]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: set min_epoch for push/pull/reply
authorSage Weil <sage@redhat.com>
Tue, 28 Feb 2017 02:41:48 +0000 (20:41 -0600)
committerSage Weil <sage@redhat.com>
Tue, 2 May 2017 02:01:28 +0000 (21:01 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDPGPull.h
src/messages/MOSDPGPush.h
src/messages/MOSDPGPushReply.h
src/osd/ECBackend.cc
src/osd/ReplicatedBackend.cc

index 442836e3da2063f01012d55d9c2afb63cf818cfd..281b26f20db4d063f4901555a5337afe470ecd8f 100644 (file)
@@ -18,7 +18,7 @@
 #include "MOSDFastDispatchOp.h"
 
 class MOSDPGPull : public MOSDFastDispatchOp {
-  static const int HEAD_VERSION = 2;
+  static const int HEAD_VERSION = 3;
   static const int COMPAT_VERSION = 2;
 
   vector<PullOp> pulls;
@@ -26,12 +26,15 @@ class MOSDPGPull : public MOSDFastDispatchOp {
 public:
   pg_shard_t from;
   spg_t pgid;
-  epoch_t map_epoch;
+  epoch_t map_epoch, min_epoch;
   uint64_t cost;
 
   epoch_t get_map_epoch() const override {
     return map_epoch;
   }
+  epoch_t get_min_epoch() const override {
+    return min_epoch;
+  }
   spg_t get_spg() const override {
     return pgid;
   }
@@ -69,6 +72,11 @@ public:
     ::decode(cost, p);
     ::decode(pgid.shard, p);
     ::decode(from, p);
+    if (header.version >= 3) {
+      ::decode(min_epoch, p);
+    } else {
+      min_epoch = map_epoch;
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -78,13 +86,14 @@ public:
     ::encode(cost, payload);
     ::encode(pgid.shard, payload);
     ::encode(from, payload);
+    ::encode(min_epoch, payload);
   }
 
   const char *get_type_name() const override { return "MOSDPGPull"; }
 
   void print(ostream& out) const override {
     out << "MOSDPGPull(" << pgid
-       << " e" << map_epoch
+       << " e" << map_epoch << "/" << min_epoch
        << " cost " << cost
        << ")";
   }
index 50abe8475c2a1cf9539f9ed35027524af5156ea4..4f45048412cff464ac1da25df78fd44994e8a23d 100644 (file)
 #include "MOSDFastDispatchOp.h"
 
 class MOSDPGPush : public MOSDFastDispatchOp {
-  static const int HEAD_VERSION = 2;
+  static const int HEAD_VERSION = 3;
   static const int COMPAT_VERSION = 2;
 
 public:
   pg_shard_t from;
   spg_t pgid;
-  epoch_t map_epoch;
+  epoch_t map_epoch, min_epoch;
   vector<PushOp> pushes;
 
 private:
@@ -47,6 +47,9 @@ public:
   epoch_t get_map_epoch() const override {
     return map_epoch;
   }
+  epoch_t get_min_epoch() const override {
+    return min_epoch;
+  }
   spg_t get_spg() const override {
     return pgid;
   }
@@ -68,6 +71,11 @@ public:
     ::decode(cost, p);
     ::decode(pgid.shard, p);
     ::decode(from, p);
+    if (header.version >= 3) {
+      ::decode(min_epoch, p);
+    } else {
+      min_epoch = map_epoch;
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -77,13 +85,14 @@ public:
     ::encode(cost, payload);
     ::encode(pgid.shard, payload);
     ::encode(from, payload);
+    ::encode(min_epoch, payload);
   }
 
   const char *get_type_name() const override { return "MOSDPGPush"; }
 
   void print(ostream& out) const override {
     out << "MOSDPGPush(" << pgid
-       << " " << map_epoch
+       << " " << map_epoch << "/" << min_epoch
        << " " << pushes;
     out << ")";
   }
index 3ac5467a2fef27882ed5e8d34c404305d7be4c48..c60007c818721e533a78825f0793ae9973e68438 100644 (file)
 #include "MOSDFastDispatchOp.h"
 
 class MOSDPGPushReply : public MOSDFastDispatchOp {
-  static const int HEAD_VERSION = 2;
+  static const int HEAD_VERSION = 3;
   static const int COMPAT_VERSION = 2;
 
 public:
   pg_shard_t from;
   spg_t pgid;
-  epoch_t map_epoch;
+  epoch_t map_epoch, min_epoch;
   vector<PushReplyOp> replies;
   uint64_t cost;
 
   epoch_t get_map_epoch() const override {
     return map_epoch;
   }
+  epoch_t get_min_epoch() const override {
+    return min_epoch;
+  }
   spg_t get_spg() const override {
     return pgid;
   }
@@ -61,6 +64,11 @@ public:
     ::decode(cost, p);
     ::decode(pgid.shard, p);
     ::decode(from, p);
+    if (header.version >= 3) {
+      ::decode(min_epoch, p);
+    } else {
+      min_epoch = map_epoch;
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -70,11 +78,12 @@ public:
     ::encode(cost, payload);
     ::encode(pgid.shard, payload);
     ::encode(from, payload);
+    ::encode(min_epoch, payload);
   }
 
   void print(ostream& out) const override {
     out << "MOSDPGPushReply(" << pgid
-       << " " << map_epoch
+       << " " << map_epoch << "/" << min_epoch
        << " " << replies;
     out << ")";
   }
index 14f7a0bda8e7b5992e50a4d6a17c9dbf9dc1f73b..84e0838f8636c4465cb51be1261e859897c59627 100644 (file)
@@ -480,6 +480,7 @@ void ECBackend::dispatch_recovery_messages(RecoveryMessages &m, int priority)
     MOSDPGPush *msg = new MOSDPGPush();
     msg->set_priority(priority);
     msg->map_epoch = get_parent()->get_epoch();
+    msg->min_epoch = get_parent()->get_last_peering_reset_epoch();
     msg->from = get_parent()->whoami_shard();
     msg->pgid = spg_t(get_parent()->get_info().pgid.pgid, i->first.shard);
     msg->pushes.swap(i->second);
@@ -496,6 +497,7 @@ void ECBackend::dispatch_recovery_messages(RecoveryMessages &m, int priority)
     MOSDPGPushReply *msg = new MOSDPGPushReply();
     msg->set_priority(priority);
     msg->map_epoch = get_parent()->get_epoch();
+    msg->min_epoch = get_parent()->get_last_peering_reset_epoch();
     msg->from = get_parent()->whoami_shard();
     msg->pgid = spg_t(get_parent()->get_info().pgid.pgid, i->first.shard);
     msg->replies.swap(i->second);
index 9363115ef44a35dbf139dafe16a9a9b503de6688..9be7a255c00bdfc2980fccf4b0450ae15058c28a 100644 (file)
@@ -824,6 +824,7 @@ void ReplicatedBackend::_do_push(OpRequestRef op)
   reply->set_priority(m->get_priority());
   reply->pgid = get_info().pgid;
   reply->map_epoch = m->map_epoch;
+  reply->min_epoch = m->min_epoch;
   reply->replies.swap(replies);
   reply->compute_cost(cct);
 
@@ -902,6 +903,7 @@ void ReplicatedBackend::_do_pull_response(OpRequestRef op)
     reply->set_priority(m->get_priority());
     reply->pgid = get_info().pgid;
     reply->map_epoch = m->map_epoch;
+    reply->min_epoch = m->min_epoch;
     reply->set_pulls(&replies);
     reply->compute_cost(cct);
 
@@ -1847,6 +1849,7 @@ void ReplicatedBackend::send_pushes(int prio, map<pg_shard_t, vector<PushOp> > &
       msg->from = get_parent()->whoami_shard();
       msg->pgid = get_parent()->primary_spg_t();
       msg->map_epoch = get_osdmap()->get_epoch();
+      msg->min_epoch = get_parent()->get_last_peering_reset_epoch();
       msg->set_priority(prio);
       for (;
            (j != i->second.end() &&
@@ -1882,6 +1885,7 @@ void ReplicatedBackend::send_pulls(int prio, map<pg_shard_t, vector<PullOp> > &p
     msg->set_priority(prio);
     msg->pgid = get_parent()->primary_spg_t();
     msg->map_epoch = get_osdmap()->get_epoch();
+    msg->min_epoch = get_parent()->get_last_peering_reset_epoch();
     msg->set_pulls(&i->second);
     msg->compute_cost(cct);
     get_parent()->send_message_osd_cluster(msg, con);