summaryrefslogtreecommitdiff
path: root/test/shell/missing-pv.sh
blob: 3acc07d3647edd03dc88b8577160e0069172f3ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/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

vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3"

lvcreate -n $lv1 -L8M --type mirror -m 1 $vg
lvcreate -n $lv2 -L8M --type mirror -m 1 $vg

vgchange -an $vg

pvs
vgs
lvs -a -o+devices

# Fail one leg of each mirror LV.
aux disable_dev "$dev1"

pvs
vgs
lvs -a -o+devices

# Cannot do normal activate of either LV with a failed leg.
not lvchange -ay $vg/$lv1
not lvchange -ay $vg/$lv2

# Can activate with partial option.
lvchange -ay --activationmode partial $vg/$lv1
lvchange -ay --activationmode partial $vg/$lv2

pvs
vgs
lvs -a -o+devices

# Repair lv1 so it no longer uses failed dev.
lvconvert --repair --yes $vg/$lv1

# TODO: check that MISSING flag is set in ondisk metadata
# it should have been written by the lvconvert since the
# missing PV is still used by lv2

pvs
vgs
lvs -a -o+devices

# Verify normal activation is possible of lv1 since it's
# not using any failed devs, and partial activation is
# required for lv2 since it's still using the failed dev.
vgchange -an $vg
lvchange -ay $vg/$lv1
not lvchange -ay $vg/$lv2
vgchange -an $vg

aux enable_dev "$dev1"

pvs
vgs
lvs -a -o+devices

# TODO: check that lv2 has partial flag, lv1 does not
# (there's no partial reporting option, only attr p.)

# TODO: check that MISSING flag is still set in ondisk
# metadata since the previously missing dev is still
# used by lv2.

# The missing pv restrictions still apply even after
# the dev has reappeared since it has the MISSING flag.
not lvchange -ay $vg/$lv2
not lvcreate -l1 $vg

# Update old metadata on the previously missing PV.
# This should not clear the MISSING flag because the
# previously missing PV is still used by lv2.
# This would be done by any command that writes
# metadata, e.g. lvcreate, but since we are in a
# state with a missing pv, most commands that write
# metadata are restricted, so use a command that
# explicitly writes/fixes metadata.
vgck --updatemetadata $vg

pvs
vgs
lvs -a -o+devices

# TODO: check that MISSING flag is still set in ondisk
# metadata since the previously missing dev is still
# used by lv2.

# The missing pv restrictions still apply since it
# has the MISSING flag.
not lvchange -ay $vg/$lv2
not lvcreate -l1 $vg

lvchange -ay --activationmode partial  $vg/$lv2

# After repair, no more LVs will be using the previously
# missing PV.
lvconvert --repair --yes $vg/$lv2

pvs
vgs
lvs -a -o+devices

vgchange -an $vg

# The next write of the metadata will clear the MISSING
# flag in ondisk metadata because the previously missing
# PV is no longer used by any LVs.

# Run a command to write ondisk metadata, which should clear
# the MISSING flag, options include:
# lvcreate -l1 $vg
# vgck --updatemetadata vg
# vgextend --restoremissing
# vgreduce --removemissing
vgreduce --removemissing $vg

# TODO: check that the MISSING flag is no longer set
# in the ondisk metadata.

pvs
vgs
lvs -a -o+devices

vgchange -an $vg
vgremove -ff $vg