[dm-devel] multipathd can fail to monitor paths in some corner cases

christophe varoqui christophe.varoqui at free.fr
Fri Jul 1 21:48:21 UTC 2005


Would you adhere to this variant ?

... because :

1) disass*table is always called before disass*status
2) saves a couple of loops

Anyway, did you solve your git problems ?
Your testing would be much appreciated on HEAD.

Regards,
cvaroqui

--- b40790b47efc2b5e50b241945bfca58c569e91ee/libmultipath/dmparser.c
(mode:100644)
+++ uncommitted/libmultipath/dmparser.c  (mode:100644)
@@ -216,9 +216,20 @@
                        if (store_path(pgp->paths, pp))
                                goto out;

+                       /*
+                        * Update wwid for multipaths which are not set
+                        * in the get_dm_mpvec() code path
+                        */
                        if (!strlen(mpp->wwid))
                                strncpy(mpp->wwid, pp->wwid, WWID_SIZE);

+                       /*
+                        * Update wwid for paths which may not have been
+                        * active at the time the getuid callout was run
+                        */
+                       else if (!strlen(pp->wwid))
+                               strncpy(pp->wwid, mpp->wwid, WWID_SIZE);
+
                        pgp->id ^= (long)pp;
                        pp->pgindex = i + 1;



On ven, 2005-07-01 at 17:03 -0400, goggin, edward wrote:
> Apologies in advance if this issue has been posted previously.
> 
> Any inability of multipathd to determine the multipath UID for a path which
> the multipath target
> driver is already using as a target device of a particular multipath mapped
> device can lead to a
> discrepancy in the set of paths to a block device used by the multipath
> target driver in the kernel
> and those paths to the block device monitored by multipathd in user space.
> 
> The case I have validated involves path failures between the last issuance
> of multipath and when
> multipathd is started, although there may be other similar transient errors
> which could cause
> similar results.  Since in these cases multipathd will not be managing all
> paths to a block device,
> for those paths not being managed by multipathd, kernel path state is not
> being accurately
> updated to reflect the actual physical path state of the paths.
> 
> While paths in the active path group will be updated to a failed state by
> the kernel multipath target driver,
> the state for these paths will never be updated to active as the path is
> physically reconnected.  Conversely,
> the path state for physically disconnected paths in the non-active path
> group(s) will incorrectly be
> displayed as active.  The path state for both categories of incorrectly
> displayed paths will only be
> updated to failed in the event someone manually restarts multipathd or runs
> multipath to reconfigure
> paths.  Obviously, these steps shouldn't be necessary.
> 
> The patch below fixes this problem by enabling disassemble_map() to populate
> the wwid field for
> a path in a mapped device's path group from the wwid field of the path's
> associated mapped device
> If the path's wwid field is currently not initialized.  Doing so is
> necessary since (1) this field was
> set to zeros during device discovery if the path was unusable at the time
> the path getuid callout
> was made, (2) a valid wwid field is necessary in order to match a path to
> its mapped device (mpp)
> structure, and (3) multipathd will not monitor a path which has no valid mpp
> structure.
> 
> The diff is based on 0.4.5-pre3.
> 
> diff -u multipath-tools-0.4.5-pre3.orig/libmultipath/dmparser.c
> multipath-tools-0.4.5-pre3-ed/libmultipath/dmparser.c
> --- multipath-tools-0.4.5-pre3.orig/libmultipath/dmparser.c	2005-06-10
> 03:28:53.000000000 -0500
> +++ multipath-tools-0.4.5-pre3-ed/libmultipath/dmparser.c	2005-07-01
> 15:19:29.250125016 -0500
> @@ -261,6 +261,15 @@
>  			for (k = 0; k < num_paths_args; k++)
>  				p += get_word(p, NULL);
>  		}
> +		/*
> +		 * Update wwid for paths which may not have been active at
> +		 * the time the getuid callout was run.
> +		 */
> +		for (j = 0; j < num_paths; j++) {
> +			pp = VECTOR_SLOT(pgp->paths, j);
> +			if (!strlen(pp->wwid))
> +				strncpy(pp->wwid, mpp->wwid, WWID_SIZE);
> +		}
>  	}
>  	return 0;
>  out1:
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
-- 
christophe varoqui <christophe.varoqui at free.fr>





More information about the dm-devel mailing list