]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: send last_epoch_clean when indicating PG is ready to merge
authorSage Weil <sage@redhat.com>
Wed, 12 Sep 2018 20:00:09 +0000 (15:00 -0500)
committerSage Weil <sage@redhat.com>
Thu, 20 Sep 2018 13:35:15 +0000 (08:35 -0500)
The mon can put this in the pg_pool_t.

Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDPGReadyToMerge.h
src/mon/OSDMonitor.cc
src/osd/OSD.cc
src/osd/OSD.h
src/osd/PG.cc
src/osd/osd_types.h

index f0cb8f1daa764e75b9a7837325fca0a2f8643c7b..b286686b761b7bf40f5d5febb3e1079f2a3d02ae 100644 (file)
@@ -7,28 +7,32 @@ class MOSDPGReadyToMerge
   : public MessageInstance<MOSDPGReadyToMerge, PaxosServiceMessage> {
 public:
   pg_t pgid;
+  epoch_t last_epoch_clean = 0;
 
   MOSDPGReadyToMerge()
     : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, 0)
   {}
-  MOSDPGReadyToMerge(pg_t p, epoch_t e)
-    : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, e),
-      pgid(p)
+  MOSDPGReadyToMerge(pg_t p, epoch_t lec, epoch_t v)
+    : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, v),
+      pgid(p),
+      last_epoch_clean(lec)
   {}
   void encode_payload(uint64_t features) override {
     using ceph::encode;
     paxos_encode();
     encode(pgid, payload);
+    encode(last_epoch_clean, payload);
   }
   void decode_payload() override {
     bufferlist::const_iterator p = payload.begin();
     paxos_decode(p);
     decode(pgid, p);
+    decode(last_epoch_clean, p);
   }
   const char *get_type_name() const override { return "osd_pg_ready_to_merge"; }
   void print(ostream &out) const {
     out << get_type_name()
-        << "(" << pgid
+        << "(" << pgid << " lec " << last_epoch_clean
         << " v" << version << ")";
   }
 };
index 1159365d3692a43f30df0e508d582927c69cf467..ac2eb6ee6870b7ae7ba1d2c6eadcdab37d743385 100644 (file)
@@ -3295,7 +3295,7 @@ bool OSDMonitor::prepare_pg_ready_to_merge(MonOpRequestRef op)
     return true;
   }
 
-  p.dec_pg_num();
+  p.dec_pg_num(m->last_epoch_clean);
   p.last_change = pending_inc.epoch;
 
   // force pre-nautilus clients to resend their ops, since they
index 57f6d9fa06312fc70a91308e096e951d701bd0a3..b7c6ecac52c104769d7aeb7f918255d73e612bd3 100644 (file)
@@ -1702,11 +1702,11 @@ void OSDService::set_ready_to_merge_source(PG *pg)
   _send_ready_to_merge();
 }
 
-void OSDService::set_ready_to_merge_target(PG *pg)
+void OSDService::set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean)
 {
   Mutex::Locker l(merge_lock);
   dout(10) << __func__ << " " << pg->pg_id << dendl;
-  ready_to_merge_target.insert(pg->pg_id.pgid);
+  ready_to_merge_target.insert(make_pair(pg->pg_id.pgid, last_epoch_clean));
   _send_ready_to_merge();
 }
 
@@ -1719,9 +1719,13 @@ void OSDService::send_ready_to_merge()
 void OSDService::_send_ready_to_merge()
 {
   for (auto src : ready_to_merge_source) {
-    if (ready_to_merge_target.count(src.get_parent()) &&
+    auto p = ready_to_merge_target.find(src.get_parent());
+    if (p != ready_to_merge_target.end() &&
        sent_ready_to_merge_source.count(src) == 0) {
-      monc->send_mon_message(new MOSDPGReadyToMerge(src, osdmap->get_epoch()));
+      monc->send_mon_message(new MOSDPGReadyToMerge(
+                              src,
+                              p->second,  // PG's last_epoch_clean
+                              osdmap->get_epoch()));
       sent_ready_to_merge_source.insert(src);
     }
   }
index cace749e139b4a0186ea1c7768556c6e510cf40b..96b060d3f6e568e15c18ded50279dd1da30efd70 100644 (file)
@@ -717,11 +717,11 @@ public:
   // -- pg merge --
   Mutex merge_lock = {"OSD::merge_lock"};
   set<pg_t> ready_to_merge_source;
-  set<pg_t> ready_to_merge_target;
+  map<pg_t,epoch_t> ready_to_merge_target;  // pg -> last_epoch_clean
   set<pg_t> sent_ready_to_merge_source;
 
   void set_ready_to_merge_source(PG *pg);
-  void set_ready_to_merge_target(PG *pg);
+  void set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean);
   void clear_ready_to_merge(PG *pg);
   void send_ready_to_merge();
   void _send_ready_to_merge();
index 35c33db309cf4aac2e2a0e5f5019dc068e4190a4..5dc8d1dc45c9727c543e7effe917f282d5478780 100644 (file)
@@ -7992,7 +7992,8 @@ PG::RecoveryState::Clean::Clean(my_context ctx)
     if (pg->pool.info.is_pending_merge(pg->info.pgid.pgid, &target)) {
       if (target) {
        ldout(pg->cct, 10) << "ready to merge (target)" << dendl;
-       pg->osd->set_ready_to_merge_target(pg);
+       pg->osd->set_ready_to_merge_target(pg,
+                                          pg->info.history.last_epoch_clean);
       } else {
        ldout(pg->cct, 10) << "ready to merge (source)" << dendl;
        pg->osd->set_ready_to_merge_source(pg);
index ea6ebb343b2c1531949dcf32eeed62cbfeb20471..f20c45e1049d67a6634f3a2190fb72c055b77435 100644 (file)
@@ -1638,8 +1638,9 @@ public:
   void set_pgp_num_target(int p) {
     pgp_num_target = p;
   }
-  void dec_pg_num() {
+  void dec_pg_num(epoch_t last_epoch_clean) {
     --pg_num;
+    pg_num_dec_last_epoch_clean = last_epoch_clean;
     calc_pg_masks();
   }