From 707c0eb4a12672caa8e9f6111939f70c6478d267 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 16 Sep 2019 18:48:23 +0800 Subject: [PATCH] crimson/osd: reply if pg is absent when handling MQuery in previous commit, the support of `MOSDPGQuery` was dropped. but if we want to handle `MOSDPGQuery2` properly, we should take `on_pg_absent()` into consideration when handling `MOSDPGQuery2`. in this change, we handle `MOSDPGQuery2` by checking the boost event against `MQuery`, so we don't need to create a new class derived from `RemotePeeringEvent` for specializing the behavior. Signed-off-by: Kefu Chai --- .../osd/osd_operations/peering_event.cc | 39 ++++++++++++++++++- .../osd/osd_operations/peering_event.h | 2 + 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/osd_operations/peering_event.cc b/src/crimson/osd/osd_operations/peering_event.cc index 79584fe4e2397..67a3c38a96364 100644 --- a/src/crimson/osd/osd_operations/peering_event.cc +++ b/src/crimson/osd/osd_operations/peering_event.cc @@ -3,9 +3,11 @@ #include +#include "messages/MOSDPGLog.h" + +#include "common/Formatter.h" #include "crimson/osd/pg.h" #include "crimson/osd/osd.h" -#include "common/Formatter.h" #include "crimson/osd/osd_operations/peering_event.h" #include "crimson/osd/osd_connection_priv.h" @@ -94,7 +96,40 @@ RemotePeeringEvent::ConnectionPipeline &RemotePeeringEvent::cp() return get_osd_priv(conn.get()).peering_request_conn_pipeline; } -seastar::future> RemotePeeringEvent::get_pg() { +void RemotePeeringEvent::on_pg_absent() +{ + if (auto& e = get_event().get_event(); + e.dynamic_type() == MQuery::static_type()) { + const auto map_epoch = + shard_services.get_osdmap_service().get_map()->get_epoch(); + const auto& q = static_cast(e); + const pg_info_t empty{spg_t{pgid.pgid, q.query.to}}; + if (q.query.type == q.query.LOG || + q.query.type == q.query.FULLLOG) { + auto m = new MOSDPGLog{q.query.from, q.query.to, + map_epoch, empty, + q.query.epoch_sent}; + ctx.send_osd_message(q.from.osd, m); + } else { + ctx.send_notify(q.from.osd, {q.query.from, q.query.to, + q.query.epoch_sent, + map_epoch, empty, + PastIntervals{}}); + } + } +} + +seastar::future<> RemotePeeringEvent::complete_rctx(Ref pg) +{ + if (pg) { + return PeeringEvent::complete_rctx(pg); + } else { + return shard_services.dispatch_context_messages(std::move(ctx)); + } +} + +seastar::future> RemotePeeringEvent::get_pg() +{ return with_blocking_future( handle.enter(cp().await_map) ).then([this] { diff --git a/src/crimson/osd/osd_operations/peering_event.h b/src/crimson/osd/osd_operations/peering_event.h index 7f32953a9e928..1beb5f2612b96 100644 --- a/src/crimson/osd/osd_operations/peering_event.h +++ b/src/crimson/osd/osd_operations/peering_event.h @@ -81,6 +81,8 @@ protected: OSD &osd; ceph::net::ConnectionRef conn; + void on_pg_absent() final; + seastar::future<> complete_rctx(Ref pg) override; seastar::future> get_pg() final; public: -- 2.39.5