* [PATCH 0/4] multipath-tools rbd checker fixes
@ 2016-08-31 21:44 Mike Christie
2016-08-31 21:44 ` [PATCH 1/4] rbd: fix sync repair support Mike Christie
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Mike Christie @ 2016-08-31 21:44 UTC (permalink / raw)
To: dm-devel, christophe.varoqui
The following patches fix some minor issues in the rbd checker.
They were made over the upsteam multipath-tools git tree.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/4] rbd: fix sync repair support
2016-08-31 21:44 [PATCH 0/4] multipath-tools rbd checker fixes Mike Christie
@ 2016-08-31 21:44 ` Mike Christie
2016-08-31 21:44 ` [PATCH 2/4] rbd: check for nonshared clients Mike Christie
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Mike Christie @ 2016-08-31 21:44 UTC (permalink / raw)
To: dm-devel, christophe.varoqui; +Cc: Mike Christie
If sync was set we were calling check instead
of function passed in.
Signed-off-by: Mike Christie <mchristi@redhat.com>
---
libmultipath/checkers/rbd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libmultipath/checkers/rbd.c b/libmultipath/checkers/rbd.c
index 7f540ad..f7b1087 100644
--- a/libmultipath/checkers/rbd.c
+++ b/libmultipath/checkers/rbd.c
@@ -554,7 +554,7 @@ static int rbd_exec_fn(struct checker *c, thread_fn *fn)
int rbd_status, r;
if (c->sync)
- return rbd_check(ct, c->message);
+ return fn(ct, c->message);
/*
* Async mode
*/
--
2.7.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] rbd: check for nonshared clients
2016-08-31 21:44 [PATCH 0/4] multipath-tools rbd checker fixes Mike Christie
2016-08-31 21:44 ` [PATCH 1/4] rbd: fix sync repair support Mike Christie
@ 2016-08-31 21:44 ` Mike Christie
2016-08-31 21:44 ` [PATCH 3/4] rbd: check for exclusive lock enabled Mike Christie
2016-08-31 21:44 ` [PATCH 4/4] rbd: fixup log messages Mike Christie
3 siblings, 0 replies; 5+ messages in thread
From: Mike Christie @ 2016-08-31 21:44 UTC (permalink / raw)
To: dm-devel, christophe.varoqui; +Cc: Mike Christie
The rbd checker only supports nonshared clients so add a check
during init time.
Signed-off-by: Mike Christie <mchristi@redhat.com>
---
libmultipath/checkers/rbd.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libmultipath/checkers/rbd.c b/libmultipath/checkers/rbd.c
index f7b1087..6542bdb 100644
--- a/libmultipath/checkers/rbd.c
+++ b/libmultipath/checkers/rbd.c
@@ -123,6 +123,11 @@ int libcheck_init(struct checker * c)
if (!config_info)
goto free_addr;
+ if (!strstr(config_info, "noshare")) {
+ condlog(3, "Only nonshared clients supported.");
+ goto free_addr;
+ }
+
ct->config_info = strdup(config_info);
if (!ct->config_info)
goto free_addr;
--
2.7.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] rbd: check for exclusive lock enabled
2016-08-31 21:44 [PATCH 0/4] multipath-tools rbd checker fixes Mike Christie
2016-08-31 21:44 ` [PATCH 1/4] rbd: fix sync repair support Mike Christie
2016-08-31 21:44 ` [PATCH 2/4] rbd: check for nonshared clients Mike Christie
@ 2016-08-31 21:44 ` Mike Christie
2016-08-31 21:44 ` [PATCH 4/4] rbd: fixup log messages Mike Christie
3 siblings, 0 replies; 5+ messages in thread
From: Mike Christie @ 2016-08-31 21:44 UTC (permalink / raw)
To: dm-devel, christophe.varoqui; +Cc: Mike Christie
Only attach the checker if the rbd image has the exclusive lock
enabled.
Signed-off-by: Mike Christie <mchristi@redhat.com>
---
libmultipath/checkers/rbd.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/libmultipath/checkers/rbd.c b/libmultipath/checkers/rbd.c
index 6542bdb..175c4a6 100644
--- a/libmultipath/checkers/rbd.c
+++ b/libmultipath/checkers/rbd.c
@@ -33,6 +33,8 @@ typedef int (thread_fn)(struct rbd_checker_context *ct, char *msg);
#define RBD_MSG(msg, fmt, args...) snprintf(msg, CHECKER_MSG_LEN, fmt, ##args);
+#define RBD_FEATURE_EXCLUSIVE_LOCK (1 << 2)
+
struct rbd_checker_context {
int rbd_bus_id;
char *client_addr;
@@ -65,8 +67,9 @@ int libcheck_init(struct checker * c)
struct udev_device *bus_dev;
struct udev *udev;
struct stat sb;
- const char *block_name, *addr, *config_info;
+ const char *block_name, *addr, *config_info, *features_str;
const char *image, *pool, *snap, *username;
+ uint64_t features = 0;
char sysfs_path[PATH_SIZE];
int ret;
@@ -119,6 +122,15 @@ int libcheck_init(struct checker * c)
if (!ct->client_addr)
goto free_dev;
+ features_str = udev_device_get_sysattr_value(bus_dev, "features");
+ if (!features_str)
+ goto free_addr;
+ features = strtoll(features_str, NULL, 16);
+ if (!(features & RBD_FEATURE_EXCLUSIVE_LOCK)) {
+ condlog(3, "Exclusive lock not set.");
+ goto free_addr;
+ }
+
config_info = udev_device_get_sysattr_value(bus_dev, "config_info");
if (!config_info)
goto free_addr;
--
2.7.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] rbd: fixup log messages
2016-08-31 21:44 [PATCH 0/4] multipath-tools rbd checker fixes Mike Christie
` (2 preceding siblings ...)
2016-08-31 21:44 ` [PATCH 3/4] rbd: check for exclusive lock enabled Mike Christie
@ 2016-08-31 21:44 ` Mike Christie
3 siblings, 0 replies; 5+ messages in thread
From: Mike Christie @ 2016-08-31 21:44 UTC (permalink / raw)
To: dm-devel, christophe.varoqui; +Cc: Mike Christie
Add rbd device prefix to condlog messages that was missing it, and drop
it in RBD_MSG because it is already added by caller.
Signed-off-by: Mike Christie <mchristi@redhat.com>
---
libmultipath/checkers/rbd.c | 67 +++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/libmultipath/checkers/rbd.c b/libmultipath/checkers/rbd.c
index 175c4a6..ea3e95c 100644
--- a/libmultipath/checkers/rbd.c
+++ b/libmultipath/checkers/rbd.c
@@ -113,8 +113,8 @@ int libcheck_init(struct checker * c)
addr = udev_device_get_sysattr_value(bus_dev, "client_addr");
if (!addr) {
- condlog(0, "Could not find client_addr in rbd sysfs. Try "
- "updating kernel");
+ condlog(0, "rbd%d: Could not find client_addr in rbd sysfs. "
+ "Try updating kernel", ct->rbd_bus_id);
goto free_dev;
}
@@ -127,7 +127,7 @@ int libcheck_init(struct checker * c)
goto free_addr;
features = strtoll(features_str, NULL, 16);
if (!(features & RBD_FEATURE_EXCLUSIVE_LOCK)) {
- condlog(3, "Exclusive lock not set.");
+ condlog(3, "rbd%d: Exclusive lock not set.", ct->rbd_bus_id);
goto free_addr;
}
@@ -136,7 +136,8 @@ int libcheck_init(struct checker * c)
goto free_addr;
if (!strstr(config_info, "noshare")) {
- condlog(3, "Only nonshared clients supported.");
+ condlog(3, "rbd%d: Only nonshared clients supported.",
+ ct->rbd_bus_id);
goto free_addr;
}
@@ -189,18 +190,20 @@ int libcheck_init(struct checker * c)
}
if (rados_create(&ct->cluster, NULL) < 0) {
- condlog(0, "Could not create rados cluster");
+ condlog(0, "rbd%d: Could not create rados cluster",
+ ct->rbd_bus_id);
goto free_snap;
}
if (rados_conf_read_file(ct->cluster, NULL) < 0) {
- condlog(0, "Could not read rados conf");
+ condlog(0, "rbd%d: Could not read rados conf", ct->rbd_bus_id);
goto shutdown_rados;
}
ret = rados_connect(ct->cluster);
if (ret < 0) {
- condlog(0, "Could not connect to rados cluster");
+ condlog(0, "rbd%d: Could not connect to rados cluster",
+ ct->rbd_bus_id);
goto shutdown_rados;
}
@@ -291,8 +294,7 @@ static int rbd_is_blacklisted(struct rbd_checker_context *ct, char *msg)
ret = rados_mon_command(ct->cluster, (const char **)cmd, 1, "", 0,
&blklist, &blklist_len, &stat, &stat_len);
if (ret < 0) {
- RBD_MSG(msg, "rbd checker failed: mon command failed %d",
- ret);
+ RBD_MSG(msg, "checker failed: mon command failed %d", ret);
return ret;
}
@@ -313,16 +315,15 @@ static int rbd_is_blacklisted(struct rbd_checker_context *ct, char *msg)
end = strchr(addr_tok, ' ');
if (!end) {
- RBD_MSG(msg, "rbd%d checker failed: invalid blacklist %s",
- ct->rbd_bus_id, addr_tok);
+ RBD_MSG(msg, "checker failed: invalid blacklist %s",
+ addr_tok);
break;
}
*end = '\0';
if (!strcmp(addr_tok, ct->client_addr)) {
ct->blacklisted = 1;
- RBD_MSG(msg, "rbd%d checker: %s is blacklisted",
- ct->rbd_bus_id, ct->client_addr);
+ RBD_MSG(msg, "%s is blacklisted", ct->client_addr);
ret = 1;
break;
}
@@ -339,7 +340,7 @@ int rbd_check(struct rbd_checker_context *ct, char *msg)
if (ct->blacklisted || rbd_is_blacklisted(ct, msg) == 1)
return PATH_DOWN;
- RBD_MSG(msg, "rbd checker reports path is up");
+ RBD_MSG(msg, "checker reports path is up");
/*
* Path may have issues, but the ceph cluster is at least
* accepting IO, so we can attempt to do IO.
@@ -411,10 +412,12 @@ static int rbd_remap(struct rbd_checker_context *ct)
argv[i] = NULL;
ret = execvp(argv[0], argv);
- condlog(0, "Error executing rbd: %s", strerror(errno));
+ condlog(0, "rbd%d: Error executing rbd: %s", ct->rbd_bus_id,
+ strerror(errno));
exit(-1);
case -1:
- condlog(0, "fork failed: %s", strerror(errno));
+ condlog(0, "rbd%d: fork failed: %s", ct->rbd_bus_id,
+ strerror(errno));
return -1;
default:
ret = -1;
@@ -424,7 +427,8 @@ static int rbd_remap(struct rbd_checker_context *ct)
if (status == 0)
ret = 0;
else
- condlog(0, "rbd failed with %d", status);
+ condlog(0, "rbd%d: failed with %d",
+ ct->rbd_bus_id, status);
}
}
@@ -454,12 +458,12 @@ static int rbd_rm_blacklist(struct rbd_checker_context *ct)
ret = rados_mon_command(ct->cluster, (const char **)cmd, 1, "", 0,
NULL, 0, &stat, &stat_len);
if (ret < 0) {
- condlog(1, "rbd%d repair failed to remove blacklist for %s %d",
+ condlog(1, "rbd%d: repair failed to remove blacklist for %s %d",
ct->rbd_bus_id, ct->client_addr, ret);
goto free_cmd;
}
- condlog(1, "rbd%d repair rm blacklist for %s",
+ condlog(1, "rbd%d: repair rm blacklist for %s",
ct->rbd_bus_id, ct->client_addr);
free(stat);
free_cmd:
@@ -478,8 +482,7 @@ static int rbd_repair(struct rbd_checker_context *ct, char *msg)
if (!ct->remapped) {
ret = rbd_remap(ct);
if (ret) {
- RBD_MSG(msg, "rbd%d repair failed to remap. Err %d",
- ct->rbd_bus_id, ret);
+ RBD_MSG(msg, "repair failed to remap. Err %d", ret);
return PATH_DOWN;
}
}
@@ -488,22 +491,21 @@ static int rbd_repair(struct rbd_checker_context *ct, char *msg)
snprintf(del, sizeof(del), "%d force", ct->rbd_bus_id);
ret = sysfs_write_rbd_remove(del, strlen(del) + 1);
if (ret) {
- RBD_MSG(msg, "rbd%d repair failed to clean up. Err %d",
- ct->rbd_bus_id, ret);
+ RBD_MSG(msg, "repair failed to clean up. Err %d", ret);
return PATH_DOWN;
}
ret = rbd_rm_blacklist(ct);
if (ret) {
- RBD_MSG(msg, "rbd%d repair could not remove blacklist entry. Err %d",
- ct->rbd_bus_id, ret);
+ RBD_MSG(msg, "repair could not remove blacklist entry. Err %d",
+ ret);
return PATH_DOWN;
}
ct->remapped = 0;
ct->blacklisted = 0;
- RBD_MSG(msg, "rbd%d has been repaired", ct->rbd_bus_id);
+ RBD_MSG(msg, "has been repaired");
return PATH_UP;
}
@@ -528,7 +530,7 @@ void *rbd_thread(void *ctx)
struct rbd_checker_context *ct = ctx;
int state;
- condlog(3, "rbd%d thread starting up", ct->rbd_bus_id);
+ condlog(3, "rbd%d: thread starting up", ct->rbd_bus_id);
ct->message[0] = '\0';
/* This thread can be canceled, so setup clean up */
@@ -547,7 +549,7 @@ void *rbd_thread(void *ctx)
pthread_mutex_unlock(&ct->lock);
pthread_cond_signal(&ct->active);
- condlog(3, "rbd%d thead finished, state %s", ct->rbd_bus_id,
+ condlog(3, "rbd%d: thead finished, state %s", ct->rbd_bus_id,
checker_state_name(state));
rbd_thread_cleanup_pop(ct);
return ((void *)0);
@@ -577,16 +579,17 @@ static int rbd_exec_fn(struct checker *c, thread_fn *fn)
*/
r = pthread_mutex_lock(&ct->lock);
if (r != 0) {
- condlog(2, "rbd%d mutex lock failed with %d", ct->rbd_bus_id,
+ condlog(2, "rbd%d: mutex lock failed with %d", ct->rbd_bus_id,
r);
- MSG(c, "rbd%d thread failed to initialize", ct->rbd_bus_id);
+ MSG(c, "rbd%d: thread failed to initialize", ct->rbd_bus_id);
return PATH_WILD;
}
if (ct->running) {
/* Check if checker is still running */
if (ct->thread) {
- condlog(3, "rbd%d thread not finished", ct->rbd_bus_id);
+ condlog(3, "rbd%d: thread not finished",
+ ct->rbd_bus_id);
rbd_status = PATH_PENDING;
} else {
/* checker done */
@@ -623,7 +626,7 @@ static int rbd_exec_fn(struct checker *c, thread_fn *fn)
if (ct->thread &&
(rbd_status == PATH_PENDING || rbd_status == PATH_UNCHECKED)) {
- condlog(3, "rbd%d thread still running",
+ condlog(3, "rbd%d: thread still running",
ct->rbd_bus_id);
ct->running = 1;
rbd_status = PATH_PENDING;
--
2.7.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-08-31 21:44 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-31 21:44 [PATCH 0/4] multipath-tools rbd checker fixes Mike Christie
2016-08-31 21:44 ` [PATCH 1/4] rbd: fix sync repair support Mike Christie
2016-08-31 21:44 ` [PATCH 2/4] rbd: check for nonshared clients Mike Christie
2016-08-31 21:44 ` [PATCH 3/4] rbd: check for exclusive lock enabled Mike Christie
2016-08-31 21:44 ` [PATCH 4/4] rbd: fixup log messages Mike Christie
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).