diff options
author | David Teigland <teigland@redhat.com> | 2016-01-29 14:33:46 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2016-01-29 15:22:43 -0600 |
commit | 599696514460fb72fbce84f3eb511853e107a6f3 (patch) | |
tree | cc1b7cb3fac547a663b5e6c57c6b30caefa38276 | |
parent | d295e2e021388d668a80c9421ef35322efdff934 (diff) | |
download | lvm2-599696514460fb72fbce84f3eb511853e107a6f3.tar.gz |
pvscan: repopulate and reenable disabled lvmetad
Other commands ignore lvmetad when it's disabled,
but pvscan --cache is an exception since it is populating
the lvmetad cache, not using the lvmetad cache.
Have 'pvscan --cache' clear the disabled flag in lvmetad
if, after scanning all devices, it found no lvm1 metadata
and found no duplicate PVs.
-rw-r--r-- | lib/cache/lvmetad.c | 37 | ||||
-rw-r--r-- | lib/cache/lvmetad.h | 2 | ||||
-rw-r--r-- | tools/lvmcmdline.c | 9 |
3 files changed, 47 insertions, 1 deletions
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c index 5a566950e..b3e65aafd 100644 --- a/lib/cache/lvmetad.c +++ b/lib/cache/lvmetad.c @@ -35,6 +35,8 @@ static char *_lvmetad_token = NULL; static const char *_lvmetad_socket = NULL; static struct cmd_context *_lvmetad_cmd = NULL; +static int _found_lvm1_metadata = 0; + static struct volume_group *lvmetad_pvscan_vg(struct cmd_context *cmd, struct volume_group *vg); static int _log_debug_inequality(const char *name, struct dm_config_node *a, struct dm_config_node *b) @@ -1356,6 +1358,7 @@ static struct volume_group *lvmetad_pvscan_vg(struct cmd_context *cmd, struct vo lvmcache_fmt(info)->ops->destroy_instance(baton.fid); log_warn("WARNING: Disabling lvmetad cache which does not support obsolete metadata."); lvmetad_set_disabled(cmd, "LVM1"); + _found_lvm1_metadata = 1; return NULL; } @@ -1472,6 +1475,7 @@ int lvmetad_pvscan_single(struct cmd_context *cmd, struct device *dev, log_warn("WARNING: Disabling lvmetad cache which does not support obsolete metadata."); lvmetad_set_disabled(cmd, "LVM1"); + _found_lvm1_metadata = 1; if (ignore_obsolete) return 1; @@ -1525,6 +1529,7 @@ static int _lvmetad_pvscan_all_devs(struct cmd_context *cmd, activation_handler daemon_reply reply; int r = 1; char *future_token; + const char *reason; int was_silent; if (!lvmetad_active()) { @@ -1574,6 +1579,16 @@ static int _lvmetad_pvscan_all_devs(struct cmd_context *cmd, activation_handler if (!_token_update()) return 0; + /* + * If lvmetad is disabled, and no lvm1 metadata was seen and no + * duplicate PVs were seen, then re-enable lvmetad. + */ + if (lvmetad_is_disabled(cmd, &reason) && + !lvmcache_found_duplicate_pvs() && !_found_lvm1_metadata) { + log_debug_lvmetad("Enabling lvmetad which was previously disabled."); + lvmetad_clear_disabled(cmd); + } + return r; } @@ -1973,6 +1988,28 @@ void lvmetad_set_disabled(struct cmd_context *cmd, const char *reason) daemon_reply_destroy(reply); } +void lvmetad_clear_disabled(struct cmd_context *cmd) +{ + daemon_reply reply; + + if (!_lvmetad_use) + return; + + log_debug_lvmetad("lvmetad send disabled 0"); + + reply = daemon_send_simple(_lvmetad, "set_global_info", + "token = %s", "skip", + "global_disable = " FMTd64, (int64_t)0, + NULL); + if (reply.error) + log_error("Failed to send message to lvmetad %d", reply.error); + + if (strcmp(daemon_reply_str(reply, "response", ""), "OK")) + log_error("Failed response from lvmetad."); + + daemon_reply_destroy(reply); +} + int lvmetad_is_disabled(struct cmd_context *cmd, const char **reason) { daemon_reply reply; diff --git a/lib/cache/lvmetad.h b/lib/cache/lvmetad.h index 6345d9551..9e0f51a6f 100644 --- a/lib/cache/lvmetad.h +++ b/lib/cache/lvmetad.h @@ -180,6 +180,7 @@ int lvmetad_vg_is_foreign(struct cmd_context *cmd, const char *vgname, const cha int lvmetad_is_disabled(struct cmd_context *cmd, const char **reason); void lvmetad_set_disabled(struct cmd_context *cmd, const char *reason); +void lvmetad_clear_disabled(struct cmd_context *cmd); # else /* LVMETAD_SUPPORT */ @@ -214,6 +215,7 @@ void lvmetad_set_disabled(struct cmd_context *cmd, const char *reason); # define lvmetad_is_connected() (0) # define lvmetad_is_disabled(cmd, reason) (0) # define lvmetad_set_disabled(cmd, reason) do { } while (0) +# define lvmetad_clear_disabled(cmd) do { } while (0) # endif /* LVMETAD_SUPPORT */ diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c index b2f9debea..13310f8ef 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -1640,7 +1640,14 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv) goto_out; } - if (lvmetad_is_connected() && lvmetad_is_disabled(cmd, &reason)) { + /* + * If lvmetad is disabled, don't use it and revert to scanning. + * The exception is pvscan which is explicitly repopulating + * lvmetad, and may be able to clear the disabled setting. + */ + if (lvmetad_is_connected() && + !(cmd->command->flags & DISABLE_BUILTIN_PVSCAN) && + lvmetad_is_disabled(cmd, &reason)) { log_warn("WARNING: Disabling use of lvmetad because %s.", reason); lvmetad_set_active(cmd, 0); } |