mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-23 02:05:07 +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:
parent
b5d88e683f
commit
e37b173f13
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.64 -
|
Version 2.02.64 -
|
||||||
=================================
|
=================================
|
||||||
|
Disallow primary mirror image removal when mirror is not in-sync.
|
||||||
Remove obsolete --name parameter from vgcfgrestore.
|
Remove obsolete --name parameter from vgcfgrestore.
|
||||||
Add -S command to clvmd to restart the daemon preserving exclusive locks.
|
Add -S command to clvmd to restart the daemon preserving exclusive locks.
|
||||||
Increment lvm2app version from 1 to 2.
|
Increment lvm2app version from 1 to 2.
|
||||||
|
@ -751,7 +751,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
|
|||||||
uint32_t *removed)
|
uint32_t *removed)
|
||||||
{
|
{
|
||||||
uint32_t m;
|
uint32_t m;
|
||||||
uint32_t s;
|
int32_t s;
|
||||||
int removable_pvs_specified;
|
int removable_pvs_specified;
|
||||||
struct logical_volume *sub_lv;
|
struct logical_volume *sub_lv;
|
||||||
struct logical_volume *detached_log_lv = NULL;
|
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 */
|
/* Move removable_pvs to end of array */
|
||||||
if (removable_pvs_specified) {
|
if (removable_pvs_specified) {
|
||||||
for (s = 0; s < mirrored_seg->area_count &&
|
for (s = mirrored_seg->area_count - 1;
|
||||||
old_area_count - new_area_count < num_removed; s++) {
|
s >= 0 && old_area_count - new_area_count < num_removed;
|
||||||
|
s--) {
|
||||||
sub_lv = seg_lv(mirrored_seg, s);
|
sub_lv = seg_lv(mirrored_seg, s);
|
||||||
|
|
||||||
if (!is_temporary_mirror_layer(sub_lv) &&
|
if (!is_temporary_mirror_layer(sub_lv) &&
|
||||||
_is_mirror_image_removable(sub_lv, removable_pvs)) {
|
_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))
|
if (!shift_mirror_images(mirrored_seg, s))
|
||||||
return_0;
|
return_0;
|
||||||
s--; /* adjust counter after shifting */
|
|
||||||
new_area_count--;
|
new_area_count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,10 +61,20 @@ lvcreate -l2 -n $lv1 $vg $dev1
|
|||||||
not lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1
|
not lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1
|
||||||
lvremove -ff $vg
|
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
|
lvconvert -m-1 $vg/$lv1 $dev1
|
||||||
check mirror_images_on $lv1 $dev2 $dev4
|
check mirror_images_on $lv1 $dev2 $dev4
|
||||||
lvconvert -m-1 $vg/$lv1 $dev2
|
lvconvert -m-1 $vg/$lv1 $dev2
|
||||||
check linear $vg $lv1
|
check linear $vg $lv1
|
||||||
check lv_on $vg/$lv1 $dev4
|
check lv_on $vg/$lv1 $dev4
|
||||||
|
|
||||||
|
@ -98,6 +98,12 @@ wait_conversion_()
|
|||||||
while (lvs --noheadings -oattr "$lv" | grep -q '^ *c'); do sleep 1; done
|
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_()
|
check_no_tmplvs_()
|
||||||
{
|
{
|
||||||
local lv=$1
|
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
|
lvs -a -o+devices $vg
|
||||||
check_mirror_count_ $vg/$lv1 2
|
check_mirror_count_ $vg/$lv1 2
|
||||||
check_mirror_log_ $vg/$lv1
|
check_mirror_log_ $vg/$lv1
|
||||||
|
wait_sync_ $vg/$lv1 # cannot pull primary unless mirror in-sync
|
||||||
lvconvert -m0 $vg/$lv1 $dev1
|
lvconvert -m0 $vg/$lv1 $dev1
|
||||||
lvs -a -o+devices $vg
|
lvs -a -o+devices $vg
|
||||||
check_no_tmplvs_ $vg/$lv1
|
check_no_tmplvs_ $vg/$lv1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user