[dm-devel] [RFC PATCH 3/6] multipathd: allow shutdown during configure()
Martin Wilck
mwilck at suse.com
Fri Jan 4 17:59:11 UTC 2019
reconfigure() can be a long-running operation; both initial path
discovery and initial map setup can take a long time. Allow
the main program to indicate that the process should be
interrupted if a shutdown signal was received.
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
libmultipath/configure.c | 5 +++++
libmultipath/discovery.c | 4 ++++
libmultipath/exit.h | 5 +++++
mpathpersist/main.c | 5 +++++
multipath/main.c | 6 ++++++
multipathd/main.c | 18 ++++++++++++++++++
6 files changed, 43 insertions(+)
create mode 100644 libmultipath/exit.h
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index 84ae5f56..2b062b35 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -43,6 +43,7 @@
#include "wwids.h"
#include "sysfs.h"
#include "io_err_stat.h"
+#include "exit.h"
/* group paths in pg by host adapter
*/
@@ -1021,6 +1022,10 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid,
vector_foreach_slot (pathvec, pp1, k) {
int invalid;
+
+ if (should_exit())
+ return CP_FAIL;
+
/* skip this path for some reason */
/* 1. if path has no unique id or wwid blacklisted */
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 7f983a63..3834685c 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -33,6 +33,7 @@
#include "unaligned.h"
#include "prioritizers/alua_rtpg.h"
#include "foreign.h"
+#include "exit.h"
int
alloc_path_with_pathinfo (struct config *conf, struct udev_device *udevice,
@@ -160,6 +161,9 @@ path_discovery (vector pathvec, int flag)
udev_list_entry_foreach(entry,
udev_enumerate_get_list_entry(udev_iter)) {
const char *devtype;
+
+ if (should_exit())
+ break;
devpath = udev_list_entry_get_name(entry);
condlog(4, "Discover device %s", devpath);
udevice = udev_device_new_from_syspath(udev, devpath);
diff --git a/libmultipath/exit.h b/libmultipath/exit.h
new file mode 100644
index 00000000..1954c5ce
--- /dev/null
+++ b/libmultipath/exit.h
@@ -0,0 +1,5 @@
+#ifndef _EXIT_H
+#define _EXIT_H
+
+extern int should_exit(void);
+#endif /* _EXIT_H */
diff --git a/mpathpersist/main.c b/mpathpersist/main.c
index 10cba452..fa831a07 100644
--- a/mpathpersist/main.c
+++ b/mpathpersist/main.c
@@ -7,6 +7,7 @@
#include "vector.h"
#include "config.h"
#include "structs.h"
+#include "exit.h"
#include <getopt.h>
#include <libudev.h>
#include "mpath_persist.h"
@@ -42,6 +43,10 @@ int construct_transportid(const char * inp, struct transportid transid[], int nu
int logsink;
struct config *multipath_conf;
+int should_exit(void)
+{
+ return 0;
+}
struct config *get_multipath_config(void)
{
diff --git a/multipath/main.c b/multipath/main.c
index f40c179b..a5ca10ca 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -63,8 +63,14 @@
#include "propsel.h"
#include "time-util.h"
#include "file.h"
+#include "exit.h"
int logsink;
+int should_exit(void)
+{
+ return 0;
+}
+
struct udev *udev;
struct config *multipath_conf;
diff --git a/multipathd/main.c b/multipathd/main.c
index 6fc6a3ac..413beee0 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -67,6 +67,7 @@ static int use_watchdog;
#include "uevent.h"
#include "log.h"
#include "uxsock.h"
+#include "exit.h"
#include "mpath_cmd.h"
#include "mpath_persist.h"
@@ -141,6 +142,11 @@ static inline enum daemon_status get_running_state(void)
return st;
}
+int should_exit(void)
+{
+ return get_running_state() == DAEMON_SHUTDOWN;
+}
+
/*
* global copy of vecs for use in sig handlers
*/
@@ -2355,6 +2361,9 @@ configure (struct vectors * vecs)
goto fail;
}
+ if (should_exit())
+ goto fail;
+
conf = get_multipath_config();
pthread_cleanup_push(put_multipath_config, conf);
vector_foreach_slot (vecs->pathvec, pp, i){
@@ -2371,6 +2380,9 @@ configure (struct vectors * vecs)
goto fail;
}
+ if (should_exit())
+ goto fail;
+
/*
* create new set of maps & push changed ones into dm
* In the first call, use FORCE_RELOAD_WEAK to avoid making
@@ -2385,6 +2397,9 @@ configure (struct vectors * vecs)
goto fail;
}
+ if (should_exit())
+ goto fail;
+
/*
* may need to remove some maps which are no longer relevant
* e.g., due to blacklist changes in conf file
@@ -2396,6 +2411,9 @@ configure (struct vectors * vecs)
dm_lib_release();
+ if (should_exit())
+ goto fail;
+
sync_maps_state(mpvec);
vector_foreach_slot(mpvec, mpp, i){
if (remember_wwid(mpp->wwid) == 1)
--
2.19.2
More information about the dm-devel
mailing list