diff options
author | David Teigland <teigland@redhat.com> | 2015-04-23 14:52:21 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2015-05-19 11:02:53 -0500 |
commit | e27182249a2cef2518fbbab1037810ed5c9a6d37 (patch) | |
tree | 47f0735e878facb822dec31a8ab1d0a78cc1c686 /test/shell | |
parent | dc49e1cde0a0736c581b10062797807c65ae0ce3 (diff) | |
download | lvm2-e27182249a2cef2518fbbab1037810ed5c9a6d37.tar.gz |
tests: add test for duplicate pvs
Diffstat (limited to 'test/shell')
-rw-r--r-- | test/shell/process-each-duplicate-pvs.sh | 135 |
1 files changed, 135 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 000000000..353b29618 --- /dev/null +++ b/test/shell/process-each-duplicate-pvs.sh @@ -0,0 +1,135 @@ +#!/bin/sh +# 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' + +. lib/inittest + +aux prepare_devs 2 + +pvcreate "$dev1" +vgcreate $vg1 "$dev1" + +# Clone the PV +dd if="$dev1" of="$dev2" bs=256K count=1 iflag=direct oflag=direct +aux notify_lvmetad "$dev2" + +# When there are cloned devices (same pvid), one will be referenced in +# lvmcache as pv->dev, and the other will not be referenced from lvmcache, +# it'll only be in device cache. The one referenced by lvmcache is +# referred to as the "preferred" one, and is the one that is printed by a +# standard 'pvs' command. +# +# We don't know if dev1 or dev2 will be preferred, so we first check that +# and save it as PV1, the other as PV2. +# +# The rules that 'pvs' follows to choose which PVs to display are +# somewhat strange and seem arbitrary from a user perspective; +# the choice is driven largely by what's most practical in the code, +# but also by what vgimportclone needs. +# +# Some of the rules that process_each_pv is using: +# - When no pv arg is specified, print the one preferred dev. +# - When pv args are specified, print one line per specified arg, +# i.e. don't print all duplicate pvs when one is specified. +# - Always print the preferred duplicate, even if it was not the +# one specified, e.g. If there are two duplicates on A and B, +# and A is the preferred device, then 'pvs A' will show A and +# 'pvs B' will show A. +# - If multiple duplicates are specified, then print each, e.g. +# 'pvs A B' will show both A and B. +# - If three duplicates exist on A, B, C, and the preferred is A, +# and the command 'pvs B C' is run, then the A will be printed +# first since we always print the preferred device, and then +# either B or C will be printed. 'pvs A B C' will print all. +# - 'pvs -a' should print all the duplicates and should show +# the same VG for each. +# - 'pvs -o+size ...' should show the correct size of the +# devices being printed if they differ among the duplicates. +# - By using 'pvs --config' with a filter, you can filter out +# the duplicate devs you don't want so that pvs will +# print the devs you do want to see. +# +# The tests below check these behaviors on up to two duplicates, +# so if the process_each_pv logic changes regarding which +# duplicates are chosen, then this test will need adjusting. + +# Verify that there is only one PV printed, i.e. the preferred +pvs --noheading | tee out +test $(wc -l < out) -eq 1 + +# Set PV1 to the perferred/cached PV, and PV2 to the other. +# Cannot use pvs -o pv_name because that command goes to +# disk and does not represent what lvmetad thinks. +PV1=$(pvs --noheading | awk '{ print $1 }') +echo PV1 is $PV1 +if [ $PV1 == $dev1 ]; then + PV2=$dev2 +else + PV2=$dev1 +fi +echo PV2 is $PV2 + +# check listed pvs +pvs --noheading | tee out +grep $PV1 out +not grep $PV2 out + +# check error messages +pvs --noheading 2>&1 | tee out +grep "Found duplicate" out >err +grep "using $PV1 not $PV2" err + +# check listed pvs +pvs --noheading "$dev1" | tee out +grep $PV1 out +not grep $PV2 out + +# check error messages +pvs --noheading "$dev1" 2>&1 | tee out +grep "Found duplicate" out >err +grep "using $PV1 not $PV2" err + +# check listed pvs +pvs --noheading "$dev2" | tee out +grep $PV1 out +not grep $PV2 out + +# check error messages +pvs --noheading "$dev2" 2>&1 | tee out +grep "Found duplicate" out >err +grep "using $PV1 not $PV2" err + +# check listed pvs +pvs --noheading "$dev1" "$dev2" | tee out +grep $PV1 out +grep $PV2 out + +# check error messages +pvs --noheading "$dev1" "$dev2" 2>&1 | tee out +grep "Found duplicate" out >err +grep "using $PV1 not $PV2" err + +# check listed pvs +pvs --noheading -a | tee out +grep $PV1 out +grep $PV2 out +grep $PV1 out | grep $vg1 +grep $PV2 out | grep $vg1 + +# check error messages +pvs --noheading -a 2>&1 | tee out +grep "Found duplicate" out >err +grep "using $PV1 not $PV2" err + + +# TODO: I'd like to test that a subsystem device is preferred +# over a non-subsystem device, but all the devices used here +# are DM devices, i.e. they are already subsystem devices, +# so I can't just wrap a standard block device with a DM +# identity mapping. + |