From: Sage Weil Date: Mon, 10 Jun 2019 15:10:34 +0000 (-0500) Subject: mon/OSDMonitor: add messages to get past purged_snaps X-Git-Tag: v15.1.0~2308^2~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7315d3fdba0ab917fc2b01d1d7ae99220fcbcf43;p=ceph.git mon/OSDMonitor: add messages to get past purged_snaps Signed-off-by: Sage Weil --- diff --git a/src/messages/MMonGetPurgedSnaps.h b/src/messages/MMonGetPurgedSnaps.h new file mode 100644 index 000000000000..7f023b9b3fab --- /dev/null +++ b/src/messages/MMonGetPurgedSnaps.h @@ -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 + friend boost::intrusive_ptr ceph::make_message(Args&&... args); +}; diff --git a/src/messages/MMonGetPurgedSnapsReply.h b/src/messages/MMonGetPurgedSnapsReply.h new file mode 100644 index 000000000000..5d7628e35d59 --- /dev/null +++ b/src/messages/MMonGetPurgedSnapsReply.h @@ -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> 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 + friend boost::intrusive_ptr ceph::make_message(Args&&... args); +}; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 11a8d4e9e26f..85185adf7a40 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -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; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1811139fad50..99ec156a1860 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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(op->get_req()); + dout(7) << __func__ << " " << *m << dendl; + + map> 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(m->start, epoch); + reply->purged_snaps.swap(r); + mon->send_reply(op, reply.detach()); + + return true; +} + // osd beacon bool OSDMonitor::preprocess_beacon(MonOpRequestRef op) { diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 913965da49cb..9064effd51a6 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -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& m, ostream *err); void count_metadata(const string& field, Formatter *f); diff --git a/src/msg/Message.cc b/src/msg/Message.cc index 7a90544926f2..802c73d7a631 100644 --- a/src/msg/Message.cc +++ b/src/msg/Message.cc @@ -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(); break; + case MSG_MON_GET_PURGED_SNAPS: + m = make_message(); + break; + case MSG_MON_GET_PURGED_SNAPS_REPLY: + m = make_message(); + break; case CEPH_MSG_MON_GET_VERSION: m = make_message(); break; diff --git a/src/msg/Message.h b/src/msg/Message.h index bbcf96cb4a8c..87b4b263b686 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -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