From: Sage Weil Date: Thu, 22 Aug 2019 18:51:47 +0000 (-0500) Subject: osd/PeeringState: give require_osd_release to BufferedRecoveryMessages X-Git-Tag: v15.1.0~1584^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=77ecc32788203ab0b2a52d580dd6ff15fc01dd90;p=ceph.git osd/PeeringState: give require_osd_release to BufferedRecoveryMessages They need to know what type of message(s) to queue. Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 25508ddda494..0f773b26b547 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9257,7 +9257,7 @@ void OSD::handle_pg_create(OpRequestRef op) PeeringCtx OSD::create_context() { - return PeeringCtx(); + return PeeringCtx(get_osdmap()->require_osd_release); } void OSD::dispatch_context(PeeringCtx &ctx, PG *pg, OSDMapRef curmap, diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 42cb55411bf0..4e9f58179124 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1159,7 +1159,7 @@ void PG::read_state(ObjectStore *store) // init pool options store->set_collection_opts(ch, pool.info.opts); - PeeringCtx rctx; + PeeringCtx rctx(ceph_release_t::unknown); handle_initialize(rctx); // note: we don't activate here because we know the OSD will advance maps // during boot. diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 3726541e9d42..68cfe2e8342a 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -19,10 +19,12 @@ #define dout_context cct #define dout_subsys ceph_subsys_osd -BufferedRecoveryMessages::BufferedRecoveryMessages(PeeringCtx &ctx) - : message_map(std::move(ctx.message_map)) -{ - ctx.message_map.clear(); +BufferedRecoveryMessages::BufferedRecoveryMessages( + ceph_release_t r, + PeeringCtx &ctx) + : require_osd_release(r) { + // steal messages from ctx + message_map.swap(ctx.message_map); } void BufferedRecoveryMessages::send_notify(int to, const pg_notify_t &n) @@ -134,7 +136,8 @@ void PeeringState::begin_block_outgoing() { ceph_assert(!messages_pending_flush); ceph_assert(orig_ctx); ceph_assert(rctx); - messages_pending_flush = BufferedRecoveryMessages(); + messages_pending_flush = BufferedRecoveryMessages( + orig_ctx->require_osd_release); rctx.emplace(*messages_pending_flush, *orig_ctx); } diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 4a6f69a5e7da..cbd6f500b91c 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -51,10 +51,13 @@ class PeeringCtx; // [primary only] content recovery state struct BufferedRecoveryMessages { + ceph_release_t require_osd_release; map> message_map; - BufferedRecoveryMessages() = default; - BufferedRecoveryMessages(PeeringCtx &); + BufferedRecoveryMessages(ceph_release_t r) + : require_osd_release(r) { + } + BufferedRecoveryMessages(ceph_release_t r, PeeringCtx &ctx); void accept_buffered_messages(BufferedRecoveryMessages &m) { for (auto &[target, ls] : m.message_map) { @@ -174,7 +177,8 @@ struct PeeringCtx : BufferedRecoveryMessages { ObjectStore::Transaction transaction; HBHandle* handle = nullptr; - PeeringCtx() = default; + PeeringCtx(ceph_release_t r) + : BufferedRecoveryMessages(r) {} PeeringCtx(const PeeringCtx &) = delete; PeeringCtx &operator=(const PeeringCtx &) = delete;