[dm-devel] [PATCH v3] multipath: don't set queue_if_no_path without multipathd
Christophe Varoqui
christophe.varoqui at gmail.com
Mon Sep 26 19:01:02 UTC 2011
On lun., 2011-09-26 at 09:50 -0500, Benjamin Marzinski wrote:
> If multipathd is not running, when all paths to a device have failed, there's
> no way for them to automatically get restored. If the device is set to queue,
> whatever is accessing it will hang forever. This can lead to problems if it
> happens at boot-up. This patch unsets queue_if_no_path for all devices created
> when multipathd is not running. When multipathd starts, it will automatically
> get reset queue_if_no_path to the proper value. This new behaviour can be
> overridden using the new "-q" option to multipath.
>
> This version of the patch contacts multipathd's client socket to tell if it's
> running.
>
Applied.
Thanks for the refactoring.
> Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
> libmultipath/config.h | 1 +
> libmultipath/configure.c | 40 +++++++++++++++++++++++++++++++++++++++-
> multipath/main.c | 8 ++++++--
> 3 files changed, 46 insertions(+), 3 deletions(-)
>
> Index: multipath-tools-110916/libmultipath/config.h
> ===================================================================
> --- multipath-tools-110916.orig/libmultipath/config.h
> +++ multipath-tools-110916/libmultipath/config.h
> @@ -92,6 +92,7 @@ struct config {
> int attribute_flags;
> int fast_io_fail;
> unsigned int dev_loss;
> + int allow_queueing;
> uid_t uid;
> gid_t gid;
> mode_t mode;
> Index: multipath-tools-110916/libmultipath/configure.c
> ===================================================================
> --- multipath-tools-110916.orig/libmultipath/configure.c
> +++ multipath-tools-110916/libmultipath/configure.c
> @@ -35,6 +35,7 @@
> #include "alias.h"
> #include "prio.h"
> #include "util.h"
> +#include "uxsock.h"
>
> extern int
> setup_map (struct multipath * mpp, char * params, int params_size)
> @@ -448,6 +449,34 @@ deadmap (struct multipath * mpp)
> return 1; /* dead */
> }
>
> +int check_daemon(void)
> +{
> + int fd;
> + char *reply;
> + size_t len;
> + int ret = 0;
> +
> + fd = ux_socket_connect(DEFAULT_SOCKET);
> + if (fd == -1)
> + return 0;
> +
> + if (send_packet(fd, "show daemon", 12) != 0)
> + goto out;
> + if (recv_packet(fd, &reply, &len) != 0)
> + goto out;
> +
> + if (strstr(reply, "shutdown"))
> + goto out_free;
> +
> + ret = 1;
> +
> +out_free:
> + FREE(reply);
> +out:
> + close(fd);
> + return ret;
> +}
> +
> extern int
> coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, int force_reload)
> {
> @@ -555,7 +584,16 @@ coalesce_paths (struct vectors * vecs, v
> if (r == DOMAP_DRY)
> continue;
>
> - if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
> + if (!conf->daemon && !conf->allow_queueing && !check_daemon()) {
> + if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
> + mpp->no_path_retry != NO_PATH_RETRY_FAIL)
> + condlog(3, "%s: multipathd not running, unset "
> + "queue_if_no_path feature", mpp->alias);
> + if (!dm_queue_if_no_path(mpp->alias, 0))
> + remove_feature(&mpp->features,
> + "queue_if_no_path");
> + }
> + else if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
> if (mpp->no_path_retry == NO_PATH_RETRY_FAIL) {
> condlog(3, "%s: unset queue_if_no_path feature",
> mpp->alias);
> Index: multipath-tools-110916/multipath/main.c
> ===================================================================
> --- multipath-tools-110916.orig/multipath/main.c
> +++ multipath-tools-110916/multipath/main.c
> @@ -79,7 +79,7 @@ usage (char * progname)
> {
> fprintf (stderr, VERSION_STRING);
> fprintf (stderr, "Usage:\n");
> - fprintf (stderr, " %s [-d] [-r] [-v lvl] [-p pol] [-b fil] [dev]\n", progname);
> + fprintf (stderr, " %s [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
> fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
> fprintf (stderr, " %s -F [-v lvl]\n", progname);
> fprintf (stderr, " %s -t\n", progname);
> @@ -92,6 +92,7 @@ usage (char * progname)
> " -ll show multipath topology (maximum info)\n" \
> " -f flush a multipath device map\n" \
> " -F flush all multipath device maps\n" \
> + " -q allow queue_if_no_path when multipathd is not running\n"\
> " -d dry run, do not create or update devmaps\n" \
> " -t dump internal hardware table\n" \
> " -r force devmap reload\n" \
> @@ -397,7 +398,7 @@ main (int argc, char *argv[])
> condlog(0, "multipath tools need sysfs mounted");
> exit(1);
> }
> - while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Brt")) != EOF ) {
> + while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Brtq")) != EOF ) {
> switch(arg) {
> case 1: printf("optarg : %s\n",optarg);
> break;
> @@ -414,6 +415,9 @@ main (int argc, char *argv[])
> case 'B':
> conf->bindings_read_only = 1;
> break;
> + case 'q':
> + conf->allow_queueing = 1;
> + break;
> case 'd':
> conf->dry_run = 1;
> break;
More information about the dm-devel
mailing list