This is the mail archive of the cluster-cvs@sourceware.org mailing list for the cluster.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

cluster: STABLE3 - cman init: major clean up of startup sequence


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=7a15c284c78688473f3d3eacdbd0dc9a5a131a87
Commit:        7a15c284c78688473f3d3eacdbd0dc9a5a131a87
Parent:        7c61522722a1f068474689583c91d1604bb4cbe5
Author:        Fabio M. Di Nitto <fdinitto@redhat.com>
AuthorDate:    Thu Mar 26 10:38:24 2009 +0100
Committer:     Fabio M. Di Nitto <fdinitto@redhat.com>
CommitterDate: Fri Mar 27 20:05:46 2009 +0100

cman init: major clean up of startup sequence

move conditional checks into runwrap (reduce output for unrequired stuff).

create common start_daemon wrapper function. All daemons need the same stuff
over and over. Might as well do it once and for all.

sort all functions around to match startup order and sort them into
categories (helpers, conditional checkers, do_real_work).

split start_daemons into separate specific functions. This might
look like a lot of overhead but it's laying down the framework
to add functional checks for each daemons.
For example we start dlm_controld and the daemons return 0 because
it does start. We don't check if the daemon is actually working.
This framework will allow us to do so.

move common bits from start function into start_global.

reformat start function to be < 80 cols.

simplify common section for start. It doesn't need to print anymore.
Only handle the lock file.

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
 cman/init.d/cman.in |  448 ++++++++++++++++++++++++++++-----------------------
 1 files changed, 250 insertions(+), 198 deletions(-)

diff --git a/cman/init.d/cman.in b/cman/init.d/cman.in
index 7505f83..9cf1360 100644
--- a/cman/init.d/cman.in
+++ b/cman/init.d/cman.in
@@ -139,7 +139,7 @@ fi
 [ -n "$CONFIG_LOADER" ] && cman_join_opts+=" -C $CONFIG_LOADER"
 
 
-### helper/common functions
+### generic wrapper functions
 
 ok() {
 	success
@@ -153,6 +153,97 @@ nok() {
 	exit 1
 }
 
+none()
+{
+	return 0
+}
+
+runwrap()
+{
+	function=$1
+	shift
+	conditional=$1
+	shift
+	message="$@"
+
+	if ! $conditional; then
+		return 0
+	fi
+
+	echo -n "   $message... "
+	if $function; then
+		ok
+	else
+		nok
+	fi
+}
+
+start_daemon()
+{
+	daemon=$1
+	shift
+	args="$@"
+
+	if ! status $daemon > /dev/null 2>&1; then
+		errmsg=$( @SBINDIR@/$daemon $args 2>&1 ) || return 1
+	fi
+	return 0
+}
+
+### check functions (enable/disable) (on/off)
+
+mtab_configfs()
+{
+	awk '{ print $2 }' /etc/mtab | \
+		grep "/sys/kernel/config" > /dev/null 2>&1 && \
+	awk '{ print $3 }' /etc/mtab | \
+		grep "configfs" > /dev/null 2>&1
+	return $?
+}
+
+cman_running()
+{
+	@SBINDIR@/cman_tool status > /dev/null 2>&1
+	return $?
+}
+
+# NOTE: this could probably grow a bit to do config sanity checks
+cman_checkconfig()
+{
+	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
+	;;
+	xmlconfig|"")
+		configfile=@CONFDIR@/@CONFFILE@
+		[ -n "$COROSYNC_CLUSTER_CONFIG_FILE" ] && \
+			configfile=$COROSYNC_CLUSTER_CONFIG_FILE
+
+		if [ ! -f $configfile ]; then
+			errmsg="xmlconfig cannot find $configfile"
+			return 1
+		fi
+	;;
+	esac
+	return 0
+}
+
 xend_bridged_net_enabled() {
 	# Not a xen kernel
 	test -d /proc/xen || return 1
@@ -180,12 +271,36 @@ xend_bridged_net_enabled() {
 	return 0
 }
 
-cman_running()
+qdiskd_enabled()
 {
-	@SBINDIR@/cman_tool status > /dev/null 2>&1
+	ccs_tool query /cluster/quorumd >/dev/null 2>&1
 	return $?
 }
 
+groupd_enabled()
+{
+	if [ "$(ccs_tool query /cluster/group/@groupd_compat 2>/dev/null || true)" != "0" ]; then
+		return 0
+	else
+		return 1
+	fi
+}
+
+cmannotifyd_enabled()
+{
+	case "$CMAN_NOTIFYD_START" in
+	yes)
+		return 0
+	;;
+	conditional)
+		if [ -n "$(ls -1 @NOTIFYDDIR@ 2>/dev/null)" ]; then
+			return 0
+		fi
+	;;
+	esac
+	return 1
+}
+
 fence_join_enabled()
 {
 	#
@@ -225,99 +340,35 @@ fence_xvmd_enabled()
 	return 0
 }
 
