SOURCES: mysql.init - reworked starting/stopping/status checking (...
arekm
arekm at pld-linux.org
Sat Jan 21 16:50:20 CET 2006
Author: arekm Date: Sat Jan 21 15:50:20 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- reworked starting/stopping/status checking (arekm && glen)
---- Files affected:
SOURCES:
mysql.init (1.89 -> 1.90)
---- Diffs:
================================================================
Index: SOURCES/mysql.init
diff -u SOURCES/mysql.init:1.89 SOURCES/mysql.init:1.90
--- SOURCES/mysql.init:1.89 Thu Dec 8 02:02:49 2005
+++ SOURCES/mysql.init Sat Jan 21 16:50:15 2006
@@ -63,6 +63,8 @@
fi
MYSQL_ERRLOG=/var/log/mysql/err
+MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
+MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
#
# Useful functions.
@@ -73,25 +75,59 @@
#
# arguments:
# $1 - db cluster
+# $2 - start|stop
#
# sets variables:
-# MYSQL_STATUS = running | not running | died
+# MYSQL_STATUS = starting | running | not running | died
# MYSQL_PID = pid of mysqld process
#
mysqlstatus() {
clusterdir="$1"
+ mode="$2"
+
mysqlgetconfig "$clusterdir"
MYSQL_STATUS="not running"
MYSQL_PID="unknown"
+ MYSQL_PIDFILE_PID=""
+ MYSQL_GREP_PID=""
- [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE")
+ if [ -f "$MYSQL_PIDFILE" ]; then
+ MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
+ fi
+
+ if [ -n "$MYSQL_PIDFILE_PID" ]; then
+ MYSQL_PID=$MYSQL_PIDFILE_PID
+ if [ ! -d "/proc/$MYSQL_PID" ]; then
+ MYSQL_STATUS="died"
+ return
+ elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline); then
+ MYSQL_STATUS="running"
+ return
+ fi
+ fi
- if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then
- MYSQL_STATUS="died"
- elif [ -d "/proc/$MYSQL_PID" ]; then
- grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
+ if [ "$mode" = "start" ]; then
+ MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline | awk -F "/" '{ print $3; exit; }')
+ if [ -n "$MYSQL_GREP_PID" ]; then
+ MYSQL_PID=$MYSQL_GREP_PID
+ if (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline); then
+ if [ -f "$MYSQL_PIDFILE" ]; then
+ MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
+ fi
+ if [ -n "$MYSQL_PIDFILE_PID" ]; then
+ MYSQL_PID=$MYSQL_PIDFILE_PID
+ MYSQL_STATUS="running"
+ return
+ else
+ MYSQL_STATUS="starting"
+ return
+ fi
+ fi
+ fi
fi
+
+ # else default, "not running"
}
# get mysql configuration in variables
@@ -194,9 +230,19 @@
msg_starting "MySQL $clusterdir"
busy
[ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
+ rm -f "$MYSQL_PIDFILE"
TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} /usr/bin/setsid /usr/sbin/mysqld --defaults-file=$MYSQL_CONFIG --datadir=$MYSQL_DATA_DIR --pid-file=$MYSQL_PIDFILE >> $MYSQL_ERRLOG 2>&1 &
- sleep 2
- mysqlstatus "$clusterdir"
+ sleep 0.2
+ mysqlstatus "$clusterdir" start
+ # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
+ if [ "$MYSQL_STATUS" = "starting" ]; then
+ for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
+ [ -f "$MYSQL_PIDFILE" ] && break
+ sleep 0.1
+ done
+ fi
+
+ mysqlstatus "$clusterdir" start
if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
ok
elif [ "$MYSQL_STATUS" = "died" ]; then
@@ -211,31 +257,31 @@
# stop mysql
mysqlstop() {
clusterdir="$1"
- mysqlstatus "$clusterdir"
+ mysqlstatus "$clusterdir" stop
msg_stopping "MySQL $clusterdir"
busy
# try graceful shutdown -- send shutdown command
# requires mysql_logrotate user proper privs
/usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
- mysqlstatus "$clusterdir"
+ mysqlstatus "$clusterdir" stop
- [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
- # 15 seconds
- for nr in $(seq 1 15); do
- [ -d "/proc/$MYSQL_PID" ] && sleep 1
- done
- mysqlstatus "$clusterdir"
+ if [ "$MYSQL_PID" != "unknown" ]; then
+ kill -TERM "$MYSQL_PID" 2> /dev/null
+ for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
+ [ -d "/proc/$MYSQL_PID" ] || break
+ sleep 0.1
+ done
+ fi
+
+ mysqlstatus "$clusterdir" stop
if [ "$MYSQL_STATUS" = "died" ]; then
died
- elif [ "$MYSQL_STATUS" = "running" ]; then
+ elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
fail
else
ok
fi
-
- # FIXME: should let mysqld remove pid by itself?
- rm -f "$MYSQL_PIDFILE"
}
#
@@ -789,7 +835,7 @@
chmod 640 $MYSQL_ERRLOG
for mysqldir in $DB_CLUSTERS; do
- mysqlstatus "$mysqldir"
+ mysqlstatus "$mysqldir" start
if [ "$MYSQL_STATUS" = "running" ]; then
msg_already_running "MySQL $mysqldir"
else
@@ -800,7 +846,7 @@
;;
stop)
for mysqldir in $DB_CLUSTERS; do
- mysqlstatus "$mysqldir"
+ mysqlstatus "$mysqldir" stop
if [ "$MYSQL_STATUS" = "not running" ]; then
msg_not_running "MySQL $mysqldir"
else
================================================================
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/mysql.init?r1=1.89&r2=1.90&f=u
More information about the pld-cvs-commit
mailing list