]> sourceware.org Git - lvm2.git/commitdiff
thin: refresh status when error processing fails
authorZdenek Kabelac <zkabelac@redhat.com>
Thu, 22 Dec 2016 22:28:04 +0000 (23:28 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Thu, 22 Dec 2016 22:37:07 +0000 (23:37 +0100)
When thin-pool processes event and 'lvextend --use-policies' fails
rather capture up-to-date new info as the fullness percentage may
have jumped noticable. This way we could use 'more' correct numbers
when checking for thresholds.

WHATS_NEW_DM
daemons/dmeventd/plugins/thin/dmeventd_thin.c

index 3f9eeac45242d6dd1bacf48515074787a0fbfe4f..67aed5e538d6c8b644bd8bb109b823e3d5dbb494 100644 (file)
@@ -1,5 +1,6 @@
 Version 1.02.138 - 
 =====================================
+  Thin dmeventd plugin reacts faster on lvextend failure path with umount.
   Add dm_stats_bind_from_fd() to bind a stats handle from a file descriptor.
   Do not try call callback when reverting activation on error path.
   Fix file mapping for extents with physically adjacent extents.
index 0c26baffe2d542c179464c0d0b5c4ae93f6e59f2..65de4651f7b82437c239498da09f5aa255fa8883 100644 (file)
@@ -328,6 +328,7 @@ void process_event(struct dm_task *dmt,
        char *params;
        int needs_policy = 0;
        int needs_umount = 0;
+       struct dm_task *new_dmt = NULL;
 
 #if THIN_DEBUG
        log_debug("Watch for tp-data:%.2f%%  tp-metadata:%.2f%%.",
@@ -346,6 +347,28 @@ void process_event(struct dm_task *dmt,
                        goto out;
 
                stack;
+
+               /*
+                * Rather update oldish status
+                * since after 'command' processing
+                * percentage info could have changed a lot.
+                * If we would get above UMOUNT_THRESH
+                * we would wait for next sigalarm.
+                */
+               if (!(new_dmt = dm_task_create(DM_DEVICE_STATUS)))
+                       goto_out;
+
+               if (!dm_task_set_uuid(new_dmt, dm_task_get_uuid(dmt)))
+                       goto_out;
+
+               /* Non-blocking status read */
+               if (!dm_task_no_flush(new_dmt))
+                       log_warn("WARNING: Can't set no_flush for dm status.");
+
+               if (!dm_task_run(new_dmt))
+                       goto_out;
+
+               dmt = new_dmt;
        }
 
        dm_get_next_target(dmt, next, &start, &length, &target_type, &params);
@@ -433,6 +456,9 @@ out:
                         device, state->fails);
                pthread_kill(pthread_self(), SIGALRM);
        }
+
+       if (new_dmt)
+               dm_task_destroy(new_dmt);
 }
 
 int register_device(const char *device,
This page took 0.063693 seconds and 5 git commands to generate.