]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/krbd_exclusive_option.sh
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / qa / workunits / rbd / krbd_exclusive_option.sh
CommitLineData
11fdf7f2 1#!/usr/bin/env bash
7c673cae
FG
2
3set -ex
4
5function expect_false() {
6 if "$@"; then return 1; else return 0; fi
7}
8
9function assert_locked() {
10 local dev_id="${1#/dev/rbd}"
11
12 local client_addr
13 client_addr="$(< $SYSFS_DIR/$dev_id/client_addr)"
14
15 local client_id
16 client_id="$(< $SYSFS_DIR/$dev_id/client_id)"
17 # client4324 -> client.4324
18 client_id="client.${client_id#client}"
19
20 local watch_cookie
21 watch_cookie="$(rados -p rbd listwatchers rbd_header.$IMAGE_ID |
22 grep $client_id | cut -d ' ' -f 3 | cut -d '=' -f 2)"
23 [[ $(echo -n "$watch_cookie" | grep -c '^') -eq 1 ]]
24
25 local actual
26 actual="$(rados -p rbd --format=json lock info rbd_header.$IMAGE_ID rbd_lock |
9f95a23c 27 python3 -m json.tool --sort-keys)"
7c673cae
FG
28
29 local expected
9f95a23c 30 expected="$(cat <<EOF | python3 -m json.tool --sort-keys
7c673cae
FG
31{
32 "lockers": [
33 {
34 "addr": "$client_addr",
35 "cookie": "auto $watch_cookie",
36 "description": "",
37 "expiration": "0.000000",
38 "name": "$client_id"
39 }
40 ],
41 "name": "rbd_lock",
42 "tag": "internal",
43 "type": "exclusive"
44}
45EOF
46 )"
47
48 [ "$actual" = "$expected" ]
49}
50
51function assert_unlocked() {
52 rados -p rbd --format=json lock info rbd_header.$IMAGE_ID rbd_lock |
53 grep '"lockers":\[\]'
54}
55
f67539c2 56function blocklist_add() {
92f5a8d4
TL
57 local dev_id="${1#/dev/rbd}"
58
59 local client_addr
60 client_addr="$(< $SYSFS_DIR/$dev_id/client_addr)"
61
f67539c2 62 ceph osd blocklist add $client_addr
92f5a8d4
TL
63}
64
7c673cae
FG
65SYSFS_DIR="/sys/bus/rbd/devices"
66IMAGE_NAME="exclusive-option-test"
67
68rbd create --size 1 --image-feature '' $IMAGE_NAME
69
70IMAGE_ID="$(rbd info --format=json $IMAGE_NAME |
9f95a23c 71 python3 -c "import sys, json; print(json.load(sys.stdin)['block_name_prefix'].split('.')[1])")"
7c673cae
FG
72
73DEV=$(sudo rbd map $IMAGE_NAME)
74assert_unlocked
75sudo rbd unmap $DEV
76assert_unlocked
77
78expect_false sudo rbd map -o exclusive $IMAGE_NAME
79assert_unlocked
80
92f5a8d4
TL
81expect_false sudo rbd map -o lock_on_read $IMAGE_NAME
82assert_unlocked
83
7c673cae
FG
84rbd feature enable $IMAGE_NAME exclusive-lock
85rbd snap create $IMAGE_NAME@snap
86
87DEV=$(sudo rbd map $IMAGE_NAME)
92f5a8d4
TL
88assert_locked $DEV
89[[ $(blockdev --getro $DEV) -eq 0 ]]
90sudo rbd unmap $DEV
91assert_unlocked
92
93DEV=$(sudo rbd map $IMAGE_NAME@snap)
94assert_unlocked
95[[ $(blockdev --getro $DEV) -eq 1 ]]
96sudo rbd unmap $DEV
97assert_unlocked
98
99DEV=$(sudo rbd map -o ro $IMAGE_NAME)
7c673cae 100assert_unlocked
92f5a8d4 101[[ $(blockdev --getro $DEV) -eq 1 ]]
7c673cae
FG
102sudo rbd unmap $DEV
103assert_unlocked
104
105DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
106assert_locked $DEV
107[[ $(blockdev --getro $DEV) -eq 0 ]]
108sudo rbd unmap $DEV
109assert_unlocked
110
111DEV=$(sudo rbd map -o exclusive $IMAGE_NAME@snap)
92f5a8d4 112assert_unlocked
7c673cae
FG
113[[ $(blockdev --getro $DEV) -eq 1 ]]
114sudo rbd unmap $DEV
115assert_unlocked
116
117DEV=$(sudo rbd map -o exclusive,ro $IMAGE_NAME)
92f5a8d4 118assert_unlocked
7c673cae
FG
119[[ $(blockdev --getro $DEV) -eq 1 ]]
120sudo rbd unmap $DEV
121assert_unlocked
122
123# alternate syntax
124DEV=$(sudo rbd map --exclusive --read-only $IMAGE_NAME)
92f5a8d4 125assert_unlocked
7c673cae
FG
126[[ $(blockdev --getro $DEV) -eq 1 ]]
127sudo rbd unmap $DEV
128assert_unlocked
129
130DEV=$(sudo rbd map $IMAGE_NAME)
92f5a8d4
TL
131assert_locked $DEV
132OTHER_DEV=$(sudo rbd map -o noshare $IMAGE_NAME)
133assert_locked $OTHER_DEV
7c673cae
FG
134dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
135assert_locked $DEV
92f5a8d4 136dd if=/dev/urandom of=$OTHER_DEV bs=4k count=10 oflag=direct
7c673cae
FG
137assert_locked $OTHER_DEV
138sudo rbd unmap $DEV
139sudo rbd unmap $OTHER_DEV
140assert_unlocked
141
92f5a8d4 142DEV=$(sudo rbd map $IMAGE_NAME)
7c673cae 143assert_locked $DEV
92f5a8d4
TL
144OTHER_DEV=$(sudo rbd map -o noshare,exclusive $IMAGE_NAME)
145assert_locked $OTHER_DEV
146dd if=$DEV of=/dev/null bs=4k count=10 iflag=direct
147expect_false dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
148assert_locked $OTHER_DEV
149sudo rbd unmap $OTHER_DEV
150assert_unlocked
151dd if=$DEV of=/dev/null bs=4k count=10 iflag=direct
152assert_unlocked
153dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
154assert_locked $DEV
155sudo rbd unmap $DEV
156assert_unlocked
157
158DEV=$(sudo rbd map -o lock_on_read $IMAGE_NAME)
159assert_locked $DEV
160OTHER_DEV=$(sudo rbd map -o noshare,exclusive $IMAGE_NAME)
161assert_locked $OTHER_DEV
162expect_false dd if=$DEV of=/dev/null bs=4k count=10 iflag=direct
163expect_false dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
164sudo udevadm settle
165assert_locked $OTHER_DEV
166sudo rbd unmap $OTHER_DEV
167assert_unlocked
168dd if=$DEV of=/dev/null bs=4k count=10 iflag=direct
169assert_locked $DEV
170dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
7c673cae
FG
171assert_locked $DEV
172sudo rbd unmap $DEV
173assert_unlocked
174
175DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
176assert_locked $DEV
92f5a8d4 177expect_false sudo rbd map -o noshare $IMAGE_NAME
7c673cae 178assert_locked $DEV
7c673cae 179sudo rbd unmap $DEV
7c673cae
FG
180assert_unlocked
181
11fdf7f2
TL
182DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
183assert_locked $DEV
92f5a8d4 184expect_false sudo rbd map -o noshare,exclusive $IMAGE_NAME
11fdf7f2 185assert_locked $DEV
92f5a8d4
TL
186sudo rbd unmap $DEV
187assert_unlocked
188
189DEV=$(sudo rbd map $IMAGE_NAME)
11fdf7f2 190assert_locked $DEV
92f5a8d4
TL
191rbd resize --size 1G $IMAGE_NAME
192assert_unlocked
11fdf7f2 193sudo rbd unmap $DEV
11fdf7f2
TL
194assert_unlocked
195
7c673cae
FG
196DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
197assert_locked $DEV
92f5a8d4 198expect_false rbd resize --size 2G $IMAGE_NAME
7c673cae 199assert_locked $DEV
7c673cae 200sudo rbd unmap $DEV
92f5a8d4
TL
201assert_unlocked
202
203DEV=$(sudo rbd map $IMAGE_NAME)
204assert_locked $DEV
205dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
f67539c2 206{ sleep 10; blocklist_add $DEV; } &
92f5a8d4
TL
207PID=$!
208expect_false dd if=/dev/urandom of=$DEV bs=4k count=200000 oflag=direct
209wait $PID
210# break lock
211OTHER_DEV=$(sudo rbd map -o noshare $IMAGE_NAME)
212assert_locked $OTHER_DEV
213sudo rbd unmap $DEV
7c673cae
FG
214assert_locked $OTHER_DEV
215sudo rbd unmap $OTHER_DEV
216assert_unlocked
217
218# induce a watch error after 30 seconds
219DEV=$(sudo rbd map -o exclusive,osdkeepalive=60 $IMAGE_NAME)
220assert_locked $DEV
221OLD_WATCHER="$(rados -p rbd listwatchers rbd_header.$IMAGE_ID)"
222sleep 40
223assert_locked $DEV
224NEW_WATCHER="$(rados -p rbd listwatchers rbd_header.$IMAGE_ID)"
225# same client_id, old cookie < new cookie
226[ "$(echo "$OLD_WATCHER" | cut -d ' ' -f 2)" = \
227 "$(echo "$NEW_WATCHER" | cut -d ' ' -f 2)" ]
228[[ $(echo "$OLD_WATCHER" | cut -d ' ' -f 3 | cut -d '=' -f 2) -lt \
229 $(echo "$NEW_WATCHER" | cut -d ' ' -f 3 | cut -d '=' -f 2) ]]
230sudo rbd unmap $DEV
231assert_unlocked
232
233echo OK