]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | #!/bin/bash -ex |
2 | ||
3 | . $(dirname $0)/../ceph-helpers.sh | |
4 | ||
5 | POOL=rbd | |
6 | IMAGE=testrbdnbd$$ | |
7 | SIZE=64 | |
8 | DATA= | |
9 | DEV= | |
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 | ||
28 | setup() | |
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 | ||
54 | function 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 | ||
71 | function expect_false() | |
72 | { | |
73 | if "$@"; then return 1; else return 0; fi | |
74 | } | |
75 | ||
76 | # | |
77 | # main | |
78 | # | |
79 | ||
80 | setup | |
81 | ||
82 | # exit status test | |
83 | expect_false rbd-nbd | |
84 | expect_false rbd-nbd INVALIDCMD | |
85 | if [ `id -u` -ne 0 ] | |
86 | then | |
87 | expect_false rbd-nbd map ${IMAGE} | |
88 | fi | |
89 | expect_false _sudo rbd-nbd map INVALIDIMAGE | |
90 | expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE} | |
91 | ||
92 | # map test using the first unused device | |
93 | DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}` | |
31f18b77 FG |
94 | PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \ |
95 | '$2 == pool && $3 == img && $5 == dev {print $1}') | |
96 | test -n "${PID}" | |
97 | ps -p ${PID} -o cmd | grep rbd-nbd | |
7c673cae FG |
98 | # map test specifying the device |
99 | expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE} | |
100 | dev1=${DEV} | |
101 | _sudo rbd-nbd unmap ${DEV} | |
31f18b77 | 102 | rbd-nbd list-mapped | expect_false grep "${DEV} $" |
7c673cae FG |
103 | DEV= |
104 | # XXX: race possible when the device is reused by other process | |
105 | DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}` | |
106 | [ "${DEV}" = "${dev1}" ] | |
31f18b77 FG |
107 | rbd-nbd list-mapped | grep "${IMAGE}" |
108 | PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \ | |
109 | '$2 == pool && $3 == img && $5 == dev {print $1}') | |
110 | test -n "${PID}" | |
111 | ps -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 | |
117 | dd 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 | |
122 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
123 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
124 | used=`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? | |
128 | sync | |
129 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
130 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
131 | used=`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 | |
136 | devname=$(basename ${DEV}) | |
137 | blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions) | |
138 | test -n "${blocks}" | |
139 | rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M | |
140 | rbd info ${POOL}/${IMAGE} | |
141 | blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions) | |
142 | test -n "${blocks2}" | |
143 | test ${blocks2} -eq $((blocks * 2)) | |
144 | rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M | |
145 | blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions) | |
146 | test -n "${blocks2}" | |
147 | test ${blocks2} -eq ${blocks} | |
148 | ||
149 | # read-only option test | |
150 | _sudo rbd-nbd unmap ${DEV} | |
151 | DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}` | |
31f18b77 FG |
152 | PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \ |
153 | '$2 == pool && $3 == img && $5 == dev {print $1}') | |
154 | test -n "${PID}" | |
155 | ps -p ${PID} -o cmd | grep rbd-nbd | |
156 | ||
7c673cae FG |
157 | _sudo dd if=${DEV} of=/dev/null bs=1M |
158 | expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct | |
159 | _sudo rbd-nbd unmap ${DEV} | |
160 | ||
161 | # exclusive option test | |
162 | DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}` | |
31f18b77 FG |
163 | PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \ |
164 | '$2 == pool && $3 == img && $5 == dev {print $1}') | |
165 | test -n "${PID}" | |
166 | ps -p ${PID} -o cmd | grep rbd-nbd | |
167 | ||
7c673cae FG |
168 | _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct |
169 | expect_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 | |
174 | DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}` | |
175 | PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \ | |
176 | '$2 == pool && $3 == img && $5 == dev {print $1}') | |
177 | test -n "${PID}" | |
178 | ps -p ${PID} -o cmd | grep rbd-nbd | |
179 | _sudo kill ${PID} | |
180 | for i in `seq 10`; do | |
181 | rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" && break | |
182 | sleep 1 | |
183 | done | |
184 | rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" | |
185 | ||
7c673cae FG |
186 | DEV= |
187 | rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024 | |
188 | ||
189 | echo OK |