Statistics
| Branch: | Revision:

root / tests / qemu-iotests / 077 @ 9a05feab

History | View | Annotate | Download (5.7 kB)

1
#!/bin/bash
2
#
3
# Test concurrent pread/pwrite
4
#
5
# Copyright (C) 2014 Red Hat, Inc.
6
#
7
# This program is free software; you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 2 of the License, or
10
# (at your option) any later version.
11
#
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
#
20

    
21
# creator
22
owner=kwolf@redhat.com
23

    
24
seq=`basename $0`
25
echo "QA output created by $seq"
26

    
27
here=`pwd`
28
tmp=/tmp/$$
29
status=1	# failure is the default!
30

    
31
_cleanup()
32
{
33
	_cleanup_test_img
34
}
35
trap "_cleanup; exit \$status" 0 1 2 3 15
36

    
37
# get standard environment, filters and checks
38
. ./common.rc
39
. ./common.filter
40

    
41
_supported_fmt raw
42
_supported_proto generic
43
_supported_os Linux
44

    
45
CLUSTER_SIZE=4k
46
size=128M
47

    
48
_make_test_img $size
49

    
50
echo
51
echo "== Some concurrent requests involving RMW =="
52

    
53
function test_io()
54
{
55
echo "open -o file.align=4k blkdebug::$TEST_IMG"
56
# A simple RMW request
57
cat  <<EOF
58
aio_write -P 10 0x200 0x200
59
aio_flush
60
EOF
61

    
62
# Sequential RMW requests on the same physical sector
63
off=0x1000
64
for ev in "head" "after_head" "tail" "after_tail"; do
65
cat  <<EOF
66
break pwritev_rmw.$ev A
67
aio_write -P 10 $((off + 0x200)) 0x200
68
wait_break A
69
aio_write -P 11 $((off + 0x400)) 0x200
70
sleep 100
71
resume A
72
aio_flush
73
EOF
74
off=$((off + 0x1000))
75
done
76

    
77
# Chained dependencies
78
cat  <<EOF
79
break pwritev_rmw.after_tail A
80
aio_write -P 10 0x5000 0x200
81
wait_break A
82
aio_write -P 11 0x5200 0x200
83
aio_write -P 12 0x5400 0x200
84
aio_write -P 13 0x5600 0x200
85
aio_write -P 14 0x5800 0x200
86
aio_write -P 15 0x5a00 0x200
87
aio_write -P 16 0x5c00 0x200
88
aio_write -P 17 0x5e00 0x200
89
sleep 100
90
resume A
91
aio_flush
92
EOF
93

    
94
# Overlapping multiple requests
95
cat  <<EOF
96
break pwritev_rmw.after_tail A
97
aio_write -P 10 0x6000 0x200
98
wait_break A
99
break pwritev_rmw.after_head B
100
aio_write -P 10 0x7e00 0x200
101
wait_break B
102
aio_write -P 11 0x6800 0x1000
103
resume A
104
sleep 100
105
resume B
106
aio_flush
107
EOF
108

    
109
cat  <<EOF
110
break pwritev_rmw.after_tail A
111
aio_write -P 10 0x8000 0x200
112
wait_break A
113
break pwritev_rmw.after_head B
114
aio_write -P 10 0x9e00 0x200
115
wait_break B
116
aio_write -P 11 0x8800 0x1000
117
resume B
118
sleep 100
119
resume A
120
aio_flush
121
EOF
122

    
123
cat  <<EOF
124
break pwritev_rmw.after_tail A
125
aio_write -P 10 0xa000 0x200
126
wait_break A
127
aio_write -P 11 0xa800 0x1000
128
break pwritev_rmw.after_head B
129
aio_write -P 10 0xbe00 0x200
130
wait_break B
131
resume A
132
sleep 100
133
resume B
134
aio_flush
135
EOF
136

    
137
cat  <<EOF
138
break pwritev_rmw.after_tail A
139
aio_write -P 10 0xc000 0x200
140
wait_break A
141
aio_write -P 11 0xc800 0x1000
142
break pwritev_rmw.after_head B
143
aio_write -P 10 0xde00 0x200
144
wait_break B
145
resume B
146
sleep 100
147
resume A
148
aio_flush
149
EOF
150

    
151
# Only RMW for the tail part
152
cat  <<EOF
153
break pwritev_rmw.after_tail A
154
aio_write -P 10 0xe000 0x1800
155
wait_break A
156
aio_write -P 11 0xf000 0xc00
157
sleep 100
158
resume A
159
aio_flush
160
EOF
161

    
162
cat  <<EOF
163
break pwritev A
164
aio_write -P 10 0x10000 0x800
165
wait_break A
166
break pwritev_rmw.after_tail B
167
aio_write -P 11 0x10000 0x400
168
break pwritev_done C
169
resume A
170
wait_break C
171
resume C
172
sleep 100
173
wait_break B
174
resume B
175
aio_flush
176
EOF
177

    
178
cat  <<EOF
179
break pwritev A
180
aio_write -P 10 0x11000 0x800
181
wait_break A
182
aio_write -P 11 0x11000 0x1000
183
sleep 100
184
resume A
185
aio_flush
186
EOF
187
}
188

    
189
test_io | $QEMU_IO  | _filter_qemu_io | \
190
    sed -e 's,[0-9/]* bytes at offset [0-9]*,XXX/XXX bytes at offset XXX,g' \
