mrc0mmand / rpms / lvm2

Forked from rpms/lvm2 2 years ago
Clone

Blame SOURCES/lvm2-2_02_184-pvscan-lvmetad-init-should-set-updating-before-scann.patch

fce67d
 lib/cache/lvmetad.c | 44 ++++++++++++++++++++++++--------------------
fce67d
 tools/pvscan.c      |  9 ++++-----
fce67d
 2 files changed, 28 insertions(+), 25 deletions(-)
fce67d
fce67d
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
fce67d
index 2a2d7ea..da8c027 100644
fce67d
--- a/lib/cache/lvmetad.c
fce67d
+++ b/lib/cache/lvmetad.c
fce67d
@@ -312,6 +312,7 @@ retry:
fce67d
 	 * The caller should do a disk scan to populate lvmetad.
fce67d
 	 */
fce67d
 	if (!strcmp(daemon_token, "none")) {
fce67d
+		log_debug_lvmetad("lvmetad initialization needed.");
fce67d
 		ret = 0;
fce67d
 		goto out;
fce67d
 	}
fce67d
@@ -323,10 +324,16 @@ retry:
fce67d
 	 * our global filter.
fce67d
 	 */
fce67d
 	if (strcmp(daemon_token, _lvmetad_token)) {
fce67d
+		log_debug_lvmetad("lvmetad initialization needed for different filter.");
fce67d
 		ret = 0;
fce67d
 		goto out;
fce67d
 	}
fce67d
 
fce67d
+	if (wait_start)
fce67d
+		log_debug_lvmetad("lvmetad initialized during wait.");
fce67d
+	else
fce67d
+		log_debug_lvmetad("lvmetad initialized previously.");
fce67d
+
fce67d
 out:
fce67d
 	daemon_reply_destroy(reply);
fce67d
 	return ret;
fce67d
@@ -2362,28 +2369,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait)
fce67d
 		replacing_other_update = 1;
fce67d
 	}
fce67d
 
fce67d
-	label_scan(cmd);
fce67d
-
fce67d
-	lvmcache_pvscan_duplicate_check(cmd);
fce67d
-
fce67d
-	if (lvmcache_found_duplicate_pvs()) {
fce67d
-		log_warn("WARNING: Scan found duplicate PVs.");
fce67d
-		return 0;
fce67d
-	}
fce67d
-
fce67d
-	log_verbose("Scanning all devices to update lvmetad.");
fce67d
-
fce67d
-	if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) {
fce67d
-		log_error("dev_iter creation failed");
fce67d
-		return 0;
fce67d
-	}
fce67d
-
fce67d
 	future_token = _lvmetad_token;
fce67d
 	_lvmetad_token = (char *) LVMETAD_TOKEN_UPDATE_IN_PROGRESS;
fce67d
 
fce67d
 	if (!_token_update(&replaced_update)) {
fce67d
-		log_error("Failed to update lvmetad which had an update in progress.");
fce67d
-		dev_iter_destroy(iter);
fce67d
+		log_error("Failed to start lvmetad update.");
fce67d
 		_lvmetad_token = future_token;
fce67d
 		return 0;
fce67d
 	}
fce67d
@@ -2399,16 +2389,18 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait)
fce67d
 		if (do_wait && !retries) {
fce67d
 			retries = 1;
fce67d
 			log_warn("WARNING: lvmetad update in progress, retrying update.");
fce67d
-			dev_iter_destroy(iter);
fce67d
 			_lvmetad_token = future_token;
fce67d
 			goto retry;
fce67d
 		}
fce67d
 		log_warn("WARNING: lvmetad update in progress, skipping update.");
fce67d
-		dev_iter_destroy(iter);
fce67d
 		_lvmetad_token = future_token;
fce67d
 		return 0;
fce67d
 	}
fce67d
 
fce67d
+	log_verbose("Scanning all devices to initialize lvmetad.");
fce67d
+
fce67d
+	label_scan(cmd);
fce67d
+
fce67d
 	log_debug_lvmetad("Telling lvmetad to clear its cache");
fce67d
 	reply = _lvmetad_send(cmd, "pv_clear_all", NULL);
fce67d
 	if (!_lvmetad_handle_reply(reply, "pv_clear_all", "", NULL))
fce67d
@@ -2418,6 +2410,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait)
fce67d
 	was_silent = silent_mode();
fce67d
 	init_silent(1);
fce67d
 
fce67d
+	if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) {
fce67d
+		log_error("dev_iter creation failed");
fce67d
+		return 0;
fce67d
+	}
fce67d
+
fce67d
 	while ((dev = dev_iter_get(iter))) {
fce67d
 		if (sigint_caught()) {
fce67d
 			ret = 0;
fce67d
@@ -2453,6 +2450,13 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait)
fce67d
 		return 0;
fce67d
 	}
fce67d
 
fce67d
+	/* This will disable lvmetad if label scan found duplicates. */
fce67d
+	lvmcache_pvscan_duplicate_check(cmd);
fce67d
+	if (lvmcache_found_duplicate_pvs()) {
fce67d
+		log_warn("WARNING: Scan found duplicate PVs.");
fce67d
+		return 0;
fce67d
+	}
fce67d
+
fce67d
 	/*
fce67d
 	 * If lvmetad is disabled, and no lvm1 metadata was seen and no
fce67d
 	 * duplicate PVs were seen, then re-enable lvmetad.
fce67d
diff --git a/tools/pvscan.c b/tools/pvscan.c
fce67d
index cdccfb5..a5e01b3 100644
fce67d
--- a/tools/pvscan.c
fce67d
+++ b/tools/pvscan.c
fce67d
@@ -381,7 +381,7 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv)
fce67d
 		all_vgs = 1;
fce67d
 		goto activate;
fce67d
 	}
fce67d
-       
fce67d
+
fce67d
 	/*
fce67d
 	 * FIXME: when specific devs are named, we generally don't want to scan
fce67d
 	 * any other devs, but if lvmetad is not yet populated, the first
fce67d
@@ -390,11 +390,10 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv)
fce67d
 	 * never scan any devices other than those specified.
fce67d
 	 */
fce67d
 	if (!lvmetad_token_matches(cmd)) {
fce67d
-		log_verbose("Scanning all devices to initialize lvmetad.");
fce67d
-
fce67d
 		if (lvmetad_used() && !lvmetad_pvscan_all_devs(cmd, 0)) {
fce67d
-			log_warn("WARNING: Not using lvmetad because cache update failed.");
fce67d
-			lvmetad_make_unused(cmd);
fce67d
+			log_warn("WARNING: Not updating lvmetad because cache update failed.");
fce67d
+			ret = ECMD_FAILED;
fce67d
+			goto out;
fce67d
 		}
fce67d
 		if (lvmetad_used() && lvmetad_is_disabled(cmd, &reason)) {
fce67d
 			log_warn("WARNING: Not using lvmetad because %s.", reason);