[Pacemaker] [patch] Seeking suggestions for cluster configuration of HA iSCSI target and initiators]

Dejan Muhamedagic dejanmm at fastmail.fm
Tue Jul 17 11:49:25 UTC 2012


Hi,

On Mon, Jul 16, 2012 at 03:20:35PM -0400, Phil Frost wrote:
> On 07/16/2012 01:34 PM, Phil Frost wrote:
> >I've been doing some study of the iscsi RA since my first post,
> >and it seems to me now that the "failure" in the monitor action
> >isn't actually in the monitor action at all. Rather, it appears
> >that for *all* actions, the RA does a "discovery" step, and that's
> >what is failing. I'm not really sure what this is, or why I need
> >it. Is it simply to find an unspecified portal for a given IQN? Is
> >it therefore useless in my case, since I've explicitly specified
> >the portal in the resource parameters?
> >
> >If I were to disable the "discovery" step, what are people's
> >thoughts on the case where the target is operational, but the
> >initiator for some reason (network failure) can't reach it? In
> >this case, assume Pacemaker knows the target is up; is there a way
> >to encourage it to decide to attempt migrating the initiator to
> >another node?
> 
> Well, after reading through the iscsi RA a dozen times, I could not
> formulate any reasonable idea of why the discovery step might be
> necessary.

The discovery is not necessary for the RA, but for open-iscsi. It
creates a database of available targets on the host.

> The portal parameter is required, so it couldn't be to
> locate the portal. And, there is logic in the discovery function to
> handle the case when a target returns multiple portals for the same
> target -- by finding the one that was specified in the portal
> parameter. So it can't really be discovering anything. It does raise
> an error in this case if the portal parameter isn't specified, but
> then the portal parameter isn't optional, so that case could never
> occur. It smelled like rotten code to me.
> 
> So, given all that, and given how it introduces a nasty race
> condition in the case that the target isn't running (or is just in
> the process of migrating to another node), I decided it was better
> to just get rid of it. Patch attached. I suppose I've introduced a
> different failure in that an initiator that can't contact a running
> target won't be migrated, but I'd rather have one of my VMs trying
> to run, unsuccessfully, and able to automatically recover when the
> fault is cleared, than have an entire VM host shot in the head on
> the basis of a race condition in non-failure situations.
> 
> One minor nastiness was observed with my patch: if the portal isn't
> specified exactly as udev will format it, then the RA will wait
> forever for the device node to appear, expecting the wrong device
> filename. Maybe canonicalizing the portal was one useful function of
> the discovery function, but in my opinion, not worth the other
> problems.

This patch would break the start operation. However, discovery is
arguably not necessary for monitor and stop operations. There's a
patch in the works to that effect and also to support iscsi
recovery.

Thanks,

Dejan

