summaryrefslogtreecommitdiff
path: root/test/shell/process-each-duplicate-pvs.sh
diff options
context:
space:
mode:
Diffstat (limited to 'test/shell/process-each-duplicate-pvs.sh')
-rw-r--r--test/shell/process-each-duplicate-pvs.sh528
1 files changed, 528 insertions, 0 deletions
diff --git a/test/shell/process-each-duplicate-pvs.sh b/test/shell/process-each-duplicate-pvs.sh
new file mode 100644
index 0000000..f3063ab
--- /dev/null
+++ b/test/shell/process-each-duplicate-pvs.sh
@@ -0,0 +1,528 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2008-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.
+
+test_description='Test duplicate PVs'
+
+SKIP_WITH_LVMPOLLD=1
+SKIP_WITH_CLVMD=1
+
+# This test should work with real device ids (not devnames).
+# When PVs are being overwritten by the test, the devices file is
+# excluding them since with idtype=devname the devices file falls
+# back to including devs based on PVIDs in the devices file,
+# but the 'dd' is clobbering the PVIDs so those devs aren't included
+# so the 'pvs' commands below don't report them.
+# In general this is better behavior, but needs to be tested
+# with proper device ids.
+SKIP_WITH_DEVICES_FILE=1
+
+. lib/inittest
+
+aux prepare_devs 6 16
+
+# The LV-using-PV tests (DEV_USED_FOR_LV, where a PV is
+# preferred if an active LV is using it) depend on sysfs
+# info that is not available in RHEL5 kernels.
+aux driver_at_least 4 15 || skip
+
+aux lvmconf 'devices/allow_changes_with_duplicate_pvs = 0'
+
+pvcreate "$dev1"
+pvcreate "$dev2"
+vgcreate $SHARED $vg1 "$dev1"
+vgcreate $SHARED $vg2 "$dev2"
+pvresize --setphysicalvolumesize 8m -y "$dev2"
+lvcreate -an -l1 -n $lv1 $vg1
+
+# Both devs are shown and used by the VG
+
+pvs 2>&1 | tee out
+
+grep "$dev1" out
+grep "$dev2" out
+grep "$dev1" out | grep $vg1
+grep "$dev2" out | grep $vg2
+check pv_field "$dev1" pv_allocatable "allocatable"
+check pv_field "$dev2" pv_allocatable "allocatable"
+not grep WARNING out
+
+UUID1=$(get pv_field "$dev1" uuid)
+UUID2=$(get pv_field "$dev2" uuid)
+
+SIZE1=$(get pv_field "$dev1" dev_size)
+SIZE2=$(get pv_field "$dev2" dev_size)
+
+MINOR1=$(get pv_field "$dev1" minor)
+MINOR2=$(get pv_field "$dev2" minor)
+
+check pv_field "$dev1" dev_size "$SIZE1"
+check pv_field "$dev2" dev_size "$SIZE2"
+
+# Copy dev1 over dev2.
+dd if="$dev1" of="$dev2" bs=1M iflag=direct oflag=direct,sync
+#pvscan --cache
+
+# The single preferred dev is shown from 'pvs'.
+pvs -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+# Don't know yet if dev1 or dev2 is preferred, so count just one is.
+test "$(grep -c "$vg1" main)" -eq 1
+test "$(grep -c "$UUID1" main)" -eq 1
+not grep duplicate main
+not grep $vg2 main
+not grep $UUID2 main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+# Find which is the preferred dev and which is the duplicate.
+PV=$(pvs --noheadings -o name -S uuid="$UUID1" | xargs)
+if [ "$PV" = "$dev1" ]; then
+ DUP=$dev2
+else
+ DUP=$dev1
+fi
+
+echo "PV is $PV"
+echo "DUP is $DUP"
+
+grep "$PV" main
+not grep "$DUP" main
+
+# Repeat above checking preferred/dup in output
+pvs 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$PV" main
+not grep "$DUP" main
+
+# The duplicate dev is included in 'pvs -a'
+pvs -a -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev1" main
+grep "$dev2" main
+grep $PV main
+grep $DUP main
+test "$(grep -c duplicate main)" -eq 1
+grep $DUP main | grep duplicate
+not grep $vg2 main
+not grep $UUID2 main
+grep "$dev1" main | grep $vg1
+grep "$dev2" main | grep $vg1
+grep "$dev1" main | grep $UUID1
+grep "$dev2" main | grep $UUID1
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+#
+# Passing a dev name arg always includes that dev.
+#
+
+pvs -o+uuid "$dev1" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev1" main
+not grep "$dev2" main
+grep "$UUID1" main
+grep "$vg1" main
+grep "Not using device" warn
+grep "prefers device" warn
+
+pvs -o+uuid "$dev2" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev2" main
+not grep "$dev1" main
+grep "$UUID1" main
+grep "$vg1" main
+grep "Not using device" warn
+grep "prefers device" warn
+
+pvs -o+uuid,duplicate "$dev1" "$dev2" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev1" main
+grep "$dev2" main
+grep "$dev1" main | grep $vg1
+grep "$dev2" main | grep $vg1
+grep "$dev1" main | grep $UUID1
+grep "$dev2" main | grep $UUID1
+test "$(grep -c duplicate main)" -eq 1
+grep $DUP main | grep duplicate
+
+#
+# Test specific report fields for each dev.
+#
+
+pvs --noheadings -o vg_name,vg_uuid "$dev1" 2>&1 | tee out1
+pvs --noheadings -o vg_name,vg_uuid "$dev2" 2>&1 | tee out2
+
+grep -v WARNING out1 > main1 || true
+grep -v WARNING out2 > main2 || true
+diff main1 main2
+rm out1 out2 main1 main2 || true
+
+check pv_field "$dev1" pv_in_use "used"
+check pv_field "$dev2" pv_in_use "used"
+
+check pv_field "$PV" pv_allocatable "allocatable"
+check pv_field "$DUP" pv_allocatable ""
+
+check pv_field "$PV" pv_duplicate ""
+check pv_field "$DUP" pv_duplicate "duplicate"
+
+pvs --noheadings -o name,pv_allocatable "$dev1" "$dev2" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$PV" main
+grep "$DUP" main
+grep "$dev1" main
+grep "$dev2" main
+test "$(grep -c allocatable main)" -eq 1
+
+pvs --noheadings -o name,pv_duplicate "$dev1" "$dev2" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$PV" main
+grep "$DUP" main
+grep "$dev1" main
+grep "$dev2" main
+test "$(grep -c duplicate main)" -eq 1
+
+#
+# A filter can be used to show only one.
+#
+
+pvs --config "devices { filter=[ \"a|$dev2|\", \"r|.*|\" ] }" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+not grep "$dev1" main
+grep "$dev2" main
+
+not grep "Not using device" warn
+not grep "prefers device" warn
+
+
+pvs --config "devices { filter=[ \"a|$dev1|\", \"r|.*|\"] }" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev1" main
+not grep "$dev2" main
+
+not grep "Not using device" warn
+not grep "prefers device" warn
+
+# PV size and minor is still reported correctly for each.
+
+check pv_field "$dev1" dev_size "$SIZE1"
+check pv_field "$dev2" dev_size "$SIZE2"
+
+check pv_field "$dev1" minor "$MINOR1"
+check pv_field "$dev2" minor "$MINOR2"
+
+# With allow_changes_with_duplicate_pvs=0, a VG with duplicate devs
+# cannot be modified or activated.
+
+not lvcreate -an -l1 -n $lv2 $vg1
+not lvremove $vg1/$lv1
+not lvchange -ay $vg1/$lv1
+not vgremove $vg1
+
+
+# With allow_changes_with_duplicate_pvs=1, changes above are permitted.
+
+aux lvmconf 'devices/allow_changes_with_duplicate_pvs = 1'
+
+lvcreate -an -l1 -n $lv2 $vg1
+lvremove $vg1/$lv1
+lvchange -ay $vg1/$lv2
+lvchange -an $vg1/$lv2
+lvremove $vg1/$lv2
+vgremove -f $vg1
+pvremove -ff -y "$dev1"
+pvremove -ff -y "$dev2"
+
+
+# dev3 and dev4 are copies, orphans
+
+pvcreate "$dev3"
+pvcreate "$dev4"
+pvresize --setphysicalvolumesize 8m -y "$dev4"
+
+UUID3=$(get pv_field "$dev3" uuid)
+UUID4=$(get pv_field "$dev4" uuid)
+
+SIZE3=$(get pv_field "$dev3" dev_size)
+SIZE4=$(get pv_field "$dev4" dev_size)
+
+check pv_field "$dev3" dev_size "$SIZE3"
+check pv_field "$dev4" dev_size "$SIZE4"
+
+pvs 2>&1 | tee out
+
+grep "$dev3" out
+grep "$dev4" out
+
+dd if="$dev3" of="$dev4" bs=1M iflag=direct oflag=direct,sync
+#pvscan --cache
+
+# One appears with 'pvs'
+
+pvs -o+uuid 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+test "$(grep -c "$UUID3" main)" -eq 1
+not grep "$UUID4" main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+# Both appear with 'pvs -a'
+
+pvs -a -o+uuid 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+test "$(grep -c "$UUID3" main)" -eq 2
+
+grep "$dev3" main
+grep "$dev4" main
+
+grep $UUID3 main
+not grep $UUID4 main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+# Show each dev individually and both together
+
+pvs -o+uuid "$dev3" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev3" main
+not grep "$dev4" main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+pvs -o+uuid "$dev4" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+not grep "$dev3" main
+grep "$dev4" main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+pvs -o+uuid "$dev3" "$dev4" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev3" main
+grep "$dev4" main
+
+grep "Not using device" warn
+grep "prefers device" warn
+
+# Same sizes shown.
+
+check pv_field "$dev3" dev_size "$SIZE3"
+check pv_field "$dev4" dev_size "$SIZE4"
+
+# Verify that devs being used by an active LV are
+# preferred over duplicates that are not used by an LV.
+
+aux clear_devs "$dev3" "$dev4"
+#pvscan --cache
+
+# The previous steps prevent us from nicely cleaning up
+# the vg lockspace in lvmlockd, so just restart it;
+# what follows could also just be split into a separate test.
+if test -n "$LVM_TEST_LVMLOCKD_TEST" ; then
+ killall -9 lvmlockd
+ sleep 2
+ aux prepare_lvmlockd
+fi
+
+vgcreate $SHARED "$vg2" "$dev3" "$dev4"
+lvcreate -l1 -n $lv1 $vg2 "$dev3"
+lvcreate -l1 -n $lv2 $vg2 "$dev4"
+
+dd if="$dev3" of="$dev5" bs=1M iflag=direct oflag=direct,sync
+dd if="$dev4" of="$dev6" bs=1M iflag=direct oflag=direct,sync
+# dev5/dev6 not pvs so dd'ing pv onto them causes invalid hints
+# that won't be detected, so 5/6 won't be scanned unless we
+# force hint recreation
+pvscan --cache
+
+pvs -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev3" main
+grep "$dev4" main
+not grep duplicate main
+check pv_field "$dev3" pv_duplicate ""
+check pv_field "$dev4" pv_duplicate ""
+check pv_field "$dev5" pv_duplicate "duplicate"
+check pv_field "$dev6" pv_duplicate "duplicate"
+
+grep "prefers device $dev3" warn
+grep "prefers device $dev4" warn
+not grep "prefers device $dev5" warn
+not grep "prefers device $dev6" warn
+
+pvs -a -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+test "$(grep -c duplicate main)" -eq 2
+grep "$dev3" main
+grep "$dev4" main
+grep "$dev5" main
+grep "$dev6" main
+
+grep "prefers device $dev3" warn
+grep "prefers device $dev4" warn
+not grep "prefers device $dev5" warn
+not grep "prefers device $dev6" warn
+
+pvs -o+uuid,duplicate "$dev3" "$dev4" "$dev5" "$dev6" 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+test "$(grep -c duplicate main)" -eq 2
+grep "$dev3" main
+grep "$dev4" main
+grep "$dev5" main
+grep "$dev6" main
+
+grep "prefers device $dev3" warn
+grep "prefers device $dev4" warn
+not grep "prefers device $dev5" warn
+not grep "prefers device $dev6" warn
+
+
+dd if=/dev/zero of="$dev5" bs=1M oflag=direct,sync || true
+dd if=/dev/zero of="$dev6" bs=1M oflag=direct,sync || true
+#pvscan --cache
+
+lvremove -y $vg2/$lv1
+lvremove -y $vg2/$lv2
+vgremove $vg2
+pvremove -ff -y "$dev3"
+pvremove -ff -y "$dev4"
+
+dd if=/dev/zero of="$dev3" bs=1M oflag=direct,sync || true
+dd if=/dev/zero of="$dev4" bs=1M oflag=direct,sync || true
+#pvscan --cache
+
+# Reverse devs in the previous in case dev3/dev4 would be
+# preferred even without an active LV using them.
+
+vgcreate $SHARED $vg2 "$dev5" "$dev6"
+lvcreate -l1 -n $lv1 $vg2 "$dev5"
+lvcreate -l1 -n $lv2 $vg2 "$dev6"
+
+dd if="$dev5" of="$dev3" bs=1M iflag=direct oflag=direct,sync
+dd if="$dev6" of="$dev4" bs=1M iflag=direct oflag=direct,sync
+# dev3/dev4 are not pvs (zeroed above) so dd'ing pv onto them causes
+# invalid hints that won't be detected, so 3/4 won't be scanned
+# unless we force hint recreation
+pvscan --cache
+
+pvs -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+grep "$dev5" main
+grep "$dev6" main
+not grep duplicate main
+check pv_field "$dev5" pv_duplicate ""
+check pv_field "$dev6" pv_duplicate ""
+check pv_field "$dev3" pv_duplicate "duplicate"
+check pv_field "$dev4" pv_duplicate "duplicate"
+
+pvs -a -o+uuid,duplicate 2>&1 | tee out
+
+rm warn main || true
+grep WARNING out > warn || true
+grep -v WARNING out > main || true
+
+test "$(grep -c duplicate main)" -eq 2
+grep "$dev3" main
+grep "$dev4" main
+grep "$dev5" main
+grep "$dev6" main
+
+grep "prefers device $dev5" warn
+grep "prefers device $dev6" warn
+not grep "prefers device $dev3" warn
+not grep "prefers device $dev4" warn
+
+dd if=/dev/zero of="$dev3" bs=1M oflag=direct,sync || true
+dd if=/dev/zero of="$dev4" bs=1M oflag=direct,sync || true
+#pvscan --cache
+
+lvremove -y $vg2/$lv1
+lvremove -y $vg2/$lv2
+vgremove $vg2