-mtab_configfs()
-{
-	awk '{ print $2 }' /etc/mtab | \
-		grep "/sys/kernel/config" > /dev/null 2>&1 && \
-	awk '{ print $3 }' /etc/mtab | \
-		grep "configfs" > /dev/null 2>&1
-	return $?
-}
-
-qdiskd_enabled()
-{
-	ccs_tool query /cluster/quorumd >/dev/null 2>&1
-	return $?
-}
-
-groupd_enabled()
-{
-	if [ "$(ccs_tool query /cluster/group/@groupd_compat 2>/dev/null || true)" != "0" ]; then
-		return 0
-	else
-		return 1
-	fi
-}
-
-cmannotifyd_enabled()
-{
-	case "$CMAN_NOTIFYD_START" in
-	yes)
-		return 0
-	;;
-	conditional)
-		if [ -n "$(ls -1 @NOTIFYDDIR@ 2>/dev/null)" ]; then
-			return 0
-		fi
-	;;
-	esac
-	return 1
-}
+### the real stuff starts here
 
-runwrap()
+start_global()
 {
-	function=$1
-	shift
-	message="$@"
-
-	echo -n "   $message... "
-	if $function; then
-		ok
-	else
-		nok
-	fi
+	## global bits
+	# guarantee enough limits
+	ulimit -c unlimited
+	# required for distributions that use tmpfs for /var/run
+	mkdir -p /var/run/cluster
 }
 
-# NOTE: this could probably grow a bit to do config sanity checks
-cman_checkconfig()
-{
-	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
+xend_bridged_net_start() {
+	if [ ! -x /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then
+		if [ -f /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then
+			errmsg='The xend bridged network script cannot be run'
 		else
-			errmsg="ldadconfig has been select but neither LDAP_URL or LDAP_BASEDN have been set"
-			return 1
+			errmsg='The xend bridged network script is missing'
 		fi
-	;;
-	xmlconfig|"")
-		configfile=@CONFDIR@/@CONFFILE@
-		[ -n "$COROSYNC_CLUSTER_CONFIG_FILE" ] && \
-			configfile=$COROSYNC_CLUSTER_CONFIG_FILE
+		return 1
+	fi
 
-		if [ ! -f $configfile ]; then
-			errmsg="xmlconfig cannot find $configfile"
-			return 1
-		fi
-	;;
-	esac
+	/sbin/modprobe netbk >& /dev/null
+	/sbin/modprobe netloop >& /dev/null
+	bridge_parms=`egrep -m 1 "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp| sed -r "s/^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+'?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}[[:blank:]]*//; s/'?[[:blank:]]*\).*//"`
+	errmsg=$(/etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} start $bridge_parms 2>&1) || return 1
 	return 0
 }
 
-### the real stuff starts here
-
-load_modules()
+load_kernel_modules()
 {
 	errmsg=$( /sbin/modprobe configfs 2>&1 ) || return 1
 	errmsg=$( /sbin/modprobe dlm 2>&1 ) || return 1
@@ -334,6 +385,23 @@ start_configfs()
 	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
+}
+
 start_cman()
 {
 	# cman
@@ -352,56 +420,48 @@ start_cman()
 unfence_self()
 {
 	fence_node -U > /dev/null 2>&1
-
-	case $? in
-	1)
-		return 1
-	;;
-	2)
-		echo -n "unconfigured or not required"
-	;;
-	esac
+	[ $? -eq 1 ] && return 1
 	return 0
 }
 
 start_qdiskd()
 {
-	if ! status qdiskd > /dev/null 2>&1 && \
-		qdiskd_enabled; then
-		errmsg=$( @SBINDIR@/qdiskd -Q 2>&1 ) || return 1
-	fi
-	return 0
+	start_daemon qdiskd "-Q" 
+	return $?
 }
 
