loadconfig
-[ -z "$CTDB_MONITOR_MPDEVICES" ] && {
- exit 0
-}
+[ -n "$CTDB_MONITOR_MPDEVICES" ] || exit 0
ctdb_setup_service_state_dir
-MPFAILURE="$service_state_dir/failure"
+multipath_fail="${service_state_dir}/fail"
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
+ 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 &
- 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
+ # Run the actual check in the background since the call to
+ # multipath may block
+ multipathd_check_background </dev/null >/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
- fi
+ 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
- [ "$?" = "0" ] || {
- echo 20.multipathd: monitoring of multipathing failed
- exit 1
- }
- exit 0
+ multipathd_check || die "multipath monitoring failed"
;;
*)