teardown $dir || return 1
}
-function TEST_scrub_parallelism() {
- local dir=$1
- local poolname=test
- local OSDS=8
- local PGS=64
- local objects=$(expr $PGS \* 15)
- local size=2
- local osd_max_scrubs_per_osd=2
- local maxscrubs=$(expr $OSDS / $size \* $osd_max_scrubs_per_osd)
-
- TESTDATA="testdata.$$"
-
- setup $dir || return 1
- run_mon $dir a --osd_pool_default_size=$size || return 1
- run_mgr $dir x || return 1
- for osd in $(seq 0 $(expr $OSDS - 1))
- do
- run_osd $dir $osd --osd_pool_default_pg_autoscale_mode=off \
- --osd_deep_scrub_randomize_ratio=0.0 \
- --osd_max_scrubs=$osd_max_scrubs_per_osd \
- --osd_scrub_chunk_max=5 \
- --osd_scrub_sleep=5.0 \
- --osd_scrub_interval_randomize_ratio=0 || return 1
- done
-
- # Create a pool
- create_pool $poolname $PGS $PGS
- wait_for_clean || return 1
- poolid=$(ceph osd dump | grep "^pool.*[']${poolname}[']" | awk '{ print $2 }')
-
- ceph pg dump pgs
-
- dd if=/dev/urandom of=$TESTDATA bs=1032 count=1
- for i in `seq 1 $objects`
- do
- rados -p $poolname put obj${i} $TESTDATA
- done
- rm -f $TESTDATA
-
- ceph pg dump pgs
-
- ceph osd set noscrub
- sleep 3
- for i in $(seq 0 $(expr $PGS - 1))
- do
- ceph tell $poolid.$(printf '%x' $i) scrub || return 1
- done
- ceph osd unset noscrub
-
- # Wait for scrubbing to start
- set -o pipefail
- found="no"
- for i in $(seq 0 200)
- do
- flush_pg_stats
- if ceph pg dump pgs | grep -q "scrubbing"
- then
- found="yes"
- #ceph pg dump pgs
- break
- fi
- done
- set +o pipefail
-
- if test $found = "no";
- then
- echo "Scrubbing never started"
- return 1
- fi
-
- local zero_count=0
- local found_count=0
- local threshold="$(expr $maxscrubs - 1)"
- set -o pipefail
- while(true)
- do
- sleep 1
- scrubs=$(ceph pg dump pgs | grep scrubbing | wc -l)
- # Occasionally we still see scrubs that have finished with new scrubs starting
- # so more scrubs appear to be running then is possible.
- # Also, count 1 less than maximum possible scrubs
- if test $scrubs -ge $threshold
- then
- found_count=$(expr $found_count + 1)
- continue
- fi
- if test $scrubs = "0"
- then
- zero_count=$(expr $zero_count + 1)
- if test $zero_count = "10"
- then
- break
- fi
- else
- zero_count=0
- fi
- done
- set +o pipefail
-
- echo found $found_count max scrubs
-
- ERRORS=0
- if test $found_count -lt "20"
- then
- echo "Only detected near to or at maximum scrubs $found_count time(s)"
- ERRORS=$(expr $ERRORS + 1)
- fi
-
- grep "reserve failed" $dir/osd.*.log
- if ! grep -q "reserve failed" $dir/osd.*.log
- then
- ERRORS=$(expr $ERRORS + 1)
- fi
-
- if test $ERRORS -gt 0
- then
- return 1
- fi
-
- teardown $dir || return 1
-}
-
main osd-scrub-test "$@"
# Local Variables: