@@ -101,6 +101,7 @@ void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function<void(int,
101101 struct Ctx : public QuiesceDbManager ::RequestContext {
102102 std::function<void (int , const std::string&, bufferlist&)> on_finish;
103103 bool all = false ;
104+ mds_gid_t me;
104105
105106 double sec (QuiesceTimeInterval duration) {
106107 return duration_cast<dd>(duration).count ();
@@ -126,6 +127,7 @@ void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function<void(int,
126127
127128 f->open_object_section (" response" ); {
128129 f->dump_int (" epoch" , response.db_version .epoch );
130+ f->dump_int (" leader" , me);
129131 f->dump_int (" set_version" , response.db_version .set_version );
130132 f->open_object_section (" sets" ); {
131133 for (auto && [set_id, set] : response.sets ) {
@@ -168,8 +170,10 @@ void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function<void(int,
168170
169171 auto * ctx = new Ctx ();
170172
173+ QuiesceInterface::PeerId me = mds_gid_t (monc->get_global_id ());
171174 ctx->on_finish = std::move (on_finish);
172175 ctx->all = all;
176+ ctx->me = me;
173177
174178 ctx->request .reset ([&](auto & r) {
175179 r.set_id = set_id;
@@ -212,6 +216,12 @@ void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function<void(int,
212216 int rc = quiesce_db_manager->submit_request (ctx);
213217 if (rc != 0 ) {
214218 bufferlist bl;
219+ auto f = Formatter::create_unique (" json-pretty" );
220+ f->open_object_section (" response" );
221+ f->dump_int (" epoch" , mdsmap->get_epoch ());
222+ f->dump_int (" leader" , mdsmap->get_quiesce_db_cluster_leader ());
223+ f->close_section ();
224+ f->flush (bl);
215225 // on_finish was moved there, so should only call via the ctx.
216226 ctx->on_finish (rc, " Error submitting the command to the local db manager" , bl);
217227 delete ctx;
@@ -234,62 +244,35 @@ static void rebind_agent_callback(std::shared_ptr<QuiesceAgent> agt, std::shared
234244
235245void MDSRank::quiesce_cluster_update () {
236246 // the quiesce leader is the lowest rank with the highest state up to ACTIVE
237- auto less_leader = [](MDSMap::mds_info_t const * l, MDSMap::mds_info_t const * r) {
238- ceph_assert (l->rank != MDS_RANK_NONE);
239- ceph_assert (r->rank != MDS_RANK_NONE);
240- ceph_assert (l->state <= MDSMap::STATE_ACTIVE);
241- ceph_assert (r->state <= MDSMap::STATE_ACTIVE);
242- if (l->rank == r->rank ) {
243- return l->state < r->state ;
244- } else {
245- return l->rank > r->rank ;
246- }
247- };
248-
249- std::priority_queue<MDSMap::mds_info_t const *, std::vector<MDSMap::mds_info_t const *>, decltype (less_leader)> member_info (less_leader);
250247 QuiesceClusterMembership membership;
251-
252248 QuiesceInterface::PeerId me = mds_gid_t (monc->get_global_id ());
253249
254- for (auto && [gid, info] : mdsmap->get_mds_info ()) {
255- // if it has a rank and state <= ACTIVE, it's good enough
256- // if (info.rank != MDS_RANK_NONE && info.state <= MDSMap::STATE_ACTIVE) {
257- if (info.rank != MDS_RANK_NONE && info.state == MDSMap::STATE_ACTIVE) {
258- member_info.push (&info);
259- membership.members .insert (info.global_id );
260- }
261- }
262-
263- QuiesceInterface::PeerId leader =
264- member_info.empty ()
265- ? QuiesceClusterMembership::INVALID_MEMBER
266- : member_info.top ()->global_id ;
250+ mdsmap->get_quiesce_db_cluster (membership.leader , membership.members );
267251
268252 membership.epoch = mdsmap->get_epoch ();
269- membership.leader = leader;
270253 membership.me = me;
271254 membership.fs_name = mdsmap->get_fs_name ();
272255
273- dout (5 ) << " epoch:" << membership.epoch << " me:" << me << " leader:" << leader << " members:" << membership.members
256+ dout (5 ) << " epoch:" << membership.epoch << " me:" << me << " leader:" << membership. leader << " members:" << membership.members
274257 << (mdsmap->is_degraded () ? " (degraded)" : " " ) << dendl;
275258
276- if (leader != QuiesceClusterMembership::INVALID_MEMBER) {
259+ if (membership. leader != QuiesceClusterMembership::INVALID_MEMBER) {
277260 membership.send_ack = [=, this ](QuiesceMap&& ack) {
278- if (me == leader) {
261+ if (me == membership. leader ) {
279262 // loopback
280263 quiesce_db_manager->submit_ack_from (me, std::move (ack));
281264 return 0 ;
282265 } else {
283266 std::lock_guard guard (mds_lock);
284267
285- if (mdsmap->get_state_gid (leader) == MDSMap::STATE_NULL) {
286- dout (5 ) << " couldn't find the leader " << leader << " in the map" << dendl;
268+ if (mdsmap->get_state_gid (membership. leader ) == MDSMap::STATE_NULL) {
269+ dout (5 ) << " couldn't find the leader " << membership. leader << " in the map" << dendl;
287270 return -ENOENT;
288271 }
289- auto addrs = mdsmap->get_info_gid (leader).addrs ;
272+ auto addrs = mdsmap->get_info_gid (membership. leader ).addrs ;
290273
291274 auto ack_msg = make_message<MMDSQuiesceDbAck>();
292- dout (10 ) << " sending ack " << ack << " to the leader " << leader << dendl;
275+ dout (10 ) << " sending ack " << ack << " to the leader " << membership. leader << dendl;
293276 ack_msg->encode_payload_from (me, ack);
294277 return send_message_mds (ack_msg, addrs);
295278 }
0 commit comments