* [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal
@ 2018-11-02 12:23 Martin Wilck
2018-11-02 12:23 ` [PATCH v3 1/7] libmultipath: set pp->checkint in store_pathinfo() Martin Wilck
` (7 more replies)
0 siblings, 8 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:23 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
Hi Christophe,
this series, based on top of the recently submitted
"various multipath-tools patches (v2)" and "checkers overhaul (v3)"
series, fixes a problem that I recently observed: despite
ee01e841 "multipathd: handle errors in uxlsnr as fatal", multipathd
sometimes doesn't quit when the socket setup fails.
While at that, I stumbled upon init_path_check_interval(), wondered
about its purpose, and came to the conclusion that can be quite
easily obsoleted.
----
Changes v2->v3:
04/07: Fixed cleanup code path (Ben).
Changes v1->v2:
04/07: Fixed problem observed by Ben.
Martin Wilck (7):
libmultipath: set pp->checkint in store_pathinfo()
multipathd: remove init_path_check_interval()
multipathd: print error message if checkint is not initialized
multipathd: open client socket early
multipathd: set DAEMON_CONFIGURE from uxlsnr thread
multipathd: make DAEMON_SHUTDOWN a terminal state
multipathd: only grab conf once for filter_path()
libmultipath/defaults.h | 1 +
libmultipath/dict.c | 14 ++++-
libmultipath/discovery.c | 1 +
libmultipath/structs.c | 1 +
multipathd/cli_handlers.c | 10 ++--
multipathd/main.c | 109 +++++++++++++++++++++++++-------------
multipathd/uxlsnr.c | 14 +----
multipathd/uxlsnr.h | 5 +-
8 files changed, 98 insertions(+), 57 deletions(-)
--
2.19.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 1/7] libmultipath: set pp->checkint in store_pathinfo()
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
@ 2018-11-02 12:23 ` Martin Wilck
2018-11-02 12:23 ` [PATCH v3 2/7] multipathd: remove init_path_check_interval() Martin Wilck
` (6 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:23 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
store_pathinfo is called with valid conf pointer anyway, so
checkint is available. pp->checkint is now valid for every
path after path_discovery().
This fixes a bad conf access in cli_add_path().
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
libmultipath/discovery.c | 1 +
multipathd/cli_handlers.c | 1 -
multipathd/main.c | 2 --
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index a6159e4a..63558ad8 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -103,6 +103,7 @@ store_pathinfo (vector pathvec, struct config *conf,
err = store_path(pathvec, pp);
if (err)
goto out;
+ pp->checkint = conf->checkint;
out:
if (err)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 75000807..4aea4ce7 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -736,7 +736,6 @@ cli_add_path (void * v, char ** reply, int * len, void * data)
condlog(0, "%s: failed to store path info", param);
return 1;
}
- pp->checkint = conf->checkint;
}
return ev_add_path(pp, vecs, 1);
blacklisted:
diff --git a/multipathd/main.c b/multipathd/main.c
index c57aa392..958545a4 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2324,8 +2324,6 @@ configure (struct vectors * vecs)
free_path(pp);
i--;
}
- else
- pp->checkint = conf->checkint;
pthread_cleanup_pop(1);
}
if (map_discovery(vecs)) {
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/7] multipathd: remove init_path_check_interval()
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
2018-11-02 12:23 ` [PATCH v3 1/7] libmultipath: set pp->checkint in store_pathinfo() Martin Wilck
@ 2018-11-02 12:23 ` Martin Wilck
2018-11-02 12:23 ` [PATCH v3 3/7] multipathd: print error message if checkint is not initialized Martin Wilck
` (5 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:23 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
After "libmultipath: set pp->checkint in store_pathinfo()",
pp-checkint should always be properly initialized, so this code
is not needed any more.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
multipathd/main.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index 958545a4..dfc10e54 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2133,19 +2133,6 @@ check_path (struct vectors * vecs, struct path * pp, int ticks)
return 1;
}
-static void init_path_check_interval(struct vectors *vecs)
-{
- struct config *conf;
- struct path *pp;
- unsigned int i;
-
- vector_foreach_slot (vecs->pathvec, pp, i) {
- conf = get_multipath_config();
- pp->checkint = conf->checkint;
- put_multipath_config(conf);
- }
-}
-
static void *
checkerloop (void *ap)
{
@@ -2729,7 +2716,6 @@ child (void * param)
*/
post_config_state(DAEMON_CONFIGURE);
- init_path_check_interval(vecs);
if (poll_dmevents) {
if (init_dmevent_waiter(vecs)) {
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 3/7] multipathd: print error message if checkint is not initialized
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
2018-11-02 12:23 ` [PATCH v3 1/7] libmultipath: set pp->checkint in store_pathinfo() Martin Wilck
2018-11-02 12:23 ` [PATCH v3 2/7] multipathd: remove init_path_check_interval() Martin Wilck
@ 2018-11-02 12:23 ` Martin Wilck
2018-11-02 12:23 ` [PATCH v3 4/7] multipathd: open client socket early Martin Wilck
` (4 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:23 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
This is just a safety measure in case I overlooked something wrt
the checkint initialization. It could be reverted once we know the
error message isn't triggered.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
libmultipath/defaults.h | 1 +
libmultipath/dict.c | 14 ++++++++++++--
libmultipath/structs.c | 1 +
multipathd/main.c | 6 ++++++
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
index 7f3839fc..65769398 100644
--- a/libmultipath/defaults.h
+++ b/libmultipath/defaults.h
@@ -46,6 +46,7 @@
#define DEFAULT_UNKNOWN_FIND_MULTIPATHS_TIMEOUT 1
#define DEFAULT_ALL_TG_PT ALL_TG_PT_OFF
+#define CHECKINT_UNDEF (~0U)
#define DEFAULT_CHECKINT 5
#define MAX_CHECKINT(a) (a << 2)
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index c3f5a6e6..a81c051f 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -264,7 +264,17 @@ snprint_mp_ ## option (struct config *conf, char * buff, int len, \
return function (buff, len, mpe->option); \
}
-declare_def_handler(checkint, set_int)
+static int checkint_handler(struct config *conf, vector strvec)
+{
+ int rc = set_int(strvec, &conf->checkint);
+
+ if (rc)
+ return rc;
+ if (conf->checkint == CHECKINT_UNDEF)
+ conf->checkint--;
+ return 0;
+}
+
declare_def_snprint(checkint, print_int)
declare_def_handler(max_checkint, set_int)
@@ -1563,7 +1573,7 @@ init_keywords(vector keywords)
{
install_keyword_root("defaults", NULL);
install_keyword("verbosity", &def_verbosity_handler, &snprint_def_verbosity);
- install_keyword("polling_interval", &def_checkint_handler, &snprint_def_checkint);
+ install_keyword("polling_interval", &checkint_handler, &snprint_def_checkint);
install_keyword("max_polling_interval", &def_max_checkint_handler, &snprint_def_max_checkint);
install_keyword("reassign_maps", &def_reassign_maps_handler, &snprint_def_reassign_maps);
install_keyword("multipath_dir", &def_multipath_dir_handler, &snprint_def_multipath_dir);
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index caa178a6..fee899bd 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -100,6 +100,7 @@ alloc_path (void)
pp->fd = -1;
pp->tpgs = TPGS_UNDEF;
pp->priority = PRIO_UNDEF;
+ pp->checkint = CHECKINT_UNDEF;
checker_clear(&pp->checker);
dm_path_to_gen(pp)->ops = &dm_gen_path_ops;
pp->hwe = vector_alloc();
diff --git a/multipathd/main.c b/multipathd/main.c
index dfc10e54..a022bdb5 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1842,6 +1842,12 @@ check_path (struct vectors * vecs, struct path * pp, int ticks)
max_checkint = conf->max_checkint;
verbosity = conf->verbosity;
put_multipath_config(conf);
+
+ if (pp->checkint == CHECKINT_UNDEF) {
+ condlog(0, "%s: BUG: checkint is not set", pp->dev);
+ pp->checkint = checkint;
+ };
+
if (!pp->mpp && pp->initialized == INIT_MISSING_UDEV) {
if (pp->retriggers < retrigger_tries) {
condlog(2, "%s: triggering change event to reinitialize",
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 4/7] multipathd: open client socket early
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
` (2 preceding siblings ...)
2018-11-02 12:23 ` [PATCH v3 3/7] multipathd: print error message if checkint is not initialized Martin Wilck
@ 2018-11-02 12:23 ` Martin Wilck
2018-11-02 17:08 ` Benjamin Marzinski
2018-11-02 12:24 ` [PATCH v3 5/7] multipathd: set DAEMON_CONFIGURE from uxlsnr thread Martin Wilck
` (3 subsequent siblings)
7 siblings, 1 reply; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:23 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
Open the unix socket in multipathd code and pass the fd to
uxsock_listen(). This will enable us to make the main thread
wait for successful socket initialization in a follow-up patch.
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
multipathd/main.c | 27 ++++++++++++++++++++++-----
multipathd/uxlsnr.c | 14 ++------------
multipathd/uxlsnr.h | 5 +++--
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index a022bdb5..a91a14c6 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -66,6 +66,7 @@ static int use_watchdog;
#include "pgpolicies.h"
#include "uevent.h"
#include "log.h"
+#include "uxsock.h"
#include "mpath_cmd.h"
#include "mpath_persist.h"
@@ -1496,12 +1497,24 @@ uevqloop (void * ap)
static void *
uxlsnrloop (void * ap)
{
+ long ux_sock;
+
+ pthread_cleanup_push(rcu_unregister, NULL);
+ rcu_register_thread();
+
+ ux_sock = ux_socket_listen(DEFAULT_SOCKET);
+ if (ux_sock == -1) {
+ condlog(1, "could not create uxsock: %d", errno);
+ exit_daemon();
+ goto out;
+ }
+ pthread_cleanup_push(uxsock_cleanup, (void *)ux_sock);
+
if (cli_init()) {
condlog(1, "Failed to init uxsock listener");
- return NULL;
+ exit_daemon();
+ goto out_sock;
}
- pthread_cleanup_push(rcu_unregister, NULL);
- rcu_register_thread();
set_handler_callback(LIST+PATHS, cli_list_paths);
set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
@@ -1556,8 +1569,12 @@ uxlsnrloop (void * ap)
set_handler_callback(UNSETPRKEY+MAP, cli_unsetprkey);
umask(077);
- uxsock_listen(&uxsock_trigger, ap);
- pthread_cleanup_pop(1);
+ uxsock_listen(&uxsock_trigger, ux_sock, ap);
+
+out_sock:
+ pthread_cleanup_pop(1); /* uxsock_cleanup */
+out:
+ pthread_cleanup_pop(1); /* rcu_unregister */
return NULL;
}
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 6f666663..773bc878 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -165,24 +165,15 @@ void uxsock_cleanup(void *arg)
/*
* entry point
*/
-void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
+void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, long ux_sock,
+ void * trigger_data)
{
- long ux_sock;
int rlen;
char *inbuf;
char *reply;
sigset_t mask;
int old_clients = MIN_POLLS;
- ux_sock = ux_socket_listen(DEFAULT_SOCKET);
-
- if (ux_sock == -1) {
- condlog(1, "could not create uxsock: %d", errno);
- exit_daemon();
- }
-
- pthread_cleanup_push(uxsock_cleanup, (void *)ux_sock);
-
condlog(3, "uxsock: startup listener");
polls = (struct pollfd *)MALLOC((MIN_POLLS + 1) * sizeof(struct pollfd));
if (!polls) {
@@ -322,6 +313,5 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
}
}
- pthread_cleanup_pop(1);
return NULL;
}
diff --git a/multipathd/uxlsnr.h b/multipathd/uxlsnr.h
index d51a8f99..18f008d7 100644
--- a/multipathd/uxlsnr.h
+++ b/multipathd/uxlsnr.h
@@ -5,7 +5,8 @@
typedef int (uxsock_trigger_fn)(char *, char **, int *, bool, void *);
-void * uxsock_listen(uxsock_trigger_fn uxsock_trigger,
- void * trigger_data);
+void uxsock_cleanup(void *arg);
+void *uxsock_listen(uxsock_trigger_fn uxsock_trigger, long ux_sock,
+ void * trigger_data);
#endif
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 5/7] multipathd: set DAEMON_CONFIGURE from uxlsnr thread
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
` (3 preceding siblings ...)
2018-11-02 12:23 ` [PATCH v3 4/7] multipathd: open client socket early Martin Wilck
@ 2018-11-02 12:24 ` Martin Wilck
2018-11-02 12:24 ` [PATCH v3 6/7] multipathd: make DAEMON_SHUTDOWN a terminal state Martin Wilck
` (2 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:24 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
Commit ee01e841 had the intention to make multipathd quit if
the client socket couldn't be set up, because the unix socket
listener is vital for signal handling in multipathd.
But during startup, this condition might be lost if the main
thread doesn't wait for the unix listener to initialize.
Fixes: ee01e841 "multipathd: handle errors in uxlsnr as fatal"
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
multipathd/main.c | 43 ++++++++++++++++++++++++++++++++-----------
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index a91a14c6..9052b56d 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -207,9 +207,8 @@ static void config_cleanup(void *arg)
pthread_mutex_unlock(&config_lock);
}
-void post_config_state(enum daemon_status state)
+static void __post_config_state(enum daemon_status state)
{
- pthread_mutex_lock(&config_lock);
if (state != running_state) {
enum daemon_status old_state = running_state;
@@ -219,7 +218,14 @@ void post_config_state(enum daemon_status state)
do_sd_notify(old_state);
#endif
}
- pthread_mutex_unlock(&config_lock);
+}
+
+void post_config_state(enum daemon_status state)
+{
+ pthread_mutex_lock(&config_lock);
+ pthread_cleanup_push(config_cleanup, NULL);
+ __post_config_state(state);
+ pthread_cleanup_pop(1);
}
int set_config_state(enum daemon_status state)
@@ -1515,6 +1521,10 @@ uxlsnrloop (void * ap)
exit_daemon();
goto out_sock;
}
+
+ /* Tell main thread that thread has started */
+ post_config_state(DAEMON_CONFIGURE);
+
set_handler_callback(LIST+PATHS, cli_list_paths);
set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
@@ -2734,11 +2744,26 @@ child (void * param)
*/
conf = NULL;
- /*
- * Signal start of configuration
- */
- post_config_state(DAEMON_CONFIGURE);
+ pthread_cleanup_push(config_cleanup, NULL);
+ pthread_mutex_lock(&config_lock);
+ __post_config_state(DAEMON_IDLE);
+ rc = pthread_create(&uxlsnr_thr, &misc_attr, uxlsnrloop, vecs);
+ if (!rc) {
+ /* Wait for uxlsnr startup */
+ while (running_state == DAEMON_IDLE)
+ pthread_cond_wait(&config_cond, &config_lock);
+ }
+ pthread_cleanup_pop(1);
+
+ if (rc) {
+ condlog(0, "failed to create cli listener: %d", rc);
+ goto failed;
+ }
+ else if (running_state != DAEMON_CONFIGURE) {
+ condlog(0, "cli listener failed to start");
+ goto failed;
+ }
if (poll_dmevents) {
if (init_dmevent_waiter(vecs)) {
@@ -2761,10 +2786,6 @@ child (void * param)
goto failed;
}
pthread_attr_destroy(&uevent_attr);
- if ((rc = pthread_create(&uxlsnr_thr, &misc_attr, uxlsnrloop, vecs))) {
- condlog(0, "failed to create cli listener: %d", rc);
- goto failed;
- }
/*
* start threads
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 6/7] multipathd: make DAEMON_SHUTDOWN a terminal state
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
` (4 preceding siblings ...)
2018-11-02 12:24 ` [PATCH v3 5/7] multipathd: set DAEMON_CONFIGURE from uxlsnr thread Martin Wilck
@ 2018-11-02 12:24 ` Martin Wilck
2018-11-02 12:24 ` [PATCH v3 7/7] multipathd: only grab conf once for filter_path() Martin Wilck
2018-11-14 7:38 ` [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Christophe Varoqui
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:24 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
It can happen that, before the main thread reacts on DAEMON_SHUTDOWN
and starts cancelling threads, another thread resets the state to
something else. Fix that.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
multipathd/cli_handlers.c | 9 +++++++--
multipathd/main.c | 10 +++++++---
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 4aea4ce7..a0d57a53 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -1124,12 +1124,17 @@ cli_switch_group(void * v, char ** reply, int * len, void * data)
int
cli_reconfigure(void * v, char ** reply, int * len, void * data)
{
+ int rc;
+
condlog(2, "reconfigure (operator)");
- if (set_config_state(DAEMON_CONFIGURE) == ETIMEDOUT) {
+ rc = set_config_state(DAEMON_CONFIGURE);
+ if (rc == ETIMEDOUT) {
condlog(2, "timeout starting reconfiguration");
return 1;
- }
+ } else if (rc == EINVAL)
+ /* daemon shutting down */
+ return 1;
return 0;
}
diff --git a/multipathd/main.c b/multipathd/main.c
index 9052b56d..3cccc9f8 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -209,7 +209,7 @@ static void config_cleanup(void *arg)
static void __post_config_state(enum daemon_status state)
{
- if (state != running_state) {
+ if (state != running_state && running_state != DAEMON_SHUTDOWN) {
enum daemon_status old_state = running_state;
running_state = state;
@@ -237,7 +237,9 @@ int set_config_state(enum daemon_status state)
if (running_state != state) {
enum daemon_status old_state = running_state;
- if (running_state != DAEMON_IDLE) {
+ if (running_state == DAEMON_SHUTDOWN)
+ rc = EINVAL;
+ else if (running_state != DAEMON_IDLE) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
@@ -2212,7 +2214,9 @@ checkerloop (void *ap)
if (rc == ETIMEDOUT) {
condlog(4, "timeout waiting for DAEMON_IDLE");
continue;
- }
+ } else if (rc == EINVAL)
+ /* daemon shutdown */
+ break;
pthread_cleanup_push(cleanup_lock, &vecs->lock);
lock(&vecs->lock);
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 7/7] multipathd: only grab conf once for filter_path()
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
` (5 preceding siblings ...)
2018-11-02 12:24 ` [PATCH v3 6/7] multipathd: make DAEMON_SHUTDOWN a terminal state Martin Wilck
@ 2018-11-02 12:24 ` Martin Wilck
2018-11-14 7:38 ` [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Christophe Varoqui
7 siblings, 0 replies; 10+ messages in thread
From: Martin Wilck @ 2018-11-02 12:24 UTC (permalink / raw)
To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck
This saves a possibly large number of cleanup push/pop calls and
slightly improves readability.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
multipathd/main.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index 3cccc9f8..a445b050 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2340,16 +2340,17 @@ configure (struct vectors * vecs)
goto fail;
}
+ conf = get_multipath_config();
+ pthread_cleanup_push(put_multipath_config, conf);
vector_foreach_slot (vecs->pathvec, pp, i){
- conf = get_multipath_config();
- pthread_cleanup_push(put_multipath_config, conf);
if (filter_path(conf, pp) > 0){
vector_del_slot(vecs->pathvec, i);
free_path(pp);
i--;
}
- pthread_cleanup_pop(1);
}
+ pthread_cleanup_pop(1);
+
if (map_discovery(vecs)) {
condlog(0, "configure failed at map discovery");
goto fail;
--
2.19.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 4/7] multipathd: open client socket early
2018-11-02 12:23 ` [PATCH v3 4/7] multipathd: open client socket early Martin Wilck
@ 2018-11-02 17:08 ` Benjamin Marzinski
0 siblings, 0 replies; 10+ messages in thread
From: Benjamin Marzinski @ 2018-11-02 17:08 UTC (permalink / raw)
To: Martin Wilck; +Cc: dm-devel
On Fri, Nov 02, 2018 at 01:23:59PM +0100, Martin Wilck wrote:
> Open the unix socket in multipathd code and pass the fd to
> uxsock_listen(). This will enable us to make the main thread
> wait for successful socket initialization in a follow-up patch.
>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
> Signed-off-by: Martin Wilck <mwilck@suse.com>
> ---
> multipathd/main.c | 27 ++++++++++++++++++++++-----
> multipathd/uxlsnr.c | 14 ++------------
> multipathd/uxlsnr.h | 5 +++--
> 3 files changed, 27 insertions(+), 19 deletions(-)
>
> diff --git a/multipathd/main.c b/multipathd/main.c
> index a022bdb5..a91a14c6 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -66,6 +66,7 @@ static int use_watchdog;
> #include "pgpolicies.h"
> #include "uevent.h"
> #include "log.h"
> +#include "uxsock.h"
>
> #include "mpath_cmd.h"
> #include "mpath_persist.h"
> @@ -1496,12 +1497,24 @@ uevqloop (void * ap)
> static void *
> uxlsnrloop (void * ap)
> {
> + long ux_sock;
> +
> + pthread_cleanup_push(rcu_unregister, NULL);
> + rcu_register_thread();
> +
> + ux_sock = ux_socket_listen(DEFAULT_SOCKET);
> + if (ux_sock == -1) {
> + condlog(1, "could not create uxsock: %d", errno);
> + exit_daemon();
> + goto out;
> + }
> + pthread_cleanup_push(uxsock_cleanup, (void *)ux_sock);
> +
> if (cli_init()) {
> condlog(1, "Failed to init uxsock listener");
> - return NULL;
> + exit_daemon();
> + goto out_sock;
> }
> - pthread_cleanup_push(rcu_unregister, NULL);
> - rcu_register_thread();
> set_handler_callback(LIST+PATHS, cli_list_paths);
> set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
> set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
> @@ -1556,8 +1569,12 @@ uxlsnrloop (void * ap)
> set_handler_callback(UNSETPRKEY+MAP, cli_unsetprkey);
>
> umask(077);
> - uxsock_listen(&uxsock_trigger, ap);
> - pthread_cleanup_pop(1);
> + uxsock_listen(&uxsock_trigger, ux_sock, ap);
> +
> +out_sock:
> + pthread_cleanup_pop(1); /* uxsock_cleanup */
> +out:
> + pthread_cleanup_pop(1); /* rcu_unregister */
> return NULL;
> }
>
> diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
> index 6f666663..773bc878 100644
> --- a/multipathd/uxlsnr.c
> +++ b/multipathd/uxlsnr.c
> @@ -165,24 +165,15 @@ void uxsock_cleanup(void *arg)
> /*
> * entry point
> */
> -void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
> +void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, long ux_sock,
> + void * trigger_data)
> {
> - long ux_sock;
> int rlen;
> char *inbuf;
> char *reply;
> sigset_t mask;
> int old_clients = MIN_POLLS;
>
> - ux_sock = ux_socket_listen(DEFAULT_SOCKET);
> -
> - if (ux_sock == -1) {
> - condlog(1, "could not create uxsock: %d", errno);
> - exit_daemon();
> - }
> -
> - pthread_cleanup_push(uxsock_cleanup, (void *)ux_sock);
> -
> condlog(3, "uxsock: startup listener");
> polls = (struct pollfd *)MALLOC((MIN_POLLS + 1) * sizeof(struct pollfd));
> if (!polls) {
> @@ -322,6 +313,5 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
> }
> }
>
> - pthread_cleanup_pop(1);
> return NULL;
> }
> diff --git a/multipathd/uxlsnr.h b/multipathd/uxlsnr.h
> index d51a8f99..18f008d7 100644
> --- a/multipathd/uxlsnr.h
> +++ b/multipathd/uxlsnr.h
> @@ -5,7 +5,8 @@
>
> typedef int (uxsock_trigger_fn)(char *, char **, int *, bool, void *);
>
> -void * uxsock_listen(uxsock_trigger_fn uxsock_trigger,
> - void * trigger_data);
> +void uxsock_cleanup(void *arg);
> +void *uxsock_listen(uxsock_trigger_fn uxsock_trigger, long ux_sock,
> + void * trigger_data);
>
> #endif
> --
> 2.19.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
` (6 preceding siblings ...)
2018-11-02 12:24 ` [PATCH v3 7/7] multipathd: only grab conf once for filter_path() Martin Wilck
@ 2018-11-14 7:38 ` Christophe Varoqui
7 siblings, 0 replies; 10+ messages in thread
From: Christophe Varoqui @ 2018-11-14 7:38 UTC (permalink / raw)
To: Martin Wilck; +Cc: device-mapper development
[-- Attachment #1.1: Type: text/plain, Size: 1523 bytes --]
Merged.
Thanks.
On Fri, Nov 2, 2018 at 1:24 PM Martin Wilck <mwilck@suse.com> wrote:
> Hi Christophe,
>
> this series, based on top of the recently submitted
> "various multipath-tools patches (v2)" and "checkers overhaul (v3)"
> series, fixes a problem that I recently observed: despite
> ee01e841 "multipathd: handle errors in uxlsnr as fatal", multipathd
> sometimes doesn't quit when the socket setup fails.
>
> While at that, I stumbled upon init_path_check_interval(), wondered
> about its purpose, and came to the conclusion that can be quite
> easily obsoleted.
>
> ----
> Changes v2->v3:
> 04/07: Fixed cleanup code path (Ben).
>
> Changes v1->v2:
> 04/07: Fixed problem observed by Ben.
>
> Martin Wilck (7):
> libmultipath: set pp->checkint in store_pathinfo()
> multipathd: remove init_path_check_interval()
> multipathd: print error message if checkint is not initialized
> multipathd: open client socket early
> multipathd: set DAEMON_CONFIGURE from uxlsnr thread
> multipathd: make DAEMON_SHUTDOWN a terminal state
> multipathd: only grab conf once for filter_path()
>
> libmultipath/defaults.h | 1 +
> libmultipath/dict.c | 14 ++++-
> libmultipath/discovery.c | 1 +
> libmultipath/structs.c | 1 +
> multipathd/cli_handlers.c | 10 ++--
> multipathd/main.c | 109 +++++++++++++++++++++++++-------------
> multipathd/uxlsnr.c | 14 +----
> multipathd/uxlsnr.h | 5 +-
> 8 files changed, 98 insertions(+), 57 deletions(-)
>
> --
> 2.19.1
>
>
[-- Attachment #1.2: Type: text/html, Size: 1994 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2018-11-14 7:38 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-02 12:23 [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Martin Wilck
2018-11-02 12:23 ` [PATCH v3 1/7] libmultipath: set pp->checkint in store_pathinfo() Martin Wilck
2018-11-02 12:23 ` [PATCH v3 2/7] multipathd: remove init_path_check_interval() Martin Wilck
2018-11-02 12:23 ` [PATCH v3 3/7] multipathd: print error message if checkint is not initialized Martin Wilck
2018-11-02 12:23 ` [PATCH v3 4/7] multipathd: open client socket early Martin Wilck
2018-11-02 17:08 ` Benjamin Marzinski
2018-11-02 12:24 ` [PATCH v3 5/7] multipathd: set DAEMON_CONFIGURE from uxlsnr thread Martin Wilck
2018-11-02 12:24 ` [PATCH v3 6/7] multipathd: make DAEMON_SHUTDOWN a terminal state Martin Wilck
2018-11-02 12:24 ` [PATCH v3 7/7] multipathd: only grab conf once for filter_path() Martin Wilck
2018-11-14 7:38 ` [PATCH v3 0/7] multipathd: make uxlsnr errors really fatal Christophe Varoqui
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox