mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
5d455b28fc
The dm-raid target now rejects device rebuild requests during ongoing resynchronization thus causing 'lvconvert --repair ...' to fail with a kernel error message. This regresses with respect to failing automatic repair via the dmeventd RAID plugin in case raid_fault_policy="allocate" is configured in lvm.conf as well. Previously allowing such repair request required cancelling the resynchronization of any still accessible DataLVs, hence reasoning potential data loss. Patch allows the resynchronization of still accessible DataLVs to finish up by rejecting any 'lvconvert --repair ...'. It enhances the dmeventd RAID plugin to be able to automatically repair by postponing the repair after synchronization ended. More tests are added to lvconvert-rebuild-raid.sh to cover single and multiple DataLV failure cases for the different RAID levels. - resolves: rhbz1371717
144 lines
3.9 KiB
Bash
144 lines
3.9 KiB
Bash
#!/bin/sh
|
|
# Copyright (C) 2013 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
SKIP_WITH_LVMLOCKD=1
|
|
SKIP_WITH_LVMPOLLD=1
|
|
|
|
. lib/inittest
|
|
|
|
aux have_raid 1 3 0 || skip
|
|
aux raid456_replace_works || skip
|
|
|
|
aux lvmconf 'allocation/maximise_cling = 0' \
|
|
'allocation/mirror_logs_require_separate_pvs = 1'
|
|
|
|
aux prepare_vg 8
|
|
|
|
function delay
|
|
{
|
|
for d in $(< DEVICES)
|
|
do
|
|
aux delay_dev "$d" 0 $1 $(get first_extent_sector "$d")
|
|
done
|
|
}
|
|
|
|
# It's possible small raid arrays do have problems with reporting in-sync.
|
|
# So try bigger size
|
|
RAID_SIZE=32
|
|
|
|
# Fast sync and repair afterwards
|
|
delay 0
|
|
|
|
# RAID1 dual-leg single replace after initial sync
|
|
lvcreate --type raid1 -m 1 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2"
|
|
aux wait_for_sync $vg $lv1
|
|
aux disable_dev "$dev2"
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev2"
|
|
vgextend $vg "$dev2"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
# Delayed sync to allow for repair during rebuild
|
|
delay 50
|
|
|
|
# RAID1 triple-leg single replace during initial sync
|
|
lvcreate --type raid1 -m 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
|
|
aux disable_dev "$dev2" "$dev3"
|
|
not lvconvert -y --repair $vg/$lv1
|
|
aux wait_for_sync $vg $lv1
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev2" "$dev3"
|
|
vgextend $vg "$dev2" "$dev3"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
|
|
# Larger RAID size possible for striped RAID
|
|
RAID_SIZE=64
|
|
|
|
# Fast sync and repair afterwards
|
|
delay 0
|
|
# RAID5 single replace after initial sync
|
|
lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
|
|
aux wait_for_sync $vg $lv1
|
|
aux disable_dev "$dev3"
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev3"
|
|
vgextend $vg "$dev3"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
# Delayed sync to allow for repair during rebuild
|
|
delay 50
|
|
|
|
# RAID5 single replace during initial sync
|
|
lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
|
|
aux disable_dev "$dev3"
|
|
not lvconvert -y --repair $vg/$lv1
|
|
aux wait_for_sync $vg $lv1
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev3"
|
|
vgextend $vg "$dev3"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
# Fast sync and repair afterwards
|
|
delay 0
|
|
|
|
# RAID6 double replace after initial sync
|
|
lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
|
|
"$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
|
|
aux wait_for_sync $vg $lv1
|
|
aux disable_dev "$dev4" "$dev5"
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev4" "$dev5"
|
|
vgextend $vg "$dev4" "$dev5"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
# Delayed sync to allow for repair during rebuild
|
|
delay 50
|
|
|
|
# RAID6 single replace after initial sync
|
|
lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
|
|
"$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
|
|
aux disable_dev "$dev4"
|
|
not lvconvert -y --repair $vg/$lv1
|
|
delay 0 # Fast sync and repair afterwards
|
|
aux disable_dev "$dev4" # Need to disable again after changing delay
|
|
aux wait_for_sync $vg $lv1
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev4"
|
|
vgextend $vg "$dev4"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
# Delayed sync to allow for repair during rebuild
|
|
delay 50
|
|
|
|
# RAID10 single replace after initial sync
|
|
lvcreate --type raid10 -m 1 -i 2 -L $RAID_SIZE -n $lv1 $vg \
|
|
"$dev1" "$dev2" "$dev3" "$dev4"
|
|
aux disable_dev "$dev4"
|
|
not lvconvert -y --repair $vg/$lv1
|
|
delay 0 # Fast sync and repair afterwards
|
|
aux disable_dev "$dev4" # Need to disable again after changing delay
|
|
aux disable_dev "$dev1"
|
|
aux wait_for_sync $vg $lv1
|
|
lvconvert -y --repair $vg/$lv1
|
|
vgreduce --removemissing $vg
|
|
aux enable_dev "$dev4"
|
|
vgextend $vg "$dev4"
|
|
lvremove -ff $vg/$lv1
|
|
|
|
vgremove -ff $vg
|