summaryrefslogtreecommitdiff
path: root/test/shell/thin-flags.sh
blob: 795d47ae5579280c09b67042c00af5ee545a2f4f (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
#!/usr/bin/env bash

# Copyright (C) 2016 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

# test presence of various thin-pool/thin flags

SKIP_WITH_LVMLOCKD=1
SKIP_WITH_LVMPOLLD=1

export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false}

. lib/inittest

#
# Main
#
aux have_thin 1 3 0 || skip
aux thin_pool_error_works_32 || skip

aux prepare_vg 2 256

###############################################
#  Testing failing thin-pool metadata device  #
###############################################

lvcreate -T -L1M --errorwhenfull y $vg/pool
lvcreate -V2 -n $lv2 $vg/pool

aux error_dev  "$dev2" 2054:2
# Check our 'lvs' is not flushing pool - should be still OK
check lv_attr_bit health $vg/pool "-"
# Enforce flush on thin pool device to notice error device.
dmsetup status $vg-pool-tpool
check lv_attr_bit health $vg/pool "F"
check lv_attr_bit health $vg/$lv2 "F"
aux enable_dev "$dev2"

lvchange -an $vg

# Overfill data area
lvchange -ay $vg
dd if=/dev/zero of="$DM_DEV_DIR/mapper/$vg-$lv2" bs=1M count=2 oflag=direct || true
check lv_attr_bit health $vg/pool "D"
# TODO use spaces ??
check lv_field $vg/pool lv_health_status "out_of_data"

lvremove -ff $vg


#######################################################
#  Testing what happens on system without thin-check  #
#######################################################

lvcreate -L200M --errorwhenfull y -T $vg/pool
lvcreate -V2 -n $lv2 $vg/pool
lvchange -an $vg

# Drop usage of  thin_check
aux lvmconf 'global/thin_check_executable = ""'

# Prepare some fake metadata prefilled to ~100%
lvcreate -L2 -n $lv1 $vg "$dev2" # tmp for metadata

VOLS=490
aux thin_restore_needs_more_volumes || VOLS=445
aux prepare_thin_metadata $VOLS 1 | tee data

# Note: we like want to test BOTH sizes (445 & 490) as ATM it gives
# different errors (5.9-rc5 kernel does not handle it as expected by this test)

"$LVM_TEST_THIN_RESTORE_CMD" -i data -o "$DM_DEV_DIR/mapper/$vg-$lv1"

# Swap volume with restored fake metadata
lvconvert -y --thinpool $vg/pool --poolmetadata $vg/$lv1

lvchange -ay $vg

lvchange -ay $vg/$lv2
# Provisiong and last free bits in metadata
dd if=/dev/zero of="$DM_DEV_DIR/mapper/$vg-$lv2" bs=1M count=1 oflag=direct || true

check lv_attr_bit health $vg/pool "M"
# TODO - use spaces ??
check lv_field $vg/pool lv_health_status "metadata_read_only"
check lv_attr_bit health $vg/$lv2 "-"

not lvcreate -s $vg/$lv2
not lvcreate -V10 -n $lv3 $vg/pool

lvs -ao+seg_pe_ranges $vg

# needs_check needs newer version
THINMINVER="1 20 0"
aux kernel_at_least 4 18 && THINMINVER="1 19 0" # kernel >=4.18 already had changes from 1.20

if aux have_thin $THINMINVER ; then
	check lv_attr_bit state $vg/pool "a"

	dmsetup suspend $vg-pool-tpool

	check lv_attr_bit state $vg/pool "s"

	dmsetup resume $vg-pool-tpool

	lvresize -L+2M $vg/pool_tmeta

	# Newer version recovers when metadata grow up
	check lv_attr_bit state $vg/pool "a"
	check lv_field $vg/pool lv_health_status ""

elif aux have_thin 1 16 0 ; then
	check lv_attr_bit state $vg/pool "c"
	check lv_field $vg/pool lv_check_needed "check needed"

	dmsetup suspend $vg-pool-tpool

	# suspended  thin-pool with Capital 'c'
	check lv_attr_bit state $vg/pool "C"

	dmsetup resume $vg-pool-tpool

	lvresize -L+2M $vg/pool_tmeta

	# still require thin_check
	check lv_attr_bit state $vg/pool "c"
fi

vgremove -ff $vg