2019-05-24 23:18:18 +03:00
#!/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
2021-03-26 18:05:28 +03:00
SKIP_WITH_LVMPOLLD = 1
2019-05-24 23:18:18 +03:00
. 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
2020-09-28 21:21:44 +03:00
# 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