[Cluster-devel] cluster/cman/init.d cman
adas at sourceware.org
adas at sourceware.org
Wed Jun 28 20:57:03 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: adas at sourceware.org 2006-06-28 20:57:03
Modified files:
cman/init.d : cman
Log message:
Single init script to start up cluster: Covers loading of modules, starting ccsd, cman and fencing, and starting daemons. Replaces ccsd, cman and fenced init scripts
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/init.d/cman.diff?cvsroot=cluster&r1=1.15&r2=1.16
--- cluster/cman/init.d/cman 2006/05/08 22:38:29 1.15
+++ cluster/cman/init.d/cman 2006/06/28 20:57:03 1.16
@@ -3,11 +3,12 @@
# chkconfig: 345 21 79
# description: Starts and stops cman
#
-#
+#
### BEGIN INIT INFO
-# Provides:
+# Provides:
### END INIT INFO
-
+. /etc/init.d/functions
+CCSD_OPTS=-X
# CMAN_CLUSTER_TIMEOUT -- amount of time to wait for joinging a cluster
# before giving up. If CMAN_CLUSTER_TIMEOUT is positive, then we will
# wait CMAN_CLUSTER_TIMEOUT seconds before giving up and failing when
@@ -20,166 +21,265 @@
# startup quorum is needed by many other applications, so we may as
# well wait here. If CMAN_QUORUM_TIMEOUT is less than 1, quorum will
# be ignored.
-CMAN_QUORUM_TIMEOUT=300
+#CMAN_QUORUM_TIMEOUT=300
+CMAN_QUORUM_TIMEOUT=0
# CMAN_SHUTDOWN_TIMEOUT -- amount of time to wait for cman to become a
# cluster member before calling cman_tool leave during shutdown.
# default is 60 seconds
CMAN_SHUTDOWN_TIMEOUT=60
-. /etc/init.d/functions
-[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster
+# FENCED_START_TIMEOUT -- amount of time to wait for starting fenced
+# before giving up. If FENCED_START_TIMEOUT is positive, then we will
+# wait FENCED_START_TIMEOUT seconds before giving up and failing when
+# fenced does not start. If FENCED_START_TIMEOUT is zero, then
+# wait indefinately for fenced to start.
+FENCED_START_TIMEOUT=120
LOCK_FILE="/var/lock/subsys/cman"
[ -n "$CLUSTERNAME" ] && cman_join_opts="-c $CLUSTERNAME"
-in_cluster()
+load_modules()
{
- grep -q "Cluster Member: Yes" /proc/cluster/status
+ errmsg=$( /sbin/modprobe configfs 2>&1 ) || return 1
+ errmsg=$( /sbin/modprobe dlm 2>&1 ) || return 1
+ errmsg=$( /sbin/modprobe dlm_device 2>&1 ) || return 1
+ return 0
}
-start()
+start_configfs()
+{
+ # configfs
+ awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" &> /dev/null \
+ && awk '{ print $3 }' /etc/mtab | grep "configfs" &> /dev/null
+ if [ $? -ne 0 ]
+ then
+ errmsg=$( /bin/mount -t configfs none /sys/kernel/config 2>&1 )
+ return $?
+ fi
+ return 0
+}
+
+start_ccsd()
+{
+ # ccsd
+ status ccsd &> /dev/null
+ if [ $? -ne 0 ]
+ then
+ errmsg=$(/sbin/ccsd $CCSD_OPTS 2>&1)
+ return $?
+ fi
+ return 0
+}
+
+start_cman()
{
- echo -n "Starting cman:"
+ # cman
+ /sbin/cman_tool status &> /dev/null
+ if [ $? -ne 0 ]
+ then
+ errmsg=$( /sbin/cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join \
+ $cman_join_opts 2>&1 ) || return 1
- # If gulm is in ccs, don't start cman
- # FIXME -- Should this be silent? I think users should get some
- # feedback, but others might not want added verbosity to
- # the boot process. Oh well... it's only one line :)
- if ! [ -r /etc/cluster/cluster.conf ]
- then
- # TODO -- cman can start w/out cluster.conf file. This
- # should not stop cman from starting up.
- initlog -n ${0##*/} -s "/etc/cluster/cluster.conf was not detected"
- elif grep -qE "<[[:space:]]*gulm([[:space:]]|[>]|$)" \
- /etc/cluster/cluster.conf
+ if [ $CMAN_QUORUM_TIMEOUT -gt 0 ]
then
- warning "Skipping because of <gulm> section detected in " \
- "/etc/cluster/cluster.conf"
- echo
- exit 0
+ errmsg=$( /sbin/cman_tool -t $CMAN_QUORUM_TIMEOUT \
+ -q wait 2>&1 ) || return 1
fi
+ fi
+ return 0
+}
- rtrn=1
+start_daemons()
+{
+ status groupd &> /dev/null
+ if [ $? -ne 0 ]; then
+ errmsg=$( /sbin/groupd 2>&1 ) || return 1
+ fi
+ status fenced &> /dev/null
+ if [ $? -ne 0 ]; then
+ errmsg=$( /sbin/fenced 2>&1 ) || return 1
+ fi
+ status dlm_controld &> /dev/null
+ if [ $? -ne 0 ]; then
+ errmsg=$( /sbin/dlm_controld 2>&1 ) || return 1
+ fi
+ status gfs_controld &> /dev/null
+ if [ $? -ne 0 ]; then
+ errmsg=$( /sbin/gfs_controld 2>&1 ) || return 1
+ fi
+ return 0
+}
- for try in block
- do
- # load the cman module (modprobe won't error if the modules
- # are already loaded
- errmsg=$(modprobe cman 2>&1) || break
-
- # try to load the dlm module
- modprobe dlm &> /dev/null
-
- # TODO -- configure tunable paramters?
- # [ -n "$CMAN_TRANSITION_RESTARTS" ] &&
- # echo $CMAN_TRANSITION_RESTARTS > \
- # /proc/cluster/config/cman/transition_restarts
-
- if in_cluster
- then
- rtrn=0
- break
- fi
-
- # specify -w to make sure we have joined the cluster
- # TODO -- should we call cman_tool leave if this times out?
- errmsg=$(cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join \
- $cman_join_opts 2>&1) || break
-
- # make sure that we are quorate?
- if [ $CMAN_QUORUM_TIMEOUT -gt 0 ]
- then
- errmsg=$( cman_tool -t $CMAN_QUORUM_TIMEOUT \
- -q wait 2>&1 ) || break
- fi
+start_fence()
+{
+ errmsg=$( /sbin/fence_tool -j $FENCED_START_TIMEOUT join \
+ > /dev/null 2>&1 ) || return 1
+ return 0
+}
- rtrn=0
- done
+start()
+{
+ echo -n "Starting cluster: "
+ load_modules
+ [ $? -ne 0 ] && return 1
+ start_configfs
+ [ $? -ne 0 ] && return 1
+ start_ccsd
+ [ $? -ne 0 ] && return 1
+ start_cman
+ [ $? -ne 0 ] && return 1
+ start_daemons
+ [ $? -ne 0 ] && return 1
+ start_fence
+ [ $? -ne 0 ] && return 1
+
+ return 0
+}
+
+stop_configfs()
+{
+ awk '{ print $2 }' /etc/mtab | grep "/sys/kernel/config" &> /dev/null\
+ && awk '{ print $3 }' /etc/mtab | grep "configfs" &> /dev/null
+ if [ $? -eq 0 ]
+ then
+ errmsg=$( /bin/umount /sys/kernel/config 2>&1 )
+ return $?
+ fi
+ return 0
+}
- if [ $rtrn -eq 0 ]
+stop_ccsd()
+{
+ for sec in $(seq 1 10)
+ do
+ if /sbin/pidof ccsd &> /dev/null
then
- success "startup"
- echo
+ # get the pid of ccsd from /var/run/cluster/ccsd.pid
+ # and break if the file is not there
+ [ -r /var/run/cluster/ccsd.pid ] || break
+
+ pid=$(cat /var/run/cluster/ccsd.pid)
+ /usr/bin/kill $pid &> /dev/null || break
+
+ sleep 1
else
- failure "$errmsg"
- echo
+ return 0
fi
-
- # need the extra echo to properlly terminate the line
- return $rtrn
+ done
+ return 1
}
-# This function can be called with an additional argument, remove
-# The cman_tool command will fail if the additional argument is
-# something else.
-stop()
+stop_cman()
{
- echo -n "Stopping cman:"
- rtrn=0
- if [ -r /proc/cluster/status ]
- then
- rtrn=1
+ /sbin/cman_tool status &> /dev/null
+ if [ $? -eq 0 ]
+ then
+ errmsg=$( /sbin/cman_tool -t $CMAN_SHUTDOWN_TIMEOUT \
+ -w leave $1 2>&1 ) || return 1
+ fi
+ return 0 # all ok
+}
- cman_tool -t $CMAN_SHUTDOWN_TIMEOUT -w leave $1 &> /dev/null && rtrn=0
+stop_daemons()
+{
+ if pid=$(/sbin/pidof gfs_controld 2>&1); then
+ errmsg=$(/usr/bin/kill -9 $pid 2>&1) || return 1
+ fi
+ if pid=$(/sbin/pidof dlm_controld 2>&1); then
+ errmsg=$(/usr/bin/kill -9 $pid 2>&1) || return 1
+ fi
+ if pid=$(/sbin/pidof fenced 2>&1); then
+ errmsg=$(/usr/bin/kill -9 $pid 2>&1) || return 1
+ fi
+ if pid=$(/sbin/pidof groupd 2>&1); then
+ errmsg=$(/usr/bin/kill -9 $pid 2>&1) || return 1
+ fi
+ return 0 # all ok
+}
- # allow cman time to clean up BZ 149282
- sleep 3
+stop_fence()
+{
+ if /sbin/pidof fenced &> /dev/null
+ then
+ /sbin/fence_tool leave > /dev/null 2>&1
+ return $?
+ fi
+ return 0 # all ok
+}
- # try to unload dlm module
- modprobe -r dlm &>/dev/null
-
- modprobe -r cman &>/dev/null
- fi
-
- if [ $rtrn -eq 0 ]
- then
- success "shutdown"
- echo
- else
- failure "failed to stop cman"
- echo
- fi
-
- # need the extra echo to properlly terminate the line
- return $rtrn
+stop()
+{
+ echo -n "Stopping cluster: "
+ stop_fence
+ [ $? -ne 0 ] && return 1
+ stop_daemons
+ [ $? -ne 0 ] && return 1
+ if [ $1 ]; then
+ stop_cman $1
+ else
+ stop_cman
+ fi
+ [ $? -ne 0 ] && return 1
+ stop_ccsd
+ [ $? -ne 0 ] && return 1
+ stop_configfs
+ [ $? -ne 0 ] && return 1
+ return 0
}
rtrn=1
# See how we were called.
case "$1" in
- start)
+ start)
start
rtrn=$?
[ $rtrn = 0 ] && touch $LOCK_FILE
+ if [ $rtrn -ne 0 ]
+ then
+ echo $errmsg
+ failure "failed to start cman"
+ echo
+ else
+ success "start"
+ echo
+ fi
;;
-
- stop)
+ stop)
if [ $2 ]; then
- stop
+ stop
else
- stop remove
+ stop remove
fi
rtrn=$?
[ $rtrn = 0 ] && rm -f $LOCK_FILE
+ if [ $rtrn -ne 0 ]
+ then
+ echo $errmsg
+ failure "failed to stop cman"
+ echo
+ else
+ success "shutdown"
+ echo
+ fi
;;
- restart)
+ restart)
$0 stop restart
- $0 start
+ $0 start
rtrn=$?
;;
- status)
- cat /proc/cluster/status 2>/dev/null
+ status)
+ /sbin/cman_tool status 2>/dev/null
rtrn=$?
;;
- *)
- echo $"Usage: $0 {start|stop|restart|status}"
- ;;
+ *)
+ echo $"Usage: $0 {start|stop|restart|status}"
+ ;;
esac
exit $rtrn
More information about the Cluster-devel
mailing list