[lvm-devel] main - lvpoll: improve merge polling

Zdenek Kabelac zkabelac at sourceware.org
Mon Mar 15 10:14:16 UTC 2021


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=eadd58a97dd9a199b74260e8a2bdb5657bf7a88d
Commit:        eadd58a97dd9a199b74260e8a2bdb5657bf7a88d
Parent:        1a451207b8ddbd15519ff9556c59287023ab50fa
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Sun Mar 14 22:03:41 2021 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Mar 15 11:13:24 2021 +0100

lvpoll: improve merge polling

When multiple polling tasks are watching for same LV, clearly
when some of them wins the game - other polling tasks will fail.
Improve the logic and report success if the merged LV is
actually not a merging origin anymore (since likely someone
else has already finished merging).
---
 tools/lvconvert_poll.c | 11 +++++++----
 tools/polldaemon.c     |  9 +++++++--
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/tools/lvconvert_poll.c b/tools/lvconvert_poll.c
index 5adb14506..b64cffe21 100644
--- a/tools/lvconvert_poll.c
+++ b/tools/lvconvert_poll.c
@@ -111,9 +111,9 @@ int lvconvert_merge_finish(struct cmd_context *cmd,
 	struct lv_segment *snap_seg = find_snapshot(lv);
 
 	if (!lv_is_merging_origin(lv)) {
-		log_error("Logical volume %s has no merging snapshot.",
+		log_print("Logical volume %s is no longer merging origin, polling has finished.",
 			  display_lvname(lv));
-		return 0;
+		return 1;
 	}
 
 	log_print_unless_silent("Merge of snapshot into logical volume %s has finished.",
@@ -141,8 +141,11 @@ progress_t poll_merge_progress(struct cmd_context *cmd,
 {
 	dm_percent_t percent = DM_PERCENT_0;
 
-	if (!lv_is_merging_origin(lv) ||
-	    !lv_snapshot_percent(lv, &percent)) {
+	if (!lv_is_merging_origin(lv))
+		/* Nothing to monitor here */
+		return PROGRESS_FINISHED_ALL;
+
+	if (!lv_snapshot_percent(lv, &percent)) {
 		log_error("%s: Failed query for merging percentage. Aborting merge.",
 			  display_lvname(lv));
 		return PROGRESS_CHECK_FAILED;
diff --git a/tools/polldaemon.c b/tools/polldaemon.c
index 32733b8ea..c182e548e 100644
--- a/tools/polldaemon.c
+++ b/tools/polldaemon.c
@@ -172,8 +172,13 @@ int wait_for_single_lv(struct cmd_context *cmd, struct poll_operation_id *id,
 		vg = vg_read(cmd, id->vg_name, NULL, READ_FOR_UPDATE, lockd_state, &error_flags, NULL);
 		if (!vg) {
 			/* What more could we do here? */
-			log_error("ABORTING: Can't reread VG for %s error flags %x.", id->display_name, error_flags);
-			ret = 0;
+			if (error_flags & FAILED_NOTFOUND) {
+				log_print_unless_silent("Can't find VG %s. No longer active.", id->display_name);
+				ret = 1;
+			} else {
+				log_error("ABORTING: Can't reread VG for %s error flags %x.", id->display_name, error_flags);
+				ret = 0;
+			}
 			goto out;
 		}
 




More information about the lvm-devel mailing list