[Debian-ha-maintainers] Bug#613654: drbd8-utils: drbd init script stops boot if peer not available

Tim Stoop tim at kumina.nl
Wed Feb 16 12:53:08 UTC 2011


Package: drbd8-utils
Version: 2:8.3.7-2.1
Severity: normal

Hi,

We're experiencing some trouble with the drbd init script. Specifically the line
that starts $DRBDADM wait-con-int. If the peer is not available, this shows the
dialog explaining drbd is waiting to connect and if one wants to continue with
the booting, to enter the word "yes". However, after entering "yes", the boot
still doesn't continue.

This doesn't happen when the initscript is started from the commandline
afterwards. Commenting the line out helps, booting continues and drbd keeps
polling for the other host anyway.

I couldn't find a config option for this, so I think this might be a bug.

Kind regards,
Tim

-- System Information:
Debian Release: 6.0
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages drbd8-utils depends on:
ii  debconf [debconf-2.0]         1.5.36.1   Debian configuration management sy
ii  libc6                         2.11.2-10  Embedded GNU C Library: Shared lib

drbd8-utils recommends no packages.

Versions of packages drbd8-utils suggests:
ii  heartbeat                     1:3.0.3-2  Subsystem for High-Availability Li

-- Configuration Files:
/etc/drbd.d/global_common.conf changed:
global {
	usage-count yes;
	# minor-count dialog-refresh disable-ip-verification
}
common {
	protocol C;
	handlers {
		pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
		# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
		# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
		# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
		# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
		# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
	}
	startup {
		# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb;
		wfc-timeout 10s;
		degr-wfc-timeout 10s;
		outdated-wfc-timeout 10s;
	}
	disk {
		# on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
		# no-disk-drain no-md-flushes max-bio-bvecs   
	}
	net {
		# snd‐buf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
		# max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
		# after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
	}
	syncer {
		# rate after al-extents use-rle cpu-mask verify-alg csums-alg
		rate 80M;
	}
}

/etc/init.d/drbd changed:
DEFAULTFILE="/etc/default/drbd"
DRBDADM="/sbin/drbdadm"
DRBDSETUP="/sbin/drbdsetup"
PROC_DRBD="/proc/drbd"
MODPROBE="/sbin/modprobe"
RMMOD="/sbin/rmmod"
UDEV_TIMEOUT=10
ADD_MOD_PARAM=""
if [ -f $DEFAULTFILE ]; then
  . $DEFAULTFILE
