From 73a08e03daadbc49c4a27862329e46ea404e2bcf Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 15 May 2017 11:29:32 +0800 Subject: [PATCH] mds: avoid sending duplicated cache rejoin ack Signed-off-by: "Yan, Zheng" --- src/mds/MDCache.cc | 57 ++++++++++++++++++++++++++++++++-------------- src/mds/MDCache.h | 1 + 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 9eeca5c7c452d..fd030e457aeca 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2878,6 +2878,7 @@ void MDCache::handle_mds_failure(mds_rank_t who) rejoin_gather.insert(who); rejoin_sent.erase(who); // i need to send another + rejoin_ack_sent.erase(who); // i need to send another rejoin_ack_gather.erase(who); // i'll need/get another. dout(10) << " resolve_gather " << resolve_gather << dendl; @@ -5928,11 +5929,16 @@ void MDCache::rejoin_send_acks() rejoin_unlinked_inodes.clear(); // send acks to everyone in the recovery set - map ack; + map acks; for (set::iterator p = recovery_set.begin(); p != recovery_set.end(); - ++p) - ack[*p] = new MMDSCacheRejoin(MMDSCacheRejoin::OP_ACK); + ++p) { + if (rejoin_ack_sent.count(*p)) + continue; + acks[*p] = new MMDSCacheRejoin(MMDSCacheRejoin::OP_ACK); + } + + rejoin_ack_sent = recovery_set; // walk subtrees for (map >::iterator p = subtrees.begin(); @@ -5955,8 +5961,11 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = dir->replicas_begin(); r != dir->replicas_end(); ++r) { - ack[r->first]->add_strong_dirfrag(dir->dirfrag(), ++r->second, dir->dir_rep); - ack[r->first]->add_dirfrag_base(dir); + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_strong_dirfrag(dir->dirfrag(), ++r->second, dir->dir_rep); + it->second->add_dirfrag_base(dir); } for (CDir::map_t::iterator q = dir->items.begin(); @@ -5974,7 +5983,10 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = dn->replicas_begin(); r != dn->replicas_end(); ++r) { - ack[r->first]->add_strong_dentry(dir->dirfrag(), dn->name, dn->first, dn->last, + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_strong_dentry(dir->dirfrag(), dn->name, dn->first, dn->last, dnl->is_primary() ? dnl->get_inode()->ino():inodeno_t(0), dnl->is_remote() ? dnl->get_remote_ino():inodeno_t(0), dnl->is_remote() ? dnl->get_remote_d_type():0, @@ -5991,10 +6003,13 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = in->replicas_begin(); r != in->replicas_end(); ++r) { - ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features()); + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_inode_base(in, mds->mdsmap->get_up_features()); bufferlist bl; in->_encode_locks_state_for_rejoin(bl, r->first); - ack[r->first]->add_inode_locks(in, ++r->second, bl); + it->second->add_inode_locks(in, ++r->second, bl); } // subdirs in this subtree? @@ -6008,19 +6023,25 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = root->replicas_begin(); r != root->replicas_end(); ++r) { - ack[r->first]->add_inode_base(root, mds->mdsmap->get_up_features()); + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_inode_base(root, mds->mdsmap->get_up_features()); bufferlist bl; root->_encode_locks_state_for_rejoin(bl, r->first); - ack[r->first]->add_inode_locks(root, ++r->second, bl); + it->second->add_inode_locks(root, ++r->second, bl); } if (myin) for (compact_map::iterator r = myin->replicas_begin(); r != myin->replicas_end(); ++r) { - ack[r->first]->add_inode_base(myin, mds->mdsmap->get_up_features()); + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_inode_base(myin, mds->mdsmap->get_up_features()); bufferlist bl; myin->_encode_locks_state_for_rejoin(bl, r->first); - ack[r->first]->add_inode_locks(myin, ++r->second, bl); + it->second->add_inode_locks(myin, ++r->second, bl); } // include inode base for any inodes whose scatterlocks may have updated @@ -6030,14 +6051,16 @@ void MDCache::rejoin_send_acks() CInode *in = *p; for (compact_map::iterator r = in->replicas_begin(); r != in->replicas_end(); - ++r) - ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features()); + ++r) { + auto it = acks.find(r->first); + if (it == acks.end()) + continue; + it->second->add_inode_base(in, mds->mdsmap->get_up_features()); + } } // send acks - for (map::iterator p = ack.begin(); - p != ack.end(); - ++p) { + for (auto p = acks.begin(); p != acks.end(); ++p) { ::encode(rejoin_imported_caps[p->first], p->second->imported_caps); mds->send_message_mds(p->second, p->first); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index ca3cdff76d986..b2e01401eef65 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -494,6 +494,7 @@ protected: bool rejoins_pending; set rejoin_gather; // nodes from whom i need a rejoin set rejoin_sent; // nodes i sent a rejoin to + set rejoin_ack_sent; // nodes i sent a rejoin to set rejoin_ack_gather; // nodes from whom i need a rejoin ack map > > rejoin_imported_caps; map > > rejoin_slave_exports; -- 2.47.3