| #!/bin/sh |
| # Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| |
| # Check whether all available pvmove resume methods works as expected. |
| # lvchange is able to resume pvmoves in progress. |
| |
| # 2 pvmove LVs in 2 VGs (1 per VG) |
| |
| SKIP_WITH_LVMLOCKD=1 |
| SKIP_WITH_CLVMD=1 |
| |
| . lib/inittest |
| |
| aux prepare_pvs 4 30 |
| |
| vgcreate -s 128k $vg "$dev1" |
| vgcreate -s 128k $vg1 "$dev2" |
| pvcreate --metadatacopies 0 "$dev3" |
| pvcreate --metadatacopies 0 "$dev4" |
| vgextend $vg "$dev3" |
| vgextend $vg1 "$dev4" |
| |
| # $1 resume fn |
| test_pvmove_resume() { |
| lvcreate -an -Zn -l30 -n $lv1 $vg |
| lvcreate -an -Zn -l30 -n $lv1 $vg1 |
| |
| aux delay_dev "$dev3" 0 1000 $(get first_extent_sector "$dev3"): |
| test -e HAVE_DM_DELAY || { lvremove -f $vg $vg1; return 0; } |
| aux delay_dev "$dev4" 0 1000 $(get first_extent_sector "$dev4"): |
| |
| pvmove -i5 "$dev1" & |
| PVMOVE=$! |
| aux wait_pvmove_lv_ready "$vg-pvmove0" 300 |
| kill -9 $PVMOVE |
| |
| pvmove -i5 "$dev2" & |
| PVMOVE=$! |
| aux wait_pvmove_lv_ready "$vg1-pvmove0" 300 |
| kill -9 $PVMOVE |
| |
| if test -e LOCAL_LVMPOLLD ; then |
| aux prepare_lvmpolld |
| fi |
| |
| wait |
| |
| while dmsetup status "$vg-$lv1"; do dmsetup remove "$vg-$lv1" || true; done |
| while dmsetup status "$vg1-$lv1"; do dmsetup remove "$vg1-$lv1" || true; done |
| while dmsetup status "$vg-pvmove0"; do dmsetup remove "$vg-pvmove0" || true; done |
| while dmsetup status "$vg1-pvmove0"; do dmsetup remove "$vg1-pvmove0" || true; done |
| |
| check lv_attr_bit type $vg/pvmove0 "p" |
| check lv_attr_bit type $vg1/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." |
| test -e "$CLVMD_PIDFILE" || break |
| sleep .1 |
| done # wait for the pid removal |
| aux prepare_clvmd |
| fi |
| |
| aux notify_lvmetad "$dev1" "$dev2" "$dev3" "$dev4" |
| |
| # call resume function (see below) |
| # with expected number of spawned |
| # bg polling as parameter |
| $1 2 |
| |
| aux enable_dev "$dev3" |
| aux enable_dev "$dev4" |
| |
| i=0 |
| while get lv_field $vg name -a | egrep "^\[?pvmove"; do |
| # wait for 30 secs at max |
| test $i -ge 300 && die "Pvmove is too slow or does not progress." |
| sleep .1 |
| i=$((i + 1)) |
| done |
| while get lv_field $vg1 name -a | egrep "^\[?pvmove"; do |
| # wait for 30 secs at max |
| test $i -ge 300 && die "Pvmove is too slow or does not progress." |
| sleep .1 |
| i=$((i + 1)) |
| done |
| |
| aux kill_tagged_processes |
| |
| lvremove -ff $vg $vg1 |
| } |
| |
| lvchange_single() { |
| LVM_TEST_TAG="kill_me_$PREFIX" lvchange -aey $vg/$lv1 |
| LVM_TEST_TAG="kill_me_$PREFIX" lvchange -aey $vg1/$lv1 |
| |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 1 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 1 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq $1 |
| fi |
| } |
| |
| lvchange_all() { |
| LVM_TEST_TAG="kill_me_$PREFIX" lvchange -aey $vg/$lv1 $vg1/$lv1 |
| |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 1 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 1 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq $1 |
| fi |
| } |
| |
| vgchange_single() { |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange -aey $vg |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange -aey $vg1 |
| |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 1 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 1 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq $1 |
| fi |
| } |
| |
| vgchange_all() { |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange -aey $vg $vg1 |
| |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 1 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 1 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq $1 |
| fi |
| } |
| |
| pvmove_fg() { |
| # pvmove resume requires LVs active... |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange --config 'activation{polling_interval=10}' -aey --poll n $vg $vg1 |
| |
| # ...also vgchange --poll n must not spawn any bg processes... |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 0 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 0 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq 0 |
| fi |
| |
| # ...thus finish polling |
| get lv_field $vg name -a | egrep "^\[?pvmove0" |
| get lv_field $vg1 name -a | egrep "^\[?pvmove0" |
| |
| # disable delay device |
| # fg pvmove would take ages to complete otherwise |
| aux enable_dev "$dev3" |
| aux enable_dev "$dev4" |
| |
| pvmove |
| } |
| |
| pvmove_bg() { |
| # pvmove resume requires LVs active... |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange --config 'activation{polling_interval=10}' -aey --poll n $vg $vg1 |
| |
| # ...also vgchange --poll n must not spawn any bg processes... |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 0 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 0 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq 0 |
| fi |
| |
| # ...thus finish polling |
| get lv_field $vg name -a | egrep "^\[?pvmove0" |
| get lv_field $vg1 name -a | egrep "^\[?pvmove0" |
| |
| LVM_TEST_TAG="kill_me_$PREFIX" pvmove -b -i0 |
| } |
| |
| pvmove_fg_single() { |
| # pvmove resume requires LVs active... |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange --config 'activation{polling_interval=10}' -aey --poll n $vg |
| |
| # ...also vgchange --poll n must not spawn any bg processes... |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 0 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 0 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq 0 |
| fi |
| |
| # ...thus finish polling |
| get lv_field $vg name -a | egrep "^\[?pvmove0" |
| get lv_field $vg1 name -a | egrep "^\[?pvmove0" |
| |
| # disable delay device |
| # fg pvmove would take ages to complete otherwise |
| aux enable_dev "$dev3" |
| aux enable_dev "$dev4" |
| |
| pvmove "$dev1" |
| pvmove "$dev2" |
| } |
| |
| pvmove_bg_single() { |
| # pvmove resume requires LVs active... |
| LVM_TEST_TAG="kill_me_$PREFIX" vgchange --config 'activation{polling_interval=10}' -aey --poll n $vg |
| |
| # ...also vgchange --poll n must not spawn any bg processes... |
| if test -e LOCAL_LVMPOLLD; then |
| aux lvmpolld_dump | tee lvmpolld_dump.txt |
| aux check_lvmpolld_init_rq_count 0 "$vg/pvmove0" |
| aux check_lvmpolld_init_rq_count 0 "$vg1/pvmove0" |
| else |
| test $(aux count_processes_with_tag) -eq 0 |
| fi |
| |
| # ...thus finish polling |
| get lv_field $vg name -a | egrep "^\[?pvmove0" |
| get lv_field $vg1 name -a | egrep "^\[?pvmove0" |
| |
| LVM_TEST_TAG="kill_me_$PREFIX" pvmove -b "$dev1" |
| LVM_TEST_TAG="kill_me_$PREFIX" pvmove -b "$dev2" |
| } |
| |
| test_pvmove_resume lvchange_single |
| test_pvmove_resume lvchange_all |
| test_pvmove_resume vgchange_single |
| test_pvmove_resume vgchange_all |
| test_pvmove_resume pvmove_fg |
| test_pvmove_resume pvmove_fg_single |
| test_pvmove_resume pvmove_bg |
| test_pvmove_resume pvmove_bg_single |
| |
| vgremove -ff $vg $vg1 |