On Mon, Sep 17, 2018 at 3:51 PM pengyixiang <yxpengi386(a)163.com> wrote:
Hello, everyone!
if we reload lvs, why we don't update lvs that seg_start_pe != "0" ?
there's in [1] with red mark.
what seg_start_pe means?
It is kind of hidden in lvm manual, but if you read carefully lvs(8):
-o|--options String
Comma-separated, ordered list of fields to display in
columns. String arg syntax is: [+|-|#]Field1[,Field2 ...] The prefix +
will append the specified fields to the
default fields, - will remove the specified fields from the
default fields, and # will compact specified fields (removing them when
empty for all rows.) Use -o help to
view the list of all available fields. Use separate lists of
fields to add, remove or compact by repeating the -o option:
-o+field1,field2 -o-field3,field4 -o#field5.
These lists are evaluated from left to right. Use field name
lv_all to view all LV fields, vg_all all VG fields, pv_all all PV fields,
pvseg_all all PV segment fields,
seg_all all LV segment fields, and pvseg_all all PV segment
columns. See the lvm.conf report section for more config options. See
lvmreport(7) for more information about
reporting.
and you follow the instructions:
"Use -o help to view the list of all available fields"
You will find:
$ lvs -o help 2>&1 | grep seg_start_pe
seg_start_pe - Offset within the LV to the start of the
segment in physical extents.
If this lv is a vm template, may seg_start_pe is not zero, and we
should ignore it?
This is not related to templates. At this level vdsm lvm module does not
know
anything about templates.
I think the issue is getting multiple lines for same lv in lvs output, when
you
specify -o devices.
If an lv has several segments, lvs will return separate line for every
segment.
You can simulate this case with these commands:
$ sudo losetup -f /tmp/backing --show
/dev/loop2
$ sudo pvcreate /dev/loop2
Physical volume "/dev/loop2" successfully created.
$ sudo vgcreate test /dev/loop2
Volume group "test" successfully created
$ sudo lvcreate -n lv1 -L 100m test
Logical volume "lv1" created.
$ sudo lvcreate -n lv2 -L 100m test
Logical volume "lv2" created.
$ sudo lvextend -L 200m test/lv1
Size of logical volume test/lv1 changed from 100.00 MiB (25 extents) to
200.00 MiB (50 extents).
Logical volume test/lv1 successfully resized.
$ sudo lvs -o lv_name,seg_start_pe,seg_pe_ranges,devices test
LV Start PE Ranges Devices
lv1 0 /dev/loop2:0-24 /dev/loop2(0)
lv1 25 /dev/loop2:50-74 /dev/loop2(50)
lv2 0 /dev/loop2:25-49 /dev/loop2(25)
Looks like the only reason we query seg_start_pe is to filter the lines
about the first
segment of an lv.
...
updatedLVs = {}
for line in out:
fields = [field.strip() for field in line.split(SEPARATOR)]
lv = makeLV(*fields)
# For LV we are only interested in its first extent
if lv.seg_start_pe == "0":
self._lvs[(lv.vg_name, lv.name)] = lv
updatedLVs[(lv.vg_name, lv.name)] = lv
...
This stores the info about the first segment in the cache, and drop possibly
other lines about the next segments.
We probably can eliminate multiple lines by using --select, which was not
availabe
when this code was written:
$ sudo lvs -o lv_name,seg_pe_ranges,devices test --select 'seg_start_pe=0'
LV PE Ranges Devices
lv1 /dev/loop2:0-24 /dev/loop2(0)
lv2 /dev/loop2:25-49 /dev/loop2(25)
It would be nice if someone would have time to do this.
Cheers,
Nir