diff --git a/qa/standalone/scrub/osd-scrub-test.sh b/qa/standalone/scrub/osd-scrub-test.sh index fe374e22119..febffdebd55 100755 --- a/qa/standalone/scrub/osd-scrub-test.sh +++ b/qa/standalone/scrub/osd-scrub-test.sh @@ -187,6 +187,49 @@ function TEST_interval_changes() { teardown $dir || return 1 } +function TEST_scrub_extented_sleep() { + local dir=$1 + local poolname=test + local OSDS=3 + local objects=15 + + TESTDATA="testdata.$$" + + setup $dir || return 1 + run_mon $dir a --osd_pool_default_size=3 || return 1 + run_mgr $dir x || return 1 + local scrub_begin_hour=$(date -d '2 hour ago' +"%H" | sed 's/^0//') + local scrub_end_hour=$(date -d '1 hour ago' +"%H" | sed 's/^0//') + for osd in $(seq 0 $(expr $OSDS - 1)) + do + run_osd $dir $osd --osd_scrub_sleep=0 \ + --osd_scrub_extended_sleep=10 \ + --bluestore_cache_autotune=false \ + --osd_scrub_begin_hour=$scrub_begin_hour \ + --osd_scrub_end_hour=$scrub_end_hour || return 1 + done + + # Create a pool with a single pg + create_pool $poolname 1 1 + wait_for_clean || return 1 + + # Trigger a scrub on a PG + local pgid=$(get_pg $poolname SOMETHING) + local primary=$(get_primary $poolname SOMETHING) + local last_scrub=$(get_last_scrub_stamp $pgid) + CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid || return 1 + + # Due to the long delay, the scrub should not be done within 3 seconds + for ((i=0; i < 3; i++)); do + if test "$(get_last_scrub_stamp $pgid)" '>' "$last_scrub" ; then + return 1 + fi + sleep 1 + done + + teardown $dir || return 1 +} + main osd-scrub-test "$@" # Local Variables: diff --git a/src/common/legacy_config_opts.h b/src/common/legacy_config_opts.h index 6260580808f..ddf7b73ec54 100644 --- a/src/common/legacy_config_opts.h +++ b/src/common/legacy_config_opts.h @@ -720,6 +720,7 @@ OPTION(osd_scrub_backoff_ratio, OPT_DOUBLE) // the probability to back off the OPTION(osd_scrub_chunk_min, OPT_INT) OPTION(osd_scrub_chunk_max, OPT_INT) OPTION(osd_scrub_sleep, OPT_FLOAT) // sleep between [deep]scrub ops +OPTION(osd_scrub_extended_sleep, OPT_FLOAT) // more sleep between [deep]scrub ops OPTION(osd_scrub_auto_repair, OPT_BOOL) // whether auto-repair inconsistencies upon deep-scrubbing OPTION(osd_scrub_auto_repair_num_errors, OPT_U32) // only auto-repair when number of errors is below this threshold OPTION(osd_deep_scrub_interval, OPT_FLOAT) // once a week diff --git a/src/common/options.cc b/src/common/options.cc index 2475921f444..efbf788fe9b 100644 --- a/src/common/options.cc +++ b/src/common/options.cc @@ -3523,6 +3523,14 @@ std::vector