3 source $CEPH_ROOT/qa
/standalone
/ceph-helpers.sh
10 export CEPH_MON
="127.0.0.1:7302" # git grep '\<7105\>' : there must be only one
12 CEPH_ARGS
+="--fsid=$(uuidgen) --auth-supported=none "
13 CEPH_ARGS
+="--mon-host=$CEPH_MON "
15 local funcs
=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
16 for func
in $funcs ; do
17 setup
$dir ||
return 1
18 $func $dir ||
return 1
19 teardown
$dir ||
return 1
24 function check_lec_equals_pools
() {
29 lec
=$
(echo $report | \
30 jq
'.osdmap_clean_epochs.min_last_epoch_clean')
32 if [[ -z "$pool_id" ]]; then
33 pools
=($
(echo $report | \
35 ".osdmap_clean_epochs.last_epoch_clean.per_pool[] |" \
36 " select(.floor == $lec) | .poolid"))
38 [[ ${#pools[*]} -eq 2 ]] ||
( echo $report ; return 1 )
40 floor
=($
(echo $report | \
42 ".osdmap_clean_epochs.last_epoch_clean.per_pool[] |" \
43 " select(.poolid == $pool_id) | .floor"))
45 [[ $lec -eq $floor ]] ||
( echo $report ; return 1 )
50 function check_lec_lower_than_pool
() {
53 [[ -z "$pool_id" ]] && ( echo "expected pool_id as parameter" ; exit 1 )
56 lec
=$
(echo $report | \
57 jq
'.osdmap_clean_epochs.min_last_epoch_clean')
59 floor
=($
(echo $report | \
61 ".osdmap_clean_epochs.last_epoch_clean.per_pool[] |" \
62 " select(.poolid == $pool_id) | .floor"))
64 [[ $lec -lt $floor ]] ||
( echo $report ; return 1 )
68 function check_floor_pool_greater_than_pool
() {
72 [[ -z "$pool_a" ]] && ( echo "expected id as first parameter" ; exit 1 )
73 [[ -z "$pool_b" ]] && ( echo "expected id as second parameter" ; exit 1 )
77 floor_a
=($
(echo $report | \
79 ".osdmap_clean_epochs.last_epoch_clean.per_pool[] |" \
80 " select(.poolid == $pool_a) | .floor"))
82 floor_b
=($
(echo $report | \
84 ".osdmap_clean_epochs.last_epoch_clean.per_pool[] |" \
85 " select(.poolid == $pool_b) | .floor"))
87 [[ $floor_a -gt $floor_b ]] ||
( echo $report ; return 1 )
91 function check_lec_honours_osd
() {
96 lec
=$
(echo $report | \
97 jq
'.osdmap_clean_epochs.min_last_epoch_clean')
99 if [[ -z "$osd" ]]; then
100 osds
=($
(echo $report | \
102 ".osdmap_clean_epochs.osd_epochs[] |" \
103 " select(.epoch >= $lec) | .id"))
105 [[ ${#osds[*]} -eq 3 ]] ||
( echo $report ; return 1 )
107 epoch
=($
(echo $report | \
109 ".osdmap_clean_epochs.osd_epochs[] |" \
110 " select(.id == $id) | .epoch"))
111 [[ ${#epoch[*]} -eq 1 ]] ||
( echo $report ; return 1 )
112 [[ ${epoch[0]} -ge $lec ]] ||
( echo $report ; return 1 )
118 function validate_fc
() {
119 report
=$
(ceph report
)
120 lec
=$
(echo $report | \
121 jq
'.osdmap_clean_epochs.min_last_epoch_clean')
122 osdm_fc
=$
(echo $report | \
123 jq
'.osdmap_first_committed')
125 [[ $lec -eq $osdm_fc ]] ||
( echo $report ; return 1 )
129 function get_fc_lc_diff
() {
130 report
=$
(ceph report
)
131 osdm_fc
=$
(echo $report | \
132 jq
'.osdmap_first_committed')
133 osdm_lc
=$
(echo $report | \
134 jq
'.osdmap_last_committed')
136 echo $
((osdm_lc
- osdm_fc
))
139 function get_pool_id
() {
142 [[ -z "$pn" ]] && ( echo "expected pool name as argument" ; exit 1 )
144 report
=$
(ceph report
)
145 pool_id
=$
(echo $report | \
146 jq
".osdmap.pools[] | select(.pool_name == \"$pn\") | .pool")
148 [[ $pool_id -ge 0 ]] || \
149 ( echo "unexpected pool id for pool \'$pn\': $pool_id" ; return -1 )
155 function wait_for_total_num_maps
() {
156 # rip wait_for_health, becaue it's easier than deduplicating the code
157 local -a delays
=($
(get_timeout_delays
$TIMEOUT .1))
161 while [[ $
(get_fc_lc_diff
) -gt $v_diff ]]; do
162 if (( $loop >= ${#delays[*]} )) ; then
163 echo "maps were not trimmed"
166 sleep ${delays[$loop]}
171 function TEST_mon_last_clean_epoch
() {
175 run_mon
$dir a ||
return 1
176 run_mgr
$dir x ||
return 1
177 run_osd
$dir 0 ||
return 1
178 run_osd
$dir 1 ||
return 1
179 run_osd
$dir 2 ||
return 1
180 osd_pid
=$
(cat $dir/osd
.2.pid
)
184 ceph tell
'osd.*' injectargs
'--osd-beacon-report-interval 10' ||
exit 1
185 ceph tell
'mon.*' injectargs \
186 '--mon-min-osdmap-epochs 2 --paxos-service-trim-min 1' ||
exit 1
191 foo_id
=$
(get_pool_id
"foo")
192 bar_id
=$
(get_pool_id
"bar")
194 [[ $foo_id -lt 0 ]] && ( echo "couldn't find pool 'foo' id" ; exit 1 )
195 [[ $bar_id -lt 0 ]] && ( echo "couldn't find pool 'bar' id" ; exit 1 )
197 # no real clue why we are getting these warnings, but let's make them go
198 # away so we can be happy.
200 ceph osd set-full-ratio
0.97
201 ceph osd set-backfillfull-ratio
0.97
203 wait_for_health_ok ||
exit 1
205 pre_map_diff
=$
(get_fc_lc_diff
)
206 wait_for_total_num_maps
2
207 post_map_diff
=$
(get_fc_lc_diff
)
209 [[ $post_map_diff -le $pre_map_diff ]] ||
exit 1
211 pre_map_diff
=$post_map_diff
213 ceph osd pool
set foo size
3
214 ceph osd pool
set bar size
3
216 wait_for_health_ok ||
exit 1
218 check_lec_equals_pools ||
exit 1
219 check_lec_honours_osd ||
exit 1
220 validate_fc ||
exit 1
222 # down osd.2; expected result (because all pools' size equals 3):
223 # - number of committed maps increase over 2
225 # - lec equals osd.2's epoch
226 # - all pools have floor equal to lec
228 while kill $osd_pid ; do sleep 1 ; done
230 sleep 5 # seriously, just to make sure things settle; we may not need this.
233 for ((i
=0; i
<= 10; ++i
)); do
240 post_map_diff
=$
(get_fc_lc_diff
)
241 [[ $post_map_diff -gt 2 ]] ||
exit 1
243 validate_fc ||
exit 1
244 check_lec_equals_pools ||
exit 1
245 check_lec_honours_osd
2 ||
exit 1
247 # adjust pool 'bar' size to 2; expect:
248 # - number of committed maps still over 2
250 # - lec equals pool 'foo' floor
251 # - pool 'bar' floor greater than pool 'foo'
253 ceph osd pool
set bar size
2
255 diff_ver
=$
(get_fc_lc_diff
)
256 [[ $diff_ver -gt 2 ]] ||
exit 1
258 validate_fc ||
exit 1
260 check_lec_equals_pools
$foo_id ||
exit 1
261 check_lec_lower_than_pool
$bar_id ||
exit 1
263 check_floor_pool_greater_than_pool
$bar_id $foo_id ||
exit 1
265 # set pool 'foo' size to 2; expect:
268 # - number of committed maps decreases
271 pre_map_diff
=$
(get_fc_lc_diff
)
273 ceph osd pool
set foo size
2 ||
exit 1
274 wait_for_clean ||
exit 1
276 check_lec_equals_pools ||
exit 1
277 validate_fc ||
exit 1
279 if ! wait_for_total_num_maps
2 ; then
280 post_map_diff
=$
(get_fc_lc_diff
)
281 # number of maps is decreasing though, right?
282 [[ $post_map_diff -lt $pre_map_diff ]] ||
exit 1
285 # bring back osd.2; expect:
288 # - number of committed maps equals 2
289 # - all pools have floor equal to lec
291 pre_map_diff
=$
(get_fc_lc_diff
)
293 activate_osd
$dir 2 ||
exit 1
294 wait_for_health_ok ||
exit 1
295 validate_fc ||
exit 1
296 check_lec_equals_pools ||
exit 1
298 if ! wait_for_total_num_maps
2 ; then
299 post_map_diff
=$
(get_fc_lc_diff
)
300 # number of maps is decreasing though, right?
301 [[ $post_map_diff -lt $pre_map_diff ]] ||
exit 1
307 main mon-last-clean-epoch
"$@"