> --- heartbeat/iscsi	2012-07-16 13:10:14.000000000 -0400
> +++ macpros/iscsi	2012-07-16 14:50:57.000000000 -0400
> @@ -31,7 +31,6 @@
>  #	OCF_RESKEY_portal: the iSCSI portal address or host name (required)
>  #	OCF_RESKEY_target: the iSCSI target (required)
>  #	OCF_RESKEY_iscsiadm: iscsiadm program path (optional)
> -#	OCF_RESKEY_discovery_type: discovery type (optional; default: sendtargets)
>  #
>  # Initialization:
>  
> @@ -41,11 +40,9 @@
>  # Defaults
>  OCF_RESKEY_udev_default="yes"
>  OCF_RESKEY_iscsiadm_default="iscsiadm"
> -OCF_RESKEY_discovery_type_default="sendtargets"
>  
>  : ${OCF_RESKEY_udev=${OCF_RESKEY_udev_default}}
>  : ${OCF_RESKEY_iscsiadm=${OCF_RESKEY_iscsiadm_default}}
> -: ${OCF_RESKEY_discovery_type=${OCF_RESKEY_discovery_type_default}}
>  
>  usage() {
>    methods=`iscsi_methods`
> @@ -96,15 +93,6 @@
>  <content type="string" />
>  </parameter>
>  
> -<parameter name="discovery_type" unique="0" required="0">
> -<longdesc lang="en">
> -Target discovery type. Check the open-iscsi documentation for
> -supported discovery types.
> -</longdesc>
> -<shortdesc lang="en">Target discovery type</shortdesc>
> -<content type="string" default="${OCF_RESKEY_discovery_type_default}" />
> -</parameter>
> -
>  <parameter name="iscsiadm" unique="0" required="0">
>  <longdesc lang="en">
>  open-iscsi administration utility binary.
> @@ -128,8 +116,8 @@
>  </parameters>
>  
>  <actions>
> -<action name="start" timeout="120" />
> -<action name="stop" timeout="120" />
> +<action name="start" timeout="60" />
> +<action name="stop" timeout="60" />
>  <action name="status" timeout="30" />
>  <action name="monitor" depth="0" timeout="30" interval="120" />
>  <action name="validate-all" timeout="5" />
> @@ -166,7 +154,6 @@
>  	fi
>  }
>  open_iscsi_setup() {
> -	discovery=open_iscsi_discovery
>  	add_disk=open_iscsi_add
>  	remove_disk=open_iscsi_remove
>  	disk_status=open_iscsi_status
> @@ -179,72 +166,6 @@
>  		return $OCF_ERR_INSTALLED
>  }
>  
> -#
> -# discovery return codes:
> -#   0: ok (variable portal set)
> -#   1: target not found
> -#   2: target found but can't connect it unambigously
> -#   3: iscsiadm returned error
> -#
> -# open-iscsi >= "2.0-872" changed discovery semantics
> -# see http://www.mail-archive.com/open-iscsi@googlegroups.com/msg04883.html
> -# there's a new discoverydb command which should be used instead discovery
> - 
> -open_iscsi_discovery() {
> -	local output
> -	local severity=err
> -	local discovery_variant="discovery"
> -	local options=""
> -	local cmd
> -	local version=`$iscsiadm --version | awk '{print $3}'`
> -
> -	ocf_version_cmp "$version" "2.0-871"
> -	if [ $? -eq 2 ]; then # newer than 2.0-871?
> -		discovery_variant="discoverydb"
> -		[ "$discovery_type" = "sendtargets" ] &&
> -			options="-D"
> -	fi
> -	cmd="$iscsiadm -m $discovery_variant -p $OCF_RESKEY_portal -t $discovery_type $options"
> -	ocf_is_probe && severity=info
> -	output=`$cmd`
> -	if [ $? -ne 0 -o x = "x$output" ]; then
> -		[ x != "x$output" ] && {
> -			ocf_log $severity "$cmd FAILED"
> -			echo "$output"
> -		}
> -		return 3
> -	fi
> -	portal=`echo "$output" |
> -		awk -v target="$OCF_RESKEY_target" '
> -		$NF==target{
> -			if( NF==3 ) portal=$2; # sles compat mode
> -			else portal=$1;
> -			sub(",.*","",portal);
> -			print portal;
> -		}'`
> -
> -	case `echo "$portal" | wc -w` in
> -	0) #target not found
> -		echo "$output"
> -		ocf_log $severity "target $OCF_RESKEY_target not found at portal $OCF_RESKEY_portal"
> -		return 1
> -	;;
> -	1) #we're ok
> -		return 0
> -	;;
> -	*) # handle multihome hosts reporting multiple portals
> -		for p in $portal; do
> -			if [ "$OCF_RESKEY_portal" = "$p" ]; then
> -				portal="$OCF_RESKEY_portal"
> -				return 0
> -			fi
> -		done
> -		echo "$output"
> -		ocf_log err "sorry, can't handle multihomed hosts unless you specify the portal exactly"
> -		return 2
> -	;;
> -	esac
> -}
>  open_iscsi_add() {
>  	$iscsiadm -m node -p $1 -T $2 -l
>  }
> @@ -259,7 +180,7 @@
>  # NB: this is udev specific!
>  #
>  wait_for_udev() {
> -	dev=/dev/disk/by-path/ip-$portal-iscsi-$OCF_RESKEY_target
> +	dev=/dev/disk/by-path/ip-${OCF_RESKEY_portal}-iscsi-$OCF_RESKEY_target
>  	while :; do
>  		ls $dev* >/dev/null 2>&1 && break
>  		ocf_log warning "waiting for udev to create $dev" 
> @@ -267,7 +188,7 @@
>  	done
>  }
>  iscsi_status() {
> -	if $disk_status $portal $OCF_RESKEY_target; then
> +	if $disk_status ${OCF_RESKEY_portal} $OCF_RESKEY_target; then
>  		return $OCF_SUCCESS
>  	else
>  		return $OCF_NOT_RUNNING
> @@ -275,10 +196,10 @@
>  }
>  iscsi_start() {
>  	if iscsi_status; then
> -		ocf_log info "iscsi $portal $OCF_RESKEY_target already running"
> +		ocf_log info "iscsi ${OCF_RESKEY_portal} $OCF_RESKEY_target already running"
>  		return $OCF_SUCCESS
>  	else
> -		$add_disk $portal $OCF_RESKEY_target ||
> +		$add_disk ${OCF_RESKEY_portal} $OCF_RESKEY_target ||
>  			return $OCF_ERR_GENERIC
>  		case "$udev" in
>  		[Yy]es) wait_for_udev ||
> @@ -295,7 +216,7 @@
>  }
>  iscsi_stop() {
>  	if iscsi_status; then
> -		$remove_disk $portal $OCF_RESKEY_target ||
> +		$remove_disk ${OCF_RESKEY_portal} $OCF_RESKEY_target ||
>  			return $OCF_ERR_GENERIC
>  		if iscsi_status; then
>  			return $OCF_ERR_GENERIC
> @@ -303,13 +224,13 @@
>  			return $OCF_SUCCESS
>  		fi
>  	else
> -		ocf_log info "iscsi $portal $OCF_RESKEY_target already stopped"
> +		ocf_log info "iscsi ${OCF_RESKEY_portal} $OCF_RESKEY_target already stopped"
>  		return $OCF_SUCCESS
>  	fi
>  }
>  
>  iscsi_monitor() {
> -	if $disk_status $portal $OCF_RESKEY_target; then
> +	if $disk_status ${OCF_RESKEY_portal} $OCF_RESKEY_target; then
>  		return $OCF_SUCCESS
>      else
>  		return $OCF_NOT_RUNNING
> @@ -371,9 +292,7 @@
>  	exit $OCF_ERR_PERM
>  fi
>  
> -discovery_type=${OCF_RESKEY_discovery_type}
>  udev=${OCF_RESKEY_udev}
> -$discovery  # discover and setup the real portal string (address)
>  case $? in
>  0) ;;
>  1) [ "$1" = stop ] && exit $OCF_SUCCESS

> _______________________________________________
> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
> 
> Project Home: http://www.clusterlabs.org
> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> Bugs: http://bugs.clusterlabs.org





More information about the Pacemaker mailing list