[lvm-devel] [PATCH] Specified PVs being ignored when performing mirror split (bug 619221)
Takahiro Yasui
takahiro.yasui at hds.com
Thu Aug 5 21:31:56 UTC 2010
Hi Jon,
On 08/04/10 18:51, Jonathan Brassow wrote:
...
> This patch reverses the aforementioned check-in (solving the regressions)
> and posits a new solution to the list reversal problem. The original
> problem was that we would always take the lowest mimage LVs from a mirror
> when performing a split, but what we really want is to take the highest
> mimage LVs. This patch accomplishes that by simply not short-circuiting
> the processing done in _move_removable_mimages_to_end. This function
> would start from the beginning of the mirror sub-lv list and work its
> way to the end - quiting when it found just enough to cover the requested
> amount. This would always leave the least desirable LVs to be removed
> at the end of the list.
If I understand correctly, the expected result with the following examples are:
* Mirror volume (vg/org) consists of legs A (sda), B (sdb), C (sdc) and D (sdd)
(1) lvconvert --splitmirrors 1 --name new vg/org
vg/org: Mirror volume consists of legs A, B, and C (leg A is primary)
vg/new: Linear volume consists of D
(2) lvconvert --splitmirrors 2 --name new vg/org
vg/org: Mirror volume consists of legs A and B (leg A is primary)
vg/new: Mirror volume consists of legs C and D
(3) lvconvert --splitmirrors 1 --name new vg/org /dev/sda
vg/org: Mirror volume consists of legs B, C and D (leg B is primary)
vg/new: Linear volume consists of A
(4) lvconvert --splitmirrors 2 --name new vg/org /dev/sda /dev/sdb
vg/org: Mirror volume consists of legs C and D (leg C is primary)
vg/new: Mirror volume consists of legs A and B
(5) lvconvert --splitmirrors 1 --name new vg/org /dev/sda /dev/sdb
vg/org: Mirror volume consists of legs A, C and D (leg A is primary)
vg/new: Linear volume consists of B
Without a PV list in the command line, your patch works well. The new logic
desn't change the order of mirror volumes because
_move_removable_mimages_to_end() reorders all mirror legs and generates
the same order as original.
With a PV list in the command line, on the other hand, this logic shifts mirror
legs more than needed. For example, a user wants to split vg/new (linear)
from vg/org and specifies /dev/sda and /dev/sdb as removable PVs.
In this case, the structure of vg/org is changed as follows.
# lvconvert --splitmirrors 1 --name new vg/org /dev/sda /dev/sdb
vg/org: Mirror volume consists of legs C, D and A (leg C is primary)
vg/new: Linear volume consists of B
Is this change OK? If the answer is yes, I just ask you to change the comments
of _move_removable_mimages_to_end().
/*
* _move_removable_mimages_to_end
*
* We always detach mimage LVs from the end of the areas array.
* This function will push 'count' mimages to the end of the array
* based on if their PVs are removable.
*
* This is an all or nothing function. Either the user specifies
* enough removable PVs to satisfy count, or they don't specify
* any removable_pvs at all (in which case all PVs in the mirror
* are considered removable).
*/
However, if the answer is no, we need to update the patch, for example, as
follows.
static int _move_removable_mimages_to_end(struct logical_volume *lv,
uint32_t count,
struct dm_list *removable_pvs)
{
struct logical_volume *sub_lv;
struct lv_segment *mirrored_seg = first_seg(lv);
int i;
if (!removable_pvs)
return 1;
for (i = mirrored_seg->area_count - 1; i >= 0; i--) {
sub_lv = seg_lv(mirrored_seg, i);
if (!is_temporary_mirror_layer(sub_lv) &&
is_mirror_image_removable(sub_lv, removable_pvs)) {
if (!shift_mirror_images(mirrored_seg, i))
return_0;
if (!--count)
break;
}
}
return !count;
}
Thanks,
Taka
More information about the lvm-devel
mailing list