master - dmeventd_thin: add run_command
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2e935c0967e8bd...
Commit: 2e935c0967e8bd3f97614c258619ad0c83fe0a48
Parent: e5bef508275f7d9889062f8e15e39aa63a9a938e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jan 20 21:41:23 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:55:50 2017 +0100
dmeventd_thin: add run_command
Implement forking of executable command.
When command is forked, dmeventd may continue monitor device.
---
daemons/dmeventd/plugins/thin/dmeventd_thin.c | 53 +++++++++++++++++++++++--
1 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
index b436524..3e044ff 100644
--- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c
+++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2016 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2011-2017 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -55,6 +55,8 @@ struct dso_state {
uint64_t known_metadata_size;
uint64_t known_data_size;
unsigned fails;
+ pid_t pid;
+ char **argv;
char cmd_str[1024];
};
@@ -302,19 +304,62 @@ out:
dm_bitset_destroy(data.minors);
}
+static int _run_command(struct dso_state *state)
+{
+ char val[2][36];
+ char *env[] = { val[0], val[1], NULL };
+ int i;
+
+ if (state->data_percent) {
+ /* Prepare some known data to env vars for easy use */
+ (void) dm_snprintf(val[0], sizeof(val[0]), "DMEVENTD_THIN_POOL_DATA=%d",
+ state->data_percent / DM_PERCENT_1);
+ (void) dm_snprintf(val[1], sizeof(val[1]), "DMEVENTD_THIN_POOL_METADATA=%d",
+ state->metadata_percent / DM_PERCENT_1);
+ } else {
+ /* For an error event it's for a user to check status and decide */
+ env[0] = NULL;
+ log_debug("Error event processing");
+ }
+
+ log_verbose("Executing command: %s", state->cmd_str);
+
+ /* TODO:
+ * Support parallel run of 'task' and it's waitpid maintainence
+ * ATM we can't handle signaling of SIGALRM
+ * as signalling is not allowed while 'process_event()' is running
+ */
+ if (!(state->pid = fork())) {
+ /* child */
+ (void) close(0);
+ for (i = 3; i < 255; ++i) (void) close(i);
+ execve(state->argv[0], state->argv, env);
+ _exit(errno);
+ } else if (state->pid == -1) {
+ log_error("Can't fork command %s.", state->cmd_str);
+ state->fails = 1;
+ return 0;
+ }
+
+ return 1;
+}
+
static int _use_policy(struct dm_task *dmt, struct dso_state *state)
{
#if THIN_DEBUG
log_debug("dmeventd executes: %s.", state->cmd_str);
#endif
+ if (state->argv)
+ return _run_command(state);
+
if (!dmeventd_lvm2_run_with_lock(state->cmd_str)) {
- log_error("Failed to extend thin pool %s.",
- dm_task_get_name(dmt));
- state->fails++;
+ log_error("Failed command for %s.", dm_task_get_name(dmt));
+ state->fails = 1;
return 0;
}
state->fails = 0;
+
return 1;
}
7 years, 3 months
master - dmeventd_thin: better warning logic
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e5bef508275f7d...
Commit: e5bef508275f7d9889062f8e15e39aa63a9a938e
Parent: 0d945ddbad82686aa590a2e566807723d66be1a7
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jan 20 21:53:13 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:55:50 2017 +0100
dmeventd_thin: better warning logic
When fullness is passing WARN_THRESHOLD, print warning,
when it drops bellow and crossed again, we should print
warning again, but always only once.
---
daemons/dmeventd/plugins/thin/dmeventd_thin.c | 19 ++++++++++++-------
1 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
index ff127be..b436524 100644
--- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c
+++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
@@ -48,8 +48,10 @@ struct dso_state {
struct dm_pool *mem;
int metadata_percent_check;
int metadata_percent;
+ int metadata_warn_once;
int data_percent_check;
int data_percent;
+ int data_warn_once;
uint64_t known_metadata_size;
uint64_t known_data_size;
unsigned fails;
@@ -400,6 +402,11 @@ void process_event(struct dm_task *dmt,
}
state->metadata_percent = dm_make_percent(tps->used_metadata_blocks, tps->total_metadata_blocks);
+ if (state->metadata_percent <= WARNING_THRESH)
+ state->metadata_warn_once = 0; /* Dropped bellow threshold, reset warn once */
+ else if (!state->metadata_warn_once++) /* Warn once when raised above threshold */
+ log_warn("WARNING: Thin pool %s metadata is now %.2f%% full.",
+ device, dm_percent_to_float(state->metadata_percent));
if (state->metadata_percent >= state->metadata_percent_check) {
/*
* Usage has raised more than CHECK_STEP since the last
@@ -407,10 +414,6 @@ void process_event(struct dm_task *dmt,
*/
state->metadata_percent_check = (state->metadata_percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
- /* FIXME: extension of metadata needs to be written! */
- if (state->metadata_percent >= WARNING_THRESH)
- log_warn("WARNING: Thin pool %s metadata is now %.2f%% full.",
- device, dm_percent_to_float(state->metadata_percent));
needs_policy = 1;
if (state->metadata_percent >= UMOUNT_THRESH)
@@ -418,6 +421,11 @@ void process_event(struct dm_task *dmt,
}
state->data_percent = dm_make_percent(tps->used_data_blocks, tps->total_data_blocks);
+ if (state->data_percent <= WARNING_THRESH)
+ state->data_warn_once = 0;
+ else if (!state->data_warn_once++)
+ log_warn("WARNING: Thin pool %s data is now %.2f%% full.",
+ device, dm_percent_to_float(state->data_percent));
if (state->data_percent >= state->data_percent_check) {
/*
* Usage has raised more than CHECK_STEP since
@@ -425,9 +433,6 @@ void process_event(struct dm_task *dmt,
*/
state->data_percent_check = (state->data_percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
- if (state->data_percent >= WARNING_THRESH)
- log_warn("WARNING: Thin pool %s data is now %.2f%% full.",
- device, dm_percent_to_float(state->data_percent));
needs_policy = 1;
if (state->data_percent >= UMOUNT_THRESH)
7 years, 3 months
master - dmeventd_thin: switch to struct percent
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=0d945ddbad8268...
Commit: 0d945ddbad82686aa590a2e566807723d66be1a7
Parent: eca964b554e371f699758ebfa0837f2e7a8cba87
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Jan 18 14:06:29 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:55:50 2017 +0100
dmeventd_thin: switch to struct percent
Later we can use stored percent values to pass them
to executed commands.
---
daemons/dmeventd/plugins/thin/dmeventd_thin.c | 33 +++++++++++-------------
1 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
index 65de465..ff127be 100644
--- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c
+++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
@@ -47,7 +47,9 @@
struct dso_state {
struct dm_pool *mem;
int metadata_percent_check;
+ int metadata_percent;
int data_percent_check;
+ int data_percent;
uint64_t known_metadata_size;
uint64_t known_data_size;
unsigned fails;
@@ -319,7 +321,6 @@ void process_event(struct dm_task *dmt,
void **user)
{
const char *device = dm_task_get_name(dmt);
- int percent;
struct dso_state *state = *user;
struct dm_status_thin_pool *tps = NULL;
void *next = NULL;
@@ -336,13 +337,9 @@ void process_event(struct dm_task *dmt,
dm_percent_to_float(state->metadata_percent_check));
#endif
-#if 0
- /* No longer monitoring, waiting for remove */
- if (!state->meta_percent_check && !state->data_percent_check)
- return;
-#endif
if (event & DM_EVENT_DEVICE_ERROR) {
/* Error -> no need to check and do instant resize */
+ state->data_percent = state->metadata_percent = 0;
if (_use_policy(dmt, state))
goto out;
@@ -402,38 +399,38 @@ void process_event(struct dm_task *dmt,
state->known_data_size = tps->total_data_blocks;
}
- percent = dm_make_percent(tps->used_metadata_blocks, tps->total_metadata_blocks);
- if (percent >= state->metadata_percent_check) {
+ state->metadata_percent = dm_make_percent(tps->used_metadata_blocks, tps->total_metadata_blocks);
+ if (state->metadata_percent >= state->metadata_percent_check) {
/*
* Usage has raised more than CHECK_STEP since the last
* time. Run actions.
*/
- state->metadata_percent_check = (percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
+ state->metadata_percent_check = (state->metadata_percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
/* FIXME: extension of metadata needs to be written! */
- if (percent >= WARNING_THRESH) /* Print a warning to syslog. */
+ if (state->metadata_percent >= WARNING_THRESH)
log_warn("WARNING: Thin pool %s metadata is now %.2f%% full.",
- device, dm_percent_to_float(percent));
+ device, dm_percent_to_float(state->metadata_percent));
needs_policy = 1;
- if (percent >= UMOUNT_THRESH)
+ if (state->metadata_percent >= UMOUNT_THRESH)
needs_umount = 1;
}
- percent = dm_make_percent(tps->used_data_blocks, tps->total_data_blocks);
- if (percent >= state->data_percent_check) {
+ state->data_percent = dm_make_percent(tps->used_data_blocks, tps->total_data_blocks);
+ if (state->data_percent >= state->data_percent_check) {
/*
* Usage has raised more than CHECK_STEP since
* the last time. Run actions.
*/
- state->data_percent_check = (percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
+ state->data_percent_check = (state->data_percent / CHECK_STEP) * CHECK_STEP + CHECK_STEP;
- if (percent >= WARNING_THRESH) /* Print a warning to syslog. */
+ if (state->data_percent >= WARNING_THRESH)
log_warn("WARNING: Thin pool %s data is now %.2f%% full.",
- device, dm_percent_to_float(percent));
+ device, dm_percent_to_float(state->data_percent));
needs_policy = 1;
- if (percent >= UMOUNT_THRESH)
+ if (state->data_percent >= UMOUNT_THRESH)
needs_umount = 1;
}
7 years, 3 months
master - dmeventd_thin: handling of internal command
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=eca964b554e371...
Commit: eca964b554e371f699758ebfa0837f2e7a8cba87
Parent: d80f9a107fc869d541a36c8c9d12c32589c34c12
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Jan 18 09:56:15 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:55:50 2017 +0100
dmeventd_thin: handling of internal command
---
daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
index 0cca98f..930f9fc 100644
--- a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
+++ b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
@@ -121,6 +121,7 @@ int dmeventd_lvm2_run(const char *cmdline)
int dmeventd_lvm2_command(struct dm_pool *mem, char *buffer, size_t size,
const char *cmd, const char *device)
{
+ static char _internal_prefix[] = "_dmeventd_";
char *vg = NULL, *lv = NULL, *layer;
int r;
@@ -135,6 +136,21 @@ int dmeventd_lvm2_command(struct dm_pool *mem, char *buffer, size_t size,
(layer = strstr(lv, "_mlog")))
*layer = '\0';
+ if (!strncmp(cmd, _internal_prefix, sizeof(_internal_prefix) - 1)) {
+ dmeventd_lvm2_lock();
+ /* output of internal command passed via env var */
+ if (!dmeventd_lvm2_run(cmd))
+ cmd = NULL;
+ else if ((cmd = getenv(cmd)))
+ cmd = dm_pool_strdup(mem, cmd); /* copy with lock */
+ dmeventd_lvm2_unlock();
+
+ if (!cmd) {
+ log_error("Unable to find configured command.");
+ return 0;
+ }
+ }
+
r = dm_snprintf(buffer, size, "%s %s/%s", cmd, vg, lv);
dm_pool_free(mem, vg);
7 years, 3 months
master - lvmcmd2lib: support new command
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=d80f9a107fc869...
Commit: d80f9a107fc869d541a36c8c9d12c32589c34c12
Parent: 04a9cad499848cfc025d33ca28e9f657abc80ca3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Jan 18 09:53:46 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:55:07 2017 +0100
lvmcmd2lib: support new command
Internal command which reads lvm.conf settins and passes it
via envvar to dmeventd monitoring thread.
---
WHATS_NEW | 1 +
tools/lvmcmdlib.c | 5 ++++-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index e5b735f..94411ae 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Support new internal command _dmeventd_thin_command.
Introduce new dmeventd/thin_command configurable setting.
Use new default units 'r' for displaying sizes.
Also unmount mount point on top of MD device if using blkdeactivate -u.
diff --git a/tools/lvmcmdlib.c b/tools/lvmcmdlib.c
index 276c8b3..0243768 100644
--- a/tools/lvmcmdlib.c
+++ b/tools/lvmcmdlib.c
@@ -83,7 +83,10 @@ int lvm2_run(void *handle, const char *cmdline)
memlock_inc_daemon(cmd);
} else if (!strcmp(cmdline, "_memlock_dec"))
memlock_dec_daemon(cmd);
- else
+ else if (!strcmp(cmdline, "_dmeventd_thin_command")) {
+ if (setenv(cmdline, find_config_tree_str(cmd, dmeventd_thin_command_CFG, NULL), 1))
+ ret = ECMD_FAILED;
+ } else
ret = lvm_run_command(cmd, argc, argv);
out:
7 years, 3 months
master - config: new option dmeventd/thin_command
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=04a9cad499848c...
Commit: 04a9cad499848cfc025d33ca28e9f657abc80ca3
Parent: ee754500dbb3787b1b9339e59dc4335a9b6c58cd
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Jan 18 09:54:32 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:53:26 2017 +0100
config: new option dmeventd/thin_command
This setting will allowing configuring which command gets executed
when thin-pool fullness goes from 50%..100%
---
WHATS_NEW | 1 +
conf/example.conf.in | 8 ++++++++
lib/config/config_settings.h | 6 ++++++
lib/config/defaults.h | 1 +
4 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 8f0d131..e5b735f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Introduce new dmeventd/thin_command configurable setting.
Use new default units 'r' for displaying sizes.
Also unmount mount point on top of MD device if using blkdeactivate -u.
Restore check preventing resize of cache type volumes (2.02.158).
diff --git a/conf/example.conf.in b/conf/example.conf.in
index 91d7072..7cb6f4a 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -2049,6 +2049,14 @@ dmeventd {
# warning is repeated when 85%, 90% and 95% of the pool is filled.
thin_library = "libdevmapper-event-lvm2thin.so"
+ # Configuration option dmeventd/thin_command.
+ # The plugin runs command with each 5% increment when thin-pool data volume
+ # or metadata volume gets above 50%.
+ # Command which starts with 'lvm ' prefix is internal lvm command.
+ # You can write your own handler to customise behaviour in more details.
+ # This configuration option has an automatic default value.
+ # thin_command = "lvm lvextend --use-policies"
+
# Configuration option dmeventd/executable.
# The full path to the dmeventd binary.
# This configuration option has an automatic default value.
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index e0770b6..8f49b12 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -1859,6 +1859,12 @@ cfg(dmeventd_thin_library_CFG, "thin_library", dmeventd_CFG_SECTION, 0, CFG_TYPE
"and emits a warning through syslog when the usage exceeds 80%. The\n"
"warning is repeated when 85%, 90% and 95% of the pool is filled.\n")
+cfg(dmeventd_thin_command_CFG, "thin_command", dmeventd_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_DMEVENTD_THIN_COMMAND, vsn(2, 2, 169), NULL, 0, NULL,
+ "The plugin runs command with each 5% increment when thin-pool data volume\n"
+ "or metadata volume gets above 50%.\n"
+ "Command which starts with 'lvm ' prefix is internal lvm command.\n"
+ "You can write your own handler to customise behaviour in more details.\n")
+
cfg(dmeventd_executable_CFG, "executable", dmeventd_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_DMEVENTD_PATH, vsn(2, 2, 73), "@DMEVENTD_PATH@", 0, NULL,
"The full path to the dmeventd binary.\n")
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index 5479cc5..26bbc69 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -81,6 +81,7 @@
#define DEFAULT_DMEVENTD_MIRROR_LIB "libdevmapper-event-lvm2mirror.so"
#define DEFAULT_DMEVENTD_SNAPSHOT_LIB "libdevmapper-event-lvm2snapshot.so"
#define DEFAULT_DMEVENTD_THIN_LIB "libdevmapper-event-lvm2thin.so"
+#define DEFAULT_DMEVENTD_THIN_COMMAND "lvm lvextend --use-policies"
#define DEFAULT_DMEVENTD_MONITOR 1
#define DEFAULT_BACKGROUND_POLLING 1
7 years, 3 months
master - cleanup: update config doc
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ee754500dbb378...
Commit: ee754500dbb3787b1b9339e59dc4335a9b6c58cd
Parent: f8234d6e5f4f82690da61abf03f93ddfb5cff467
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jan 20 22:33:07 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:52:40 2017 +0100
cleanup: update config doc
---
conf/example.conf.in | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/conf/example.conf.in b/conf/example.conf.in
index c3defe5..91d7072 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -1156,7 +1156,8 @@ activation {
# Configuration option activation/missing_stripe_filler.
# Method to fill missing stripes when activating an incomplete LV.
# Using 'error' will make inaccessible parts of the device return I/O
- # errors on access. You can instead use a device path, in which case,
+ # errors on access. Using 'zero' will return success (and zero) on I/O
+ # You can instead use a device path, in which case,
# that device will be used in place of missing stripes. Using anything
# other than 'error' with mirrored or snapshotted volumes is likely to
# result in data corruption.
7 years, 3 months
master - libdm: add human R|readable units
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f8234d6e5f4f82...
Commit: f8234d6e5f4f82690da61abf03f93ddfb5cff467
Parent: 6a20b221516fcecda25bc56996028eb50b3250f8
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Jan 9 16:30:49 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 20 23:52:17 2017 +0100
libdm: add human R|readable units
When showing sizes with 'H|human' units we do use standard rounding.
This however is confusing users from time to time,
when the printed number uses some biger units i.e. GiB and there is just
tiny fraction of space missing.
So here is some real-life example with new 'r' unit.
$lvs
LV VG Attr LSize Pool Origin
lvol0 vg -wi-a----- 1.99g
lvol1 vg -wi-a----- <2.00g
lvol2 vg -wi-a----- <2.01g
Meaning is - lvol1 has 'slightly' less then 2.00g - from sign '<' user
can be aware the LV doesn't have full 2.00GiB in size so he
will be less surpriced allocation of 2G volume will not succeed.
$ vgs
VG #PV #LV #SN Attr VSize VFree
vg 2 2 0 wz--n- <6,00g <2,01g
For uses needing 'old' undecorated human unit simply will continue
to use 'H|h' units.
The new R|r may further change when we would recongnize some
other way how to improve readability.
---
WHATS_NEW | 1 +
WHATS_NEW_DM | 1 +
conf/example.conf.in | 2 +-
lib/config/defaults.h | 2 +-
libdm/libdm-string.c | 18 ++++++++++++++++--
5 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 44b1df8..8f0d131 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Use new default units 'r' for displaying sizes.
Also unmount mount point on top of MD device if using blkdeactivate -u.
Restore check preventing resize of cache type volumes (2.02.158).
Add missing udev sync when flushing dirty cache content.
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 67aed5e..a8d4105 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.138 -
=====================================
+ Support new R|r human readable units output format.
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.
diff --git a/conf/example.conf.in b/conf/example.conf.in
index b1a2a9c..c3defe5 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -665,7 +665,7 @@ global {
# Configuration option global/units.
# Default value for --units argument.
- units = "h"
+ units = "r"
# Configuration option global/si_unit_consistency.
# Distinguish between powers of 1024 and 1000 bytes.
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index d988779..5479cc5 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -176,7 +176,7 @@
#define DEFAULT_INDENT 1
#define DEFAULT_ABORT_ON_INTERNAL_ERRORS 0
#define DEFAULT_DETECT_INTERNAL_VG_CACHE_CORRUPTION 0
-#define DEFAULT_UNITS "h"
+#define DEFAULT_UNITS "r"
#define DEFAULT_SUFFIX 1
#define DEFAULT_HOSTTAGS 0
diff --git a/libdm/libdm-string.c b/libdm/libdm-string.c
index 39117f8..d24a474 100644
--- a/libdm/libdm-string.c
+++ b/libdm/libdm-string.c
@@ -468,10 +468,12 @@ const char *dm_size_to_string(struct dm_pool *mem, uint64_t size,
unsigned base = BASE_UNKNOWN;
unsigned s;
int precision;
+ double d;
uint64_t byte = UINT64_C(0);
uint64_t units = UINT64_C(1024);
char *size_buf = NULL;
char new_unit_type = '\0', unit_type_buf[2];
+ const char *prefix = "";
const char * const size_str[][3] = {
/* BASE_UNKNOWN */
{" ", " ", " "}, /* [0] */
@@ -570,7 +572,7 @@ const char *dm_size_to_string(struct dm_pool *mem, uint64_t size,
byte = unit_factor;
} else {
/* Human-readable style */
- if (unit_type == 'H') {
+ if (unit_type == 'H' || unit_type == 'R') {
units = UINT64_C(1000);
base = BASE_1000;
} else {
@@ -586,6 +588,16 @@ const char *dm_size_to_string(struct dm_pool *mem, uint64_t size,
for (s = 0; s < NUM_UNIT_PREFIXES && size < byte; s++)
byte /= units;
+ if ((s < NUM_UNIT_PREFIXES) &&
+ ((unit_type == 'R') || (unit_type == 'r'))) {
+ /* When the rounding would cause difference, add '<' prefix
+ * i.e. 2043M is more then 1.9949G prints <2.00G
+ * This version is for 2 digits fixed precision */
+ d = 100. * (double) size / byte;
+ if (!_close_enough(floorl(d), nearbyintl(d)))
+ prefix = "<";
+ }
+
include_suffix = 1;
}
@@ -599,7 +611,7 @@ const char *dm_size_to_string(struct dm_pool *mem, uint64_t size,
precision = 2;
}
- snprintf(size_buf, SIZE_BUF - 1, "%.*f%s", precision,
+ snprintf(size_buf, SIZE_BUF - 1, "%s%.*f%s", prefix, precision,
(double) size / byte, include_suffix ? size_str[base + s][suffix_type] : "");
return size_buf;
@@ -639,6 +651,8 @@ uint64_t dm_units_to_factor(const char *units, char *unit_type,
switch (*units) {
case 'h':
case 'H':
+ case 'r':
+ case 'R':
multiplier = v = UINT64_C(1);
*unit_type = *units;
break;
7 years, 3 months
master - devices: Recognise Veritas Dynamic Multipathing
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6a20b221516fce...
Commit: 6a20b221516fcecda25bc56996028eb50b3250f8
Parent: 15e657f110351ab16af8bd79e1716adce9b75beb
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Jan 10 22:23:23 2017 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Jan 10 22:23:23 2017 +0000
devices: Recognise Veritas Dynamic Multipathing
VxDMP doesn't interact very well with udev so always set
devices/obtain_device_list_from_udev = 0
in lvm.conf on these systems.
---
lib/device/dev-type.c | 10 ++++++++++
lib/device/dev-type.h | 1 +
lib/device/device-types.h | 1 +
3 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/lib/device/dev-type.c b/lib/device/dev-type.c
index cc6777d..325b66b 100644
--- a/lib/device/dev-type.c
+++ b/lib/device/dev-type.c
@@ -125,6 +125,10 @@ struct dev_types *create_dev_types(const char *proc_dir,
if (!strncmp("emcpower", line + i, 8) && isspace(*(line + i + 8)))
dt->emcpower_major = line_maj;
+ /* Look for Veritas Dynamic Multipathing */
+ if (!strncmp("VxDMP", line + i, 5) && isspace(*(line + i + 5)))
+ dt->vxdmp_major = line_maj;
+
if (!strncmp("loop", line + i, 4) && isspace(*(line + i + 4)))
dt->loop_major = line_maj;
@@ -218,6 +222,9 @@ int dev_subsystem_part_major(struct dev_types *dt, struct device *dev)
if (MAJOR(dev->dev) == dt->power2_major)
return 1;
+ if (MAJOR(dev->dev) == dt->vxdmp_major)
+ return 1;
+
if ((MAJOR(dev->dev) == dt->blkext_major) &&
dev_get_primary_dev(dt, dev, &primary_dev) &&
(MAJOR(primary_dev) == dt->md_major))
@@ -246,6 +253,9 @@ const char *dev_subsystem_name(struct dev_types *dt, struct device *dev)
if (MAJOR(dev->dev) == dt->power2_major)
return "POWER2";
+ if (MAJOR(dev->dev) == dt->vxdmp_major)
+ return "VXDMP";
+
if (MAJOR(dev->dev) == dt->blkext_major)
return "BLKEXT";
diff --git a/lib/device/dev-type.h b/lib/device/dev-type.h
index 33622fe..b0adfe2 100644
--- a/lib/device/dev-type.h
+++ b/lib/device/dev-type.h
@@ -41,6 +41,7 @@ struct dev_types {
int drbd_major;
int device_mapper_major;
int emcpower_major;
+ int vxdmp_major;
int power2_major;
int dasd_major;
int loop_major;
diff --git a/lib/device/device-types.h b/lib/device/device-types.h
index 2c1e4ac..2834cd1 100644
--- a/lib/device/device-types.h
+++ b/lib/device/device-types.h
@@ -63,5 +63,6 @@ static const dev_known_type_t _dev_known_types[] = {
{"bcache", 1, "bcache block device cache"},
{"nvme", 64, "NVM Express"},
{"zvol", 16, "ZFS Zvols"},
+ {"VxDMP", 16, "Veritas Dynamic Multipathing"},
{"", 0, ""}
};
7 years, 3 months
master - tests: ignore racy test failure
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=15e657f110351a...
Commit: 15e657f110351ab16af8bd79e1716adce9b75beb
Parent: d757b2431a56bd5ae45fe863423942d89e14cbf9
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jan 6 23:37:46 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jan 6 23:39:53 2017 +0100
tests: ignore racy test failure
When test fails here, make it just warning instead of failing whole
test.
---
test/shell/lvconvert-repair-raid.sh | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvconvert-repair-raid.sh b/test/shell/lvconvert-repair-raid.sh
index d3ac1da..26bca3d 100644
--- a/test/shell/lvconvert-repair-raid.sh
+++ b/test/shell/lvconvert-repair-raid.sh
@@ -79,12 +79,15 @@ vgextend $vg "$dev3"
lvremove -ff $vg/$lv1
# Delayed sync to allow for repair during rebuild
-delay 50
+delay 60
# RAID5 single replace during initial sync
lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
aux disable_dev "$dev3"
-not lvconvert -y --repair $vg/$lv1
+# FIXME: there is quite big sleep on several 'status' read retries
+# so over 3sec - it may actually finish full sync
+# Use 'should' for this test result.
+should not lvconvert -y --repair $vg/$lv1
aux wait_for_sync $vg $lv1
lvconvert -y --repair $vg/$lv1
vgreduce --removemissing $vg
7 years, 3 months