From d1885d84ddfebcdaed63bfa7b7bc5771898a8765 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Fri, 1 Apr 2022 18:42:08 +0200 Subject: [PATCH] crimson/osd: add types PG and OSD-hosted OSDMapGate instances. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit `ClientRequest` is going to hold all tracking events as a `std::tuple` instance and access them through the type-related variant of `std::get`. As two instances of `OSDMapGate` are used there, a need to differentiate at the type level arises. Signed-off-by: Radosław Zarzyński --- src/crimson/osd/osd.h | 2 +- src/crimson/osd/osdmap_gate.cc | 46 ++++++++++++++++++++++++++++++---- src/crimson/osd/osdmap_gate.h | 19 ++++++++++++-- src/crimson/osd/pg.h | 2 +- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index 7970d8c9fe38a..aeea180e0339e 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -210,7 +210,7 @@ private: seastar::future<> start_asok_admin(); public: - OSDMapGate osdmap_gate; + OSD_OSDMapGate osdmap_gate; ShardServices &get_shard_services() { return shard_services; diff --git a/src/crimson/osd/osdmap_gate.cc b/src/crimson/osd/osdmap_gate.cc index 4add9388d81ac..316596ab185df 100644 --- a/src/crimson/osd/osdmap_gate.cc +++ b/src/crimson/osd/osdmap_gate.cc @@ -14,14 +14,16 @@ namespace { namespace crimson::osd { -void OSDMapGate::OSDMapBlocker::dump_detail(Formatter *f) const +template +void OSDMapGate::OSDMapBlocker::dump_detail(Formatter *f) const { f->open_object_section("OSDMapGate"); f->dump_int("epoch", epoch); f->close_section(); } -blocking_future OSDMapGate::wait_for_map(epoch_t epoch) +template +blocking_future OSDMapGate::wait_for_map(epoch_t epoch) { if (__builtin_expect(stopping, false)) { return make_exception_blocking_future( @@ -46,7 +48,37 @@ blocking_future OSDMapGate::wait_for_map(epoch_t epoch) } } -void OSDMapGate::got_map(epoch_t epoch) { +template +seastar::future OSDMapGate::wait_for_map( + typename OSDMapBlocker::BlockingEvent::TriggerI&& trigger, + epoch_t epoch) +{ + if (__builtin_expect(stopping, false)) { + return seastar::make_exception_future( + crimson::common::system_shutdown_exception()); + } + if (current >= epoch) { + return seastar::make_ready_future(current); + } else { + logger().info("evt epoch is {}, i have {}, will wait", epoch, current); + auto &blocker = waiting_peering.emplace( + epoch, std::make_pair(blocker_type, epoch)).first->second; + auto fut = blocker.promise.get_shared_future(); + if (shard_services) { + return trigger.maybe_record_blocking( + (*shard_services).get().osdmap_subscribe(current, true).then( + [fut=std::move(fut)]() mutable { + return std::move(fut); + }), + blocker); + } else { + return trigger.maybe_record_blocking(std::move(fut), blocker); + } + } +} + +template +void OSDMapGate::got_map(epoch_t epoch) { current = epoch; auto first = waiting_peering.begin(); auto last = waiting_peering.upper_bound(epoch); @@ -56,7 +88,8 @@ void OSDMapGate::got_map(epoch_t epoch) { waiting_peering.erase(first, last); } -seastar::future<> OSDMapGate::stop() { +template +seastar::future<> OSDMapGate::stop() { logger().info("osdmap::stop"); stopping = true; auto first = waiting_peering.begin(); @@ -68,4 +101,7 @@ seastar::future<> OSDMapGate::stop() { return seastar::now(); } -} +template class OSDMapGate; +template class OSDMapGate; + +} // namespace crimson::osd diff --git a/src/crimson/osd/osdmap_gate.h b/src/crimson/osd/osdmap_gate.h index 367a7f80dcf57..de02d296eede3 100644 --- a/src/crimson/osd/osdmap_gate.h +++ b/src/crimson/osd/osdmap_gate.h @@ -21,8 +21,15 @@ namespace crimson::osd { class ShardServices; +enum class OSDMapGateType { + OSD, + PG, +}; + +template class OSDMapGate { - struct OSDMapBlocker : public BlockerT { +public: + struct OSDMapBlocker : BlockerT { const char * type_name; epoch_t epoch; @@ -39,6 +46,7 @@ class OSDMapGate { void dump_detail(Formatter *f) const final; }; +private: // order the promises in ascending order of the waited osdmap epoch, // so we can access all the waiters expecting a map whose epoch is less // than or equal to a given epoch @@ -56,9 +64,16 @@ public: : blocker_type(blocker_type), shard_services(shard_services) {} // wait for an osdmap whose epoch is greater or equal to given epoch - blocking_future wait_for_map(epoch_t epoch); + blocking_future + wait_for_map(epoch_t epoch); + seastar::future + wait_for_map(typename OSDMapBlocker::BlockingEvent::TriggerI&& trigger, + epoch_t epoch); void got_map(epoch_t epoch); seastar::future<> stop(); }; +using OSD_OSDMapGate = OSDMapGate; +using PG_OSDMapGate = OSDMapGate; + } diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index f8284771e76af..af3598fc1ba08 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -613,7 +613,7 @@ private: eversion_t& v); private: - OSDMapGate osdmap_gate; + PG_OSDMapGate osdmap_gate; ShardServices &shard_services; cached_map_t osdmap; -- 2.39.5