fi
test -f $DRBDADM || exit 5
log_daemon_msg() { echo -n "${1:-}: ${2:-}"; }
log_end_msg() { echo "."; }
if [ -f /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
fi
function assure_module_is_loaded
{
    [ -e "$PROC_DRBD" ] && return
    $MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || {
	echo "Can not load the drbd module."$'\n'; exit 20
    }
    # tell klogd to reload module symbol information ...
    [ -e /var/run/klogd.pid ] && [ -x /sbin/klogd ] && /sbin/klogd -i
}
function adjust_with_progress
{
    IFS_O=$IFS
    NEWLINE='
'
    IFS=$NEWLINE
    local res
    COMMANDS=`$DRBDADM -d -n res adjust all` || exit 20
    echo -n "[ "
    for CMD in $COMMANDS; do
	case "$CMD" in
		res=*)		eval "$CMD";;
		*\ disk\ *)	echo -n "d($res) " ;;
		*\ syncer\ *)	echo -n "s($res) " ;;
		*\ net\ *)	echo -n "n($res) " ;;
		*)		echo ".. " ;;
	esac
	if ! eval "$CMD"; then
	    echo -e "\n[$res] cmd $CMD failed - continuing!\n "
	fi
    done
    echo -n "]"
    IFS=$IFS_O
}
drbd_pretty_status()
{
	local proc_drbd=$1
	# add resource names
	if ! type column &> /dev/null ||
	   ! type paste &> /dev/null ||
	   ! type join &> /dev/null ||
	   ! type sed &> /dev/null ||
	   ! type tr &> /dev/null
	then
		cat "$proc_drbd"
		return
	fi
	sed -e '2q' < "$proc_drbd"
	sed_script=$(
		i=0;
		_sh_status_process() {
			let i++ ;
			stacked=${_stacked_on:+"^^${_stacked_on_minor:-${_stacked_on//[!a-zA-Z0-9_ -]/_}}"}
			printf "s|^ *%u:|%6u\t&%s%s|\n" \
				$_minor $i \
				"${_res_name//[!a-zA-Z0-9_ -]/_}" "$stacked"
		};
		eval "$(drbdadm sh-status)" )
	p() {
		sed -e "1,2d" \
		      -e "$sed_script" \
		      -e '/^ *[0-9]\+: cs:Unconfigured/d;' \
		      -e 's/^\(.* cs:.*[^ ]\)   \([rs]...\)$/\1 - \2/g' \
		      -e 's/^\(.* \)cs:\([^ ]* \)st:\([^ ]* \)ds:\([^ ]*\)/\1\2\3\4/' \
		      -e 's/^\(.* \)cs:\([^ ]* \)ro:\([^ ]* \)ds:\([^ ]*\)/\1\2\3\4/' \
		      -e 's/^\(.* \)cs:\([^ ]*\)$/\1\2/' \
		      -e 's/^ *[0-9]\+:/ x &??not-found??/;' \
		      -e '/^$/d;/ns:.*nr:.*dw:/d;/resync:/d;/act_log:/d;' \
		      -e 's/^\(.\[.*\)\(sync.ed:\)/... ... \2/;/^.finish:/d;' \
		      -e 's/^\(.[0-9 %]*oos:\)/... ... \1/' \
		      < "$proc_drbd" | tr -s '\t ' '  ' 
	}
	m() {
		join -1 2 -2 1 -o 1.1,2.2,2.3 \
			<( ( drbdadm sh-dev all ; drbdadm -S sh-dev all ) | cat -n | sort -k2,2) \
			<(sort < /proc/mounts ) |
			sort -n | tr -s '\t ' '  ' | sed -e 's/^ *//'
	}
	# echo "=== p ==="
	# p
	# echo "=== m ==="
	# m
	# echo "========="
	# join -a1 <(p|sort) <(m|sort)
	# echo "========="
	(
	echo m:res cs ro ds p mounted fstype
	join -a1 <(p|sort) <(m|sort) | cut -d' ' -f2-6,8- | sort -k1,1n -k2,2
	) | column -t
}
case "$1" in
    start)
	# Just in case drbdadm want to display any errors in the configuration
	# file, or we need to ask the user about registering this installation
	# at http://usage.drbd.org, we call drbdadm here without any IO
	# redirection.
	$DRBDADM sh-nop
	log_daemon_msg "Starting DRBD resources"
	assure_module_is_loaded
	adjust_with_progress
	# make sure udev has time to create the device files
	for RESOURCE in `$DRBDADM sh-resources`; do
	    for DEVICE in `$DRBDADM sh-dev $RESOURCE`; do
		UDEV_TIMEOUT_LOCAL=$UDEV_TIMEOUT
		while [ ! -e $DEVICE ] && [ $UDEV_TIMEOUT_LOCAL -gt 0 ] ; do
		    sleep 1
		UDEV_TIMEOUT_LOCAL=$(( $UDEV_TIMEOUT_LOCAL-1 ))
		done
	    done
	done
	[ -d /var/lock/subsys ] && touch /var/lock/subsys/drbd	# for RedHat
	#$DRBDADM wait-con-int # User interruptible version of wait-connect all
	$DRBDADM sh-b-pri all # Become primary if configured
	log_end_msg 0
	;;
    stop)
	$DRBDADM sh-nop
	log_daemon_msg "Stopping all DRBD resources"
	if [ -e $PROC_DRBD ] ; then
		# bypass drbdadm and drbd config file and everything,
		# to avoid leaving devices around that are not referenced by
		# the current config file, or in case the current config file
		# does not parse for some reason.
		for d in /dev/drbd* ; do
			[ -L "$d" ] && continue
			[ -b "$d" ] || continue
			M=$(umount "$d" 2>&1)
			case $M in
			*" not mounted") :;;
			*) echo "$M" >&2 ;;
			esac
			$DRBDSETUP "$d" down
		done
		$RMMOD drbd
	fi
	[ -f /var/lock/subsys/drbd ] && rm /var/lock/subsys/drbd
	log_end_msg 0
	;;
    status)
	# NEEDS to be heartbeat friendly...
	# so: put some "OK" in the output.
	if [ -e $PROC_DRBD ]; then
	    echo "drbd driver loaded OK; device status:"
	    drbd_pretty_status $PROC_DRBD 2>/dev/null
	    exit 0
	else
	    echo >&2 "drbd not loaded"
	    exit 3
	fi
	;;
    reload)
	$DRBDADM sh-nop
	log_daemon_msg  "Reloading DRBD configuration"
	$DRBDADM adjust all
	log_end_msg 0
	;;
    restart|force-reload)
	$DRBDADM sh-nop
	log_daemon_msg "Restarting all DRBD resources"
	$DRBDADM down all
	$RMMOD drbd
	assure_module_is_loaded
	$DRBDADM up all
	log_end_msg 0
	;;
    *)
	echo "Usage: /etc/init.d/drbd {start|stop|status|reload|restart|force-reload}"
	exit 1
	;;
esac
exit 0


-- no debconf information





More information about the Debian-ha-maintainers mailing list