4 shopt -s nullglob
# fns glob expansion in expect_alloc_hint_eq()
10 function get_xml_val
() {
14 local regex
=".*<${tag}>(.*)</${tag}>.*"
15 if [[ ! "${xml}" =~
${regex} ]]; then
16 echo "'${xml}' xml doesn't match '${tag}' tag regex" >&2
20 echo "${BASH_REMATCH[1]}"
23 function get_conf_val
() {
30 val
="$(sudo ceph daemon "${entity}" config get --format=xml "${option}")"
31 val
="$(get_xml_val "${val}" "${option}")"
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
")"
42 function setup_pgid
() {
47 pgid
="$(ceph osd map "${poolname}" "${objname}" --format=xml)"
48 pgid
="$(get_xml_val "${pgid}" "pgid
")"
53 function expect_alloc_hint_eq
() {
54 export CEPH_ARGS
="--osd-objectstore=filestore"
55 local expected_extsize
="$1"
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
61 sudo ceph daemon
"osd.${i}" "flush_journal"
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
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
79 extsize
="${BASH_REMATCH[1]}"
81 if [ "${extsize}" -ne "${expected_extsize}" ]; then
82 echo "FAIL: alloc_hint: actual ${extsize}, expected ${expected_extsize}" >&2
94 NUM_OSDS
="$((EC_K + EC_M))"
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
107 # ReplicatedBackend tests
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
116 setup_pgid
"${POOL}" "${OBJ}"
117 rados
-p "${POOL}" create
"${OBJ}"
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}"
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}"
127 # Bump the cap to HIGH_CAP
128 ceph tell
'osd.*' injectargs
"--filestore_max_alloc_hint_size ${HIGH_CAP}"
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}"
134 ceph tell
'osd.*' injectargs
"--filestore_max_alloc_hint_size ${LOW_CAP}"
136 # Populate object with some data
137 rados
-p "${POOL}" put
"${OBJ}" /etc
/passwd
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}"
144 setup_pgid
"${POOL}" "${OBJ}"
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}"
150 ceph osd pool delete
"${POOL}" "${POOL}" --yes-i-really-really-mean-it
156 PROFILE
="alloc_hint-ecprofile"
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
164 setup_pgid
"${POOL}" "${OBJ}"
165 rados
-p "${POOL}" create
"${OBJ}"
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))"
171 ceph osd pool delete
"${POOL}" "${POOL}" --yes-i-really-really-mean-it