From 92b47d8eb8c4b717fd79d0b7c50ecac0dceb31a5 Mon Sep 17 00:00:00 2001 From: Leo Yan Date: Thu, 3 Jun 2021 17:59:21 +0800 Subject: [PATCH] tests: idm: Add testing for IDM lock manager failure If the IDM lock manager fails to access drives, might partially fail to access drives (e.g. it fails to access one of three drives), or totally fail to access drives, the lock manager should handle properly for these cases. When the drives are partially failure, if the lock manager still can renew the lease for the locking, then it doesn't need to take any action for the drive failure; otherwise, if it detects it cannot renew the locking majority, it needs ti immediately kill the VG from the lvmlockd. This patch adds the test for verification the IDM lock manager failure; the command can be used as below: # make check_lvmlockd_idm \ LVM_TEST_BACKING_DEVICE=/dev/sdp3,/dev/sdl3,/dev/sdq3 \ LVM_TEST_FAILURE=1 T=idm_ilm_failure.sh Signed-off-by: Leo Yan --- test/shell/idm_ilm_failure.sh | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 test/shell/idm_ilm_failure.sh diff --git a/test/shell/idm_ilm_failure.sh b/test/shell/idm_ilm_failure.sh new file mode 100644 index 000000000..58bed270e --- /dev/null +++ b/test/shell/idm_ilm_failure.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +# Copyright (C) 2020 Seagate, 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_LVMPOLLD=1 + +. lib/inittest + +[ -z "$LVM_TEST_LOCK_TYPE_IDM" ] && skip; +[ -z "$LVM_TEST_FAILURE" ] && skip; + +aux prepare_devs 3 +aux extend_filter_LVMTEST + +DRIVE1=`dmsetup deps -o devname $dev1 | awk '{gsub(/[()]/,""); print $4;}' | sed 's/[0-9]*$//'` +DRIVE2=`dmsetup deps -o devname $dev2 | awk '{gsub(/[()]/,""); print $4;}' | sed 's/[0-9]*$//'` +DRIVE3=`dmsetup deps -o devname $dev3 | awk '{gsub(/[()]/,""); print $4;}' | sed 's/[0-9]*$//'` + +if [ "$DRIVE1" = "$DRIVE2" ] || [ "$DRIVE1" = "$DRIVE3" ] || [ "$DRIVE2" = "$DRIVE3" ]; then + die "Need to pass three different drives!?" +fi + +# The previous device-mapper are removed, but LVM still can directly +# access VGs from the specified physical drives. So enable drives +# for these drives. +aux extend_filter_LVMTEST "a|/dev/$DRIVE1*|" "a|/dev/$DRIVE2*|" "a|/dev/$DRIVE3*|" +aux lvmconf "devices/allow_changes_with_duplicate_pvs = 1" + +vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" + +# Create new logic volume and deactivate it +lvcreate -a y --zero n -l 1 -n $lv1 $vg + +# Inject failure 40% so cannot send partially request to drives +idm_inject_failure 40 + +# Wait for 40s, but the lock will not be time out +sleep 40 + +# Inject failure with 0% so can access drives +idm_inject_failure 0 + +# Deactivate logic volume due to locking failure +lvchange $vg/$lv1 -a n + +# Inject failure 100% so cannot send request to drives +idm_inject_failure 100 + +# Wait for 70s but should have no any alive locks +sleep 70 + +# Inject failure with 0% so can access drives +idm_inject_failure 0 + +# Activate logic volume +lvchange $vg/$lv1 -a y + +# Inject failure so cannot send request to drives +idm_inject_failure 100 + +# Wait for 70s but will not time out +sleep 70 + +# Inject failure with 0% so can access drives +idm_inject_failure 0 + +check grep_lvmlockd_dump "S lvm_$vg kill_vg" +lvmlockctl --drop $vg + +vgchange --lock-start +vgremove -f $vg