191
        -e 's/^[0-9]* \(bytes\|KiB\)/XXX bytes/' \
192
        -e '/Suspended/d'
193

    
194
echo
195
echo "== Verify image content =="
196

    
197
function verify_io()
198
{
199
    # A simple RMW request
200
    echo read -P 0       0 0x200
201
    echo read -P 10  0x200 0x200
202
    echo read -P 0   0x400 0xc00
203

    
204
    # Sequential RMW requests on the same physical sector
205
    echo read -P 0  0x1000 0x200
206
    echo read -P 10 0x1200 0x200
207
    echo read -P 11 0x1400 0x200
208
    echo read -P 0  0x1600 0xa00
209

    
210
    echo read -P 0  0x2000 0x200
211
    echo read -P 10 0x2200 0x200
212
    echo read -P 11 0x2400 0x200
213
    echo read -P 0  0x2600 0xa00
214

    
215
    echo read -P 0  0x3000 0x200
216
    echo read -P 10 0x3200 0x200
217
    echo read -P 11 0x3400 0x200
218
    echo read -P 0  0x3600 0xa00
219

    
220
    echo read -P 0  0x4000 0x200
221
    echo read -P 10 0x4200 0x200
222
    echo read -P 11 0x4400 0x200
223
    echo read -P 0  0x4600 0xa00
224

    
225
    # Chained dependencies
226
    echo read -P 10 0x5000 0x200
227
    echo read -P 11 0x5200 0x200
228
    echo read -P 12 0x5400 0x200
229
    echo read -P 13 0x5600 0x200
230
    echo read -P 14 0x5800 0x200
231
    echo read -P 15 0x5a00 0x200
232
    echo read -P 16 0x5c00 0x200
233
    echo read -P 17 0x5e00 0x200
234

    
235
    # Overlapping multiple requests
236
    echo read -P 10 0x6000 0x200
237
    echo read -P  0 0x6200 0x600
238
    echo read -P 11 0x6800 0x1000
239
    echo read -P  0 0x7800 0x600
240
    echo read -P 10 0x7e00 0x200
241

    
242
    echo read -P 10 0x8000 0x200
243
    echo read -P  0 0x8200 0x600
244
    echo read -P 11 0x8800 0x1000
245
    echo read -P  0 0x9800 0x600
246
    echo read -P 10 0x9e00 0x200
247

    
248
    echo read -P 10 0xa000 0x200
249
    echo read -P  0 0xa200 0x600
250
    echo read -P 11 0xa800 0x1000
251
    echo read -P  0 0xb800 0x600
252
    echo read -P 10 0xbe00 0x200
253

    
254
    echo read -P 10 0xc000 0x200
255
    echo read -P  0 0xc200 0x600
256
    echo read -P 11 0xc800 0x1000
257
    echo read -P  0 0xd800 0x600
258
    echo read -P 10 0xde00 0x200
259

    
260
    # Only RMW for the tail part
261
    echo read -P 10 0xe000 0x1000
262
    echo read -P 11 0xf800 0x400
263
    echo read -P  0 0xfc00 0x400
264

    
265
    echo read -P 11 0x10000 0x400
266
    echo read -P 10 0x10400 0x400
267

    
268
    echo read -P 11 0x11800 0x800
269
}
270

    
271
verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
272

    
273
_check_test_img
274

    
275
# success, all done
276
echo "*** done"
277
rm -f $seq.full
278
status=0