1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Disallow the primary mirror image from being removed when the

mirror is not in-sync.  This restriction is not extended to
repair operations (i.e. it will not limit what 'lvconvert --repair'
can do).
This commit is contained in:
Jonathan Earl Brassow 2010-04-21 13:55:08 +00:00
parent 0fad905483
commit 66f79d05eb
4 changed files with 34 additions and 6 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.64 -
=================================
Disallow primary mirror image removal when mirror is not in-sync.
Remove obsolete --name parameter from vgcfgrestore.
Add -S command to clvmd to restart the daemon preserving exclusive locks.
Increment lvm2app version from 1 to 2.

View File

@ -751,7 +751,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
uint32_t *removed)
{
uint32_t m;
uint32_t s;
int32_t s;
int removable_pvs_specified;
struct logical_volume *sub_lv;
struct logical_volume *detached_log_lv = NULL;
@ -781,15 +781,25 @@ static int _remove_mirror_images(struct logical_volume *lv,
/* Move removable_pvs to end of array */
if (removable_pvs_specified) {
for (s = 0; s < mirrored_seg->area_count &&
old_area_count - new_area_count < num_removed; s++) {
for (s = mirrored_seg->area_count - 1;
s >= 0 && old_area_count - new_area_count < num_removed;
s--) {
sub_lv = seg_lv(mirrored_seg, s);
if (!is_temporary_mirror_layer(sub_lv) &&
_is_mirror_image_removable(sub_lv, removable_pvs)) {
/*
* Check if the user is trying to pull the
* primary mirror image when the mirror is
* not in-sync.
*/
if ((s == 0) && !_mirrored_lv_in_sync(lv) &&
!(lv->status & PARTIAL_LV)) {
log_error("Unable to remove primary mirror image while mirror is not in-sync");
return_0;
}
if (!shift_mirror_images(mirrored_seg, s))
return_0;
s--; /* adjust counter after shifting */
new_area_count--;
}
}

View File

@ -61,10 +61,20 @@ lvcreate -l2 -n $lv1 $vg $dev1
not lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1
lvremove -ff $vg
lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0-1
# Start w/ 3-way mirror
# Test pulling primary image before mirror in-sync (should fail)
# Test pulling primary image after mirror in-sync (should work)
# Test that the correct devices remain in the mirror
lvcreate -l8 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0-1
# FIXME:
# This is somewhat timing dependent - sync /could/ finish before
# we get a chance to have this command fail
not lvconvert -m-1 $vg/$lv1 $dev1
while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do
sleep 1
done
lvconvert -m-1 $vg/$lv1 $dev1
check mirror_images_on $lv1 $dev2 $dev4
lvconvert -m-1 $vg/$lv1 $dev2
check linear $vg $lv1
check lv_on $vg/$lv1 $dev4

View File

@ -98,6 +98,12 @@ wait_conversion_()
while (lvs --noheadings -oattr "$lv" | grep -q '^ *c'); do sleep 1; done
}
wait_sync_()
{
local lv=$1
while [ `lvs --noheadings -o copy_percent $lv` != "100.00" ]; do sleep 1; done
}
check_no_tmplvs_()
{
local lv=$1
@ -404,6 +410,7 @@ lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3
lvs -a -o+devices $vg
check_mirror_count_ $vg/$lv1 2
check_mirror_log_ $vg/$lv1
wait_sync_ $vg/$lv1 # cannot pull primary unless mirror in-sync
lvconvert -m0 $vg/$lv1 $dev1
lvs -a -o+devices $vg
check_no_tmplvs_ $vg/$lv1