-start_daemons()
+start_groupd()
 {
-	if ! status groupd > /dev/null 2>&1 && \
-		groupd_enabled; then
-		errmsg=$( @SBINDIR@/groupd 2>&1 ) || return 1
-	fi
-	if ! status fenced > /dev/null 2>&1 ; then
-		errmsg=$( @SBINDIR@/fenced 2>&1 ) || return 1
-	fi
-	if ! status dlm_controld > /dev/null 2>&1; then
-		errmsg=$( @SBINDIR@/dlm_controld 2>&1 ) || return 1
-	fi
-	if ! status gfs_controld > /dev/null 2>&1; then
-		errmsg=$( @SBINDIR@/gfs_controld 2>&1 ) || return 1
-	fi
-	if ! status cmannotifyd > /dev/null 2>&1 && \
-		cmannotifyd_enabled; then
-		errmsg=$(@SBINDIR@/cmannotifyd 2>&1 ) || return 1
-	fi
-	return 0
+	start_daemon groupd 
+	return $?
 }
 
-start_fence()
+start_fenced()
 {
-	if ! fence_join_enabled; then
-		echo -n "not required"
-		return 0
-	fi
+	start_daemon fenced
+	return $?
+}
+
+start_dlm_controld()
+{
+	start_daemon dlm_controld
+	return $?
+}
 
