summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2015-07-23 10:34:24 -0500
committerDavid Teigland <teigland@redhat.com>2015-07-23 10:39:11 -0500
commit57534733b7750f17f5ffa115306dcb650d8015b9 (patch)
treee5846deaf1e8819f8f3a8b92db419bf178d8b466
parent1612c570b6412b68349b055ba3a6dab1796b8f35 (diff)
downloadlvm2-57534733b7750f17f5ffa115306dcb650d8015b9.tar.gz
lvmlockd: improve check for duplicate global locks
When there are duplicate global locks, check if the gl is still enabled each time a gl or vg lock is acquired in the lockspace. Once one of the duplicates is disabled, then other hosts will recognize that the issue is resolved without needing to restart the lockspaces.
-rw-r--r--daemons/lvmlockd/lvmlockd-core.c23
-rw-r--r--daemons/lvmlockd/lvmlockd-internal.h11
-rw-r--r--daemons/lvmlockd/lvmlockd-sanlock.c10
3 files changed, 24 insertions, 20 deletions
diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c
index a01c8a639..7375d9ea3 100644
--- a/daemons/lvmlockd/lvmlockd-core.c
+++ b/daemons/lvmlockd/lvmlockd-core.c
@@ -199,17 +199,6 @@ static struct list_head lockspaces;
static struct list_head lockspaces_inactive;
/*
- * This flag is set to 1 if we see multiple vgs with the global
- * lock enabled. While this is set, we return a special flag
- * with the vg lock result indicating to the lvm command that
- * there is a duplicate gl in the vg which should be resolved.
- * While this is set, find_lockspace_name has the side job of
- * counting the number of lockspaces with enabled gl's so that
- * this can be set back to zero when the duplicates are disabled.
- */
-static int sanlock_gl_dup;
-
-/*
* Client thread reads client requests and writes client results.
*/
static pthread_t client_thread;
@@ -1046,6 +1035,9 @@ static int res_lock(struct lockspace *ls, struct resource *r, struct action *act
log_debug("S %s R %s res_lock lm done r_version %u",
ls->name, r->name, r_version);
+ if (sanlock_gl_dup && ls->sanlock_gl_enabled)
+ act->flags |= LD_AF_DUP_GL_LS;
+
/* lm_lock() reads new r_version */
if ((r_version > r->version) || (!r->version && !r->version_zero_valid)) {
@@ -2096,9 +2088,6 @@ static void *lockspace_thread_main(void *arg_in)
act = list_first_entry(&ls->actions, struct action, list);
- if (sanlock_gl_dup && ls->sanlock_gl_enabled)
- act->flags |= LD_AF_DUP_GL_LS;
-
if (act->op == LD_OP_STOP) {
ls->thread_work = 0;
break;
@@ -3855,8 +3844,7 @@ static int print_lockspace(struct lockspace *ls, const char *prefix, int pos, in
"thread_work=%d "
"thread_stop=%d "
"thread_done=%d "
- "sanlock_gl_enabled=%d "
- "sanlock_gl_dup=%d\n",
+ "sanlock_gl_enabled=%d",
prefix,
ls->name,
ls->vg_name,
@@ -3870,8 +3858,7 @@ static int print_lockspace(struct lockspace *ls, const char *prefix, int pos, in
ls->thread_work ? 1 : 0,
ls->thread_stop ? 1 : 0,
ls->thread_done ? 1 : 0,
- ls->sanlock_gl_enabled ? 1 : 0,
- ls->sanlock_gl_dup ? 1 : 0);
+ ls->sanlock_gl_enabled ? 1 : 0);
}
static int print_action(struct action *act, const char *prefix, int pos, int len)
diff --git a/daemons/lvmlockd/lvmlockd-internal.h b/daemons/lvmlockd/lvmlockd-internal.h
index 1fd7125fd..7bbddb4a1 100644
--- a/daemons/lvmlockd/lvmlockd-internal.h
+++ b/daemons/lvmlockd/lvmlockd-internal.h
@@ -322,6 +322,17 @@ EXTERN int daemon_host_id;
EXTERN const char *daemon_host_id_file;
EXTERN int sanlock_io_timeout;
+/*
+ * This flag is set to 1 if we see multiple vgs with the global
+ * lock enabled. While this is set, we return a special flag
+ * with the vg lock result indicating to the lvm command that
+ * there is a duplicate gl in the vg which should be resolved.
+ * While this is set, find_lockspace_name has the side job of
+ * counting the number of lockspaces with enabled gl's so that
+ * this can be set back to zero when the duplicates are disabled.
+ */
+EXTERN int sanlock_gl_dup;
+
void log_level(int level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
#define log_debug(fmt, args...) log_level(LOG_DEBUG, fmt, ##args)
#define log_error(fmt, args...) log_level(LOG_ERR, fmt, ##args)
diff --git a/daemons/lvmlockd/lvmlockd-sanlock.c b/daemons/lvmlockd/lvmlockd-sanlock.c
index 28dac6bbd..44926da8b 100644
--- a/daemons/lvmlockd/lvmlockd-sanlock.c
+++ b/daemons/lvmlockd/lvmlockd-sanlock.c
@@ -801,8 +801,6 @@ int lm_able_gl_sanlock(struct lockspace *ls, int enable)
log_debug("S %s able_gl %s", ls->name, gl_name);
ls->sanlock_gl_enabled = enable;
- if (ls->sanlock_gl_dup && !enable)
- ls->sanlock_gl_dup = 0;
if (enable)
strncpy(gl_lsname_sanlock, ls->name, MAX_NAME);
@@ -1254,6 +1252,14 @@ int lm_lock_sanlock(struct lockspace *ls, struct resource *r, int ld_mode,
rs = &rds->rs;
+ /*
+ * While there are duplicate global locks, keep checking
+ * to see if any have been disabled.
+ */
+ if (sanlock_gl_dup && ls->sanlock_gl_enabled &&
+ (r->type == LD_RT_GL || r->type == LD_RT_VG))
+ ls->sanlock_gl_enabled = gl_is_enabled(ls, ls->lm_data);
+
if (r->type == LD_RT_LV) {
/*
* The lv may have been removed and recreated with a new lease