Bug#25341: "init.d/mysql stop" may timeout too quickly

Thirty five seconds is entirely too short of a period to wait for a server 
to exit.  Instead, make a valliant effort to make sure it exits, and only
give up after a very long period (arbitrarily chosen as 15 minutes).

In addition, if we're being asked to restart the server, then don't try
to start again if trying to stop the server failed.
---
Return zero by default, when the script exits.
---
Set return-/exit-value based on whether we successfully dealt with the 
PID-file.
---
Don't wait that long if the program we're waiting on exits.  It 
should only exit if the server is not going to be started.
parent 828121bd
...@@ -30,3 +30,9 @@ ...@@ -30,3 +30,9 @@
4554b3722d71SbPiI2Gx-RhbZjmuIQ 4554b3722d71SbPiI2Gx-RhbZjmuIQ
4558b3d73Cxjlb7Wv1oytdSTthxDfw 4558b3d73Cxjlb7Wv1oytdSTthxDfw
45771031yRCoM_ZfONdYchPvVEgLRg 45771031yRCoM_ZfONdYchPvVEgLRg
459a60d8rIxeTuhB3j_QsOwLGdcpng
459a61c9OS8PzIsdviZJDkybJ1y1uA
459a70691aYIfU2ohV0a3P5iTLpO2A
459a7422KF_P7PuU3YQ5qG6ZLEVpiA
459a74e4nRcXppMSBYeQQ5efDkTADg
45c0fdfb2mz6NdOIsLenJtf6_ZelTA
...@@ -143,11 +143,12 @@ parse_manager_arguments() { ...@@ -143,11 +143,12 @@ parse_manager_arguments() {
wait_for_pid () { wait_for_pid () {
i=0 i=0
while test $i -lt 35 ; do while test $i -lt 900 ; do
sleep 1 sleep 1
case "$1" in case "$1" in
'created') 'created')
test -s $pid_file && i='' && break test -s $pid_file && i='' && break
kill -0 $2 || break # if the program goes away, stop waiting
;; ;;
'removed') 'removed')
test ! -s $pid_file && i='' && break test ! -s $pid_file && i='' && break
...@@ -163,8 +164,10 @@ wait_for_pid () { ...@@ -163,8 +164,10 @@ wait_for_pid () {
if test -z "$i" ; then if test -z "$i" ; then
log_success_msg log_success_msg
return 0
else else
log_failure_msg log_failure_msg
return 1
fi fi
} }
...@@ -277,26 +280,28 @@ case "$mode" in ...@@ -277,26 +280,28 @@ case "$mode" in
# Give extra arguments to mysqld with the my.cnf file. This script may # Give extra arguments to mysqld with the my.cnf file. This script may
# be overwritten at next upgrade. # be overwritten at next upgrade.
$manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 & $manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 &
wait_for_pid created wait_for_pid created $!; return_value=$?
# Make lock for RedHat / SuSE # Make lock for RedHat / SuSE
if test -w /var/lock/subsys if test -w /var/lock/subsys
then then
touch /var/lock/subsys/mysqlmanager touch /var/lock/subsys/mysqlmanager
fi fi
exit $return_value
elif test -x $bindir/mysqld_safe elif test -x $bindir/mysqld_safe
then then
# Give extra arguments to mysqld with the my.cnf file. This script # Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade. # may be overwritten at next upgrade.
pid_file=$server_pid_file pid_file=$server_pid_file
$bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 & $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
wait_for_pid created wait_for_pid created $!; return_value=$?
# Make lock for RedHat / SuSE # Make lock for RedHat / SuSE
if test -w /var/lock/subsys if test -w /var/lock/subsys
then then
touch /var/lock/subsys/mysql touch /var/lock/subsys/mysql
fi fi
exit $return_value
else else
log_failure_msg "Couldn't find MySQL manager or server" log_failure_msg "Couldn't find MySQL manager or server"
fi fi
...@@ -322,13 +327,14 @@ case "$mode" in ...@@ -322,13 +327,14 @@ case "$mode" in
echo $echo_n "Shutting down MySQL" echo $echo_n "Shutting down MySQL"
kill $mysqlmanager_pid kill $mysqlmanager_pid
# mysqlmanager should remove the pid_file when it exits, so wait for it. # mysqlmanager should remove the pid_file when it exits, so wait for it.
wait_for_pid removed wait_for_pid removed; return_value=$?
# delete lock for RedHat / SuSE # delete lock for RedHat / SuSE
if test -f $lock_dir if test -f $lock_dir
then then
rm -f $lock_dir rm -f $lock_dir
fi fi
exit $return_value
else else
log_failure_msg "MySQL manager or server PID file could not be found!" log_failure_msg "MySQL manager or server PID file could not be found!"
fi fi
...@@ -337,8 +343,12 @@ case "$mode" in ...@@ -337,8 +343,12 @@ case "$mode" in
'restart') 'restart')
# Stop the service and regardless of whether it was # Stop the service and regardless of whether it was
# running or not, start it again. # running or not, start it again.
$0 stop $other_args if $0 stop $other_args; then
$0 start $other_args $0 start $other_args
else
log_failure_msg "Failed to stop running server, so refusing to try to start."
exit 1
fi
;; ;;
'reload') 'reload')
...@@ -357,3 +367,5 @@ case "$mode" in ...@@ -357,3 +367,5 @@ case "$mode" in
exit 1 exit 1
;; ;;
esac esac
exit 0
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment