summaryrefslogtreecommitdiff
path: root/tests/ceph/001
blob: aca77168569a109ab52bb14942246afdc2ec8107 (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2020 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. ceph/001
#
# Test remote copy operation (CEPH_OSD_OP_COPY_FROM) with several combinations
# of both object sizes and copy sizes.  It also uses several combinations of
# copy ranges.  For example, copying the 1st object in the src file into
# 1) the beginning (1st object) of dst file, 2) the end (last object) of dst
# file and 3) the middle of the dst file.
#
. ./common/preamble
_begin_fstest auto quick copy

# get standard environment
. common/filter
. common/attr
. common/reflink

# real QA test starts here
_supported_fs ceph

_require_xfs_io_command "copy_range"
_require_attrs
_require_test

workdir=$TEST_DIR/test-$seq
rm -rf $workdir
mkdir $workdir

check_range()
{
	local file=$1
	local off0=$2
	local off1=$3
	local val=$4
	_read_range $file $off0 $off1 | grep -v -q $val
	[ $? -eq 0 ] && echo "file $file is not '$val' in [ $off0 $off1 ]"
}

run_copy_range_tests()
{
	objsz=$1
	halfobj=$(($objsz / 2))
	file="$workdir/file-$objsz"
	copy="$workdir/copy-$objsz"
	dest="$workdir/dest-$objsz"

	# create files and set file layout, which needs to be done before
	# writing any data
	_ceph_create_file_layout $file $objsz 1 $objsz
	_ceph_create_file_layout $copy $objsz 1 $objsz
	_ceph_create_file_layout $dest $objsz 1 $objsz

	# file containing 3 objects with 'aaaa|bbbb|cccc'
	$XFS_IO_PROG -c "pwrite -S 0x61 0 $objsz" $file >> $seqres.full 2>&1
	$XFS_IO_PROG -c "pwrite -S 0x62 $objsz $objsz" $file >> $seqres.full 2>&1
	$XFS_IO_PROG -c "pwrite -S 0x63 $(($objsz * 2)) $objsz" $file >> $seqres.full 2>&1

	echo "  Copy whole file (3 objects):"
	echo "    aaaa|bbbb|cccc => aaaa|bbbb|cccc"
	$XFS_IO_PROG -c "copy_range -s 0 -d 0 -l $(($objsz * 3)) $file" "$copy"
	cmp $file $copy

	echo "  Copy single object to beginning:"
	# dest file with 3 objects with 'dddd|dddd|dddd'
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 3))" $dest >> $seqres.full 2>&1

	echo "    dddd|dddd|dddd => aaaa|dddd|dddd"
	$XFS_IO_PROG -c "copy_range -s 0 -d 0 -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 61
	check_range $dest $objsz $(($objsz * 2)) 64

	echo "    aaaa|dddd|dddd => bbbb|dddd|dddd"
	$XFS_IO_PROG -c "copy_range -s $objsz -d 0 -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 62
	check_range $dest $objsz $(($objsz * 2)) 64

	echo "    bbbb|dddd|dddd => cccc|dddd|dddd"
	$XFS_IO_PROG -c "copy_range -s $(($objsz * 2)) -d 0 -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 63
	check_range $dest $objsz $(($objsz * 2)) 64

	echo "  Copy single object to middle:"

	echo "    cccc|dddd|dddd => cccc|aaaa|dddd"
	$XFS_IO_PROG -c "copy_range -s 0 -d $objsz -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 63
	check_range $dest $objsz $objsz 61
	check_range $dest $(($objsz * 2)) $objsz 64

	echo "    cccc|aaaa|dddd => cccc|bbbb|dddd"
	$XFS_IO_PROG -c "copy_range -s $objsz -d $objsz -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 63
	check_range $dest $objsz $objsz 62
	check_range $dest $(($objsz * 2)) $objsz 64

	echo "    cccc|bbbb|dddd => cccc|cccc|dddd"
	$XFS_IO_PROG -c "copy_range -s $((objsz * 2)) -d $objsz -l $objsz $file" "$dest"
	check_range $dest 0 $objsz 63
	check_range $dest $objsz $objsz 63
	check_range $dest $(($objsz * 2)) $objsz 64

	echo "  Copy single object to end:"

	echo "    cccc|cccc|dddd => cccc|cccc|aaaa"
	$XFS_IO_PROG -c "copy_range -s 0 -d $(($objsz * 2)) -l $objsz $file" "$dest"
	check_range $dest 0 $(($objsz * 2)) 63
	check_range $dest $(($objsz * 2)) $objsz 61

	echo "    cccc|cccc|aaaa => cccc|cccc|bbbb"
	$XFS_IO_PROG -c "copy_range -s $objsz -d $(($objsz * 2)) -l $objsz $file" "$dest"
	check_range $dest 0 $(($objsz * 2)) 63
	check_range $dest $(($objsz * 2)) $objsz 62

	echo "    cccc|cccc|aaaa => cccc|cccc|cccc"
	$XFS_IO_PROG -c "copy_range -s $(($objsz * 2)) -d $(($objsz * 2)) -l $objsz $file" "$dest"
	check_range $dest 0 $(($objsz * 3)) 63

	echo "  Copy 2 objects to beginning:"

	echo "    cccc|cccc|cccc => aaaa|bbbb|cccc"
	$XFS_IO_PROG -c "copy_range -s 0 -d 0 -l $(($objsz * 2)) $file" "$dest"
	cmp $file $dest

	echo "    aaaa|bbbb|cccc => bbbb|cccc|cccc"
	$XFS_IO_PROG -c "copy_range -s $objsz -d 0 -l $(($objsz * 2)) $file" "$dest"
	check_range $dest 0 $objsz 62
	check_range $dest $objsz $(($objsz * 2)) 63

	echo "  Copy 2 objects to end:"

	echo "    bbbb|cccc|cccc => bbbb|aaaa|bbbb"
	$XFS_IO_PROG -c "copy_range -s 0 -d $objsz -l $(($objsz * 2)) $file" "$dest"
	check_range $dest 0 $objsz 62
	check_range $dest $objsz $objsz 61
	check_range $dest $(($objsz * 2)) $objsz 62

	echo "    bbbb|aaaa|bbbb => bbbb|bbbb|cccc"
	$XFS_IO_PROG -c "copy_range -s $objsz -d $objsz -l $(($objsz * 2)) $file" "$dest"
	check_range $dest 0 $(($objsz * 2)) 62
	check_range $dest $(($objsz * 2)) $objsz 63

	echo "  Append 1 object:"

	echo "    bbbb|bbbb|cccc => bbbb|bbbb|cccc|aaaa"
	$XFS_IO_PROG -c "copy_range -s 0 -d $(($objsz * 3)) -l $objsz $file" "$dest"
	check_range $dest 0 $(($objsz * 2)) 62
	check_range $dest $(($objsz * 2)) $objsz 63
	check_range $dest $(($objsz * 3)) $objsz 61

	echo "  Cross object boundary (no full object copy)"
	echo "    dddd|dddd|dddd|dddd => ddaa|aadd|dddd|dddd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s 0 -d $halfobj -l $objsz $file" "$dest"
	check_range $dest 0 $halfobj 64
	check_range $dest $halfobj $objsz 61
	check_range $dest $(($objsz + $halfobj)) $(($objsz * 2 + $halfobj)) 64

	echo "    dddd|dddd|dddd|dddd => ddaa|bbdd|dddd|dddd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s $halfobj -d $halfobj -l $objsz $file" "$dest"
	check_range $dest 0 $halfobj 64
	check_range $dest $halfobj $halfobj 61
	check_range $dest $objsz $halfobj 62
	check_range $dest $(($objsz + $halfobj)) $(($objsz * 2 + $halfobj)) 64

	echo "  Cross object boundaries (with full object copy)"
	echo "    dddd|dddd|dddd|dddd => ddaa|bbbb|dddd|dddd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s $halfobj -d $halfobj -l $(($objsz + $halfobj)) $file" "$dest"
	check_range $dest 0 $halfobj 64
	check_range $dest $halfobj $halfobj 61
	check_range $dest $objsz $objsz 62
	check_range $dest $(($objsz * 2)) $(($objsz * 2)) 64

	echo "    dddd|dddd|dddd|dddd => ddaa|bbbb|ccdd|dddd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s $halfobj -d $halfobj -l $(($objsz * 2)) $file" "$dest"
	check_range $dest 0 $halfobj 64
	check_range $dest $halfobj $halfobj 61
	check_range $dest $objsz $objsz 62
	check_range $dest $(($objsz * 2)) $halfobj 63
	check_range $dest $(($objsz * 2 + $halfobj)) $(($objsz + $halfobj)) 64

	echo "    dddd|dddd|dddd|dddd => dddd|aaaa|bbdd|dddd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s 0 -d $objsz -l $(($objsz + $halfobj)) $file" "$dest"
	check_range $dest 0 $objsz 64
	check_range $dest $objsz $objsz 61
	check_range $dest $(($objsz * 2)) $halfobj 62
	check_range $dest $(($objsz * 2 + $halfobj)) $(($objsz + $halfobj)) 64

	echo "  Cross object boundaries (with 2 full object copies)"
	echo "    dddd|dddd|dddd|dddd => ddaa|aabb|bbcc|ccdd"
	$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 4))" $dest >> $seqres.full 2>&1
	$XFS_IO_PROG -c "copy_range -s 0 -d $halfobj -l $(($objsz * 3)) $file" "$dest"
	check_range $dest 0 $halfobj 64
	check_range $dest $halfobj $objsz 61
	check_range $dest $(($objsz + $halfobj)) $objsz 62
	check_range $dest $(($objsz * 2 + $halfobj)) $objsz 63
	check_range $dest $(($objsz * 3 + $halfobj)) $halfobj 64

}

echo "Object size: 65536" # CEPH_MIN_STRIPE_UNIT
run_copy_range_tests 65536
echo "Object size: 1M"
run_copy_range_tests 1048576
echo "Object size: 4M"
run_copy_range_tests 4194304
# the max object size is 1TB, but by default OSDs only accept a max of 128M objects
echo "Object size: 128M"
run_copy_range_tests 134217728

# success, all done
status=0
exit