On 01/12/2016 11:03 AM, Joe Harvell wrote:
Le 11/01/2016 17:32, John Ferlan a écrit :
>
> On 01/11/2016 12:50 PM, Joe Harvell wrote:
>>> John/Jan:
>>>
>>> I actually made a patch similar to this and was about to submit it for
>>> review. Now I see there is a more thorough version here already
>>> submitted just over a year ago. I don't see any evidence of this in
>>> the git repo. Are there any plans to commit it?
>>>
>>> ---
>>> Joe Harvell
>>>
>>> --
>>> libvir-list mailing list
>>> libvir-list(a)redhat.com
>>>
https://www.redhat.com/mailman/listinfo/libvir-list
>> I was referring to John's patch posted on 12 Dec 2014.
>>
> For those that don't keep that much history in their mailbox...
>
>
http://www.redhat.com/archives/libvir-list/2014-December/msg00706.html
>
> There's also a related bz:
>
>
https://bugzilla.redhat.com/show_bug.cgi?id=1060287
>
>
> So from my perspective, this has languished in one of my local git
> branches. I got busy with other things and this has never really
> surfaced to anywhere near the top of my todo list.
>
> John
>
That's what I suspected. If the testing part is why it's languishing,
here is a simpler patch with less functionality. This patch just makes
Thin LVs and Snapshot Thin LVs (once you activate them) detectable by
libvirt. Would it be worth me submitting this as a patch?
---
Joe
I haven't forgotten, just have been sidetracked ;-)... I also wanted to
"try it out" for myself (a visual learner)...
The end result is an interesting way to recognize an existing "thin"
volume in the volume group; however, I still believe we need a way to
add/delete "thin" volumes in "thin" lv pools. Today all that would be
created is a "snapshot" volume. If I wanted a real "thin" volume then
a
thinpool needs to be generated and the thin volume comes from that pool
(that's how I understand it at least). The referenced patch generated a
1-to-1 mapping of thin volume and thin pool (although I may have got the
-L and -V parameters wrong). If there's a better way, then please submit
some patches for that. Feel free to use those old patches as a base. It
may be that we need to create a new switch/flag when the volume is
created in order to signify that a thinpool is desired as opposed to the
option those patches took as "defaulting" to that.
Since you included your patch as an attachment - my reply-all was less
than happy to include it. I cut-n-paste what I have and make some
comments after ">>". I also have more details afterwards...
diff -ur a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
--- a/src/storage/storage_backend_logical.c 2015-10-29
01:35:32.000000000 -0500
+++ b/src/storage/storage_backend_logical.c 2016-01-11
10:22:36.807282623 -0600
@@ -64,8 +64,6 @@
}
-#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED "striped"
-
struct virStorageBackendLogicalPoolVolData {
virStoragePoolObjPtr pool;
virStorageVolDefPtr vol;
@@ -165,13 +163,11 @@
VIR_STORAGE_VOL_OPEN_DEFAULT) < 0)
goto cleanup;
- nextents = 1;
- if (STREQ(groups[4], VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED)) {
- if (virStrToLong_i(groups[5], NULL, 10, &nextents) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed volume extent stripes value"));
- goto cleanup;
- }
+ nextents = 0;
+ if (virStrToLong_i(groups[5], NULL, 10, &nextents) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed volume extent stripes value"));
+ goto cleanup;
}
>So, it's a fair assumption that this field will be
"1" for "linear"
(always)... Same for "thin-pool"? It
would be "1" or more for "striped"
(although 1 doesn't make sense)... Similarly for "mirror"? I see it will
be "0" for "thin". Are there other instances of "0" that
would be
important to note? I think this could be a "separate" patch unrelated
the rest of the changes here.
Does this also mean that getting the 'segtype' is unnecessary? Can (or
should) it be removed?
I'm still unclear when it is 0, then what does that mean for the
following lines? The REALLOC, length, size, target.allocation, and
device (group[3]) regex/parsing? In the patch I had posted, I just
jumped around it (IOW: I punted seeing as it wasn't important nor was it
listed by libvirt).
/* Finally fill in extents information */
@@ -227,14 +223,15 @@
goto cleanup;
}
- err = regexec(reg, groups[3], nvars, vars, 0);
- regfree(reg);
- if (err != 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed volume extent devices value"));
- goto cleanup;
+ if(groups[3] != NULL && *groups[3] != '\0') {
+ err = regexec(reg, groups[3], nvars, vars, 0);
+ regfree(reg);
+ if (err != 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed volume extent devices value"));
+ goto cleanup;
+ }
> So the "if" you're showing means we could be passed
#""#? I can see
"##" (when [4] is "thin"). In any
case, if it's either NULL or "", then
all the code adjusting the extents, setting up the regex, reg, etc. is
essentially unnecessary (hence why I had skipped it in my code).
What I do see though is an opportunity to move all that devices parsing
code into a helper. Then from there make some decisions on whether to
call based on the value of 'nextents'. I would "think" (assume) that
if
nextents == 0, then devices (or groups[3] would be empty). Is that a
fair assumption?
}
-
> Spurrious change that shouldn't be made.
p = groups[3];
/* vars[0] is skipped */
@@ -311,7 +308,8 @@
* striped, so "," is not a suitable separator either (rhbz 727474).
*/
const char *regexes[] = {
-
"^\\s*(\\S+)#(\\S*)#(\\S+)#(\\S+)#(\\S+)#([0-9]+)#(\\S+)#([0-9]+)#([0-9]+)#(\\S+)#?\\s*$"
+// name orig uuid devs sgtype stripes segsz vgextsz
sz lvattr
+
"^\\s*(\\S+)#(\\S*)#(\\S+)#(\\S*)#(\\S+)#([0-9]+)#(\\S+)#([0-9]+)#([0-9]+)#(\\S+)#?\\s*$"
> To make it more obvious for the sight challenged - the change
here is
for field [3] (e.g. 'devices') where you're changing from
"(\\S+)" to
"(\\S*)". The "*" means match zero or more while "+" means
match at
least one.
Would you consider this "related" to the nextents (eg 'stripes') value
of 0? That is - I'm assuming a "*" which returns 0, means 'stripes ==
0'. If so, then choosing to not parse devices based on nextents == 0
would mean the prior change related to groups[3] != NULL and *groups[3]
!= '\0' is then unnecessary, true?
};
int vars[] = {
10
...
So while I was reviewing and thinking I generated a set of patches and
ran some basic tests. I'm still concerned about the thin/thinpool
stuff, but interestingly enough I can "see" the thin volume in a pool.
For example, assume I have a volume group (and pool) "vg_test_thin"
(it's a 50M iSCSI volume for which I did a pvcreate and vgcreate). If I
run the following:
# lvcreate --type thin-pool -L 20M \
--thinpool thinpool_lv_test_thin vg_test_thin
# lvcreate --name lv_test_thin \
--thin vg_test_thin/thinpool_lv_test_thin \
--type thin -V 40M
Then refresh my "vg_test_thin" libvirt pool, I can see a 40M
"lv_test_thin" (both capacity and allocation have 40M - regardless what
value I use for -V, the capacity and allocation remain whatever was
provided). I guess I partially at least expected the model where
allocation shows up as smaller (e.g. is what's presented to the guest),
but allowed to go up to capacity (or do I have that backwards - it's
Friday afternoon ;-)). IIRC, for these thin pool/volume's when the
actual storage on the volume goes above 20M (eg. the pool -L value),
then the pool goes 'inactive' until the pool is extended. That too could
be concerning to a libvirt and lv novice. The other issue is how to
handle/avoid the vol-wipe problem for thin volumes.
I'll post the patches in a bit so you (and others) can have a look.
John