From: Yan, Zheng Date: Tue, 9 Jan 2018 11:22:18 +0000 (+0800) Subject: mds: introduce MDCache::maybe_finish_slave_resolve() X-Git-Tag: v13.1.0~413^2~35 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=02889cf8d391b9d1e800f0666ee983c08643c821;p=ceph.git mds: introduce MDCache::maybe_finish_slave_resolve() Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index de600c84f02b..772828d0454b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2404,8 +2404,9 @@ void MDCache::logged_master_update(metareqid_t reqid) dout(10) << "logged_master_update " << reqid << dendl; assert(uncommitted_masters.count(reqid)); uncommitted_masters[reqid].safe = true; - if (pending_masters.count(reqid)) { - pending_masters.erase(reqid); + auto p = pending_masters.find(reqid); + if (p != pending_masters.end()) { + pending_masters.erase(p); if (pending_masters.empty()) process_delayed_resolve(); } @@ -2679,9 +2680,9 @@ void MDCache::send_resolves() << resolve_ack_gather << ")" << dendl; return; } - if (!need_resolve_rollback.empty()) { + if (!resolve_need_rollback.empty()) { dout(10) << "send_resolves still waiting for rollback to commit on (" - << need_resolve_rollback << ")" << dendl; + << resolve_need_rollback << ")" << dendl; return; } send_subtree_resolves(); @@ -2855,6 +2856,13 @@ void MDCache::send_subtree_resolves() resolves_pending = false; } +void MDCache::maybe_finish_slave_resolve() { + if (resolve_ack_gather.empty() && resolve_need_rollback.empty()) { + send_subtree_resolves(); + process_delayed_resolve(); + } +} + void MDCache::handle_mds_failure(mds_rank_t who) { dout(7) << "handle_mds_failure mds." << who << dendl; @@ -3191,7 +3199,7 @@ void MDCache::handle_resolve(MMDSResolve *m) return; } - if (!resolve_ack_gather.empty() || !need_resolve_rollback.empty()) { + if (!resolve_ack_gather.empty() || !resolve_need_rollback.empty()) { dout(10) << "delay processing subtree resolve" << dendl; delayed_resolve[from] = m; return; @@ -3302,7 +3310,7 @@ void MDCache::discard_delayed_resolve(mds_rank_t who) void MDCache::maybe_resolve_finish() { assert(resolve_ack_gather.empty()); - assert(need_resolve_rollback.empty()); + assert(resolve_need_rollback.empty()); if (!resolve_gather.empty()) { dout(10) << "maybe_resolve_finish still waiting for resolves (" @@ -3411,11 +3419,9 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack) } } - if (!ambiguous_slave_updates.count(from)) + if (!ambiguous_slave_updates.count(from)) { resolve_ack_gather.erase(from); - if (resolve_ack_gather.empty() && need_resolve_rollback.empty()) { - send_subtree_resolves(); - process_delayed_resolve(); + maybe_finish_slave_resolve(); } ack->put(); @@ -3489,14 +3495,12 @@ MDSlaveUpdate* MDCache::get_uncommitted_slave_update(metareqid_t reqid, mds_rank } void MDCache::finish_rollback(metareqid_t reqid) { - assert(need_resolve_rollback.count(reqid)); + auto p = resolve_need_rollback.find(reqid); + assert(p != resolve_need_rollback.end()); if (mds->is_resolve()) - finish_uncommitted_slave_update(reqid, need_resolve_rollback[reqid]); - need_resolve_rollback.erase(reqid); - if (resolve_ack_gather.empty() && need_resolve_rollback.empty()) { - send_subtree_resolves(); - process_delayed_resolve(); - } + finish_uncommitted_slave_update(reqid, p->second); + resolve_need_rollback.erase(p); + maybe_finish_slave_resolve(); } void MDCache::disambiguate_other_imports() diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index bc551a15c68e..6e8a84ac74f9 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -470,7 +470,7 @@ protected: bool resolves_pending; set resolve_gather; // nodes i need resolves from set resolve_ack_gather; // nodes i need a resolve_ack from - map need_resolve_rollback; // rollbacks i'm writing to the journal + map resolve_need_rollback; // rollbacks i'm writing to the journal map delayed_resolve; void handle_resolve(MMDSResolve *m); @@ -484,6 +484,11 @@ protected: void add_uncommitted_slave_update(metareqid_t reqid, mds_rank_t master, MDSlaveUpdate*); void finish_uncommitted_slave_update(metareqid_t reqid, mds_rank_t master); MDSlaveUpdate* get_uncommitted_slave_update(metareqid_t reqid, mds_rank_t master); + + void send_slave_resolves(); + void send_subtree_resolves(); + void maybe_finish_slave_resolve(); + public: void recalc_auth_bits(bool replay); void remove_inode_recursive(CInode *in); @@ -505,7 +510,7 @@ public: } void add_rollback(metareqid_t reqid, mds_rank_t master) { - need_resolve_rollback[reqid] = master; + resolve_need_rollback[reqid] = master; } void finish_rollback(metareqid_t reqid); @@ -523,8 +528,6 @@ public: void finish_ambiguous_import(dirfrag_t dirino); void resolve_start(MDSInternalContext *resolve_done_); void send_resolves(); - void send_slave_resolves(); - void send_subtree_resolves(); void maybe_send_pending_resolves() { if (resolves_pending) send_subtree_resolves();