From: Ronen Friedman Date: Sun, 14 Nov 2021 08:34:33 +0000 (+0000) Subject: osd/scrub: expose a "scrub sessions" counter for test use X-Git-Tag: v17.1.0~269^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0d35a924a95cee2c690849a2098ab64372cde1dc;p=ceph.git osd/scrub: expose a "scrub sessions" counter for test use Add an opaque but ever-increasing counter that is incremented whenever a scrub starts and whenever it completes. Expose the counter via 'pq query'. Signed-off-by: Ronen Friedman --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 83d1df59754..8af78111789 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4147,7 +4147,7 @@ void OSD::final_init() r = admin_socket->register_command( "scrubdebug " \ "name=pgid,type=CephPgid " \ - "name=cmd,type=CephChoices,strings=block|unblock " \ + "name=cmd,type=CephChoices,strings=block|unblock|set|unset " \ "name=value,type=CephString,req=false", asok_hook, "debug the scrubber"); diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 3023b6376f1..b4b8f00ba8b 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1189,7 +1189,8 @@ void PrimaryLogPG::do_command( outbl.append(ss.str()); } - else if (prefix == "block" || prefix == "unblock") { + else if (prefix == "block" || prefix == "unblock" || prefix == "set" || + prefix == "unset") { string value; cmd_getval(cmdmap, "value", value); diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index fb58633a679..fd3dc97fdea 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -968,12 +968,14 @@ void PgScrubber::on_init() m_start = m_pg->info.pgid.pgid.get_hobj_start(); m_active = true; + ++m_sessions_counter; m_pg->publish_stats_to_osd(); } void PgScrubber::on_replica_init() { m_active = true; + ++m_sessions_counter; } void PgScrubber::_scan_snaps(ScrubMap& smap) @@ -1975,6 +1977,11 @@ void PgScrubber::dump_scrubber(ceph::Formatter* f, f->dump_string("schedule", sched_state); } + if (m_publish_sessions) { + f->dump_int("test_sequence", + m_sessions_counter); // an ever-increasing number used by tests + } + f->close_section(); } @@ -2241,6 +2248,7 @@ void PgScrubber::reset_internal_state() m_active = false; clear_queued_or_active(); + ++m_sessions_counter; } // note that only applicable to the Replica: @@ -2302,11 +2310,30 @@ int PgScrubber::asok_debug(std::string_view cmd, if (cmd == "block") { // set a flag that will cause the next 'select_range' to report a blocked object m_debug_blockrange = 1; + } else if (cmd == "unblock") { // send an 'unblock' event, as if a blocked range was freed m_debug_blockrange = 0; m_fsm->process_event(Unblocked{}); + + } else if ((cmd == "set") || (cmd == "unset")) { + + if (param == "sessions") { + // set/reset the inclusion of the scrub sessions counter in 'query' output + m_publish_sessions = (cmd == "set"); + + } else if (param == "block") { + if (cmd == "set") { + // set a flag that will cause the next 'select_range' to report a blocked object + m_debug_blockrange = 1; + } else { + // send an 'unblock' event, as if a blocked range was freed + m_debug_blockrange = 0; + m_fsm->process_event(Unblocked{}); + } + } } + return 0; } // ///////////////////// preemption_data_t ////////////////////////////////// diff --git a/src/osd/scrubber/pg_scrubber.h b/src/osd/scrubber/pg_scrubber.h index 1835310298f..f32fb23191c 100644 --- a/src/osd/scrubber/pg_scrubber.h +++ b/src/osd/scrubber/pg_scrubber.h @@ -86,7 +86,7 @@ class LocalReservation { bool m_holding_local_reservation{false}; public: - LocalReservation(OSDService* osds); + explicit LocalReservation(OSDService* osds); ~LocalReservation(); bool is_reserved() const { return m_holding_local_reservation; } }; @@ -613,6 +613,17 @@ class PgScrubber : public ScrubPgIF, public ScrubMachineListener { */ Scrub::act_token_t m_current_token{1}; + /** + * (primary/replica) a test aid. A counter that is incremented whenever a scrub starts, + * and again when it terminates. Exposed as part of the 'pg query' command, to be used + * by test scripts. + * + * @ATTN: not guaranteed to be accurate. To be only used for tests. This is why it + * is initialized to a meaningless number; + */ + int32_t m_sessions_counter{(int32_t)((int64_t)(this) & 0x0000'0000'00ff'fff0)}; + bool m_publish_sessions{false}; //< will the counter be part of 'query' output? + scrub_flags_t m_flags; bool m_active{false};