[lvm-devel] master - cache: make syncing abortable by user
Zdenek Kabelac
zkabelac at sourceware.org
Thu Jun 22 18:18:10 UTC 2017
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ca9e6cec619e242fe6283fc5acbf773f763c1f5a
Commit: ca9e6cec619e242fe6283fc5acbf773f763c1f5a
Parent: 2df9a786845af2ce34cb3942dc2b16342e359a2c
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Thu Jun 22 17:08:47 2017 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Thu Jun 22 20:11:43 2017 +0200
cache: make syncing abortable by user
When user runs command like 'lvconvert --splitcache' the operation
might be actually either slow or not making any progress in kernel,
so lets give user a chance to abort such operation.
When user press 'Ctrl+C' device table is restored to pre-flushing state.
---
WHATS_NEW | 1 +
lib/metadata/cache_manip.c | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index e60380a..25571cc 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.172 -
===============================
+ Support aborting of flushing cache LV.
Reenable conversion of data and metadata thin-pool volumes to raid.
Improve raid status reporting with lvs.
No longer necessary to '--force' a repair for RAID1
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index e7da899..cc3482b 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -22,6 +22,7 @@
#include "activate.h"
#include "defaults.h"
#include "lv_alloc.h"
+#include "lvm-signal.h"
/* https://github.com/jthornber/thin-provisioning-tools/blob/master/caching/cache_metadata_size.cc */
#define DM_TRANSACTION_OVERHEAD 4096 /* KiB */
@@ -431,6 +432,20 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
//FIXME: use polling to do this...
for (;;) {
+ sigint_allow();
+ sigint_restore();
+ if (sigint_caught()) {
+ sigint_clear();
+ log_error("Flushing of %s aborted.", display_lvname(cache_lv));
+ if (cache_seg->cleaner_policy) {
+ cache_seg->cleaner_policy = 0;
+ /* Restore normal table */
+ if (!lv_update_and_reload(cache_lv))
+ stack;
+ }
+ return 0;
+ }
+
if (!lv_cache_status(cache_lv, &status))
return_0;
@@ -452,9 +467,12 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
log_print_unless_silent("Flushing " FMTu64 " blocks for cache %s.",
dirty_blocks, display_lvname(cache_lv));
+
if (cleaner_policy) {
/* TODO: Use centralized place */
+ sigint_allow();
usleep(500000);
+ sigint_restore();
continue;
}
More information about the lvm-devel
mailing list