+start_gfs_controld()
+{
+	start_daemon gfs_controld
+	return $?
+}
+
+start_cmannotifyd()
+{
+	start_daemon cmannotifyd
+	return $?
+}
+
+join_fence_domain()
+{
 	if ! @SBINDIR@/cman_tool status | grep Flags | grep 2node > /dev/null 2>&1; then
         	errmsg=$( @SBINDIR@/fence_tool join -w $FENCE_JOIN_TIMEOUT \
 			> /dev/null 2>&1 ) || return 1
@@ -415,76 +475,73 @@ start_fence()
 
 start_fence_xvmd()
 {
-	if ! fence_xvmd_enabled; then
-		echo -n "not required"
-		return 0
-	fi
-
-	if ! status fence_xvmd > /dev/null 2>&1; then
-		errmsg=$( @SBINDIR@/fence_xvmd $FENCE_XVMD_OPTS 2>&1 ) || return 1
-	fi
-	return 0
+	start_daemon fence_xvmd "$FENCE_XVMD_OPTS"
+	return $?
 }
 
-xend_bridged_net_start() {
-	if ! xend_bridged_net_enabled; then
-		echo -n "not required"
-		return 0
-	fi
+start()
+{
+	echo "Starting cluster: "
 
-	if [ ! -x /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then
-		if [ -f /etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} ]; then
-			errmsg='The xend bridged network script cannot be run'
-		else
-			errmsg='The xend bridged network script is missing'
-		fi
-		return 1
-	fi
+	runwrap start_global \
+		none \
+		"Global setup"
 
-	/sbin/modprobe netbk >& /dev/null
-	/sbin/modprobe netloop >& /dev/null
-	bridge_parms=`egrep -m 1 "^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+(')?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}([[:blank:]]*\)|[[:blank:]]+)" /etc/xen/xend-config.sxp| sed -r "s/^[[:blank:]]*\([[:blank:]]*network-script[[:blank:]]+'?[[:blank:]]*${NETWORK_BRIDGE_SCRIPT}[[:blank:]]*//; s/'?[[:blank:]]*\).*//"`
-	errmsg=$(/etc/xen/scripts/${NETWORK_BRIDGE_SCRIPT} start $bridge_parms 2>&1) || return 1
-	return 0
-}
+	runwrap xend_bridged_net_start \
+		xend_bridged_net_enabled \
+		"Enable Xend bridge net workaround"
 
-set_networking_params()
-{
-	if [ ! -f  /proc/sys/net/core/rmem_default ]; then
-		return 0;
-	fi
+	runwrap load_kernel_modules \
+		none \
+		"Loading kernel modules"
 
-	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
+	runwrap start_configfs \
+		none \
+		"Mounting configfs"
 
-	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
-}
+	runwrap set_networking_params \
+		none \
+		"Setting network parameters"
 
-start()
-{
-	echo "Starting cluster: "
+	runwrap start_cman \
+		none \
+		"Starting cman"
 
-	## global bits
-	# guarantee enough limits
-	ulimit -c unlimited
-	# required for distributions that use tmpfs for /var/run
-	mkdir -p /var/run/cluster
+	runwrap unfence_self \
+		none \
+		"Unfencing self"
+
+	runwrap start_qdiskd \
+		qdiskd_enabled \
+		"Starting qdiskd"
+
+	runwrap start_groupd \
+		groupd_enabled \
+		"Starting groupd"
 
-	runwrap xend_bridged_net_start "Enable Xend bridge net workaround"
-	runwrap load_modules "Loading modules"
-	runwrap start_configfs "Mounting configfs"
-	runwrap set_networking_params "Setting network parameters"
-	runwrap start_cman "Starting cman"
-	runwrap unfence_self "Unfencing self"
-	runwrap start_qdiskd "Starting qdiskd"
-	runwrap start_daemons "Starting daemons"
-	runwrap start_fence "Starting fencing"
-	runwrap start_fence_xvmd "Starting virtual machine fencing host"
+	runwrap start_fenced \
+		none \
+		"Starting fenced"
+
+	runwrap start_dlm_controld \
+		none \
+		"Starting dlm_controld"
+
+	runwrap start_gfs_controld \
+		none \
+		"Starting gfs_controld"
+
+	runwrap start_cmannotifyd \
+		cmannotifyd_enabled \
+		"Starting cmannotifyd"
+
+	runwrap join_fence_domain \
+		fence_join_enabled \
+		"Joining fence domain"
+
+	runwrap start_fence_xvmd \
+		fence_xvmd_enabled \
+		"Starting virtual machine fencing host"
 
 	return 0
 }
@@ -588,14 +645,14 @@ stop()
 {
 	echo "Stopping cluster: "
 
-	runwrap stop_fence_xvmd "Stopping virtual machine fencing host"
-	runwrap stop_fence "Stopping fencing"
-	runwrap stop_daemons "Stopping daemons"
-	runwrap stop_qdiskd "Stopping qdiskd"
-	runwrap stop_cman "Stopping cman"
-	runwrap stop_cmannotifyd "Stopping cmannotifyd"
-	runwrap unload_modules "Unloading modules"
-	runwrap stop_configfs "Unmounting configfs"
+	runwrap stop_fence_xvmd none "Stopping virtual machine fencing host"
+	runwrap stop_fence none "Stopping fencing"
+	runwrap stop_daemons none "Stopping daemons"
+	runwrap stop_qdiskd none "Stopping qdiskd"
+	runwrap stop_cman none "Stopping cman"
+	runwrap stop_cmannotifyd none "Stopping cmannotifyd"
+	runwrap unload_modules none "Unloading modules"
+	runwrap stop_configfs none "Unmounting configfs"
 
 	return 0
 }
@@ -632,12 +689,7 @@ rtrn=0
 # See how we were called.
 case "$1" in
 start)
-	if start; then
-		touch $LOCK_FILE
-	else
-		echo $errmsg
-		rtrn=1
-	fi
+	start && touch $LOCK_FILE
 ;;
 stop)
 	cmanremove=""


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]