]>
Commit | Line | Data |
---|---|---|
11a82d14 | 1 | #!/usr/bin/env bash |
9dd003a9 | 2 | # group: rw auto aio quick |
91d4093d KW |
3 | # |
4 | # Test concurrent cluster allocations | |
5 | # | |
6 | # Copyright (C) 2012 Red Hat, Inc. | |
7 | # | |
8 | # This program is free software; you can redistribute it and/or modify | |
9 | # it under the terms of the GNU General Public License as published by | |
10 | # the Free Software Foundation; either version 2 of the License, or | |
11 | # (at your option) any later version. | |
12 | # | |
13 | # This program is distributed in the hope that it will be useful, | |
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | # GNU General Public License for more details. | |
17 | # | |
18 | # You should have received a copy of the GNU General Public License | |
19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 | # | |
21 | ||
22 | # creator | |
23 | owner=kwolf@redhat.com | |
24 | ||
25 | seq=`basename $0` | |
26 | echo "QA output created by $seq" | |
27 | ||
91d4093d KW |
28 | status=1 # failure is the default! |
29 | ||
30 | _cleanup() | |
31 | { | |
32 | _cleanup_test_img | |
33 | } | |
34 | trap "_cleanup; exit \$status" 0 1 2 3 15 | |
35 | ||
36 | # get standard environment, filters and checks | |
37 | . ./common.rc | |
38 | . ./common.filter | |
39 | ||
40 | _supported_fmt qcow2 | |
57284d2a | 41 | _supported_proto file fuse |
3be2024a HR |
42 | # data_file does not support compressed clusters |
43 | _unsupported_imgopts data_file | |
91d4093d KW |
44 | |
45 | CLUSTER_SIZE=64k | |
46 | size=128M | |
47 | ||
48 | echo | |
49 | echo "== creating backing file for COW tests ==" | |
50 | ||
63c17df7 HR |
51 | TEST_IMG_SAVE=$TEST_IMG |
52 | TEST_IMG="$TEST_IMG.base" | |
91d4093d KW |
53 | _make_test_img $size |
54 | ||
8cedcffd | 55 | backing_io() |
91d4093d KW |
56 | { |
57 | local offset=$1 | |
58 | local sectors=$2 | |
59 | local op=$3 | |
60 | local pattern=0 | |
61 | local cur_sec=0 | |
62 | ||
30edd9fa | 63 | for ((i=0;i<=$((sectors - 1));i++)); do |
91d4093d KW |
64 | cur_sec=$((offset / 65536 + i)) |
65 | pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) | |
66 | ||
67 | echo "$op -P $pattern $((cur_sec * 64))k 64k" | |
68 | done | |
69 | } | |
70 | ||
fef9c191 | 71 | backing_io 0 32 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
91d4093d | 72 | |
63c17df7 | 73 | TEST_IMG=$TEST_IMG_SAVE |
b66ff2c2 | 74 | _make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G |
91d4093d KW |
75 | |
76 | echo | |
77 | echo "== Some concurrent requests touching the same cluster ==" | |
78 | ||
8cedcffd | 79 | overlay_io() |
91d4093d KW |
80 | { |
81 | # Allocate middle of cluster 1, then write to somewhere before and after it | |
82 | cat <<EOF | |
83 | break write_aio A | |
84 | aio_write -P 10 0x18000 0x2000 | |
85 | wait_break A | |
86 | ||
87 | aio_write -P 11 0x12000 0x2000 | |
88 | aio_write -P 12 0x1c000 0x2000 | |
89 | ||
90 | resume A | |
91 | aio_flush | |
92 | EOF | |
93 | ||
94 | # Sequential write case: Alloc middle of cluster 2, then write overlapping | |
95 | # to next cluster | |
96 | cat <<EOF | |
97 | break write_aio A | |
98 | aio_write -P 20 0x28000 0x2000 | |
99 | wait_break A | |
100 | aio_write -P 21 0x2a000 0x10000 | |
101 | resume A | |
102 | aio_flush | |
103 | EOF | |
104 | ||
105 | # The same with a gap between both requests | |
106 | cat <<EOF | |
107 | break write_aio A | |
108 | aio_write -P 40 0x48000 0x2000 | |
109 | wait_break A | |
110 | aio_write -P 41 0x4c000 0x10000 | |
111 | resume A | |
112 | aio_flush | |
113 | EOF | |
114 | ||
115 | # Sequential write, but the next cluster is already allocated | |
116 | cat <<EOF | |
117 | write -P 70 0x76000 0x8000 | |
118 | aio_flush | |
119 | break write_aio A | |
120 | aio_write -P 60 0x66000 0x2000 | |
121 | wait_break A | |
122 | aio_write -P 61 0x6a000 0xe000 | |
123 | resume A | |
124 | aio_flush | |
125 | EOF | |
126 | ||
127 | # Sequential write, but the next cluster is already allocated | |
96420a30 | 128 | # and physically in the right position |
91d4093d KW |
129 | cat <<EOF |
130 | write -P 89 0x80000 0x1000 | |
131 | write -P 90 0x96000 0x8000 | |
132 | aio_flush | |
133 | discard 0x80000 0x10000 | |
134 | aio_flush | |
135 | break write_aio A | |
136 | aio_write -P 80 0x86000 0x2000 | |
137 | wait_break A | |
138 | aio_write -P 81 0x8a000 0xe000 | |
139 | resume A | |
140 | aio_flush | |
141 | EOF | |
142 | ||
143 | # Sequential write, and the next cluster is compressed | |
144 | cat <<EOF | |
145 | write -P 109 0xa0000 0x1000 | |
146 | write -c -P 110 0xb0000 0x10000 | |
147 | aio_flush | |
148 | discard 0xa0000 0x10000 | |
149 | aio_flush | |
150 | break write_aio A | |
151 | aio_write -P 100 0xa6000 0x2000 | |
152 | wait_break A | |
153 | aio_write -P 101 0xaa000 0xe000 | |
154 | resume A | |
155 | aio_flush | |
156 | EOF | |
6f749281 KW |
157 | |
158 | # Reverse sequential write | |
159 | cat <<EOF | |
160 | break write_aio A | |
161 | aio_write -P 121 0xdc000 0x2000 | |
162 | wait_break A | |
163 | aio_write -P 120 0xc4000 0x18000 | |
164 | resume A | |
165 | aio_flush | |
166 | EOF | |
167 | ||
168 | # Reverse sequential write with a gap | |
169 | cat <<EOF | |
170 | break write_aio A | |
171 | aio_write -P 141 0xfc000 0x2000 | |
172 | wait_break A | |
173 | aio_write -P 140 0xe4000 0x14000 | |
174 | resume A | |
175 | aio_flush | |
176 | EOF | |
177 | ||
178 | # Allocate an area in the middle and then overwrite with a larger request | |
179 | cat <<EOF | |
180 | break write_aio A | |
181 | aio_write -P 161 0x10c000 0x8000 | |
182 | wait_break A | |
183 | aio_write -P 160 0x104000 0x18000 | |
184 | resume A | |
185 | aio_flush | |
186 | EOF | |
91d4093d KW |
187 | } |
188 | ||
fef9c191 | 189 | overlay_io | $QEMU_IO blkdebug::"$TEST_IMG" | _filter_qemu_io |\ |
6d7bb951 HR |
190 | sed -e 's/[0-9]*\/[0-9]* bytes at offset [0-9]*/XXX\/XXX bytes at offset XXX/g' \ |
191 | -e 's/^[0-9]* KiB/XXX KiB/g' | |
91d4093d KW |
192 | |
193 | echo | |
194 | echo "== Verify image content ==" | |
195 | ||
8cedcffd | 196 | verify_io() |
91d4093d | 197 | { |
55e5a3b6 | 198 | if ($QEMU_IMG info -U -f "$IMGFMT" "$TEST_IMG" | grep "compat: 0.10" > /dev/null); then |
80f5c011 AG |
199 | # In v2 images clusters are not discarded when there is a backing file. |
200 | # Keep the variable empty so that the previous value can be used as | |
a71835a0 KW |
201 | # the default below |
202 | discarded= | |
203 | else | |
204 | # Discarded clusters are zeroed for v3 or later | |
205 | discarded=0 | |
206 | fi | |
207 | ||
91d4093d KW |
208 | echo read -P 0 0 0x10000 |
209 | ||
210 | echo read -P 1 0x10000 0x2000 | |
211 | echo read -P 11 0x12000 0x2000 | |
212 | echo read -P 1 0x14000 0x4000 | |
213 | echo read -P 10 0x18000 0x2000 | |
214 | echo read -P 1 0x1a000 0x2000 | |
215 | echo read -P 12 0x1c000 0x2000 | |
216 | echo read -P 1 0x1e000 0x2000 | |
217 | ||
218 | echo read -P 2 0x20000 0x8000 | |
219 | echo read -P 20 0x28000 0x2000 | |
220 | echo read -P 21 0x2a000 0x10000 | |
221 | echo read -P 3 0x3a000 0x6000 | |
222 | ||
223 | echo read -P 4 0x40000 0x8000 | |
224 | echo read -P 40 0x48000 0x2000 | |
225 | echo read -P 4 0x4a000 0x2000 | |
226 | echo read -P 41 0x4c000 0x10000 | |
227 | echo read -P 5 0x5c000 0x4000 | |
228 | ||
229 | echo read -P 6 0x60000 0x6000 | |
230 | echo read -P 60 0x66000 0x2000 | |
231 | echo read -P 6 0x68000 0x2000 | |
232 | echo read -P 61 0x6a000 0xe000 | |
233 | echo read -P 70 0x78000 0x6000 | |
234 | echo read -P 7 0x7e000 0x2000 | |
235 | ||
80f5c011 AG |
236 | echo read -P ${discarded:-89} 0x80000 0x1000 |
237 | echo read -P ${discarded:-8} 0x81000 0x5000 | |
91d4093d | 238 | echo read -P 80 0x86000 0x2000 |
a71835a0 | 239 | echo read -P ${discarded:-8} 0x88000 0x2000 |
91d4093d KW |
240 | echo read -P 81 0x8a000 0xe000 |
241 | echo read -P 90 0x98000 0x6000 | |
242 | echo read -P 9 0x9e000 0x2000 | |
243 | ||
80f5c011 AG |
244 | echo read -P ${discarded:-109} 0xa0000 0x1000 |
245 | echo read -P ${discarded:-10} 0xa1000 0x5000 | |
91d4093d | 246 | echo read -P 100 0xa6000 0x2000 |
a71835a0 | 247 | echo read -P ${discarded:-10} 0xa8000 0x2000 |
91d4093d KW |
248 | echo read -P 101 0xaa000 0xe000 |
249 | echo read -P 110 0xb8000 0x8000 | |
6f749281 KW |
250 | |
251 | echo read -P 12 0xc0000 0x4000 | |
252 | echo read -P 120 0xc4000 0x18000 | |
253 | echo read -P 121 0xdc000 0x2000 | |
254 | echo read -P 13 0xde000 0x2000 | |
255 | ||
256 | echo read -P 14 0xe0000 0x4000 | |
257 | echo read -P 140 0xe4000 0x14000 | |
258 | echo read -P 15 0xf8000 0x4000 | |
259 | echo read -P 141 0xfc000 0x2000 | |
260 | echo read -P 15 0xfe000 0x2000 | |
261 | ||
262 | echo read -P 16 0x100000 0x4000 | |
263 | echo read -P 160 0x104000 0x8000 | |
264 | # Undefined content for 0x10c000 0x8000 | |
265 | echo read -P 160 0x114000 0x8000 | |
266 | echo read -P 17 0x11c000 0x4000 | |
91d4093d KW |
267 | } |
268 | ||
fef9c191 | 269 | verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
91d4093d KW |
270 | |
271 | _check_test_img | |
272 | ||
273 | # success, all done | |
274 | echo "*** done" | |
275 | rm -f $seq.full | |
276 | status=0 |