From 1ede20925f8bfac9546d82db48d63bdbc8369d73 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Tue, 15 Oct 2013 16:42:45 +1100 Subject: [PATCH] eventscripts: Clean up 20.multipathd Reduce the complexity, including the depth of background processes. Signed-off-by: Martin Schwenke (This used to be ctdb commit 49f077c475b078889ff0492fe7d567a64d6cb87c) --- ctdb/config/events.d/20.multipathd | 181 +++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 97 deletions(-) rewrite ctdb/config/events.d/20.multipathd (67%) diff --git a/ctdb/config/events.d/20.multipathd b/ctdb/config/events.d/20.multipathd dissimilarity index 67% index c2956d24a11..64748dae61c 100755 --- a/ctdb/config/events.d/20.multipathd +++ b/ctdb/config/events.d/20.multipathd @@ -1,97 +1,84 @@ -#!/bin/sh -# ctdb event script for monitoring the multipath daemon -# -# Configure monitporing of multipath devices by listing the device serials -# in /etc/ctdb/multipathd : -# CTDB_MONITOR_MPDEVICES="device1 device2 ..." -# - -[ -n "$CTDB_BASE" ] || \ - export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD") - -. $CTDB_BASE/functions - -service_name="multipathd" - -loadconfig - -[ -z "$CTDB_MONITOR_MPDEVICES" ] && { - exit 0 -} - -ctdb_setup_service_state_dir - -MPFAILURE="$service_state_dir/failure" - -multipathd_check_background() -{ - for DEVICE in $CTDB_MONITOR_MPDEVICES; do - # check that we can see all devices - if [ -z "`multipath -ll $DEVICE`" ]; then - echo Device $DEVICE not known to multipathd - exit 1 - fi - - # check that all devices are active - if [ -z "`multipath -ll $DEVICE|grep prio|grep active`" ]; then - echo Device $DEVICE has no active paths - exit 1 - fi - done - exit 0 -} - -multipathd_check() -{ - # run the actual check in the background since the call to - # multipath may block. - ( - multipathd_check_background & - pid="$!" - timeleft=10 - - while [ $timeleft -gt 0 ]; do - timeleft=$(($timeleft - 1)) - - # see if the process still exists - kill -0 $pid > /dev/null 2>&1 || { - # it doesn't exist, grab its exit status - wait $pid - [ $? = 0 ] || { - echo "20.multipathd: multipath background update exited with status $?" - touch $MPFAILURE - exit 1 - } - rm $MPFAILURE 2>/dev/null - exit 0 - } - sleep 1 - done - echo "20.multipathd: Callout to multipath checks hung." - touch $MPFAILURE - exit 1 - ) & - - if [ -f $MPFAILURE ]; then - return 1 - else - return 0 - fi -} - -case "$1" in - monitor) - multipathd_check - [ "$?" = "0" ] || { - echo 20.multipathd: monitoring of multipathing failed - exit 1 - } - exit 0 - ;; - - *) - ctdb_standard_event_handler "$@" - ;; -esac - -exit 0 +#!/bin/sh +# ctdb event script for monitoring the multipath daemon +# +# Configure monitporing of multipath devices by listing the device serials +# in /etc/ctdb/multipathd : +# CTDB_MONITOR_MPDEVICES="device1 device2 ..." +# + +[ -n "$CTDB_BASE" ] || \ + export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD") + +. $CTDB_BASE/functions + +service_name="multipathd" + +loadconfig + +[ -n "$CTDB_MONITOR_MPDEVICES" ] || exit 0 + +ctdb_setup_service_state_dir + +multipath_fail="${service_state_dir}/fail" + +multipathd_check_background() +{ + for _device in $CTDB_MONITOR_MPDEVICES; do + # Check multipath knows about the device + _out=$(multipath -ll "$_device") + if [ -z "$_out" ] ; then + echo "device \"${_device}\" not known to multipathd" >"$multipath_fail" + exit 1 + fi + + # Check for at least 1 active path + if ! echo "$_out" | grep 'prio=.* status=active' >/dev/null 2>&1 ; then + echo "multipath device \"${_device}\" has no active paths" >"$multipath_fail" + exit 1 + fi + done + exit 0 +} + +multipathd_check() +{ + # Run the actual check in the background since the call to + # multipath may block + multipathd_check_background /dev/null 2>&1 & + _pid="$!" + _timeleft=10 + + while [ $_timeleft -gt 0 ]; do + _timeleft=$(($_timeleft - 1)) + + # see if the process still exists + kill -0 $_pid >/dev/null 2>&1 || { + if wait $_pid ; then + return 0 + else + echo -n "ERROR: " + cat "$multipath_fail" + rm -f "$multipath_fail" + return 1 + fi + } + sleep 1 + done + + echo "ERROR: callout to multipath checks hung" + # If hung then this probably won't work, but worth trying... + kill -9 $_pid >/dev/null 2>&1 + return 1 +} + +case "$1" in + monitor) + multipathd_check || die "multipath monitoring failed" + ;; + + *) + ctdb_standard_event_handler "$@" + ;; +esac + +exit 0 -- 2.11.4.GIT