]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rados/test_alloc_hint.sh
bump version to 18.2.2-pve1
[ceph.git] / ceph / qa / workunits / rados / test_alloc_hint.sh
1 #!/usr/bin/env bash
2
3 set -ex
4 shopt -s nullglob # fns glob expansion in expect_alloc_hint_eq()
5
6 #
7 # Helpers
8 #
9
10 function get_xml_val() {
11 local xml="$1"
12 local tag="$2"
13
14 local regex=".*<${tag}>(.*)</${tag}>.*"
15 if [[ ! "${xml}" =~ ${regex} ]]; then
16 echo "'${xml}' xml doesn't match '${tag}' tag regex" >&2
17 return 2
18 fi
19
20 echo "${BASH_REMATCH[1]}"
21 }
22
23 function get_conf_val() {
24 set -e
25
26 local entity="$1"
27 local option="$2"
28
29 local val
30 val="$(sudo ceph daemon "${entity}" config get --format=xml "${option}")"
31 val="$(get_xml_val "${val}" "${option}")"
32
33 echo "${val}"
34 }
35
36 function setup_osd_data() {
37 for (( i = 0 ; i < "${NUM_OSDS}" ; i++ )); do
38 OSD_DATA[i]="$(get_conf_val "osd.$i" "osd_data")"
39 done
40 }
41
42 function setup_pgid() {
43 local poolname="$1"
44 local objname="$2"
45
46 local pgid
47 pgid="$(ceph osd map "${poolname}" "${objname}" --format=xml)"
48 pgid="$(get_xml_val "${pgid}" "pgid")"
49
50 PGID="${pgid}"
51 }
52
53 function expect_alloc_hint_eq() {
54 export CEPH_ARGS="--osd-objectstore=filestore"
55 local expected_extsize="$1"
56
57 for (( i = 0 ; i < "${NUM_OSDS}" ; i++ )); do
58 # Make sure that stuff is flushed from the journal to the store
59 # by the time we get to it, as we prod the actual files and not
60 # the journal.
61 sudo ceph daemon "osd.${i}" "flush_journal"
62
63 # e.g., .../25.6_head/foo__head_7FC1F406__19
64 # .../26.bs1_head/bar__head_EFE6384B__1a_ffffffffffffffff_1
65 local fns=$(sudo sh -c "ls ${OSD_DATA[i]}/current/${PGID}*_head/${OBJ}_*")
66 local count="${#fns[@]}"
67 if [ "${count}" -ne 1 ]; then
68 echo "bad fns count: ${count}" >&2
69 return 2
70 fi
71
72 local extsize
73 extsize="$(sudo xfs_io -c extsize "${fns[0]}")"
74 local extsize_regex="^\[(.*)\] ${fns[0]}$"
75 if [[ ! "${extsize}" =~ ${extsize_regex} ]]; then
76 echo "extsize doesn't match extsize_regex: ${extsize}" >&2
77 return 2
78 fi
79 extsize="${BASH_REMATCH[1]}"
80
81 if [ "${extsize}" -ne "${expected_extsize}" ]; then
82 echo "FAIL: alloc_hint: actual ${extsize}, expected ${expected_extsize}" >&2
83 return 1
84 fi
85 done
86 }
87
88 #
89 # Global setup
90 #
91
92 EC_K="2"
93 EC_M="1"
94 NUM_OSDS="$((EC_K + EC_M))"
95
96 NUM_PG="12"
97 NUM_PGP="${NUM_PG}"
98
99 LOW_CAP="$(get_conf_val "osd.0" "filestore_max_alloc_hint_size")"
100 HIGH_CAP="$((LOW_CAP * 10))" # 10M, assuming 1M default cap
101 SMALL_HINT="$((LOW_CAP / 4))" # 256K, assuming 1M default cap
102 BIG_HINT="$((LOW_CAP * 6))" # 6M, assuming 1M default cap
103
104 setup_osd_data
105
106 #
107 # ReplicatedBackend tests
108 #
109
110 POOL="alloc_hint-rep"
111 ceph osd pool create "${POOL}" "${NUM_PG}"
112 ceph osd pool set "${POOL}" size "${NUM_OSDS}" --yes-i-really-mean-it
113 ceph osd pool application enable "${POOL}" rados
114
115 OBJ="foo"
116 setup_pgid "${POOL}" "${OBJ}"
117 rados -p "${POOL}" create "${OBJ}"
118
119 # Empty object, SMALL_HINT - expect SMALL_HINT
120 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
121 expect_alloc_hint_eq "${SMALL_HINT}"
122
123 # Try changing to BIG_HINT (1) - expect LOW_CAP (BIG_HINT > LOW_CAP)
124 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${BIG_HINT}" "${BIG_HINT}"
125 expect_alloc_hint_eq "${LOW_CAP}"
126
127 # Bump the cap to HIGH_CAP
128 ceph tell 'osd.*' injectargs "--filestore_max_alloc_hint_size ${HIGH_CAP}"
129
130 # Try changing to BIG_HINT (2) - expect BIG_HINT (BIG_HINT < HIGH_CAP)
131 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${BIG_HINT}" "${BIG_HINT}"
132 expect_alloc_hint_eq "${BIG_HINT}"
133
134 ceph tell 'osd.*' injectargs "--filestore_max_alloc_hint_size ${LOW_CAP}"
135
136 # Populate object with some data
137 rados -p "${POOL}" put "${OBJ}" /etc/passwd
138
139 # Try changing back to SMALL_HINT - expect BIG_HINT (non-empty object)
140 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
141 expect_alloc_hint_eq "${BIG_HINT}"
142
143 OBJ="bar"
144 setup_pgid "${POOL}" "${OBJ}"
145
146 # Non-existent object, SMALL_HINT - expect SMALL_HINT (object creation)
147 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
148 expect_alloc_hint_eq "${SMALL_HINT}"
149
150 ceph osd pool delete "${POOL}" "${POOL}" --yes-i-really-really-mean-it
151
152 #
153 # ECBackend tests
154 #
155
156 PROFILE="alloc_hint-ecprofile"
157 POOL="alloc_hint-ec"
158 ceph osd erasure-code-profile set "${PROFILE}" k=2 m=1 crush-failure-domain=osd
159 ceph osd erasure-code-profile get "${PROFILE}" # just so it's logged
160 ceph osd pool create "${POOL}" "${NUM_PG}" "${NUM_PGP}" erasure "${PROFILE}"
161 ceph osd pool application enable "${POOL}" rados
162
163 OBJ="baz"
164 setup_pgid "${POOL}" "${OBJ}"
165 rados -p "${POOL}" create "${OBJ}"
166
167 # Empty object, SMALL_HINT - expect scaled-down SMALL_HINT
168 rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
169 expect_alloc_hint_eq "$((SMALL_HINT / EC_K))"
170
171 ceph osd pool delete "${POOL}" "${POOL}" --yes-i-really-really-mean-it
172
173 #
174 # Global teardown
175 #
176
177 echo "OK"