master - raid: allow more sync action for extraction
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=c465ca6a3acd2b01dda...
Commit: c465ca6a3acd2b01ddacac2275bd965bde2b4167
Parent: cac9e0b681feaf71f59ecf4f41ef724129ad61d2
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 22:28:25 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 22:28:25 2017 +0200
raid: allow more sync action for extraction
Since we discovered status reporting from 'md' goes from large set
of weird states we can't just decided based on this word.
So let it pass for rebuild and idle as well
and check for health devices afterwards.
---
lib/metadata/raid_manip.c | 13 +++++--------
1 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 2a427ab..2d735ed 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -2886,17 +2886,14 @@ static int _raid_allow_extraction(struct logical_volume *lv,
!lv_raid_dev_health(lv, &dev_health))
return_0;
- if (!strcmp("idle", sync_action)) {
- log_error(INTERNAL_ERROR
- "RAID LV should not be out-of-sync and \"idle\"");
- return 0;
- }
-
if (!strcmp("resync", sync_action))
return 1;
- /* If anything other than "recover" */
- if (strcmp("recover", sync_action)) {
+ /* If anything other than "recover", rebuild or "idle" */
+ /* Targets reports for a while 'idle' state, before recover starts */
+ if (strcmp("recover", sync_action) &&
+ strcmp("rebuild", sync_action) &&
+ strcmp("idle", sync_action)) {
log_error("Unable to remove RAID image while array"
" is performing \"%s\"", sync_action);
return 0;
6 years, 10 months
master - tests: correct percent values are reported
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=cac9e0b681feaf71f59...
Commit: cac9e0b681feaf71f59ecf4f41ef724129ad61d2
Parent: cefb8bcfc4daf56309038088325c056b0860d5a1
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 17:24:38 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:42 2017 +0200
tests: correct percent values are reported
---
test/shell/lvcreate-thin-big.sh | 21 +++++++++++++++++++--
1 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvcreate-thin-big.sh b/test/shell/lvcreate-thin-big.sh
index 9c84288..235eead 100644
--- a/test/shell/lvcreate-thin-big.sh
+++ b/test/shell/lvcreate-thin-big.sh
@@ -29,15 +29,32 @@ vgcreate $vg -s 64K $(cat DEVICES)
# Size 0 is not valid
invalid lvcreate -L4M --chunksize 128 --poolmetadatasize 0 -T $vg/pool1 2>out
-lvcreate -L4M --chunksize 128 --poolmetadatasize 16k -T $vg/pool1 2>out
+lvcreate -Zn -L4M --chunksize 128 --poolmetadatasize 16k -T $vg/pool1 2>out
grep "WARNING: Minimum" out
# FIXME: metadata allocation fails, if PV doesn't have at least 16GB
# i.e. pool metadata device cannot be multisegment
-lvcreate -L4M --chunksize 64k --poolmetadatasize 17G -T $vg/pool2 2>out
+lvcreate -Zn -L4M --chunksize 64k --poolmetadatasize 17G -T $vg/pool2 2>out
grep "WARNING: Maximum" out
check lv_field $vg/pool1_tmeta size "2.00m"
check lv_field $vg/pool2_tmeta size "15.81g"
+# Check we do report correct percent values.
+lvcreate --type zero -L3G $vg -n pool3
+lvconvert -y --thinpool $vg/pool3
+lvchange --errorwhenfull y $vg/pool3
+lvchange --zero n $vg/pool3
+lvcreate -V10G $vg/pool3 -n $lv1
+lvcreate -V2G $vg/pool3 -n $lv2
+dd if=/dev/zero of="$DM_DEV_DIR/$vg/$lv1" bs=512b count=1 conv=fdatasync
+# ...excercise write speed to 'zero' device ;)
+dd if=/dev/zero of="$DM_DEV_DIR/$vg/$lv2" bs=64K count=32767 conv=fdatasync
+lvs -a $vg
+# Check the percentage is not shown as 0.00
+check lv_field $vg/$lv1 data_percent "0.01"
+# Check the percentage is not shown as 100.00
+check lv_field $vg/$lv2 data_percent "99.99"
+
+
# Check can start and see thinpool with metadata size above kernel limit
lvcreate -L4M --poolmetadatasize 16G -T $vg/poolM
check lv_field $vg/poolM data_percent "0.00"
6 years, 10 months
master - tests: unit test for percent printing
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=cefb8bcfc4daf563090...
Commit: cefb8bcfc4daf56309038088325c056b0860d5a1
Parent: 1bd4b0059bbfebe912115f0889e8f3489422f5fc
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 13:33:36 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:42 2017 +0200
tests: unit test for percent printing
---
test/unit/Makefile.in | 1 +
test/unit/percent_t.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++
test/unit/run.c | 1 +
test/unit/units.h | 3 +-
4 files changed, 105 insertions(+), 1 deletions(-)
diff --git a/test/unit/Makefile.in b/test/unit/Makefile.in
index 7aa180f..3de30f2 100644
--- a/test/unit/Makefile.in
+++ b/test/unit/Makefile.in
@@ -21,6 +21,7 @@ UNITS = \
dmlist_t.c\
dmstatus_t.c\
matcher_t.c\
+ percent_t.c\
string_t.c\
run.c
diff --git a/test/unit/percent_t.c b/test/unit/percent_t.c
new file mode 100644
index 0000000..650f381
--- /dev/null
+++ b/test/unit/percent_t.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2017 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU General Public License v.2.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "units.h"
+
+#include <stdio.h>
+#include <string.h>
+
+int percent_init(void)
+{
+ return 0;
+}
+
+int percent_fini(void)
+{
+ return 0;
+}
+
+static void test_percent_100(void)
+{
+ char buf[32];
+
+ /* Check 100% is shown only for DM_PERCENT_100*/
+ dm_percent_t p_100 = dm_make_percent(100, 100);
+ dm_percent_t p1_100 = dm_make_percent(100000, 100000);
+ dm_percent_t n_100 = dm_make_percent(999999, 1000000);
+
+ CU_ASSERT_EQUAL(p_100, DM_PERCENT_100);
+ CU_ASSERT_EQUAL(p1_100, DM_PERCENT_100);
+ CU_ASSERT_NOT_EQUAL(n_100, DM_PERCENT_100);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(p_100));
+ CU_ASSERT_EQUAL(strcmp(buf, "100.00"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(p1_100));
+ CU_ASSERT_EQUAL(strcmp(buf, "100.00"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(n_100));
+ CU_ASSERT_NOT_EQUAL(strcmp(buf, "99.99"), 0); /* Would like to gett */
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_round_float(n_100, 2));
+ CU_ASSERT_EQUAL(strcmp(buf, "99.99"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.3f", dm_percent_to_round_float(n_100, 3));
+ CU_ASSERT_EQUAL(strcmp(buf, "99.999"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.4f", dm_percent_to_round_float(n_100, 4));
+ CU_ASSERT_EQUAL(strcmp(buf, "99.9999"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%d", (int)dm_percent_to_round_float(n_100, 0));
+ CU_ASSERT_EQUAL(strcmp(buf, "99"), 0);
+}
+
+static void test_percent_0(void)
+{
+ char buf[32];
+
+ /* Check 0% is shown only for DM_PERCENT_0 */
+ dm_percent_t p_0 = dm_make_percent(0, 100);
+ dm_percent_t p1_0 = dm_make_percent(0, 100000);
+ dm_percent_t n_0 = dm_make_percent(1, 1000000);
+
+ CU_ASSERT_EQUAL(p_0, DM_PERCENT_0);
+ CU_ASSERT_EQUAL(p1_0, DM_PERCENT_0);
+ CU_ASSERT_NOT_EQUAL(n_0, DM_PERCENT_0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(p_0));
+ CU_ASSERT_EQUAL(strcmp(buf, "0.00"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(p1_0));
+ CU_ASSERT_EQUAL(strcmp(buf, "0.00"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_float(n_0));
+ CU_ASSERT_NOT_EQUAL(strcmp(buf, "0.01"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.2f", dm_percent_to_round_float(n_0, 2));
+ CU_ASSERT_EQUAL(strcmp(buf, "0.01"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%.3f", dm_percent_to_round_float(n_0, 3));
+ CU_ASSERT_EQUAL(strcmp(buf, "0.001"), 0);
+
+ dm_snprintf(buf, sizeof(buf), "%d", (int)dm_percent_to_round_float(n_0, 0));
+ CU_ASSERT_EQUAL(strcmp(buf, "1"), 0);
+}
+
+CU_TestInfo percent_list[] = {
+ { (char*)"percent_100", test_percent_100 },
+ { (char*)"percent_0", test_percent_0 },
+ CU_TEST_INFO_NULL
+};
diff --git a/test/unit/run.c b/test/unit/run.c
index 5364107..7372138 100644
--- a/test/unit/run.c
+++ b/test/unit/run.c
@@ -18,6 +18,7 @@ CU_SuiteInfo suites[] = {
USE(dmlist),
USE(dmstatus),
USE(regex),
+ USE(percent),
USE(string),
CU_SUITE_INFO_NULL
};
diff --git a/test/unit/units.h b/test/unit/units.h
index 208ff7a..9eaa82f 100644
--- a/test/unit/units.h
+++ b/test/unit/units.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2015-2017 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -28,6 +28,7 @@ DECL(config);
DECL(dmlist);
DECL(dmstatus);
DECL(regex);
+DECL(percent);
DECL(string);
#endif
6 years, 10 months
master - cleanup: use display_percent
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1bd4b0059bbfebe9121...
Commit: 1bd4b0059bbfebe912115f0889e8f3489422f5fc
Parent: 07eec06f5d7f7a9589b8555df7e67d211dcd3257
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 16:22:36 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:42 2017 +0200
cleanup: use display_percent
Replace occurence of %.2f with call of display_percent function.
---
lib/activate/dev_manager.c | 3 ++-
lib/display/display.c | 28 ++++++++++++++--------------
lib/metadata/metadata.c | 8 ++++----
lib/metadata/thin_manip.c | 21 +++++++++++----------
tools/lvconvert_poll.c | 8 ++++----
tools/polldaemon.c | 8 ++++----
6 files changed, 39 insertions(+), 37 deletions(-)
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 8f71771..d10a917 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1037,7 +1037,8 @@ static int _percent_run(struct dev_manager *dm, const char *name,
goto_out;
}
- log_debug_activation("LV percent: %.2f", dm_percent_to_float(*overall_percent));
+ log_debug_activation("LV percent: %s",
+ display_percent(dm->cmd, *overall_percent));
r = 1;
out:
diff --git a/lib/display/display.c b/lib/display/display.c
index 5940cf0..18e49f9 100644
--- a/lib/display/display.c
+++ b/lib/display/display.c
@@ -549,12 +549,12 @@ int lvdisplay_full(struct cmd_context *cmd,
snap_seg ? snap_seg->origin->size : lv->size));
if (cache_status) {
- log_print("Cache used blocks %.2f%%",
- dm_percent_to_float(cache_status->data_usage));
- log_print("Cache metadata blocks %.2f%%",
- dm_percent_to_float(cache_status->metadata_usage));
- log_print("Cache dirty blocks %.2f%%",
- dm_percent_to_float(cache_status->dirty_usage));
+ log_print("Cache used blocks %s%%",
+ display_percent(cmd, cache_status->data_usage));
+ log_print("Cache metadata blocks %s%%",
+ display_percent(cmd, cache_status->metadata_usage));
+ log_print("Cache dirty blocks %s%%",
+ display_percent(cmd, cache_status->dirty_usage));
log_print("Cache read hits/misses " FMTu64 " / " FMTu64,
cache_status->cache->read_hits,
cache_status->cache->read_misses);
@@ -570,16 +570,16 @@ int lvdisplay_full(struct cmd_context *cmd,
}
if (thin_data_active)
- log_print("Allocated pool data %.2f%%",
- dm_percent_to_float(thin_data_percent));
+ log_print("Allocated pool data %s%%",
+ display_percent(cmd, thin_data_percent));
if (thin_metadata_active)
- log_print("Allocated metadata %.2f%%",
- dm_percent_to_float(thin_metadata_percent));
+ log_print("Allocated metadata %s%%",
+ display_percent(cmd, thin_metadata_percent));
if (thin_active)
- log_print("Mapped size %.2f%%",
- dm_percent_to_float(thin_percent));
+ log_print("Mapped size %s%%",
+ display_percent(cmd, thin_percent));
log_print("Current LE %u",
snap_seg ? snap_seg->origin->le_count : lv->le_count);
@@ -590,8 +590,8 @@ int lvdisplay_full(struct cmd_context *cmd,
log_print("COW-table LE %u", lv->le_count);
if (snap_active)
- log_print("Allocated to snapshot %.2f%%",
- dm_percent_to_float(snap_percent));
+ log_print("Allocated to snapshot %s%%",
+ display_percent(cmd, snap_percent));
log_print("Snapshot chunk size %s",
display_size(cmd, (uint64_t) snap_seg->chunk_size));
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 4ba81c7..b44f2df 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -1273,11 +1273,11 @@ uint32_t extents_from_percent_size(struct volume_group *vg, const struct dm_list
}
if (!(count = percent_of_extents(size, extents, roundup)))
- log_error("Converted %.2f%%%s into 0 extents.",
- (double) size / DM_PERCENT_1, get_percent_string(percent));
+ log_error("Converted %s%%%s into 0 extents.",
+ display_percent(vg->cmd, size), get_percent_string(percent));
else
- log_verbose("Converted %.2f%%%s into %" PRIu32 " extents.",
- (double) size / DM_PERCENT_1, get_percent_string(percent), count);
+ log_verbose("Converted %s%%%s into %" PRIu32 " extents.",
+ display_percent(vg->cmd, size), get_percent_string(percent), count);
return count;
}
diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c
index ad45ce9..559e435 100644
--- a/lib/metadata/thin_manip.c
+++ b/lib/metadata/thin_manip.c
@@ -241,10 +241,11 @@ int pool_metadata_min_threshold(const struct lv_segment *pool_seg)
int pool_below_threshold(const struct lv_segment *pool_seg)
{
+ struct cmd_context *cmd = pool_seg->lv->vg->cmd;
dm_percent_t percent;
dm_percent_t min_threshold = pool_metadata_min_threshold(pool_seg);
dm_percent_t threshold = DM_PERCENT_1 *
- find_config_tree_int(pool_seg->lv->vg->cmd, activation_thin_pool_autoextend_threshold_CFG,
+ find_config_tree_int(cmd, activation_thin_pool_autoextend_threshold_CFG,
lv_config_profile(pool_seg->lv));
/* Data */
@@ -253,10 +254,10 @@ int pool_below_threshold(const struct lv_segment *pool_seg)
if (percent > threshold || percent >= DM_PERCENT_100) {
log_debug("Threshold configured for free data space in "
- "thin pool %s has been reached (%.2f%% >= %.2f%%).",
+ "thin pool %s has been reached (%s%% >= %s%%).",
display_lvname(pool_seg->lv),
- dm_percent_to_float(percent),
- dm_percent_to_float(threshold));
+ display_percent(cmd, percent),
+ display_percent(cmd, threshold));
return 0;
}
@@ -267,21 +268,21 @@ int pool_below_threshold(const struct lv_segment *pool_seg)
if (percent >= min_threshold) {
log_warn("WARNING: Remaining free space in metadata of thin pool %s "
- "is too low (%.2f%% >= %.2f%%). "
+ "is too low (%s%% >= %s%%). "
"Resize is recommended.",
display_lvname(pool_seg->lv),
- dm_percent_to_float(percent),
- dm_percent_to_float(min_threshold));
+ display_percent(cmd, percent),
+ display_percent(cmd, min_threshold));
return 0;
}
if (percent > threshold) {
log_debug("Threshold configured for free metadata space in "
- "thin pool %s has been reached (%.2f%% > %.2f%%).",
+ "thin pool %s has been reached (%s%% > %s%%).",
display_lvname(pool_seg->lv),
- dm_percent_to_float(percent),
- dm_percent_to_float(threshold));
+ display_percent(cmd, percent),
+ display_percent(cmd, threshold));
return 0;
}
diff --git a/tools/lvconvert_poll.c b/tools/lvconvert_poll.c
index 36db1c7..0daa927 100644
--- a/tools/lvconvert_poll.c
+++ b/tools/lvconvert_poll.c
@@ -152,11 +152,11 @@ progress_t poll_merge_progress(struct cmd_context *cmd,
}
if (parms->progress_display)
- log_print_unless_silent("%s: %s: %.2f%%", lv->name, parms->progress_title,
- dm_percent_to_float(DM_PERCENT_100 - percent));
+ log_print_unless_silent("%s: %s: %s%%", lv->name, parms->progress_title,
+ display_percent(cmd, DM_PERCENT_100 - percent));
else
- log_verbose("%s: %s: %.2f%%", lv->name, parms->progress_title,
- dm_percent_to_float(DM_PERCENT_100 - percent));
+ log_verbose("%s: %s: %s%%", lv->name, parms->progress_title,
+ display_percent(cmd, DM_PERCENT_100 - percent));
if (percent == DM_PERCENT_0)
return PROGRESS_FINISHED_ALL;
diff --git a/tools/polldaemon.c b/tools/polldaemon.c
index 2b64c4e..33fe947 100644
--- a/tools/polldaemon.c
+++ b/tools/polldaemon.c
@@ -40,11 +40,11 @@ progress_t poll_mirror_progress(struct cmd_context *cmd,
overall_percent = copy_percent(lv);
if (parms->progress_display)
- log_print_unless_silent("%s: %s: %.2f%%", name, parms->progress_title,
- dm_percent_to_float(overall_percent));
+ log_print_unless_silent("%s: %s: %s%%", name, parms->progress_title,
+ display_percent(cmd, overall_percent));
else
- log_verbose("%s: %s: %.2f%%", name, parms->progress_title,
- dm_percent_to_float(overall_percent));
+ log_verbose("%s: %s: %s%%", name, parms->progress_title,
+ display_percent(cmd, overall_percent));
if (segment_percent != DM_PERCENT_100)
return PROGRESS_UNFINISHED;
6 years, 10 months
master - display: add display_percent function
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=07eec06f5d7f7a9589b...
Commit: 07eec06f5d7f7a9589b8555df7e67d211dcd3257
Parent: feed61f3fa17a94140ba91ae5df844ee4ad34248
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 16:03:21 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:42 2017 +0200
display: add display_percent function
Add universal function to print dm_percent_t values via single
code path.
TODO: extend with configurale precision of printed values.
---
WHATS_NEW | 1 +
lib/display/display.c | 26 +++++++++++++++++++++++++-
lib/display/display.h | 4 +++-
3 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index fa51f67..6a60f0b 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.172 -
===============================
+ Add display_percent helper function for printing percent values.
Lvconvert --repair handles failing raid legs (present but marked 'D'ead).
Do not lvdisplay --maps unset settings of cache pool.
Fix lvdisplay --maps for cache pool without policy settings.
diff --git a/lib/display/display.c b/lib/display/display.c
index a8bb5cc..5940cf0 100644
--- a/lib/display/display.c
+++ b/lib/display/display.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -152,6 +152,30 @@ const char *display_lvname(const struct logical_volume *lv)
return name;
}
+/* Display percentage with (TODO) configurable precision */
+const char *display_percent(struct cmd_context *cmd, dm_percent_t percent)
+{
+ char *buf;
+ int r;
+
+ /* Reusing same ring buffer we use for displaying LV names */
+ if ((cmd->display_lvname_idx + NAME_LEN) >= sizeof((cmd->display_buffer)))
+ cmd->display_lvname_idx = 0;
+
+ buf = cmd->display_buffer + cmd->display_lvname_idx;
+ /* TODO: Make configurable hardcoded 2 digits */
+ r = dm_snprintf(buf, NAME_LEN, "%.2f", dm_percent_to_round_float(percent, 2));
+
+ if (r < 0) {
+ log_error("Percentage %d does not fit.", percent);
+ return NULL;
+ }
+
+ cmd->display_lvname_idx += r + 1;
+
+ return buf;
+}
+
/* Size supplied in sectors */
static const char *_display_size(const struct cmd_context *cmd,
uint64_t size, dm_size_suffix_t suffix_type)
diff --git a/lib/display/display.h b/lib/display/display.h
index 1fc9079..9f9afe9 100644
--- a/lib/display/display.h
+++ b/lib/display/display.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -24,6 +24,8 @@
const char *display_lvname(const struct logical_volume *lv);
+const char *display_percent(struct cmd_context *cmd, dm_percent_t percent);
+
/* Specify size in KB */
const char *display_size(const struct cmd_context *cmd, uint64_t size);
const char *display_size_long(const struct cmd_context *cmd, uint64_t size);
6 years, 10 months
master - libdm: use rounded float for percent print
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=feed61f3fa17a94140b...
Commit: feed61f3fa17a94140ba91ae5df844ee4ad34248
Parent: 2ef8da61eb968acb3c5c51cdfdc997e8bed90352
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 16:39:50 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:42 2017 +0200
libdm: use rounded float for percent print
Use new added dm_percent_to_round_float to enhance print
of percentage values.
---
.../dmeventd/plugins/snapshot/dmeventd_snapshot.c | 2 +-
daemons/dmeventd/plugins/thin/dmeventd_thin.c | 8 ++++----
libdm/libdm-report.c | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c b/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c
index bab7f0e..93697a0 100644
--- a/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c
+++ b/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c
@@ -231,7 +231,7 @@ void process_event(struct dm_task *dmt,
if (percent >= WARNING_THRESH) /* Print a warning to syslog. */
log_warn("WARNING: Snapshot %s is now %.2f%% full.",
- device, dm_percent_to_float(percent));
+ device, dm_percent_to_round_float(percent, 2));
/* Try to extend the snapshot, in accord with user-set policies */
if (!_extend(state->cmd_lvextend))
diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
index 7fd7b0e..4dfd6c7 100644
--- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c
+++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
@@ -172,8 +172,8 @@ void process_event(struct dm_task *dmt,
#if THIN_DEBUG
log_debug("Watch for tp-data:%.2f%% tp-metadata:%.2f%%.",
- dm_percent_to_float(state->data_percent_check),
- dm_percent_to_float(state->metadata_percent_check));
+ dm_percent_to_round_float(state->data_percent_check, 2),
+ dm_percent_to_round_float(state->metadata_percent_check, 2));
#endif
if (!_wait_for_pid(state)) {
log_warn("WARNING: Skipping event, child %d is still running (%s).",
@@ -254,7 +254,7 @@ void process_event(struct dm_task *dmt,
if ((state->metadata_percent > WARNING_THRESH) &&
(state->metadata_percent > state->metadata_percent_check))
log_warn("WARNING: Thin pool %s metadata is now %.2f%% full.",
- device, dm_percent_to_float(state->metadata_percent));
+ device, dm_percent_to_round_float(state->metadata_percent, 2));
if (state->metadata_percent > CHECK_MINIMUM) {
/* Run action when usage raised more than CHECK_STEP since the last time */
if (state->metadata_percent > state->metadata_percent_check)
@@ -269,7 +269,7 @@ void process_event(struct dm_task *dmt,
if ((state->data_percent > WARNING_THRESH) &&
(state->data_percent > state->data_percent_check))
log_warn("WARNING: Thin pool %s data is now %.2f%% full.",
- device, dm_percent_to_float(state->data_percent));
+ device, dm_percent_to_round_float(state->data_percent, 2));
if (state->data_percent > CHECK_MINIMUM) {
/* Run action when usage raised more than CHECK_STEP since the last time */
if (state->data_percent > state->data_percent_check)
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 0a5d464..0017ac3 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -373,7 +373,7 @@ int dm_report_field_percent(struct dm_report *rh,
return 0;
}
- if (dm_snprintf(repstr, 7, "%.2f", dm_percent_to_float(*data)) < 0) {
+ if (dm_snprintf(repstr, 7, "%.2f", dm_percent_to_round_float(*data, 2)) < 0) {
dm_pool_free(rh->mem, sortval);
log_error("dm_report_field_percent: percentage too large.");
return 0;
6 years, 10 months
master - libdm: implement dm_percent_to_round_float
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2ef8da61eb968acb3c5...
Commit: 2ef8da61eb968acb3c5c51cdfdc997e8bed90352
Parent: 0016b79c8b3223de7155fb4ec5fa799f7af1c811
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 13:24:26 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 17:44:40 2017 +0200
libdm: implement dm_percent_to_round_float
Add function to adjust printing of percent values in better way.
Rounding here is going along following rules:
0% & 100% are always clearly reported with .0 decimal points.
Values slightly above 0% we make sure a nearest bigger
non zero value with given precission is printed
(i.e. 0.01 for %.2f will be shown)
For values closely approaching 100% we again detect and adjust value
that is less then 100 when printed.
(i.e. 99.99 for %.2f will be shown).
For other values we are leaving them with standard rounding mechanism
since we care mainly about corner values 0 & 100 which need to be
printed precisely.
---
WHATS_NEW_DM | 1 +
libdm/.exported_symbols.DM_1_02_141 | 1 +
libdm/libdevmapper.h | 10 ++++++++++
libdm/libdm-report.c | 23 +++++++++++++++++++++++
4 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 83df7cc..89f4a00 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.141 -
===============================
+ Add dm_percent_to_round_float for adjusted percentage rounding.
Reset array with dead rimage devices once raid gets in sync.
Drop unneeded --config option from raid dmeventd plugin.
dm_get_status_raid() handle better some incosistent md statuses.
diff --git a/libdm/.exported_symbols.DM_1_02_141 b/libdm/.exported_symbols.DM_1_02_141
new file mode 100644
index 0000000..8187642
--- /dev/null
+++ b/libdm/.exported_symbols.DM_1_02_141
@@ -0,0 +1 @@
+dm_percent_to_round_float
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 4bd32b4..5e77906 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -2836,6 +2836,16 @@ typedef enum {
typedef int32_t dm_percent_t;
float dm_percent_to_float(dm_percent_t percent);
+/*
+ * Return adjusted/rounded float for better percent value printing.
+ * Function ensures for given precision of digits:
+ * 100.0% returns only when the value is DM_PERCENT_100
+ * for close smaller values rounds to nearest smaller value
+ * 0.0% returns only for value DM_PERCENT_0
+ * for close bigger values rounds to nearest bigger value
+ * In all other cases returns same value as dm_percent_to_float()
+ */
+float dm_percent_to_round_float(dm_percent_t percent, unsigned digits);
dm_percent_t dm_make_percent(uint64_t numerator, uint64_t denominator);
/********************
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 7caba98..0a5d464 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -2425,6 +2425,29 @@ float dm_percent_to_float(dm_percent_t percent)
return (float) percent / DM_PERCENT_1 + 0.f;
}
+float dm_percent_to_round_float(dm_percent_t percent, unsigned digits)
+{
+ static const float power10[] = {
+ 1.f, .1f, .01f, .001f, .0001f, .00001f, .000001f,
+ .0000001f, .00000001f, .000000001f,
+ .0000000001f
+ };
+ float r;
+ float f = dm_percent_to_float(percent);
+
+ if (digits >= DM_ARRAY_SIZE(power10))
+ digits = DM_ARRAY_SIZE(power10) - 1; /* no better precision */
+
+ r = DM_PERCENT_1 * power10[digits];
+
+ if ((percent < r) && (percent > DM_PERCENT_0))
+ f = power10[digits];
+ else if ((percent > (DM_PERCENT_100 - r)) && (percent < DM_PERCENT_100))
+ f = (float) (DM_PERCENT_100 - r) / DM_PERCENT_1;
+
+ return f;
+}
+
dm_percent_t dm_make_percent(uint64_t numerator, uint64_t denominator)
{
dm_percent_t percent;
6 years, 10 months
master - dmeventd: improve more raid status reporting
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=0016b79c8b3223de715...
Commit: 0016b79c8b3223de7155fb4ec5fa799f7af1c811
Parent: 2a50a28f3e8e5a1a7ecbf247f27cc8178ee286bf
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Jun 24 00:06:12 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Jun 24 00:06:12 2017 +0200
dmeventd: improve more raid status reporting
When we want to report primary leg failure, check for intial 'a',
since otherwice 'Aa idle' is normally visible.
Also reset array of bit flags marking dead devices, once
plugin detects raid is in sync.
---
WHATS_NEW_DM | 1 +
daemons/dmeventd/plugins/raid/dmeventd_raid.c | 5 ++++-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 3e0e8a5..83df7cc 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.141 -
===============================
+ Reset array with dead rimage devices once raid gets in sync.
Drop unneeded --config option from raid dmeventd plugin.
dm_get_status_raid() handle better some incosistent md statuses.
Accept truncated files in calls to dm_stats_update_regions_from_fd().
diff --git a/daemons/dmeventd/plugins/raid/dmeventd_raid.c b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
index 666362a..52cf43d 100644
--- a/daemons/dmeventd/plugins/raid/dmeventd_raid.c
+++ b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
@@ -68,7 +68,8 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
* This is simply the way the kernel works...
*/
if (!strcmp(status->sync_action, "idle") &&
- strchr(status->dev_health, 'a')) {
+ (status->dev_health[0] == 'a') &&
+ (status->insync_regions < status->total_regions)) {
log_error("Primary sources for new RAID, %s, have failed.",
device);
dead = 1; /* run it through LVM repair */
@@ -97,6 +98,8 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
}
} else {
state->failed = 0;
+ if (status->insync_regions == status->total_regions)
+ memset(&state->raid_devs, 0, sizeof(state->raid_devs));
log_info("%s array, %s, is %s in-sync.",
status->raid_type, device,
(status->insync_regions == status->total_regions) ? "now" : "not");
6 years, 11 months
master - tests: use allocate policy in raid test
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2a50a28f3e8e5a1a7ec...
Commit: 2a50a28f3e8e5a1a7ecbf247f27cc8178ee286bf
Parent: 1598bf154e80f43a7b215a69dc44bd9a87b166df
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jun 23 23:22:34 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jun 23 23:32:44 2017 +0200
tests: use allocate policy in raid test
---
test/shell/lvconvert-repair-raid-dmeventd.sh | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvconvert-repair-raid-dmeventd.sh b/test/shell/lvconvert-repair-raid-dmeventd.sh
index 1a9e993..84b0591 100644
--- a/test/shell/lvconvert-repair-raid-dmeventd.sh
+++ b/test/shell/lvconvert-repair-raid-dmeventd.sh
@@ -17,6 +17,9 @@ SKIP_WITH_LVMPOLLD=1
which mkfs.ext3 || skip
aux have_raid 1 3 0 || skip
+aux lvmconf \
+ 'activation/raid_fault_policy = "allocate"'
+
aux prepare_dmeventd
aux prepare_vg 5
@@ -27,7 +30,7 @@ lvdisplay --maps $vg
aux wait_for_sync $vg 4way
aux disable_dev "$dev2" "$dev4"
mkfs.ext3 "$DM_DEV_DIR/$vg/4way"
-sleep 10 # FIXME: need a "poll" utility, akin to "check"
+sleep 5 # FIXME: need a "poll" utility, akin to "check"
aux enable_dev "$dev2" "$dev4"
vgremove -ff $vg
6 years, 11 months
master - tests: add transient failure test
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1598bf154e80f43a7b2...
Commit: 1598bf154e80f43a7b215a69dc44bd9a87b166df
Parent: f48d1bf1474f4485d42a180c542618a416f00006
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jun 23 23:20:01 2017 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jun 23 23:32:44 2017 +0200
tests: add transient failure test
Check raid repairs still 'present', but failed device.
TODO: tests needs more checking about repair actually doing its work.
---
test/shell/lvconvert-repair-raid.sh | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvconvert-repair-raid.sh b/test/shell/lvconvert-repair-raid.sh
index b25d861..86ac261 100644
--- a/test/shell/lvconvert-repair-raid.sh
+++ b/test/shell/lvconvert-repair-raid.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2013-2017 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
@@ -18,7 +18,8 @@ aux have_raid 1 3 0 || skip
aux raid456_replace_works || skip
aux lvmconf 'allocation/maximise_cling = 0' \
- 'allocation/mirror_logs_require_separate_pvs = 1'
+ 'allocation/mirror_logs_require_separate_pvs = 1' \
+ 'activation/raid_fault_policy = "allocate"'
aux prepare_vg 8 80
@@ -37,6 +38,23 @@ RAID_SIZE=32
# Fast sync and repair afterwards
delay 0
+# RAID1 transient failure check
+lvcreate --type raid1 -m 1 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2"
+aux wait_for_sync $vg $lv1
+# enforce replacing live rimage leg with error target
+dmsetup remove -f $vg-${lv1}_rimage_1 || true
+# let it notice there is problem
+echo a > "$DM_DEV_DIR/$vg/$lv1"
+check grep_dmsetup status $vg-$lv1 AD
+lvconvert -y --repair $vg/$lv1 "$dev3"
+lvs -a -o+devices $vg
+aux wait_for_sync $vg $lv1
+# Raid should have fixed device
+check grep_dmsetup status $vg-$lv1 AA
+check lv_on $vg ${lv1}_rimage_1 "$dev3"
+lvremove -ff $vg/$lv1
+
+
# RAID1 dual-leg single replace after initial sync
lvcreate --type raid1 -m 1 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2"
aux wait_for_sync $vg $lv1
6 years, 11 months