]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/messages/MOSDForceRecovery.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / messages / MOSDForceRecovery.h
index d06af07460d66e7685dd20e3f181a5c718cf493f..9ee824a16e3b55d4f563e642f950d60a1ce9c91b 100644 (file)
@@ -31,27 +31,29 @@ static const int OFR_BACKFILL = 2;
 // cancel priority boost, requeue if necessary
 static const int OFR_CANCEL = 4;
 
-struct MOSDForceRecovery : public Message {
+class MOSDForceRecovery : public MessageInstance<MOSDForceRecovery> {
+public:
+  friend factory;
 
-  static const int HEAD_VERSION = 1;
-  static const int COMPAT_VERSION = 1;
+  static constexpr int HEAD_VERSION = 2;
+  static constexpr int COMPAT_VERSION = 2;
 
   uuid_d fsid;
-  vector<pg_t> forced_pgs;
-  uint8_t options;
+  vector<spg_t> forced_pgs;
+  uint8_t options = 0;
 
-  MOSDForceRecovery() : Message(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION) {}
+  MOSDForceRecovery() : MessageInstance(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION) {}
   MOSDForceRecovery(const uuid_d& f, char opts) :
-    Message(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION),
+    MessageInstance(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION),
     fsid(f), options(opts) {}
-  MOSDForceRecovery(const uuid_d& f, vector<pg_t>& pgs, char opts) :
-    Message(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION),
+  MOSDForceRecovery(const uuid_d& f, vector<spg_t>& pgs, char opts) :
+    MessageInstance(MSG_OSD_FORCE_RECOVERY, HEAD_VERSION, COMPAT_VERSION),
     fsid(f), forced_pgs(pgs), options(opts) {}
 private:
   ~MOSDForceRecovery() {}
 
 public:
-  const char *get_type_name() const { return "force_recovery"; }
+  std::string_view get_type_name() const { return "force_recovery"; }
   void print(ostream& out) const {
     out << "force_recovery(";
     if (forced_pgs.empty())
@@ -68,15 +70,42 @@ public:
   }
 
   void encode_payload(uint64_t features) {
-    ::encode(fsid, payload);
-    ::encode(forced_pgs, payload);
-    ::encode(options, payload);
+    using ceph::encode;
+    if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
+      header.version = 1;
+      header.compat_version = 1;
+      vector<pg_t> pgs;
+      for (auto pgid : forced_pgs) {
+       pgs.push_back(pgid.pgid);
+      }
+      encode(fsid, payload);
+      encode(pgs, payload);
+      encode(options, payload);
+      return;
+    }
+    header.version = HEAD_VERSION;
+    header.compat_version = COMPAT_VERSION;
+    encode(fsid, payload);
+    encode(forced_pgs, payload);
+    encode(options, payload);
   }
   void decode_payload() {
-    bufferlist::iterator p = payload.begin();
-    ::decode(fsid, p);
-    ::decode(forced_pgs, p);
-    ::decode(options, p);
+    auto p = payload.cbegin();
+    if (header.version == 1) {
+      vector<pg_t> pgs;
+      decode(fsid, p);
+      decode(pgs, p);
+      decode(options, p);
+      for (auto pg : pgs) {
+       // note: this only works with replicated pools.  if a pre-mimic mon
+       // tries to force a mimic+ osd on an ec pool it will not work.
+       forced_pgs.push_back(spg_t(pg));
+      }
+      return;
+    }
+    decode(fsid, p);
+    decode(forced_pgs, p);
+    decode(options, p);
   }
 };