]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PeeringState: give require_osd_release to BufferedRecoveryMessages
authorSage Weil <sage@redhat.com>
Thu, 22 Aug 2019 18:51:47 +0000 (13:51 -0500)
committerSage Weil <sage@redhat.com>
Mon, 9 Sep 2019 16:22:12 +0000 (11:22 -0500)
They need to know what type of message(s) to queue.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PeeringState.cc
src/osd/PeeringState.h

index 25508ddda4941422e441439bd3310cf50a81c8a7..0f773b26b54741920681145ed2678ed640d0760d 100644 (file)
@@ -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,
index 42cb55411bf0cbb672a274921c5ff8a7f1456654..4e9f58179124755755bf52441ef1ebeaf5142db8 100644 (file)
@@ -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.
index 3726541e9d429d4183699ffb027440d726334c1b..68cfe2e8342ae8fbda080ddd47657879cee12920 100644 (file)
 #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);
 }
 
index 4a6f69a5e7dac5998c6e8f7f5e6b01ace549c4dc..cbd6f500b91c9551a07dca6965a5b47ce3d49689 100644 (file)
@@ -51,10 +51,13 @@ class PeeringCtx;
 
 // [primary only] content recovery state
 struct BufferedRecoveryMessages {
+  ceph_release_t require_osd_release;
   map<int, vector<MessageRef>> 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;