Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F1841999
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
16 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/cman/init.d/cman b/cman/init.d/cman
index e25e09fe1..4778fa89d 100644
--- a/cman/init.d/cman
+++ b/cman/init.d/cman
@@ -1,692 +1,704 @@
#!/bin/bash
#
# cman - Cluster Manager init script
#
# chkconfig: - 21 79
# description: Starts and stops cman
#
#
### BEGIN INIT INFO
# Provides: cman
# Required-Start: $network $time
# Required-Stop: $network $time
# Default-Start:
# Default-Stop:
# Short-Description: Starts and stops cman
# Description: Starts and stops the Cluster Manager set of daemons
### END INIT INFO
. /etc/init.d/functions
if [ -f /etc/sysconfig/cman ]; then
. /etc/sysconfig/cman
echo "/etc/sysconfig/cman has been deprecated in favour of /etc/sysconfig/cluster"
echo "Please consider switching to the new file"
fi
[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster
[ -z "$CCSD_OPTS" ] && CCSD_OPTS=
# 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
# a cluster is not joined. If CMAN_CLUSTER_TIMEOUT is zero, then
# wait indefinately for a cluster join. If CMAN_CLUSTER_TIMEOUT is
# negative, do not check to see that the cluster has been joined
[ -z "$CMAN_CLUSTER_TIMEOUT" ] && CMAN_CLUSTER_TIMEOUT=120
# CMAN_QUORUM_TIMEOUT -- amount of time to wait for a quorate cluster on
# 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.
[ -z "$CMAN_QUORUM_TIMEOUT" ] && 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.
# The default is 60 seconds
[ -z "$CMAN_SHUTDOWN_TIMEOUT" ] && CMAN_SHUTDOWN_TIMEOUT=60
# 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.
[ -z "$FENCED_START_TIMEOUT" ] && FENCED_START_TIMEOUT=300
# NET_RMEM_DEFAULT -- minimum value for rmem_default. If this is set
# higher elsewhere it will not be reduced here.
# These two values are only really needed for the DLM when using sctp
# but do no harm.
[ -z "$NET_RMEM_DEFAULT" ] && NET_RMEM_DEFAULT=4194304
# NET_RMEM_MAX -- minimum value for rmem_max. If this is set
# higher elsewhere it will not be reduced here.
[ -z "$NET_RMEM_MAX" ] && NET_RMEM_MAX=4194304
+# FENCED_MEMBER_DELAY -- amount of time to delay fence_tool join to allow
+# all nodes in cluster.conf to become cluster members. In seconds.
+[ -z "$FENCED_MEMBER_DELAY" ] && FENCED_MEMBER_DELAY=45
+
# FENCE_JOIN -- boolean value used to control whether or not this node
# should join the fence domain. If FENCE_JOIN is set to "no", then
# the script will not attempt to the fence domain. If FENCE_JOIN is
# set to "yes", then the script will attempt to join the fence domain.
# If FENCE_JOIN is set to any other value, the default behavior is
# to join the fence domain (equivalent to "yes").
[ -z "$FENCE_JOIN" ] && FENCE_JOIN="yes"
[ -z "$LOCK_FILE" ] && LOCK_FILE="/var/lock/subsys/cman"
[ -n "$CLUSTERNAME" ] && cman_join_opts="-c $CLUSTERNAME"
[ -n "$NODENAME" ] && cman_join_opts+=" -n $NODENAME"
# CONFIG_LOADER -- select default config parser.
# This can be:
# xmlconfig - read directly from cluster.conf and use ricci as default config
# propagation method. (default)
# ldapconfig - read configuration from an ldap server.
# Requires: LDAP_URL or/and LDAP_BASEDN envvar to be set.
# LDAP_BINDDN and LDAP_BINDPWD have to be either both set or both unset.
# corosync_parser - use internal corosync config file parser.
# openaisparser - use internal openais config file parser.
# ccsconfig - read configuration from ccsd daemon. This method is deprecated
# and available only if building the code with --enable_legacy_code.
[ -n "$CONFIG_LOADER" ] && cman_join_opts+=" -C $CONFIG_LOADER"
load_modules()
{
errmsg=$( /sbin/modprobe configfs 2>&1 ) || return 1
errmsg=$( /sbin/modprobe dlm 2>&1 ) || return 1
errmsg=$( /sbin/modprobe lock_dlm 2>&1 ) || return 1
return 0
}
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)
rtrn=$?
return $rtrn
fi
return 0
}
start_cman()
{
# cman
/sbin/cman_tool status &> /dev/null
if [ $? -ne 0 ]
then
case "$CONFIG_LOADER" in
ldapconfig)
if [ -n "$LDAP_URL" ] || [ -n "$LDAP_BASEDN" ]; then
if [ -n "$LDAP_BINDDN" ]; then
if [ -z "$LDAP_BINDPWD" ]; then
errmsg="ldadconfig has been select but LDAP_BINDPWD is not set"
return 1
fi
fi
if [ -n "$LDAP_BINDPWD" ]; then
if [ -z "$LDAP_BINDDN" ]; then
errmsg="ldadconfig has been select but LDAP_BINDDN is not set"
return 1
fi
fi
else
errmsg="ldadconfig has been select but neither LDAP_URL or LDAP_BASEDN have been set"
return 1
fi
;;
ccsconfig)
if [ -x /sbin/ccsd ]; then
echo -n " Starting ccsd... "
start_ccsd
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
errmsg="Unable to start ccsd"
return 1
fi
else
errmsg="ccsconfig has been selected but ccsd does not appear to be installed or executable"
return 1
fi
;;
*)
# nothing to do for now
;;
esac
errmsg=$( /sbin/cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join \
$cman_join_opts 2>&1 ) || return 1
if [ $CMAN_QUORUM_TIMEOUT -gt 0 ]
then
errmsg=$( /sbin/cman_tool -t $CMAN_QUORUM_TIMEOUT \
-q wait 2>&1 ) || return 1
fi
fi
return 0
}
start_qdiskd()
{
declare current_runlevel
current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null)
#
# Start qdiskd before fenced to resolve bug #436381. This only
# happens if qdiskd is configured to run in the runlevel we are in
#
/sbin/chkconfig --levels "$current_runlevel" qdiskd 2>/dev/null
if [ $? -ne 0 ]; then
# qdiskd doesn't start at this runlevel.
return 0
fi
echo -n " Starting qdiskd... "
/sbin/service qdiskd start &> /dev/null
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
return 0
}
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
}
start_fence()
{
- errmsg=$( /sbin/fence_tool -w -t $FENCED_START_TIMEOUT join \
- > /dev/null 2>&1 ) || return 1
+ /usr/sbin/cman_tool status | grep Flags | grep 2node &> /dev/null
+ if [ $? -ne 0 ]
+ then
+ errmsg=$( /sbin/fence_tool -w -t $FENCED_START_TIMEOUT join \
+ > /dev/null 2>&1 ) || return 1
+ else
+ errmsg=$( /sbin/fence_tool -w -t $FENCED_START_TIMEOUT \
+ -m $FENCED_MEMBER_DELAY join \
+ > /dev/null 2>&1 ) || return 1
+ fi
return 0
}
start_fence_xvmd()
{
status fence_xvmd &> /dev/null
if [ $? -ne 0 ]; then
errmsg=$( /sbin/fence_xvmd $FENCE_XVMD_OPTS 2>&1 ) || return 1
fi
return 0
}
xend_bridged_net_enabled() {
# Not a xen kernel
test -d /proc/xen || return 1
current_runlevel=$(/sbin/runlevel 2>/dev/null | awk '{ print $2 }' 2>/dev/null)
if [ -z "$current_runlevel" ]; then
errmsg='Unable to determine the current runlevel'
return 1
fi
/sbin/chkconfig --levels "$current_runlevel" xend 2>/dev/null
if [ $? -ne 0 ]; then
# xend doesn't start at this runlevel.
return 1
fi
if [ ! -f /etc/xen/xend-config.sxp ]; then
# xend isn't configured to use bridged networking.
return 1
fi
egrep "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*network-bridge([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp >&/dev/null
if [ $? -ne 0 ]; then
# xend isn't configured to use bridged networking.
return 1
fi
return 0
}
xend_bridged_net_start() {
if [ ! -x /etc/xen/scripts/network-bridge ]; then
if [ -f /etc/xen/scripts/network-bridge ]; then
errmsg='The xend bridged network script cannot be run'
else
errmsg='The xend bridged network script is missing'
fi
return 1
fi
/sbin/modprobe netbk >& /dev/null
/sbin/modprobe netloop >& /dev/null
bridge_parms=`egrep -m 1 "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*network-bridge([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp| sed -r "s/^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+'?[[:blank:]]*network-bridge[[:blank:]]*//; s/'?[[:blank:]]*\).*//"`
errmsg=$(/etc/xen/scripts/network-bridge start $bridge_parms 2>&1) || return 1
return 0
}
fence_xvmd_enabled()
{
#
# Check the value of FENCE_JOIN.
# If FENCE_JOIN is set to "no", then we should disable fence_xvm.
#
if [ "$FENCE_JOIN" == "no" ]; then
return 1
fi
#
# Check for the 'xm' binary. If it's not here, we are not
# running on a machine capable of running xvmd.
#
which xm &> /dev/null || return 1
#
# Check for presence of /cluster/fence_xvmd in cluster.conf
# (If -X is specified, it doesn't matter if it's in cluster.conf;
# we'll start it anyway since ccsd is not required)
#
/sbin/cman_tool status &> /dev/null
if [ $? -eq 0 ]
then
if [ "$FENCE_XVMD_OPTS" = "${FENCE_XVMD_OPTS/-X/}" ]; then
ccs_tool query /cluster/fence_xvmd || return 1
fi
fi
return 0
}
set_networking_params()
{
if [ ! -f /proc/sys/net/core/rmem_default ]
then
return 0;
fi
value="$(cat /proc/sys/net/core/rmem_default)"
if [ $value -le $NET_RMEM_DEFAULT ]
then
echo $NET_RMEM_DEFAULT > /proc/sys/net/core/rmem_default
fi
value="$(cat /proc/sys/net/core/rmem_max)"
if [ $value -le $NET_RMEM_MAX ]
then
echo $NET_RMEM_MAX > /proc/sys/net/core/rmem_max
fi
}
fence_join_enabled()
{
#
# Check the value of FENCE_JOIN.
# If FENCE_JOIN is set to "no", we will not attempt to join
# the fence domain. If FENCE_JOIN is set to any other value,
# we will attempt to join the fence domain (default).
#
if [ "$FENCE_JOIN" == "no" ]; then
return 1
else
return 0
fi
}
start()
{
echo "Starting cluster: "
xend_bridged_net_enabled
if [ $? -eq 0 ]
then
echo -n " Enabling workaround for Xend bridged networking... "
xend_bridged_net_start
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed: $errmsg"
return 1
fi
fi
echo -n " Loading modules... "
ulimit -c unlimited
load_modules
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
echo -n " Mounting configfs... "
start_configfs
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
echo -n " Setting network parameters... "
set_networking_params
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
echo -n " Starting cman... "
start_cman
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
start_qdiskd
echo -n " Starting daemons... "
start_daemons
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
if fence_join_enabled; then
echo -n " Starting fencing... "
start_fence
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
fi
if fence_xvmd_enabled; then
echo -n " Starting virtual machine fencing host... "
start_fence_xvmd
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
fi
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 ] && [ -z "$(ls -1 /sys/kernel/config)" ]
then
errmsg=$( /bin/umount /sys/kernel/config 2>&1 )
if [ $? -ne 0 ]
then
echo -n $errmsg " "
fi
fi
return 0
}
stop_ccsd()
{
for sec in $(seq 1 10)
do
if /sbin/pidof ccsd &> /dev/null
then
# 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
return 0
fi
done
return 1
}
stop_cman()
{
/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
}
stop_daemons()
{
if pid=$(/sbin/pidof gfs_controld 2>&1); then
errmsg=$(/usr/bin/kill $pid 2>&1) || return 1
fi
if pid=$(/sbin/pidof dlm_controld 2>&1); then
errmsg=$(/usr/bin/kill $pid 2>&1) || return 1
fi
if pid=$(/sbin/pidof fenced 2>&1); then
errmsg=$(/usr/bin/kill $pid 2>&1) || return 1
fi
if pid=$(/sbin/pidof groupd 2>&1); then
errmsg=$(/usr/bin/kill $pid 2>&1) || return 1
fi
return 0 # all ok
}
stop_fence()
{
if /sbin/pidof fenced &> /dev/null
then
/sbin/fence_tool -w leave > /dev/null 2>&1
rtrn=$?
sleep 1 # A bit of time for fenced to exit
return $rtrn
fi
return 0 # all ok
}
stop_fence_xvmd()
{
if /sbin/pidof fence_xvmd &> /dev/null
then
pkill -TERM fence_xvmd
sleep 1 # A bit of time for fenced to exit
fi
[ -z "`pidof fence_xvmd`" ]
return $?
}
stop()
{
echo "Stopping cluster: "
if fence_xvmd_enabled; then
echo -n " Stopping virtual machine fencing host... "
stop_fence_xvmd
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
fi
if fence_join_enabled; then
echo -n " Stopping fencing... "
stop_fence
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
fi
echo -n " Stopping cman... "
if [ $1 ]; then
stop_cman $1
else
stop_cman
fi
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
# stop_daemons
# [ $? -ne 0 ] && return 1
echo -n " Stopping ccsd... "
stop_ccsd
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
echo -n " Unmounting configfs... "
stop_configfs
if [ $? -eq 0 ]
then
echo "done"
else
echo "failed"
return 1
fi
return 0
}
cmanstatus()
{
errmsg=$( status ccsd 2>&1) || return 1
errmsg=$( status groupd 2>&1) || return 1
errmsg=$( status fenced 2>&1) || return 1
errmsg=$( status dlm_controld 2>&1) || return 1
errmsg=$( status gfs_controld 2>&1) || return 1
fence_xvmd_enabled || return 0
errmsg=$( status fence_xvmd 2>&1) || return 1
return 0
}
rtrn=1
# See how we were called.
case "$1" in
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)
if [ $2 ]; then
stop
else
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|reload)
$0 stop restart
$0 start
rtrn=$?
;;
status)
cmanstatus
rtrn=$?
if [ $rtrn -ne 0 ] ; then
echo $errmsg
else
echo "cman is running."
fi
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|status}"
;;
esac
exit $rtrn
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Nov 23, 11:05 AM (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1018621
Default Alt Text
(16 KB)
Attached To
Mode
rR Resource Agents
Attached
Detach File
Event Timeline
Log In to Comment