class MMonPaxos : public Message {
- static const int HEAD_VERSION = 3;
+ static const int HEAD_VERSION = 4;
static const int COMPAT_VERSION = 3;
public:
map<version_t,bufferlist> values;
+ bufferlist feature_map;
+
MMonPaxos() : Message(MSG_MON_PAXOS, HEAD_VERSION, COMPAT_VERSION) { }
MMonPaxos(epoch_t e, int o, utime_t now) :
Message(MSG_MON_PAXOS, HEAD_VERSION, COMPAT_VERSION),
::encode(latest_version, payload);
::encode(latest_value, payload);
::encode(values, payload);
+ ::encode(feature_map, payload);
}
void decode_payload() override {
bufferlist::iterator p = payload.begin();
::decode(latest_version, p);
::decode(latest_value, p);
::decode(values, p);
+ if (header.version >= 4) {
+ ::decode(feature_map, p);
+ }
}
};
}
quorum.clear();
outside_quorum.clear();
+ quorum_feature_map.clear();
scrub_reset();
set<int> quorum; // current active set of monitors (if !starting)
utime_t leader_since; // when this monitor became the leader, if it is the leader
utime_t exited_quorum; // time detected as not in quorum; 0 if in
+
+ // map of counts of connected clients, by type and features, for
+ // each quorum mon
+ map<int,FeatureMap> quorum_feature_map;
+
/**
* Intersection of quorum member's connection feature bits.
*/
#include "Monitor.h"
#include "messages/MMonPaxos.h"
+#include "mon/mon_types.h"
#include "common/config.h"
#include "include/assert.h"
#include "include/stringify.h"
ack->last_committed = last_committed;
ack->first_committed = first_committed;
ack->lease_timestamp = ceph_clock_now();
+ ::encode(mon->session_map.feature_map, ack->feature_map);
lease->get_connection()->send_message(ack);
// (re)set timeout event.
}
else if (acked_lease.count(from) == 0) {
acked_lease.insert(from);
-
+ if (ack->feature_map.length()) {
+ auto p = ack->feature_map.begin();
+ FeatureMap& t = mon->quorum_feature_map[from];
+ ::decode(t, p);
+ }
if (acked_lease == mon->get_quorum()) {
// yay!
dout(10) << "handle_lease_ack from " << ack->get_source()