[lvm-devel] master - lvmlockd: fixes for starting dlm global lockspace
David Teigland
teigland at fedoraproject.org
Thu Sep 3 21:48:59 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6240a7639d1473f7e22c8a8099176bc1b444d4d3
Commit: 6240a7639d1473f7e22c8a8099176bc1b444d4d3
Parent: 9e8b3d4a9825ecca3dc7a71f6379b63a27d6fa8c
Author: David Teigland <teigland at redhat.com>
AuthorDate: Thu Sep 3 16:42:19 2015 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Thu Sep 3 16:47:54 2015 -0500
lvmlockd: fixes for starting dlm global lockspace
Remove the optimization/shortcut for starting the dlm global
lockspace when it was already running.
Reenable automatically starting the dlm global lockspace
when a command attempts to use it and it's not yet started.
This had become disabled at some point.
---
daemons/lvmlockd/lvmlockd-core.c | 71 +++++++++++++++++++---------------
daemons/lvmlockd/lvmlockd-internal.h | 1 -
2 files changed, 40 insertions(+), 32 deletions(-)
diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c
index 36be584..ae6f5a1 100644
--- a/daemons/lvmlockd/lvmlockd-core.c
+++ b/daemons/lvmlockd/lvmlockd-core.c
@@ -2404,9 +2404,6 @@ out_act:
ls->drop_vg = drop_vg;
pthread_mutex_unlock(&lockspaces_mutex);
- if (gl_use_dlm && !strcmp(ls->name, gl_lsname_dlm))
- dlm_gl_lockspace_running = 0;
-
/* worker_thread will join this thread, and free the ls */
pthread_mutex_lock(&worker_mutex);
worker_wake = 1;
@@ -2592,22 +2589,14 @@ static int add_dlm_global_lockspace(struct action *act)
{
int rv;
- if (dlm_gl_lockspace_running)
- return -EEXIST;
- dlm_gl_lockspace_running = 1;
-
/*
- * There's a short period after which a previous gl lockspace thread
- * has set dlm_gl_lockspace_running = 0, but before its ls struct has
- * been deleted, during which this add_lockspace_thread() can fail with
- * -EAGAIN.
+ * FIXME: optimize this by setting a flag to indicate that the
+ * dlm global lockspace is running so we can quit here.
*/
rv = add_lockspace_thread(gl_lsname_dlm, NULL, NULL, LD_LM_DLM, NULL, act);
- if (rv < 0) {
+ if (rv < 0)
log_debug("add_dlm_global_lockspace add_lockspace_thread %d", rv);
- dlm_gl_lockspace_running = 0;
- }
return rv;
}
@@ -3535,15 +3524,27 @@ static int add_lock_action(struct action *act)
memset(ls_name, 0, sizeof(ls_name));
- /* Determine which lockspace this action is for, and set ls_name. */
+ /*
+ * Determine which lockspace this action is for, and set ls_name.
+ */
- if (act->rt == LD_RT_GL && gl_use_sanlock &&
- (act->op == LD_OP_ENABLE || act->op == LD_OP_DISABLE))
- vg_ls_name(act->vg_name, ls_name);
- else if (act->rt == LD_RT_GL)
- gl_ls_name(ls_name);
- else
+ if (act->rt == LD_RT_GL) {
+ /* Global lock is requested */
+ if (gl_use_sanlock && (act->op == LD_OP_ENABLE || act->op == LD_OP_DISABLE)) {
+ vg_ls_name(act->vg_name, ls_name);
+ } else {
+ if (!gl_use_dlm && !gl_use_sanlock) {
+ if (lm_is_running_dlm())
+ gl_use_dlm = 1;
+ else if (lm_is_running_sanlock())
+ gl_use_sanlock = 1;
+ }
+ gl_ls_name(ls_name);
+ }
+ } else {
+ /* VG lock is requested */
vg_ls_name(act->vg_name, ls_name);
+ }
retry:
pthread_mutex_lock(&lockspaces_mutex);
@@ -3552,35 +3553,43 @@ static int add_lock_action(struct action *act)
pthread_mutex_unlock(&lockspaces_mutex);
if (!ls) {
if (act->op == LD_OP_UPDATE && act->rt == LD_RT_VG) {
- log_debug("lockspace not found ignored for vg update");
+ log_debug("lockspace \"%s\" not found ignored for vg update", ls_name);
return -ENOLS;
} else if (act->flags & LD_AF_SEARCH_LS) {
- /* fail if we've already tried searching for the ls */
- log_debug("lockspace search repeated %s", ls_name);
+ /*
+ * Fail if we've already tried searching for the lockspace.
+ */
+ log_debug("lockspace \"%s\" not found after search", ls_name);
return -ENOLS;
} else if (act->op == LD_OP_LOCK && act->rt == LD_RT_GL && gl_use_sanlock) {
- /* gl may have been enabled in an existing vg */
- log_debug("gl lockspace not found check sanlock vgs");
+ /*
+ * The sanlock global lock may have been enabled in an existing VG,
+ * so search existing VGs for an enabled global lock.
+ */
+ log_debug("lockspace \"%s\" not found for sanlock gl, searching...", ls_name);
act->flags |= LD_AF_SEARCH_LS;
add_work_action(act);
return 0;
- } else if (act->op == LD_OP_LOCK && act->rt == LD_RT_GL && gl_use_dlm) {
- log_debug("gl lockspace not found add dlm global");
+ } else if (act->op == LD_OP_LOCK && act->rt == LD_RT_GL && act->mode != LD_LK_UN && gl_use_dlm) {
+ /*
+ * Automatically start the dlm global lockspace when
+ * a command tries to acquire the global lock.
+ */
+ log_debug("lockspace \"%s\" not found for dlm gl, adding...", ls_name);
act->flags |= LD_AF_SEARCH_LS;
act->flags |= LD_AF_WAIT_STARTING;
add_dlm_global_lockspace(NULL);
- gl_ls_name(ls_name);
goto retry;
} else if (act->op == LD_OP_LOCK && act->mode == LD_LK_UN) {
- log_debug("lockspace not found ignored for unlock");
+ log_debug("lockspace \"%s\" not found for unlock ignored", ls_name);
return -ENOLS;
} else {
- log_debug("lockspace not found %s", ls_name);
+ log_debug("lockspace \"%s\" not found", ls_name);
return -ENOLS;
}
}
diff --git a/daemons/lvmlockd/lvmlockd-internal.h b/daemons/lvmlockd/lvmlockd-internal.h
index 9d360ed..68dcd9d 100644
--- a/daemons/lvmlockd/lvmlockd-internal.h
+++ b/daemons/lvmlockd/lvmlockd-internal.h
@@ -313,7 +313,6 @@ static inline int list_empty(const struct list_head *head)
* or when disable_gl matches.
*/
-EXTERN int dlm_gl_lockspace_running;
EXTERN int gl_type_static;
EXTERN int gl_use_dlm;
EXTERN int gl_use_sanlock;
More information about the lvm-devel
mailing list