summaryrefslogtreecommitdiff
path: root/test/shell/metadata-bad-text.sh
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2019-05-24 15:58:05 -0500
committerDavid Teigland <teigland@redhat.com>2019-06-07 15:54:04 -0500
commit878741502a28c3e91d8fdff76ebcc83a68b04f91 (patch)
tree1312ecb6e7d3328a7cd6eb196b2448e6ed64ec09 /test/shell/metadata-bad-text.sh
parent4fa1638301672c94c22b7ceacc586316af897f29 (diff)
downloadlvm2-878741502a28c3e91d8fdff76ebcc83a68b04f91.tar.gz
tests: add metadata-bad-text.sh
Diffstat (limited to 'test/shell/metadata-bad-text.sh')
-rw-r--r--test/shell/metadata-bad-text.sh236
1 files changed, 236 insertions, 0 deletions
diff --git a/test/shell/metadata-bad-text.sh b/test/shell/metadata-bad-text.sh
new file mode 100644
index 000000000..4c59bc9f3
--- /dev/null
+++ b/test/shell/metadata-bad-text.sh
@@ -0,0 +1,236 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2008-2013,2018 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
+
+. lib/inittest
+
+aux prepare_devs 3
+get_devs
+
+dd if=/dev/zero of="$dev1" || true
+dd if=/dev/zero of="$dev2" || true
+dd if=/dev/zero of="$dev3" || true
+
+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"
+
+pvs
+
+dd if="$dev1" of=meta1 bs=4k count=2
+
+sed 's/flags =/flagx =/' meta1 > meta1.bad
+
+dd if=meta1.bad of="$dev1"
+
+pvs 2>&1 | tee out
+grep "bad metadata text" out
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+# bad metadata in one mda doesn't prevent using
+# the VG since other mdas are fine and usable
+lvcreate -l1 $vg
+
+
+vgck --updatemetadata $vg
+
+pvs 2>&1 | tee out
+not grep "bad metadata text" out
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+vgchange -an $vg
+vgremove -ff $vg
+
+
+#
+# Same test as above, but corrupt metadata text
+# on two of the three PVs, leaving one good
+# copy of the metadata.
+#
+
+dd if=/dev/zero of="$dev1" || true
+dd if=/dev/zero of="$dev2" || true
+dd if=/dev/zero of="$dev3" || true
+
+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"
+
+pvs
+
+dd if="$dev1" of=meta1 bs=4k count=2
+dd if="$dev2" of=meta2 bs=4k count=2
+
+sed 's/READ/RRRR/' meta1 > meta1.bad
+sed 's/seqno =/sss =/' meta2 > meta2.bad
+
+dd if=meta1.bad of="$dev1"
+dd if=meta2.bad of="$dev2"
+
+pvs 2>&1 | tee out
+grep "bad metadata text" out > out2
+grep "$dev1" out2
+grep "$dev2" out2
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+# bad metadata in one mda doesn't prevent using
+# the VG since other mdas are fine
+lvcreate -l1 $vg
+
+
+vgck --updatemetadata $vg
+
+pvs 2>&1 | tee out
+not grep "bad metadata text" out
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+vgchange -an $vg
+vgremove -ff $vg
+
+#
+# Three PVs where two have one mda, and the third
+# has two mdas. The first mda is corrupted on all
+# thee PVs, but the second mda on the third PV
+# makes the VG usable.
+#
+
+dd if=/dev/zero of="$dev1" || true
+dd if=/dev/zero of="$dev2" || true
+dd if=/dev/zero of="$dev3" || true
+
+pvcreate "$dev1"
+pvcreate "$dev2"
+pvcreate --pvmetadatacopies 2 "$dev3"
+
+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"
+
+pvs
+
+dd if="$dev1" of=meta1 bs=4k count=2
+dd if="$dev2" of=meta2 bs=4k count=2
+dd if="$dev3" of=meta3 bs=4k count=2
+
+sed 's/READ/RRRR/' meta1 > meta1.bad
+sed 's/seqno =/sss =/' meta2 > meta2.bad
+sed 's/id =/id/' meta3 > meta3.bad
+
+dd if=meta1.bad of="$dev1"
+dd if=meta2.bad of="$dev2"
+dd if=meta3.bad of="$dev3"
+
+pvs 2>&1 | tee out
+grep "bad metadata text" out > out2
+grep "$dev1" out2
+grep "$dev2" out2
+grep "$dev3" out2
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+# bad metadata in some mdas doesn't prevent using
+# the VG if there's a good mda found
+lvcreate -l1 $vg
+
+
+vgck --updatemetadata $vg
+
+pvs 2>&1 | tee out
+not grep "bad metadata text" out
+
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+vgchange -an $vg
+vgremove -ff $vg
+
+#
+# Test that vgck --updatemetadata will update old metadata
+# and repair bad metadata text at the same time from different
+# devices.
+#
+
+dd if=/dev/zero of="$dev1" || true
+dd if=/dev/zero of="$dev2" || true
+dd if=/dev/zero of="$dev3" || true
+
+pvcreate "$dev1"
+pvcreate "$dev2"
+pvcreate --pvmetadatacopies 2 "$dev3"
+
+vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"
+
+# Put bad metadata onto dev1
+dd if="$dev1" of=meta1 bs=4k count=2
+sed 's/READ/RRRR/' meta1 > meta1.bad
+dd if=meta1.bad of="$dev1"
+
+pvs 2>&1 | tee out
+grep "bad metadata text" out > out2
+grep "$dev1" out2
+
+# We can still use the VG with other available
+# mdas, skipping the bad mda.
+
+lvcreate -n $lv1 -l1 -an $vg "$dev1"
+lvcreate -n $lv2 -l1 -an $vg "$dev1"
+
+# Put old metadata onto dev2 by updating
+# the VG while dev2 is disabled.
+aux disable_dev "$dev2"
+
+pvs
+pvs "$dev1"
+not pvs "$dev2"
+pvs "$dev3"
+lvs $vg/$lv1
+lvs $vg/$lv2
+
+lvremove $vg/$lv2
+
+aux enable_dev "$dev2"
+
+# Both old and bad metadata are reported.
+pvs 2>&1 | tee out
+grep "ignoring metadata seqno" out
+grep "bad metadata text" out
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+lvs $vg/$lv1
+not lvs $vg/$lv2
+
+# fixes the bad metadata on dev1, and
+# fixes the old metadata on dev2.
+vgck --updatemetadata $vg
+
+pvs 2>&1 | tee out
+not grep "ignoring metadata seqno" out
+not grep "bad metadata text" out
+pvs "$dev1"
+pvs "$dev2"
+pvs "$dev3"
+
+lvs $vg/$lv1
+
+vgchange -an $vg
+vgremove -ff $vg
+