]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/rbd-nbd.sh
update sources to v12.1.0
[ceph.git] / ceph / qa / workunits / rbd / rbd-nbd.sh
CommitLineData
7c673cae
FG
1#!/bin/bash -ex
2
3. $(dirname $0)/../ceph-helpers.sh
4
5POOL=rbd
6IMAGE=testrbdnbd$$
7SIZE=64
8DATA=
9DEV=
10
11_sudo()
12{
13 local cmd
14
15 if [ `id -u` -eq 0 ]
16 then
17 "$@"
18 return $?
19 fi
20
21 # Look for the command in the user path. If it fails run it as is,
22 # supposing it is in sudo path.
23 cmd=`which $1 2>/dev/null` || cmd=$1
24 shift
25 sudo -nE "${cmd}" "$@"
26}
27
28setup()
29{
30 if [ -e CMakeCache.txt ]; then
31 # running under cmake build dir
32
33 CEPH_SRC=$(readlink -f $(dirname $0)/../../../src)
34 CEPH_ROOT=${PWD}
35 CEPH_BIN=${CEPH_ROOT}/bin
36
37 export LD_LIBRARY_PATH=${CEPH_ROOT}/lib:${LD_LIBRARY_PATH}
38 export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind
39 for x in ${CEPH_ROOT}/lib/cython_modules/lib* ; do
40 PYTHONPATH="${PYTHONPATH}:${x}"
41 done
42 PATH=${CEPH_BIN}:${PATH}
43 fi
44
45 _sudo echo test sudo
46
47 trap cleanup INT TERM EXIT
48 TEMPDIR=`mktemp -d`
49 DATA=${TEMPDIR}/data
50 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
51 rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE}
52}
53
54function cleanup()
55{
56 set +e
57 rm -Rf ${TMPDIR}
58 if [ -n "${DEV}" ]
59 then
60 _sudo rbd-nbd unmap ${DEV}
61 fi
62 if rbd -p ${POOL} status ${IMAGE} 2>/dev/null; then
63 for s in 0.5 1 2 4 8 16 32; do
64 sleep $s
65 rbd -p ${POOL} status ${IMAGE} | grep 'Watchers: none' && break
66 done
67 rbd -p ${POOL} remove ${IMAGE}
68 fi
69}
70
71function expect_false()
72{
73 if "$@"; then return 1; else return 0; fi
74}
75
76#
77# main
78#
79
80setup
81
82# exit status test
83expect_false rbd-nbd
84expect_false rbd-nbd INVALIDCMD
85if [ `id -u` -ne 0 ]
86then
87 expect_false rbd-nbd map ${IMAGE}
88fi
89expect_false _sudo rbd-nbd map INVALIDIMAGE
90expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE}
91
92# map test using the first unused device
93DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
31f18b77
FG
94PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
95 '$2 == pool && $3 == img && $5 == dev {print $1}')
96test -n "${PID}"
97ps -p ${PID} -o cmd | grep rbd-nbd
7c673cae
FG
98# map test specifying the device
99expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
100dev1=${DEV}
101_sudo rbd-nbd unmap ${DEV}
31f18b77 102rbd-nbd list-mapped | expect_false grep "${DEV} $"
7c673cae
FG
103DEV=
104# XXX: race possible when the device is reused by other process
105DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
106[ "${DEV}" = "${dev1}" ]
31f18b77
FG
107rbd-nbd list-mapped | grep "${IMAGE}"
108PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
109 '$2 == pool && $3 == img && $5 == dev {print $1}')
110test -n "${PID}"
111ps -p ${PID} -o cmd | grep rbd-nbd
7c673cae
FG
112
113# read test
114[ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
115
116# write test
117dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
118_sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
119[ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
120
121# trim test
122provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
123 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
124used=`rbd -p ${POOL} --format xml du ${IMAGE} |
125 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
126[ "${used}" -eq "${provisioned}" ]
127_sudo mkfs.ext4 -E discard ${DEV} # better idea?
128sync
129provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
130 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
131used=`rbd -p ${POOL} --format xml du ${IMAGE} |
132 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
133[ "${used}" -lt "${provisioned}" ]
134
135# resize test
136devname=$(basename ${DEV})
137blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
138test -n "${blocks}"
139rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
140rbd info ${POOL}/${IMAGE}
141blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
142test -n "${blocks2}"
143test ${blocks2} -eq $((blocks * 2))
144rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
145blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
146test -n "${blocks2}"
147test ${blocks2} -eq ${blocks}
148
149# read-only option test
150_sudo rbd-nbd unmap ${DEV}
151DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
31f18b77
FG
152PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
153 '$2 == pool && $3 == img && $5 == dev {print $1}')
154test -n "${PID}"
155ps -p ${PID} -o cmd | grep rbd-nbd
156
7c673cae
FG
157_sudo dd if=${DEV} of=/dev/null bs=1M
158expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
159_sudo rbd-nbd unmap ${DEV}
160
161# exclusive option test
162DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
31f18b77
FG
163PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
164 '$2 == pool && $3 == img && $5 == dev {print $1}')
165test -n "${PID}"
166ps -p ${PID} -o cmd | grep rbd-nbd
167
7c673cae
FG
168_sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
169expect_false timeout 10 \
170 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
171_sudo rbd-nbd unmap ${DEV}
31f18b77
FG
172
173# auto unmap test
174DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
175PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
176 '$2 == pool && $3 == img && $5 == dev {print $1}')
177test -n "${PID}"
178ps -p ${PID} -o cmd | grep rbd-nbd
179_sudo kill ${PID}
180for i in `seq 10`; do
181 rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" && break
182 sleep 1
183done
184rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}"
185
7c673cae
FG
186DEV=
187rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
188
189echo OK