[lvm-devel] master - libdm: reset report field widths in _destroy_rows()
Bryn Reeves
bmr at fedoraproject.org
Wed Sep 2 19:49:49 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c4f3732c918c9d26fdaca42acdc92a02898dbe35
Commit: c4f3732c918c9d26fdaca42acdc92a02898dbe35
Parent: a9d954cb3cf974563d27ef1594d924c4de9c5eb9
Author: Bryn M. Reeves <bmr at redhat.com>
AuthorDate: Mon Aug 24 11:38:17 2015 +0100
Committer: Bryn M. Reeves <bmr at redhat.com>
CommitterDate: Wed Sep 2 20:48:59 2015 +0100
libdm: reset report field widths in _destroy_rows()
For repeating reports field widths should be re-calculated for
each report interval. Not doing so will cause a single row with
wide field data to cause all subsequent rows to share the width:
Name RgID ArID R/s W/s Histogram Bounds
vg_hex-lv_home 0 0 4522.00 834.00 0s: 991, 2ms: 152, 4ms: 161, 6ms: 4052 0s, 2ms, 4ms, 6ms
vg_hex-lv_swap 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
vg_hex-lv_root 0 0 1754.00 683.00 0s: 369, 2ms: 65, 4ms: 90, 6ms: 1913 0s, 2ms, 4ms, 6ms
luks-79733921-3f68-4c92-9eb7-d0aca4c6ba3e 0 0 4522.00 868.00 0s: 985, 2ms: 152, 4ms: 161, 6ms: 4092 0s, 2ms, 4ms, 6ms
vg_hex-lv_images 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
Name RgID ArID R/s W/s Histogram Bounds
vg_hex-lv_home 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
vg_hex-lv_swap 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
vg_hex-lv_root 0 0 0.00 2.00 0s: 1, 2ms: 0, 4ms: 0, 6ms: 1 0s, 2ms, 4ms, 6ms
luks-79733921-3f68-4c92-9eb7-d0aca4c6ba3e 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
vg_hex-lv_images 0 0 0.00 0.00 0s: 0, 2ms: 0, 4ms: 0, 6ms: 0 0s, 2ms, 4ms, 6ms
^^^^^^^^^^^^^^^^^
This is especially significant for the current histogram fields:
depending on the time since the last clear operation the first
report iteration may contain very large values leading to a very
large minimum field width. Without resetting field widths this
large minimum field width value is used for all subsequent rows.
---
libdm/libdm-report.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index b948073..2ebb69e 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -86,7 +86,8 @@ struct field_properties {
struct dm_list list;
uint32_t field_num;
uint32_t sort_posn;
- int32_t width;
+ int32_t initial_width;
+ int32_t width; /* current width: adjusted by dm_report_object() */
const struct dm_report_object_type *type;
uint32_t flags;
int implicit;
@@ -774,7 +775,8 @@ static int _copy_field(struct dm_report *rh, struct field_properties *dest,
: rh->fields;
dest->field_num = field_num;
- dest->width = fields[field_num].width;
+ dest->initial_width = fields[field_num].width;
+ dest->width = fields[field_num].width; /* adjusted in _do_report_object() */
dest->flags = fields[field_num].flags & DM_REPORT_FIELD_MASK;
dest->implicit = implicit;
@@ -4178,6 +4180,13 @@ bad:
return 0;
}
+static void _reset_field_props(struct dm_report *rh)
+{
+ struct field_properties *fp;
+ dm_list_iterate_items(fp, &rh->field_props)
+ fp->width = fp->initial_width;
+}
+
static void _destroy_rows(struct dm_report *rh)
{
/*
@@ -4189,6 +4198,9 @@ static void _destroy_rows(struct dm_report *rh)
dm_pool_free(rh->mem, rh->first_row);
rh->first_row = NULL;
dm_list_init(&rh->rows);
+
+ /* Reset field widths to original values. */
+ _reset_field_props(rh);
}
static int _output_as_rows(struct dm_report *rh)
More information about the lvm-devel
mailing list