]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: add messages to get past purged_snaps
authorSage Weil <sage@redhat.com>
Mon, 10 Jun 2019 15:10:34 +0000 (10:10 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:50 +0000 (08:37 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MMonGetPurgedSnaps.h [new file with mode: 0644]
src/messages/MMonGetPurgedSnapsReply.h [new file with mode: 0644]
src/mon/Monitor.cc
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h
src/msg/Message.cc
src/msg/Message.h

diff --git a/src/messages/MMonGetPurgedSnaps.h b/src/messages/MMonGetPurgedSnaps.h
new file mode 100644 (file)
index 0000000..7f023b9
--- /dev/null
@@ -0,0 +1,45 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "PaxosServiceMessage.h"
+#include "include/types.h"
+
+class MMonGetPurgedSnaps : public PaxosServiceMessage {
+public:
+  epoch_t start, last;
+
+  MMonGetPurgedSnaps(epoch_t s=0, epoch_t l=0)
+    : PaxosServiceMessage{MSG_MON_GET_PURGED_SNAPS, 0},
+      start(s),
+      last(l) {}
+private:
+  ~MMonGetPurgedSnaps() override {}
+
+public:
+  std::string_view get_type_name() const override {
+    return "mon_get_purged_snaps";
+  }
+  void print(std::ostream& out) const override {
+    out << "mon_get_purged_snaps([" << start << "," << last << "])";
+  }
+
+  void encode_payload(uint64_t features) override {
+    using ceph::encode;
+    paxos_encode();
+    encode(start, payload);
+    encode(last, payload);
+  }
+  void decode_payload() override {
+    using ceph::decode;
+    auto p = payload.cbegin();
+    paxos_decode(p);
+    decode(start, p);
+    decode(last, p);
+  }
+
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
+};
diff --git a/src/messages/MMonGetPurgedSnapsReply.h b/src/messages/MMonGetPurgedSnapsReply.h
new file mode 100644 (file)
index 0000000..5d7628e
--- /dev/null
@@ -0,0 +1,49 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "PaxosServiceMessage.h"
+#include "osd/osd_types.h"
+#include "include/types.h"
+
+class MMonGetPurgedSnapsReply : public PaxosServiceMessage {
+public:
+  epoch_t start, last;
+  map<epoch_t,mempool::osdmap::map<int64_t,snap_interval_set_t>> purged_snaps;
+
+  MMonGetPurgedSnapsReply(epoch_t s=0, epoch_t l=0)
+    : PaxosServiceMessage{MSG_MON_GET_PURGED_SNAPS_REPLY, 0},
+      start(s),
+      last(l) {}
+private:
+  ~MMonGetPurgedSnapsReply() override {}
+
+public:
+  std::string_view get_type_name() const override {
+    return "mon_get_purged_snaps_reply";
+  }
+  void print(std::ostream& out) const override {
+    out << "mon_get_purged_snaps_reply([" << start << "," << last << "])";
+  }
+
+  void encode_payload(uint64_t features) override {
+    using ceph::encode;
+    paxos_encode();
+    encode(start, payload);
+    encode(last, payload);
+    encode(purged_snaps, payload);
+  }
+  void decode_payload() override {
+    using ceph::decode;
+    auto p = payload.cbegin();
+    paxos_decode(p);
+    decode(start, p);
+    decode(last, p);
+    decode(purged_snaps, p);
+  }
+
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
+};
index 11a8d4e9e26ffd6443f4926706a620a32978297d..85185adf7a40a5861dedbf0840f531584f71be37 100644 (file)
@@ -4488,6 +4488,7 @@ void Monitor::dispatch_op(MonOpRequestRef op)
     case MSG_OSD_PGTEMP:
     case MSG_OSD_PG_CREATED:
     case MSG_REMOVE_SNAPS:
+    case MSG_MON_GET_PURGED_SNAPS:
     case MSG_OSD_PG_READY_TO_MERGE:
       paxos_service[PAXOS_OSDMAP]->dispatch(op);
       return;
index 1811139fad50c30a691b293e41bc8741bb00e83d..99ec156a1860576a1116396c7aed95134a56b933 100644 (file)
@@ -55,6 +55,8 @@
 #include "messages/MRemoveSnaps.h"
 #include "messages/MOSDScrub.h"
 #include "messages/MRoute.h"
+#include "messages/MMonGetPurgedSnaps.h"
+#include "messages/MMonGetPurgedSnapsReply.h"
 
 #include "common/TextTable.h"
 #include "common/Timer.h"
@@ -2279,6 +2281,9 @@ bool OSDMonitor::preprocess_query(MonOpRequestRef op)
   case MSG_REMOVE_SNAPS:
     return preprocess_remove_snaps(op);
 
+  case MSG_MON_GET_PURGED_SNAPS:
+    return preprocess_get_purged_snaps(op);
+
   default:
     ceph_abort();
     return true;
@@ -3719,6 +3724,56 @@ bool OSDMonitor::prepare_remove_snaps(MonOpRequestRef op)
   return true;
 }
 
+bool OSDMonitor::preprocess_get_purged_snaps(MonOpRequestRef op)
+{
+  op->mark_osdmon_event(__func__);
+  const MMonGetPurgedSnaps *m = static_cast<MMonGetPurgedSnaps*>(op->get_req());
+  dout(7) << __func__ << " " << *m << dendl;
+
+  map<epoch_t,mempool::osdmap::map<int64_t,snap_interval_set_t>> r;
+
+  string k = make_purged_snap_epoch_key(m->start);
+  auto it = mon->store->get_iterator(OSD_SNAP_PREFIX);
+  it->upper_bound(k);
+  unsigned long epoch = m->last;
+  while (it->valid()) {
+    if (it->key().find("purged_epoch_") != 0) {
+      break;
+    }
+    string k = it->key();
+    int n = sscanf(k.c_str(), "purged_epoch_%lx", &epoch);
+    if (n != 1) {
+      derr << __func__ << " unable to parse key '" << it->key() << "'" << dendl;
+    } else if (epoch > m->last) {
+      break;
+    } else {
+      bufferlist bl = it->value();
+      auto p = bl.cbegin();
+      auto &v = r[epoch];
+      try {
+       ceph::decode(v, p);
+      } catch (buffer::error& e) {
+       derr << __func__ << " unable to parse value for key '" << it->key()
+            << "': \n";
+       bl.hexdump(*_dout);
+       *_dout << dendl;
+      }
+      n += 4 + v.size() * 16;
+    }
+    if (n > 1048576) {
+      // impose a semi-arbitrary limit to message size
+      break;
+    }
+    it->next();
+  }
+
+  auto reply = make_message<MMonGetPurgedSnapsReply>(m->start, epoch);
+  reply->purged_snaps.swap(r);
+  mon->send_reply(op, reply.detach());
+
+  return true;
+}
+
 // osd beacon
 bool OSDMonitor::preprocess_beacon(MonOpRequestRef op)
 {
index 913965da49cb1cc46c4e83990173cbd75151dd5f..9064effd51a640e4cc57ede82e7348546c70de10 100644 (file)
@@ -609,6 +609,8 @@ private:
   bool preprocess_remove_snaps(MonOpRequestRef op);
   bool prepare_remove_snaps(MonOpRequestRef op);
 
+  bool preprocess_get_purged_snaps(MonOpRequestRef op);
+
   int load_metadata(int osd, map<string, string>& m, ostream *err);
   void count_metadata(const string& field, Formatter *f);
 
index 7a90544926f2cb0fd211d8628ccc0683894cd023..802c73d7a6314f2329aa97b84aa1115c6d7d8d26 100644 (file)
@@ -70,6 +70,8 @@
 #include "messages/MOSDRepOpReply.h"
 #include "messages/MOSDMap.h"
 #include "messages/MMonGetOSDMap.h"
+#include "messages/MMonGetPurgedSnaps.h"
+#include "messages/MMonGetPurgedSnapsReply.h"
 
 #include "messages/MOSDPGCreated.h"
 #include "messages/MOSDPGNotify.h"
@@ -439,6 +441,12 @@ Message *decode_message(CephContext *cct, int crcflags,
   case CEPH_MSG_MON_GET_OSDMAP:
     m = make_message<MMonGetOSDMap>();
     break;
+  case MSG_MON_GET_PURGED_SNAPS:
+    m = make_message<MMonGetPurgedSnaps>();
+    break;
+  case MSG_MON_GET_PURGED_SNAPS_REPLY:
+    m = make_message<MMonGetPurgedSnapsReply>();
+    break;
   case CEPH_MSG_MON_GET_VERSION:
     m = make_message<MMonGetVersion>();
     break;
index bbcf96cb4a8cfec9fc726075043fee349b81ae20..87b4b263b686de3ab83857a32010ae191c4e7158 100644 (file)
@@ -61,6 +61,8 @@
 #define MSG_CONFIG           62
 #define MSG_GET_CONFIG       63
 
+#define MSG_MON_GET_PURGED_SNAPS 76
+#define MSG_MON_GET_PURGED_SNAPS_REPLY 77
 
 // osd internal
 #define MSG_OSD_PING         70