mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
fb96e9ab21
Cover the case where two copies of metadata have the same seqno but different checksums. Also elaborate on an existing fixme in the code for this case, since we should be doing something better for this case. This had been uncovering an issue with reopening fds in readwrite mode.
223 lines
4.5 KiB
Bash
223 lines
4.5 KiB
Bash
#!/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
|
|
|
|
#
|
|
# Test "old metadata" repair which occurs when the VG is written
|
|
# and one of the PVs in the VG does not get written to, and then
|
|
# the PV reappears with the old metadata. This can happen if
|
|
# a command is killed or crashes after writing new metadata to
|
|
# only some of the PVs in the VG, or if a PV is temporarily
|
|
# inaccessible while a VG is written.
|
|
#
|
|
|
|
vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"
|
|
|
|
#
|
|
# Test that vgck --updatemetadata will update old metadata.
|
|
#
|
|
|
|
lvcreate -n $lv1 -l1 -an $vg "$dev1"
|
|
lvcreate -n $lv2 -l1 -an $vg "$dev1"
|
|
|
|
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"
|
|
|
|
pvs 2>&1 | tee out
|
|
grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
lvs $vg/$lv1
|
|
not lvs $vg/$lv2
|
|
|
|
# fixes the old metadata on dev1
|
|
vgck --updatemetadata $vg
|
|
|
|
pvs 2>&1 | tee out
|
|
not grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
lvs $vg/$lv1
|
|
not lvs $vg/$lv2
|
|
|
|
#
|
|
# Test that any writing command will also update the
|
|
# old metadata.
|
|
#
|
|
|
|
lvcreate -n $lv2 -l1 -an $vg "$dev1"
|
|
|
|
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"
|
|
|
|
pvs 2>&1 | tee out
|
|
grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
lvs $vg/$lv1
|
|
not lvs $vg/$lv2
|
|
|
|
# fixes the old metadata on dev1
|
|
lvcreate -n $lv3 -l1 -an $vg
|
|
|
|
pvs 2>&1 | tee out
|
|
not grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
lvs $vg/$lv1
|
|
not lvs $vg/$lv2
|
|
|
|
vgremove -ff $vg
|
|
|
|
#
|
|
# First two PVs with one mda, where both have old metadata.
|
|
# Third PV with two mdas, where the first mda has old
|
|
# metadata, and the second mda has current metadata.
|
|
#
|
|
|
|
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"
|
|
|
|
lvcreate -n $lv1 -l1 -an $vg "$dev3"
|
|
lvcreate -n $lv2 -l1 -an $vg "$dev3"
|
|
|
|
# Save the metadata at this point...
|
|
dd if="$dev1" of=meta1 bs=4k count=4
|
|
dd if="$dev2" of=meta2 bs=4k count=4
|
|
dd if="$dev3" of=meta3 bs=4k count=4
|
|
|
|
# and now change metadata so the saved copies are old
|
|
lvcreate -n $lv3 -l1 -an $vg "$dev3"
|
|
|
|
# Copy the saved metadata back to the three
|
|
# devs first mda, leaving the second mda on
|
|
# dev3 as the only latest copy of the metadata.
|
|
|
|
dd if=meta1 of="$dev1"
|
|
dd if=meta2 of="$dev2"
|
|
dd if=meta3 of="$dev3"
|
|
|
|
pvs 2>&1 | tee out
|
|
grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
# We still see the three LVs since we are using
|
|
# the latest copy of metadata from dev3:mda2
|
|
|
|
lvs $vg/$lv1
|
|
lvs $vg/$lv2
|
|
lvs $vg/$lv3
|
|
|
|
# This command which writes the VG should update
|
|
# all of the old copies.
|
|
lvcreate -n $lv4 -l1 -an $vg
|
|
|
|
pvs 2>&1 | tee out
|
|
not grep "ignoring metadata seqno" out
|
|
pvs "$dev1"
|
|
pvs "$dev2"
|
|
pvs "$dev3"
|
|
|
|
lvs $vg/$lv1
|
|
lvs $vg/$lv2
|
|
lvs $vg/$lv3
|
|
lvs $vg/$lv4
|
|
|
|
vgchange -an $vg
|
|
vgremove -ff $vg
|
|
|
|
# Test when the metadata on two PVs have the same seqno
|
|
# but different checksums.
|
|
|
|
dd if=/dev/zero of="$dev1" || true
|
|
dd if=/dev/zero of="$dev2" || true
|
|
|
|
pvcreate "$dev1"
|
|
pvcreate "$dev2"
|
|
|
|
vgcreate $SHARED $vg "$dev1" "$dev2"
|
|
|
|
lvcreate -n $lv1 -l1 -an $vg
|
|
|
|
pvck --dump metadata -f meta "$dev2"
|
|
|
|
# change an unimportant character so the metadata is effectively
|
|
# the same in content but will have a different checksum
|
|
sed 's/Linux/linux/' meta > meta2
|
|
|
|
# write out the changed metadata
|
|
pvck --repair -y -f meta2 "$dev2"
|
|
|
|
# the vg can still be used but will produce warnings
|
|
# the mda on one pv is updated, but not the other,
|
|
# which changes the error from a checksum inconsistency
|
|
# into a seqno inconsistency.
|
|
lvs $vg 2>&1 | tee out
|
|
grep WARNING out
|
|
grep $lv1 out
|
|
lvcreate -n $lv2 -l1 -an $vg 2>&1 |tee out
|
|
grep WARNING out
|
|
lvs $vg 2>&1 | tee out
|
|
grep WARNING out
|
|
grep $lv1 out
|
|
grep $lv2 out
|
|
|
|
# correct the senqo inconsistency
|
|
vgck --updatemetadata $vg
|
|
lvs $vg 2>&1 | tee out
|
|
not grep WARNING out
|
|
grep $lv1 out
|
|
grep $lv2 out
|
|
|
|
vgremove -ff $vg
|