#!/bin/sh # Copyright (C) 2013-2015 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Check pvmove behavior when it's progress and machine is rebooted . lib/inittest aux prepare_pvs 3 60 vgcreate -s 128k $vg "$dev1" "$dev2" pvcreate --metadatacopies 0 "$dev3" vgextend $vg "$dev3" # Slowdown writes # (FIXME: generates interesting race when not used) aux delay_dev "$dev3" 0 800 $(get first_extent_sector "$dev3"): for mode in "--atomic" "" do # Create multisegment LV lvcreate -an -Zn -l5 -n $lv1 $vg "$dev1" lvextend -l+10 $vg/$lv1 "$dev2" lvextend -l+5 $vg/$lv1 "$dev1" lvextend -l+10 $vg/$lv1 "$dev2" pvmove -i10 -n $vg/$lv1 "$dev1" "$dev3" $mode & PVMOVE=$! # Let's wait a bit till pvmove starts and kill it aux wait_pvmove_lv_ready "$vg-pvmove0" kill -9 $PVMOVE if test -e LOCAL_LVMPOLLD; then aux prepare_lvmpolld fi wait # Simulate reboot - forcibly remove related devices # First take down $lv1 then it's pvmove0 j=0 for i in $lv1 pvmove0 pvmove0_mimage_0 pvmove0_mimage_1 ; do while dmsetup status "$vg-$i"; do dmsetup remove "$vg-$i" || { j=$(($j + 1)) test $j -le 100 || die "Cannot take down devices." sleep .1; } done done dmsetup table | grep $PREFIX # Check we really have pvmove volume check lv_attr_bit type $vg/pvmove0 "p" if test -e LOCAL_CLVMD ; then # giveup all clvmd locks (faster then restarting clvmd) # no deactivation happen, nodes are already removed #vgchange -an $vg # FIXME: However above solution has one big problem # as clvmd starts to abort on internal errors on various # errors, based on the fact pvmove is killed -9 # Restart clvmd kill $(< LOCAL_CLVMD) for i in $(seq 1 100) ; do test $i -eq 100 && die "Shutdown of clvmd is too slow." pgrep clvmd || break sleep .1 done # wait for the pid removal aux prepare_clvmd fi aux notify_lvmetad "$dev1" "$dev2" "$dev3" # Only PVs should be left in table... dmsetup table # Restart pvmove # use exclusive activation to have usable pvmove without cmirrord LVM_TEST_TAG="kill_me_$PREFIX" vgchange --config 'activation{polling_interval=10}' -aey $vg aux wait_pvmove_lv_ready "$vg-pvmove0" dmsetup table pvmove --abort lvs -a -o+devices $vg lvremove -ff $vg aux kill_tagged_processes done # Restore delayed device back aux delay_dev "$dev3" vgremove -ff $vg