From 1e44d86b2c237239f97fa54fb7f79f9ddcd2c288 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 10 Sep 2019 10:14:41 -0500 Subject: [PATCH] osd: change trigger_[deep_]scrub tommands to a pg tell command This is cleaner. All users are currently standalone tests; updated. It also means that *all* commands that have a name=pgid arg are pg tell commands. Signed-off-by: Sage Weil --- qa/standalone/scrub/osd-scrub-dump.sh | 2 +- qa/standalone/scrub/osd-scrub-repair.sh | 29 +++---- qa/standalone/scrub/osd-scrub-test.sh | 2 +- src/osd/OSD.cc | 102 ++++++++---------------- src/osd/PrimaryLogPG.cc | 42 ++++++++++ 5 files changed, 89 insertions(+), 88 deletions(-) diff --git a/qa/standalone/scrub/osd-scrub-dump.sh b/qa/standalone/scrub/osd-scrub-dump.sh index e218834c657..6d18d6a60f3 100755 --- a/qa/standalone/scrub/osd-scrub-dump.sh +++ b/qa/standalone/scrub/osd-scrub-dump.sh @@ -85,7 +85,7 @@ function TEST_recover_unexpected() { do primary=$(ceph pg dump pgs --format=json | jq ".pg_stats[] | select(.pgid == $qpg) | .acting_primary") eval pg=$qpg # strip quotes around qpg - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pg + ceph tell $pg scrub done ceph pg dump pgs diff --git a/qa/standalone/scrub/osd-scrub-repair.sh b/qa/standalone/scrub/osd-scrub-repair.sh index a468d49c197..3ee4d1f066a 100755 --- a/qa/standalone/scrub/osd-scrub-repair.sh +++ b/qa/standalone/scrub/osd-scrub-repair.sh @@ -360,8 +360,8 @@ function TEST_auto_repair_bluestore_basic() { local pgid=$(get_pg $poolname SOMETHING) local primary=$(get_primary $poolname SOMETHING) local last_scrub_stamp="$(get_last_scrub_stamp $pgid)" - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid + ceph tell $pgid deep_scrub + ceph tell $pgid scrub # Wait for auto repair wait_for_scrub $pgid "$last_scrub_stamp" || return 1 @@ -409,7 +409,7 @@ function TEST_auto_repair_bluestore_scrub() { local pgid=$(get_pg $poolname SOMETHING) local primary=$(get_primary $poolname SOMETHING) local last_scrub_stamp="$(get_last_scrub_stamp $pgid)" - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid + ceph tell $pgid scrub # Wait for scrub -> auto repair wait_for_scrub $pgid "$last_scrub_stamp" || return 1 @@ -470,8 +470,8 @@ function TEST_auto_repair_bluestore_failed() { local pgid=$(get_pg $poolname obj1) local primary=$(get_primary $poolname obj1) local last_scrub_stamp="$(get_last_scrub_stamp $pgid)" - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid + ceph tell $pgid deep_scrub + ceph tell $pgid scrub # Wait for auto repair wait_for_scrub $pgid "$last_scrub_stamp" || return 1 @@ -541,8 +541,8 @@ function TEST_auto_repair_bluestore_failed_norecov() { local pgid=$(get_pg $poolname obj1) local primary=$(get_primary $poolname obj1) local last_scrub_stamp="$(get_last_scrub_stamp $pgid)" - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid - CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid + ceph tell $pgid deep_scrub + ceph tell $pgid scrub # Wait for auto repair wait_for_scrub $pgid "$last_scrub_stamp" || return 1 @@ -5745,8 +5745,7 @@ function TEST_periodic_scrub_replicated() { flush_pg_stats local last_scrub=$(get_last_scrub_stamp $pg) # Fake a schedule scrub - CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \ - trigger_scrub $pg || return 1 + ceph tell $pg scrub || return 1 # Wait for schedule regular scrub wait_for_scrub $pg "$last_scrub" @@ -5763,8 +5762,7 @@ function TEST_periodic_scrub_replicated() { sleep 5 # Fake a schedule scrub - CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \ - trigger_scrub $pg || return 1 + ceph tell $pg scrub || return 1 # Wait for schedule regular scrub # to notice scrub and skip it local found=false @@ -5839,8 +5837,7 @@ function TEST_scrub_warning() { else overdue_seconds=$conf_overdue_seconds fi - CEPH_ARGS='' ceph daemon $(get_asok_path osd.${primary}) \ - trigger_scrub ${i}.0 $(expr ${overdue_seconds} + ${i}00) || return 1 + ceph tell ${i}.0 scrub $(expr ${overdue_seconds} + ${i}00) || return 1 done # Fake schedule deep scrubs for i in $(seq $(expr $scrubs + 1) $(expr $scrubs + $deep_scrubs)) @@ -5851,8 +5848,7 @@ function TEST_scrub_warning() { else overdue_seconds=$conf_overdue_seconds fi - CEPH_ARGS='' ceph daemon $(get_asok_path osd.${primary}) \ - trigger_deep_scrub ${i}.0 $(expr ${overdue_seconds} + ${i}00) || return 1 + ceph tell ${i}.0 deep_scrub $(expr ${overdue_seconds} + ${i}00) || return 1 done flush_pg_stats @@ -6177,8 +6173,7 @@ function TEST_request_scrub_priority() { otherpgs="${otherpgs}${opg} " local other_last_scrub=$(get_last_scrub_stamp $pg) # Fake a schedule scrub - CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \ - trigger_scrub $opg || return 1 + ceph tell $opg scrub $opg || return 1 done sleep 15 diff --git a/qa/standalone/scrub/osd-scrub-test.sh b/qa/standalone/scrub/osd-scrub-test.sh index febffdebd55..d12d225cd6e 100755 --- a/qa/standalone/scrub/osd-scrub-test.sh +++ b/qa/standalone/scrub/osd-scrub-test.sh @@ -217,7 +217,7 @@ function TEST_scrub_extented_sleep() { 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 + ceph tell $pgid scrub || return 1 # Due to the long delay, the scrub should not be done within 3 seconds for ((i=0; i < 3; i++)); do diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6a4825ecec5..0170d100a9a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2370,7 +2370,9 @@ void OSD::asok_command( if (prefix == "pg" || prefix == "query" || prefix == "mark_unfound_lost" || - prefix == "list_unfound" + prefix == "list_unfound" || + prefix == "scrub" || + prefix == "deep_scrub" ) { string pgidstr; pg_t pgid; @@ -3838,20 +3840,6 @@ void OSD::final_init() test_ops_hook, "Delay osd recovery by specified seconds"); ceph_assert(r == 0); - r = admin_socket->register_command( - "trigger_scrub " \ - "name=pgid,type=CephString " \ - "name=time,type=CephInt,req=false", - test_ops_hook, - "Trigger a scheduled scrub "); - ceph_assert(r == 0); - r = admin_socket->register_command( - "trigger_deep_scrub " \ - "name=pgid,type=CephString " \ - "name=time,type=CephInt,req=false", - test_ops_hook, - "Trigger a scheduled deep scrub "); - ceph_assert(r == 0); r = admin_socket->register_command( "injectfull " \ "name=type,type=CephString,req=false " \ @@ -3958,6 +3946,22 @@ void OSD::final_init() asok_hook, ""); ceph_assert(r == 0); + r = admin_socket->register_command( + "pg " \ + "name=pgid,type=CephPgid " \ + "name=cmd,type=CephChoices,strings=scrub " \ + "name=time,type=CephInt,req=false", + asok_hook, + ""); + ceph_assert(r == 0); + r = admin_socket->register_command( + "pg " \ + "name=pgid,type=CephPgid " \ + "name=cmd,type=CephChoices,strings=deep_scrub " \ + "name=time,type=CephInt,req=false", + asok_hook, + ""); + ceph_assert(r == 0); // new form: tell for both cli and rest r = admin_socket->register_command( "query", @@ -3978,6 +3982,20 @@ void OSD::final_init() asok_hook, "list unfound objects on this pg, perhaps starting at an offset given in JSON"); ceph_assert(r == 0); + r = admin_socket->register_command( + "scrub " \ + "name=pgid,type=CephPgid,req=false " \ + "name=time,type=CephInt,req=false", + asok_hook, + "Trigger a scheduled scrub "); + ceph_assert(r == 0); + r = admin_socket->register_command( + "deep_scrub " \ + "name=pgid,type=CephPgid,req=false " \ + "name=time,type=CephInt,req=false", + asok_hook, + "Trigger a scheduled deep scrub "); + ceph_assert(r == 0); } void OSD::create_logger() @@ -6020,60 +6038,6 @@ void TestOpsSocketHook::test_ops(OSDService *service, ObjectStore *store, << "to " << service->cct->_conf->osd_recovery_delay_start; return; } - if (command == "trigger_scrub" || command == "trigger_deep_scrub") { - spg_t pgid; - bool deep = (command == "trigger_deep_scrub"); - OSDMapRef curmap = service->get_osdmap(); - - string pgidstr; - - cmd_getval(service->cct, cmdmap, "pgid", pgidstr); - if (!pgid.parse(pgidstr.c_str())) { - ss << "Invalid pgid specified"; - return; - } - - int64_t time; - cmd_getval(service->cct, cmdmap, "time", time, (int64_t)0); - - PGRef pg = service->osd->_lookup_lock_pg(pgid); - if (pg == nullptr) { - ss << "Can't find pg " << pgid; - return; - } - - if (pg->is_primary()) { - const pg_pool_t *p = curmap->get_pg_pool(pgid.pool()); - double pool_scrub_max_interval = 0; - double scrub_max_interval; - if (deep) { - p->opts.get(pool_opts_t::DEEP_SCRUB_INTERVAL, &pool_scrub_max_interval); - scrub_max_interval = pool_scrub_max_interval > 0 ? - pool_scrub_max_interval : g_conf()->osd_deep_scrub_interval; - } else { - p->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &pool_scrub_max_interval); - scrub_max_interval = pool_scrub_max_interval > 0 ? - pool_scrub_max_interval : g_conf()->osd_scrub_max_interval; - } - // Instead of marking must_scrub force a schedule scrub - utime_t stamp = ceph_clock_now(); - if (time == 0) - stamp -= scrub_max_interval; - else - stamp -= (float)time; - stamp -= 100.0; // push back last scrub more for good measure - if (deep) { - pg->set_last_deep_scrub_stamp(stamp); - } else { - pg->set_last_scrub_stamp(stamp); - } - ss << "ok - set" << (deep ? " deep" : "" ) << " stamp " << stamp; - } else { - ss << "Not primary"; - } - pg->unlock(); - return; - } if (command == "injectfull") { int64_t count; string type; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 3fffb8d2275..f33b620cdec 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1075,6 +1075,48 @@ void PrimaryLogPG::do_command( f->close_section(); } + else if (prefix == "scrub" || + prefix == "deep_scrub") { + bool deep = (prefix == "deep_scrub"); + int64_t time; + cmd_getval(cct, cmdmap, "time", time, (int64_t)0); + + if (is_primary()) { + const pg_pool_t *p = &pool.info; + double pool_scrub_max_interval = 0; + double scrub_max_interval; + if (deep) { + p->opts.get(pool_opts_t::DEEP_SCRUB_INTERVAL, &pool_scrub_max_interval); + scrub_max_interval = pool_scrub_max_interval > 0 ? + pool_scrub_max_interval : g_conf()->osd_deep_scrub_interval; + } else { + p->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &pool_scrub_max_interval); + scrub_max_interval = pool_scrub_max_interval > 0 ? + pool_scrub_max_interval : g_conf()->osd_scrub_max_interval; + } + // Instead of marking must_scrub force a schedule scrub + utime_t stamp = ceph_clock_now(); + if (time == 0) + stamp -= scrub_max_interval; + else + stamp -= (float)time; + stamp -= 100.0; // push back last scrub more for good measure + if (deep) { + set_last_deep_scrub_stamp(stamp); + } else { + set_last_scrub_stamp(stamp); + } + f->open_object_section("result"); + f->dump_bool("deep", deep); + f->dump_stream("stamp") << stamp; + f->close_section(); + } else { + ss << "Not primary"; + ret = -EPERM; + } + outbl.append(ss.str()); + } + else { ret = -ENOSYS; ss << "prefix '" << prefix << "' not implemented"; -- 2.39.5