]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/krbd_exclusive_option.sh
update sources to ceph Nautilus 14.2.1
[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 |
27 python -m json.tool)"
28
29 local expected
30 expected="$(cat <<EOF | python -m json.tool
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
56SYSFS_DIR="/sys/bus/rbd/devices"
57IMAGE_NAME="exclusive-option-test"
58
59rbd create --size 1 --image-feature '' $IMAGE_NAME
60
61IMAGE_ID="$(rbd info --format=json $IMAGE_NAME |
62 python -c "import sys, json; print json.load(sys.stdin)['block_name_prefix'].split('.')[1]")"
63
64DEV=$(sudo rbd map $IMAGE_NAME)
65assert_unlocked
66sudo rbd unmap $DEV
67assert_unlocked
68
69expect_false sudo rbd map -o exclusive $IMAGE_NAME
70assert_unlocked
71
72rbd feature enable $IMAGE_NAME exclusive-lock
73rbd snap create $IMAGE_NAME@snap
74
75DEV=$(sudo rbd map $IMAGE_NAME)
76assert_unlocked
77sudo rbd unmap $DEV
78assert_unlocked
79
80DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
81assert_locked $DEV
82[[ $(blockdev --getro $DEV) -eq 0 ]]
83sudo rbd unmap $DEV
84assert_unlocked
85
86DEV=$(sudo rbd map -o exclusive $IMAGE_NAME@snap)
87assert_locked $DEV
88[[ $(blockdev --getro $DEV) -eq 1 ]]
89sudo rbd unmap $DEV
90assert_unlocked
91
92DEV=$(sudo rbd map -o exclusive,ro $IMAGE_NAME)
93assert_locked $DEV
94[[ $(blockdev --getro $DEV) -eq 1 ]]
95sudo rbd unmap $DEV
96assert_unlocked
97
98# alternate syntax
99DEV=$(sudo rbd map --exclusive --read-only $IMAGE_NAME)
100assert_locked $DEV
101[[ $(blockdev --getro $DEV) -eq 1 ]]
102sudo rbd unmap $DEV
103assert_unlocked
104
105DEV=$(sudo rbd map $IMAGE_NAME)
106assert_unlocked
107dd if=/dev/urandom of=$DEV bs=4k count=10 oflag=direct
108assert_locked $DEV
109OTHER_DEV=$(sudo rbd map -o noshare,exclusive $IMAGE_NAME)
110assert_locked $OTHER_DEV
111sudo rbd unmap $DEV
112sudo rbd unmap $OTHER_DEV
113assert_unlocked
114
115DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
116assert_locked $DEV
117expect_false sudo rbd map -o noshare,exclusive $IMAGE_NAME
118assert_locked $DEV
119sudo rbd unmap $DEV
120assert_unlocked
121
122DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
123assert_locked $DEV
124OTHER_DEV=$(sudo rbd map -o noshare $IMAGE_NAME)
125dd if=/dev/urandom of=$OTHER_DEV bs=4k count=10 oflag=direct &
126PID=$!
127sleep 20
128assert_locked $DEV
11fdf7f2 129[[ "$(ps -o stat= $PID)" =~ ^D ]]
7c673cae
FG
130sudo rbd unmap $DEV
131wait $PID
132assert_locked $OTHER_DEV
133sudo rbd unmap $OTHER_DEV
134assert_unlocked
135
11fdf7f2
TL
136DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
137assert_locked $DEV
138OTHER_DEV=$(sudo rbd map -o noshare,lock_timeout=60 $IMAGE_NAME)
139dd if=/dev/urandom of=$OTHER_DEV bs=4k count=10 oflag=direct &
140PID=$!
141sleep 20
142assert_locked $DEV
143[[ "$(ps -o stat= $PID)" =~ ^D ]]
144expect_false wait $PID
145assert_locked $DEV
146sudo rbd unmap $DEV
147sudo rbd unmap $OTHER_DEV
148assert_unlocked
149
7c673cae
FG
150DEV=$(sudo rbd map -o exclusive $IMAGE_NAME)
151assert_locked $DEV
152sudo rbd map -o noshare,lock_on_read $IMAGE_NAME &
153SUDO_PID=$!
154sleep 20
155assert_locked $DEV
156PID="$(ps -o pid= --ppid $SUDO_PID)"
11fdf7f2 157[[ "$(ps -o stat= $PID)" =~ ^D ]]
7c673cae
FG
158sudo rbd unmap $DEV
159wait $SUDO_PID
160assert_locked $OTHER_DEV
161sudo rbd unmap $OTHER_DEV
162assert_unlocked
163
164# induce a watch error after 30 seconds
165DEV=$(sudo rbd map -o exclusive,osdkeepalive=60 $IMAGE_NAME)
166assert_locked $DEV
167OLD_WATCHER="$(rados -p rbd listwatchers rbd_header.$IMAGE_ID)"
168sleep 40
169assert_locked $DEV
170NEW_WATCHER="$(rados -p rbd listwatchers rbd_header.$IMAGE_ID)"
171# same client_id, old cookie < new cookie
172[ "$(echo "$OLD_WATCHER" | cut -d ' ' -f 2)" = \
173 "$(echo "$NEW_WATCHER" | cut -d ' ' -f 2)" ]
174[[ $(echo "$OLD_WATCHER" | cut -d ' ' -f 3 | cut -d '=' -f 2) -lt \
175 $(echo "$NEW_WATCHER" | cut -d ' ' -f 3 | cut -d '=' -f 2) ]]
176sudo rbd unmap $DEV
177assert_unlocked
178
179echo OK