1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

lvmlockd: improve error message about missing global lock

If the VG holding the global lock is removed, we can indicate
that as the reason for not being able to acquire the global
lock in subsequent error messages, and can suggest enabling
the global lock in another VG.  (This helpful error message
will go away if the global lock is enabled in another VG,
or if lvmlockd is restarted.)
This commit is contained in:
David Teigland 2016-07-25 14:45:11 -05:00
parent 1efb1c2343
commit d0e15b86b5
3 changed files with 24 additions and 3 deletions

View File

@ -1654,6 +1654,9 @@ static int res_able(struct lockspace *ls, struct resource *r,
}
rv = lm_able_gl_sanlock(ls, act->op == LD_OP_ENABLE);
if (!rv && (act->op == LD_OP_ENABLE))
gl_vg_removed = 0;
out:
return rv;
}
@ -2627,8 +2630,10 @@ out_act:
if (free_vg && ls->sanlock_gl_enabled && act_op_free) {
pthread_mutex_lock(&lockspaces_mutex);
if (other_sanlock_vgs_exist(ls))
if (other_sanlock_vgs_exist(ls)) {
act_op_free->flags |= LD_AF_WARN_GL_REMOVED;
gl_vg_removed = 1;
}
pthread_mutex_unlock(&lockspaces_mutex);
}
@ -3668,7 +3673,7 @@ static int client_send_result(struct client *cl, struct action *act)
if (act->flags & LD_AF_DUP_GL_LS)
strcat(result_flags, "DUP_GL_LS,");
if (act->flags & LD_AF_WARN_GL_REMOVED)
if ((act->flags & LD_AF_WARN_GL_REMOVED) || gl_vg_removed)
strcat(result_flags, "WARN_GL_REMOVED,");
if (act->op == LD_OP_INIT) {

View File

@ -320,6 +320,7 @@ static inline int list_empty(const struct list_head *head)
EXTERN int gl_type_static;
EXTERN int gl_use_dlm;
EXTERN int gl_use_sanlock;
EXTERN int gl_vg_removed;
EXTERN char gl_lsname_dlm[MAX_NAME+1];
EXTERN char gl_lsname_sanlock[MAX_NAME+1];
EXTERN int global_dlm_lockspace_exists;

View File

@ -969,6 +969,7 @@ int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_i
{
char uuid[64] __attribute__((aligned(8)));
daemon_reply reply;
uint32_t lockd_flags = 0;
int host_id = 0;
int result;
int ret;
@ -1018,13 +1019,16 @@ int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg, int start_i
"opts = %s", start_init ? "start_init" : "none",
NULL);
if (!_lockd_result(reply, &result, NULL)) {
if (!_lockd_result(reply, &result, &lockd_flags)) {
ret = 0;
result = -ELOCKD;
} else {
ret = (result < 0) ? 0 : 1;
}
if (lockd_flags & LD_RF_WARN_GL_REMOVED)
cmd->lockd_gl_removed = 1;
switch (result) {
case 0:
log_print_unless_silent("VG %s starting %s lockspace", vg->name, vg->lock_type);
@ -1140,6 +1144,11 @@ int lockd_start_wait(struct cmd_context *cmd)
daemon_reply_destroy(reply);
if (cmd->lockd_gl_removed) {
log_error("Missing global lock: global lock was lost by removing a previous VG.");
log_error("To enable the global lock in another VG, see lvmlockctl --gl-enable.");
}
return ret;
}
@ -1556,6 +1565,12 @@ int lockd_gl(struct cmd_context *cmd, const char *def_mode, uint32_t flags)
goto allow;
}
if ((lockd_flags & LD_RF_NO_GL_LS) && (lockd_flags & LD_RF_WARN_GL_REMOVED)) {
log_warn("Skipping global lock: VG with global lock was removed");
force_cache_update = 1;
goto allow;
}
if ((lockd_flags & LD_RF_NO_GL_LS) || (lockd_flags & LD_RF_NO_LOCKSPACES)) {
log_warn("Skipping global lock: lockspace not found or started");
force_cache_update = 1;