From: Patrick Donnelly Date: Tue, 24 Jul 2018 13:51:28 +0000 (-0700) Subject: mds: use vector for context lists X-Git-Tag: v14.0.1~708^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=396511da7e27c906e6c80b74f0f24c141e1daaac;p=ceph.git mds: use vector for context lists Commands executed: sed -i 's/\([^:]\)list/\1MDSInternalContextBase::vec/g' *.cc *.h sed -i 's/std::list/MDSInternalContextBase::vec/g' *.cc *.h With various incidental fixes. Fixes: http://tracker.ceph.com/issues/25111 Signed-off-by: Patrick Donnelly --- diff --git a/src/mds/CDentry.h b/src/mds/CDentry.h index c417bb261ac2f..556a03a437a05 100644 --- a/src/mds/CDentry.h +++ b/src/mds/CDentry.h @@ -29,6 +29,7 @@ #include "include/filepath.h" #include "MDSCacheObject.h" +#include "MDSContext.h" #include "SimpleLock.h" #include "LocalLock.h" #include "ScrubHeader.h" diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index dbf3f809dca72..d0b231e1fc9c5 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -905,7 +905,7 @@ void CDir::steal_dentry(CDentry *dn) dn->dir = this; } -void CDir::prepare_old_fragment(map >& dentry_waiters, bool replay) +void CDir::prepare_old_fragment(map& dentry_waiters, bool replay) { // auth_pin old fragment for duration so that any auth_pinning // during the dentry migration doesn't trigger side effects @@ -933,7 +933,7 @@ void CDir::prepare_new_fragment(bool replay) inode->add_dirfrag(this); } -void CDir::finish_old_fragment(list& waiters, bool replay) +void CDir::finish_old_fragment(MDSInternalContextBase::vec& waiters, bool replay) { // take waiters _before_ unfreeze... if (!replay) { @@ -985,7 +985,7 @@ void CDir::init_fragment_pins() get(PIN_SUBTREE); } -void CDir::split(int bits, list& subs, list& waiters, bool replay) +void CDir::split(int bits, list& subs, MDSInternalContextBase::vec& waiters, bool replay) { dout(10) << "split by " << bits << " bits on " << *this << dendl; @@ -1009,7 +1009,7 @@ void CDir::split(int bits, list& subs, list& wai fragstatdiff.add_delta(fnode.accounted_fragstat, fnode.fragstat); dout(10) << " rstatdiff " << rstatdiff << " fragstatdiff " << fragstatdiff << dendl; - map > dentry_waiters; + map dentry_waiters; prepare_old_fragment(dentry_waiters, replay); // create subfrag dirs @@ -1086,7 +1086,7 @@ void CDir::split(int bits, list& subs, list& wai finish_old_fragment(waiters, replay); } -void CDir::merge(list& subs, list& waiters, bool replay) +void CDir::merge(list& subs, MDSInternalContextBase::vec& waiters, bool replay) { dout(10) << "merge " << subs << dendl; @@ -1108,7 +1108,7 @@ void CDir::merge(list& subs, list& waiters, bool version_t rstat_version = inode->get_projected_inode()->rstat.version; version_t dirstat_version = inode->get_projected_inode()->dirstat.version; - map > dentry_waiters; + map dentry_waiters; for (auto dir : subs) { dout(10) << " subfrag " << dir->get_frag() << " " << *dir << dendl; @@ -1264,7 +1264,7 @@ void CDir::add_dentry_waiter(std::string_view dname, snapid_t snapid, MDSInterna } void CDir::take_dentry_waiting(std::string_view dname, snapid_t first, snapid_t last, - list& ls) + MDSInternalContextBase::vec& ls) { if (waiting_on_dentry.empty()) return; @@ -1288,7 +1288,7 @@ void CDir::take_dentry_waiting(std::string_view dname, snapid_t first, snapid_t put(PIN_DNWAITER); } -void CDir::take_sub_waiting(list& ls) +void CDir::take_sub_waiting(MDSInternalContextBase::vec& ls) { dout(10) << __func__ << dendl; if (!waiting_on_dentry.empty()) { @@ -1337,7 +1337,7 @@ void CDir::add_waiter(uint64_t tag, MDSInternalContextBase *c) /* NOTE: this checks dentry waiters too */ -void CDir::take_waiting(uint64_t mask, list& ls) +void CDir::take_waiting(uint64_t mask, MDSInternalContextBase::vec& ls) { if ((mask & WAIT_DENTRY) && !waiting_on_dentry.empty()) { // take all dentry waiters @@ -1361,7 +1361,7 @@ void CDir::finish_waiting(uint64_t mask, int result) { dout(11) << __func__ << " mask " << hex << mask << dec << " result " << result << " on " << *this << dendl; - list finished; + MDSInternalContextBase::vec finished; take_waiting(mask, finished); if (result < 0) finish_contexts(g_ceph_context, finished, result); @@ -1442,7 +1442,7 @@ void CDir::mark_new(LogSegment *ls) ls->new_dirfrags.push_back(&item_new); state_clear(STATE_CREATING); - list waiters; + MDSInternalContextBase::vec waiters; take_waiting(CDir::WAIT_CREATED, waiters); cache->mds->queue_waiters(waiters); } @@ -2465,7 +2465,7 @@ void CDir::_committed(int r, version_t v) _commit(it->first, -1); break; } - std::list t; + MDSInternalContextBase::vec t; for (const auto &waiter : it->second) t.push_back(waiter); cache->mds->queue_waiters(t); @@ -2698,7 +2698,7 @@ void CDir::set_dir_auth(const mds_authority_t &a) // newly single auth? if (was_ambiguous && dir_auth.second == CDIR_AUTH_UNKNOWN) { - list ls; + MDSInternalContextBase::vec ls; take_waiting(WAIT_SINGLEAUTH, ls); cache->mds->queue_waiters(ls); } diff --git a/src/mds/CDir.h b/src/mds/CDir.h index fceedfa727bcc..0bbd3f1caff74 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -32,6 +32,7 @@ #include "CInode.h" #include "MDSCacheObject.h" +#include "MDSContext.h" class CDentry; class MDCache; @@ -501,8 +502,8 @@ public: public: - void split(int bits, std::list& subs, list& waiters, bool replay); - void merge(std::list& subs, std::list& waiters, bool replay); + void split(int bits, std::list& subs, MDSInternalContextBase::vec& waiters, bool replay); + void merge(std::list& subs, MDSInternalContextBase::vec& waiters, bool replay); bool should_split() const { return (int)get_frag_size() > g_conf()->mds_bal_split_size; @@ -514,9 +515,9 @@ public: private: void prepare_new_fragment(bool replay); - void prepare_old_fragment(map >& dentry_waiters, bool replay); + void prepare_old_fragment(map& dentry_waiters, bool replay); void steal_dentry(CDentry *dn); // from another dir. used by merge/split. - void finish_old_fragment(std::list& waiters, bool replay); + void finish_old_fragment(MDSInternalContextBase::vec& waiters, bool replay); void init_fragment_pins(); @@ -658,7 +659,7 @@ protected: bool complete, int r); // -- commit -- - mempool::mds_co::compact_map > waiting_for_commit; + mempool::mds_co::compact_map > waiting_for_commit; void _commit(version_t want, int op_prio); void _omap_commit(int op_prio); void _encode_dentry(CDentry *dn, bufferlist& bl, const std::set *snaps); @@ -694,18 +695,18 @@ public: // -- waiters -- protected: - mempool::mds_co::compact_map< string_snap_t, mempool::mds_co::list > waiting_on_dentry; // FIXME string_snap_t not in mempool + mempool::mds_co::compact_map< string_snap_t, MDSInternalContextBase::vec_alloc > waiting_on_dentry; // FIXME string_snap_t not in mempool public: bool is_waiting_for_dentry(std::string_view dname, snapid_t snap) { return waiting_on_dentry.count(string_snap_t(dname, snap)); } void add_dentry_waiter(std::string_view dentry, snapid_t snap, MDSInternalContextBase *c); - void take_dentry_waiting(std::string_view dentry, snapid_t first, snapid_t last, std::list& ls); - void take_sub_waiting(std::list& ls); // dentry or ino + void take_dentry_waiting(std::string_view dentry, snapid_t first, snapid_t last, MDSInternalContextBase::vec& ls); + void take_sub_waiting(MDSInternalContextBase::vec& ls); // dentry or ino void add_waiter(uint64_t mask, MDSInternalContextBase *c) override; - void take_waiting(uint64_t mask, std::list& ls) override; // may include dentry waiters + void take_waiting(uint64_t mask, MDSInternalContextBase::vec& ls) override; // may include dentry waiters void finish_waiting(uint64_t mask, int result = 0); // ditto diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index d7c92409f3bf7..e17241b23e2fd 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -2431,7 +2431,7 @@ void CInode::add_dir_waiter(frag_t fg, MDSInternalContextBase *c) dout(10) << __func__ << " frag " << fg << " " << c << " on " << *this << dendl; } -void CInode::take_dir_waiting(frag_t fg, list& ls) +void CInode::take_dir_waiting(frag_t fg, MDSInternalContextBase::vec& ls) { if (waiting_on_dir.empty()) return; @@ -2439,7 +2439,8 @@ void CInode::take_dir_waiting(frag_t fg, list& ls) auto it = waiting_on_dir.find(fg); if (it != waiting_on_dir.end()) { dout(10) << __func__ << " frag " << fg << " on " << *this << dendl; - ls.splice(ls.end(), it->second); + auto& waiting = it->second; + ls.insert(ls.end(), waiting.begin(), waiting.end()); waiting_on_dir.erase(it); if (waiting_on_dir.empty()) @@ -2467,14 +2468,15 @@ void CInode::add_waiter(uint64_t tag, MDSInternalContextBase *c) MDSCacheObject::add_waiter(tag, c); } -void CInode::take_waiting(uint64_t mask, list& ls) +void CInode::take_waiting(uint64_t mask, MDSInternalContextBase::vec& ls) { if ((mask & WAIT_DIR) && !waiting_on_dir.empty()) { // take all dentry waiters while (!waiting_on_dir.empty()) { auto it = waiting_on_dir.begin(); dout(10) << __func__ << " dirfrag " << it->first << " on " << *this << dendl; - ls.splice(ls.end(), it->second); + auto& waiting = it->second; + ls.insert(ls.end(), waiting.begin(), waiting.end()); waiting_on_dir.erase(it); } put(PIN_DIRWAITER); @@ -2505,7 +2507,7 @@ bool CInode::freeze_inode(int auth_pin_allowance) return true; } -void CInode::unfreeze_inode(list& finished) +void CInode::unfreeze_inode(MDSInternalContextBase::vec& finished) { dout(10) << __func__ << dendl; if (state_test(STATE_FREEZING)) { @@ -2521,7 +2523,7 @@ void CInode::unfreeze_inode(list& finished) void CInode::unfreeze_inode() { - list finished; + MDSInternalContextBase::vec finished; unfreeze_inode(finished); mdcache->mds->queue_waiters(finished); } @@ -2537,13 +2539,13 @@ void CInode::unfreeze_auth_pin() assert(state_test(CInode::STATE_FROZENAUTHPIN)); state_clear(CInode::STATE_FROZENAUTHPIN); if (!state_test(STATE_FREEZING|STATE_FROZEN)) { - list finished; + MDSInternalContextBase::vec finished; take_waiting(WAIT_UNFREEZE, finished); mdcache->mds->queue_waiters(finished); } } -void CInode::clear_ambiguous_auth(list& finished) +void CInode::clear_ambiguous_auth(MDSInternalContextBase::vec& finished) { assert(state_test(CInode::STATE_AMBIGUOUSAUTH)); state_clear(CInode::STATE_AMBIGUOUSAUTH); @@ -2552,7 +2554,7 @@ void CInode::clear_ambiguous_auth(list& finished) void CInode::clear_ambiguous_auth() { - list finished; + MDSInternalContextBase::vec finished; clear_ambiguous_auth(finished); mdcache->mds->queue_waiters(finished); } @@ -3084,7 +3086,7 @@ void CInode::remove_client_cap(client_t client) bool fcntl_removed = fcntl_locks ? fcntl_locks->remove_all_from(client) : false; bool flock_removed = flock_locks ? flock_locks->remove_all_from(client) : false; if (fcntl_removed || flock_removed) { - list waiters; + MDSInternalContextBase::vec waiters; take_waiting(CInode::WAIT_FLOCK, waiters); mdcache->mds->queue_waiters(waiters); } @@ -3822,7 +3824,7 @@ void CInode::_decode_locks_state(bufferlist::const_iterator& p, bool is_new) policylock.mark_need_recover(); } } -void CInode::_decode_locks_rejoin(bufferlist::const_iterator& p, list& waiters, +void CInode::_decode_locks_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters, list& eval_locks, bool survivor) { authlock.decode_state_rejoin(p, waiters, survivor); diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 083ddfb00e2d3..ef72340aa25c3 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -30,6 +30,7 @@ #include "include/compact_set.h" #include "MDSCacheObject.h" +#include "MDSContext.h" #include "flock.h" #include "CDentry.h" @@ -720,7 +721,7 @@ public: void set_ambiguous_auth() { state_set(STATE_AMBIGUOUSAUTH); } - void clear_ambiguous_auth(std::list& finished); + void clear_ambiguous_auth(MDSInternalContextBase::vec& finished); void clear_ambiguous_auth(); inodeno_t ino() const { return inode.ino; } @@ -828,15 +829,15 @@ public: // -- waiting -- protected: - mempool::mds_co::compact_map > waiting_on_dir; + mempool::mds_co::compact_map waiting_on_dir; public: void add_dir_waiter(frag_t fg, MDSInternalContextBase *c); - void take_dir_waiting(frag_t fg, std::list& ls); + void take_dir_waiting(frag_t fg, MDSInternalContextBase::vec& ls); bool is_waiting_for_dir(frag_t fg) { return waiting_on_dir.count(fg); } void add_waiter(uint64_t tag, MDSInternalContextBase *c) override; - void take_waiting(uint64_t tag, std::list& ls) override; + void take_waiting(uint64_t tag, MDSInternalContextBase::vec& ls) override; // -- encode/decode helpers -- void _encode_base(bufferlist& bl, uint64_t features); @@ -846,7 +847,7 @@ public: void _encode_locks_state_for_replica(bufferlist& bl, bool need_recover); void _encode_locks_state_for_rejoin(bufferlist& bl, int rep); void _decode_locks_state(bufferlist::const_iterator& p, bool is_new); - void _decode_locks_rejoin(bufferlist::const_iterator& p, std::list& waiters, + void _decode_locks_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters, std::list& eval_locks, bool survivor); // -- import/export -- @@ -1046,7 +1047,7 @@ public: /* Freeze the inode. auth_pin_allowance lets the caller account for any * auth_pins it is itself holding/responsible for. */ bool freeze_inode(int auth_pin_allowance=0); - void unfreeze_inode(std::list& finished); + void unfreeze_inode(MDSInternalContextBase::vec& finished); void unfreeze_inode(); void freeze_auth_pin(); diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 72c2c5182cb56..de9160ec517c9 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -816,7 +816,7 @@ void Locker::drop_rdlocks_for_early_reply(MutationImpl *mut) // generics -void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, list *pfinishers) +void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, MDSInternalContextBase::vec *pfinishers) { dout(10) << "eval_gather " << *lock << " on " << *lock->get_parent() << dendl; assert(!lock->is_stable()); @@ -1040,7 +1040,7 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, list finishers; + MDSInternalContextBase::vec finishers; dout(10) << "eval " << mask << " " << *in << dendl; @@ -1203,7 +1203,7 @@ void Locker::try_eval(SimpleLock *lock, bool *pneed_issue) void Locker::eval_cap_gather(CInode *in, set *issue_set) { bool need_issue = false; - list finishers; + MDSInternalContextBase::vec finishers; // kick locks now if (!in->filelock.is_stable()) @@ -1228,7 +1228,7 @@ void Locker::eval_cap_gather(CInode *in, set *issue_set) void Locker::eval_scatter_gathers(CInode *in) { bool need_issue = false; - list finishers; + MDSInternalContextBase::vec finishers; dout(10) << "eval_scatter_gathers " << *in << dendl; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index f3dd5ca516486..4e77ef9369d9a 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -43,6 +43,7 @@ class LocalLock; #include "CInode.h" #include "SimpleLock.h" +#include "MDSContext.h" #include "Mutation.h" class Locker { @@ -89,9 +90,9 @@ public: void drop_non_rdlocks(MutationImpl *mut, set *pneed_issue=0); void drop_rdlocks_for_early_reply(MutationImpl *mut); - void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list *pfinishers=0); + void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, MDSInternalContextBase::vec *pfinishers=0); void eval(SimpleLock *lock, bool *need_issue); - void eval_any(SimpleLock *lock, bool *need_issue, list *pfinishers=0, bool first=false) { + void eval_any(SimpleLock *lock, bool *need_issue, MDSInternalContextBase::vec *pfinishers=0, bool first=false) { if (!lock->is_stable()) eval_gather(lock, first, need_issue, pfinishers); else if (lock->get_parent()->is_auth()) diff --git a/src/mds/LogSegment.h b/src/mds/LogSegment.h index f5ef2078a19bd..cff5dea0df758 100644 --- a/src/mds/LogSegment.h +++ b/src/mds/LogSegment.h @@ -18,11 +18,11 @@ #include "include/elist.h" #include "include/interval_set.h" #include "include/Context.h" +#include "MDSContext.h" #include "mdstypes.h" #include "CInode.h" #include "CDentry.h" #include "CDir.h" -#include "MDSContext.h" #include "include/unordered_set.h" using ceph::unordered_set; @@ -74,7 +74,7 @@ class LogSegment { // try to expire void try_to_expire(MDSRank *mds, MDSGatherBuilder &gather_bld, int op_prio); - std::list expiry_waiters; + MDSInternalContextBase::vec expiry_waiters; void wait_for_expiry(MDSInternalContextBase *c) { diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index c465d6cc70a36..1aeb03598f65b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3128,7 +3128,7 @@ void MDCache::handle_mds_recovery(mds_rank_t who) static const uint64_t i_mask = CInode::WAIT_ANY_MASK & ~CInode::WAIT_DIR; static const uint64_t d_mask = CDir::WAIT_ANY_MASK & ~CDir::WAIT_DENTRY; - list waiters; + MDSInternalContextBase::vec waiters; // wake up any waiters in their subtrees for (map >::iterator p = subtrees.begin(); @@ -5813,7 +5813,7 @@ void MDCache::export_remaining_imported_caps() mds->heartbeat_reset(); } - for (map >::iterator p = cap_reconnect_waiters.begin(); + for (map::iterator p = cap_reconnect_waiters.begin(); p != cap_reconnect_waiters.end(); ++p) mds->queue_waiters(p->second); @@ -5853,7 +5853,7 @@ void MDCache::try_reconnect_cap(CInode *in, Session *session) dout(15) << " chose lock states on " << *in << dendl; } - map >::iterator it = + map::iterator it = cap_reconnect_waiters.find(in->ino()); if (it != cap_reconnect_waiters.end()) { mds->queue_waiters(it->second); @@ -6563,7 +6563,7 @@ void MDCache::truncate_inode_logged(CInode *in, MutationRef& mut) in->put(CInode::PIN_TRUNCATING); in->auth_unpin(this); - list waiters; + MDSInternalContextBase::vec waiters; in->take_waiting(CInode::WAIT_TRUNC, waiters); mds->queue_waiters(waiters); } @@ -8812,7 +8812,7 @@ void MDCache::open_ino_finish(inodeno_t ino, open_ino_info_t& info, int ret) { dout(10) << "open_ino_finish ino " << ino << " ret " << ret << dendl; - list waiters; + MDSInternalContextBase::vec waiters; waiters.swap(info.waiters); opening_inodes.erase(ino); finish_contexts(g_ceph_context, waiters, ret); @@ -9887,7 +9887,7 @@ void MDCache::discover_path(CInode *base, base->add_waiter(CInode::WAIT_SINGLEAUTH, onfinish); return; } else if (from == mds->get_nodeid()) { - list finished; + MDSInternalContextBase::vec finished; base->take_waiting(CInode::WAIT_DIR, finished); mds->queue_waiters(finished); return; @@ -9942,7 +9942,7 @@ void MDCache::discover_path(CDir *base, base->add_waiter(CDir::WAIT_SINGLEAUTH, onfinish); return; } else if (from == mds->get_nodeid()) { - list finished; + MDSInternalContextBase::vec finished; base->take_sub_waiting(finished); mds->queue_waiters(finished); return; @@ -10299,7 +10299,7 @@ void MDCache::handle_discover_reply(MDiscoverReply *m) if (m->is_flag_error_dn()) dout(7) << " flag error, dentry = " << m->get_error_dentry() << dendl; - list finished, error; + MDSInternalContextBase::vec finished, error; mds_rank_t from = mds_rank_t(m->get_source().num()); // starting point @@ -10467,7 +10467,7 @@ void MDCache::replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl, } CDir *MDCache::add_replica_dir(bufferlist::const_iterator& p, CInode *diri, mds_rank_t from, - list& finished) + MDSInternalContextBase::vec& finished) { dirfrag_t df; decode(df, p); @@ -10508,7 +10508,7 @@ CDir *MDCache::add_replica_dir(bufferlist::const_iterator& p, CInode *diri, mds_ return dir; } -CDentry *MDCache::add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, list& finished) +CDentry *MDCache::add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, MDSInternalContextBase::vec& finished) { string name; snapid_t last; @@ -10532,7 +10532,7 @@ CDentry *MDCache::add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, l return dn; } -CInode *MDCache::add_replica_inode(bufferlist::const_iterator& p, CDentry *dn, list& finished) +CInode *MDCache::add_replica_inode(bufferlist::const_iterator& p, CDentry *dn, MDSInternalContextBase::vec& finished) { inodeno_t ino; snapid_t last; @@ -10579,7 +10579,7 @@ void MDCache::replicate_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl) CDentry *MDCache::add_replica_stray(bufferlist &bl, mds_rank_t from) { - list finished; + MDSInternalContextBase::vec finished; auto p = bl.cbegin(); CInode *mdsin = add_replica_inode(p, NULL, finished); @@ -10744,7 +10744,7 @@ void MDCache::handle_dentry_link(MDentryLink *m) } auto p = m->bl.cbegin(); - list finished; + MDSInternalContextBase::vec finished; if (dn) { if (m->get_is_primary()) { // primary link. @@ -10898,7 +10898,7 @@ void MDCache::handle_dentry_unlink(MDentryUnlink *m) */ void MDCache::adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits, list& resultfrags, - list& waiters, + MDSInternalContextBase::vec& waiters, bool replay) { dout(10) << "adjust_dir_fragments " << basefrag << " " << bits @@ -10919,7 +10919,7 @@ CDir *MDCache::force_dir_fragment(CInode *diri, frag_t fg, bool replay) dout(10) << "force_dir_fragment " << fg << " on " << *diri << dendl; list src, result; - list waiters; + MDSInternalContextBase::vec waiters; // split a parent? frag_t parent = diri->dirfragtree.get_branch_or_leaf(fg); @@ -10964,7 +10964,7 @@ void MDCache::adjust_dir_fragments(CInode *diri, list& srcfrags, frag_t basefrag, int bits, list& resultfrags, - list& waiters, + MDSInternalContextBase::vec& waiters, bool replay) { dout(10) << "adjust_dir_fragments " << basefrag << " bits " << bits @@ -11546,7 +11546,7 @@ void MDCache::dispatch_fragment_dir(MDRequestRef& mdr) } // refragment - list waiters; + MDSInternalContextBase::vec waiters; adjust_dir_fragments(diri, info.dirs, basedirfrag.frag, info.bits, info.resultfrags, waiters, false); if (g_conf()->mds_debug_frag) @@ -11790,7 +11790,7 @@ void MDCache::handle_fragment_notify(MMDSFragmentNotify *notify) */ // refragment - list waiters; + MDSInternalContextBase::vec waiters; list resultfrags; adjust_dir_fragments(diri, base, bits, resultfrags, waiters, false); if (g_conf()->mds_debug_frag) @@ -11895,7 +11895,7 @@ void MDCache::rollback_uncommitted_fragments() list resultfrags; if (uf.old_frags.empty()) { // created by old format EFragment - list waiters; + MDSInternalContextBase::vec waiters; adjust_dir_fragments(diri, p->first.frag, -uf.bits, resultfrags, waiters, true); } else { auto bp = uf.rollback.cbegin(); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 0b36e951e8201..8e323dbade421 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -285,7 +285,7 @@ public: } // waiters - map > > waiting_for_base_ino; + map > waiting_for_base_ino; void discover_base_ino(inodeno_t want_ino, MDSInternalContextBase *onfinish, mds_rank_t from=MDS_RANK_NONE); void discover_dir_frag(CInode *base, frag_t approx_fg, MDSInternalContextBase *onfinish, @@ -450,7 +450,7 @@ protected: struct umaster { set slaves; LogSegment *ls; - list waiters; + MDSInternalContextBase::vec waiters; bool safe; bool committing; bool recovering; @@ -557,7 +557,7 @@ protected: map > > cap_imports; // ino -> client -> frommds -> capex set cap_imports_missing; - map > cap_reconnect_waiters; + map cap_reconnect_waiters; int cap_imports_num_opening; set rejoin_undef_inodes; @@ -567,7 +567,7 @@ protected: vector rejoin_recover_q, rejoin_check_q; list rejoin_eval_locks; - list rejoin_waiters; + MDSInternalContextBase::vec rejoin_waiters; void rejoin_walk(CDir *dir, MMDSCacheRejoin *rejoin); void handle_cache_rejoin(MMDSCacheRejoin *m); @@ -899,7 +899,7 @@ protected: private: bool opening_root, open; - list waiting_for_open; + MDSInternalContextBase::vec waiting_for_open; public: void init_layouts(); @@ -1000,7 +1000,7 @@ protected: version_t tid; int64_t pool; int last_err; - list waiters; + MDSInternalContextBase::vec waiters; open_ino_info_t() : checking(MDS_RANK_NONE), auth_hint(MDS_RANK_NONE), check_peers(true), fetch_backtrace(true), discover(false), want_replica(false), want_xlocked(false), tid(0), pool(-1), @@ -1089,9 +1089,9 @@ public: void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl, uint64_t features); - CDir* add_replica_dir(bufferlist::const_iterator& p, CInode *diri, mds_rank_t from, list& finished); - CDentry *add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, list& finished); - CInode *add_replica_inode(bufferlist::const_iterator& p, CDentry *dn, list& finished); + CDir* add_replica_dir(bufferlist::const_iterator& p, CInode *diri, mds_rank_t from, MDSInternalContextBase::vec& finished); + CDentry *add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, MDSInternalContextBase::vec& finished); + CInode *add_replica_inode(bufferlist::const_iterator& p, CDentry *dn, MDSInternalContextBase::vec& finished); void replicate_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl); CDentry *add_replica_stray(bufferlist &bl, mds_rank_t from); @@ -1111,7 +1111,7 @@ private: int bits; bool committed; LogSegment *ls; - list waiters; + MDSInternalContextBase::vec waiters; list old_frags; bufferlist rollback; ufragment() : bits(0), committed(false), ls(NULL) {} @@ -1134,12 +1134,12 @@ private: map fragments; void adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits, - list& frags, list& waiters, bool replay); + list& frags, MDSInternalContextBase::vec& waiters, bool replay); void adjust_dir_fragments(CInode *diri, list& srcfrags, frag_t basefrag, int bits, list& resultfrags, - list& waiters, + MDSInternalContextBase::vec& waiters, bool replay); CDir *force_dir_fragment(CInode *diri, frag_t fg, bool replay=true); void get_force_dirfrag_bound_set(vector& dfs, set& bounds); diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 74586ffb4a82a..9cbb64aa0234a 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -874,11 +874,7 @@ void MDLog::_expired(LogSegment *ls) expired_events += ls->num_events; // Trigger all waiters - for (std::list::iterator i = ls->expiry_waiters.begin(); - i != ls->expiry_waiters.end(); ++i) { - (*i)->complete(0); - } - ls->expiry_waiters.clear(); + finish_contexts(g_ceph_context, ls->expiry_waiters); logger->inc(l_mdl_evex, ls->num_events); logger->inc(l_mdl_segex); diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index fa3704be21a96..cbc609a6fbe6a 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -41,6 +41,7 @@ enum { #include "include/types.h" #include "include/Context.h" +#include "MDSContext.h" #include "common/Thread.h" #include "common/Cond.h" @@ -99,7 +100,7 @@ protected: friend class ReplayThread; friend class C_MDL_Replay; - list waitfor_replay; + MDSInternalContextBase::vec waitfor_replay; void _replay(); // old way void _replay_thread(); // new way diff --git a/src/mds/MDSCacheObject.cc b/src/mds/MDSCacheObject.cc index 6286bbe5d1cbd..6c6a676ba857d 100644 --- a/src/mds/MDSCacheObject.cc +++ b/src/mds/MDSCacheObject.cc @@ -8,7 +8,7 @@ uint64_t MDSCacheObject::last_wait_seq = 0; void MDSCacheObject::finish_waiting(uint64_t mask, int result) { - std::list finished; + MDSInternalContextBase::vec finished; take_waiting(mask, finished); finish_contexts(g_ceph_context, finished, result); } diff --git a/src/mds/MDSCacheObject.h b/src/mds/MDSCacheObject.h index 5bad26590bb7b..c2bab86b5b069 100644 --- a/src/mds/MDSCacheObject.h +++ b/src/mds/MDSCacheObject.h @@ -12,6 +12,7 @@ #include "include/xlist.h" #include "mdstypes.h" +#include "MDSContext.h" #define MDS_REF_SET // define me for improved debug output, sanity checking //#define MDS_AUTHPIN_SET // define me for debugging auth pin leaks @@ -332,7 +333,7 @@ protected: // << dendl; } - virtual void take_waiting(uint64_t mask, std::list& ls) { + virtual void take_waiting(uint64_t mask, MDSInternalContextBase::vec& ls) { if (waiting.empty()) return; // process ordered waiters in the same order that they were added. diff --git a/src/mds/MDSContinuation.h b/src/mds/MDSContinuation.h index 0340a20843264..06c320eac5ba5 100644 --- a/src/mds/MDSContinuation.h +++ b/src/mds/MDSContinuation.h @@ -15,6 +15,8 @@ #include "common/Continuation.h" #include "mds/Mutation.h" #include "mds/Server.h" + +#include "MDSContext.h" class MDSContinuation : public Continuation { protected: diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 6865d153efdf4..2289508410e18 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -821,13 +821,11 @@ void MDSRank::_advance_queues() while (!finished_queue.empty()) { dout(7) << "mds has " << finished_queue.size() << " queued contexts" << dendl; dout(10) << finished_queue << dendl; - list ls; + decltype(finished_queue) ls; ls.swap(finished_queue); - while (!ls.empty()) { - dout(10) << " finish " << ls.front() << dendl; - ls.front()->complete(0); - ls.pop_front(); - + for (auto& c : ls) { + dout(10) << " finish " << c << dendl; + c->complete(0); heartbeat_reset(); } } @@ -1537,7 +1535,7 @@ bool MDSRank::queue_one_replay() return false; } queue_waiter(replay_queue.front()); - replay_queue.pop_front(); + replay_queue.pop(); return true; } @@ -1943,9 +1941,9 @@ void MDSRankDispatcher::handle_mds_map( } { - map >::iterator p = waiting_for_mdsmap.begin(); + map::iterator p = waiting_for_mdsmap.begin(); while (p != waiting_for_mdsmap.end() && p->first <= mdsmap->get_epoch()) { - list ls; + MDSInternalContextBase::vec ls; ls.swap(p->second); waiting_for_mdsmap.erase(p++); finish_contexts(g_ceph_context, ls); diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 3a4a48d61d1f7..7cf3be6a65e5b 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -30,6 +30,7 @@ #include "SessionMap.h" #include "MDCache.h" #include "MDLog.h" +#include "MDSContext.h" #include "PurgeQueue.h" #include "osdc/Journaler.h" @@ -248,7 +249,7 @@ class MDSRank { } progress_thread; list waiting_for_nolaggy; - list finished_queue; + MDSInternalContextBase::vec finished_queue; // Dispatch, retry, queues int dispatch_depth; void inc_dispatch_depth() { ++dispatch_depth; } @@ -266,11 +267,11 @@ class MDSRank { ceph_tid_t last_tid; // for mds-initiated requests (e.g. stray rename) - list waiting_for_active, waiting_for_replay, waiting_for_reconnect, waiting_for_resolve; - list waiting_for_any_client_connection; - list replay_queue; - map > waiting_for_active_peer; - map > waiting_for_mdsmap; + MDSInternalContextBase::vec waiting_for_active, waiting_for_replay, waiting_for_reconnect, waiting_for_resolve; + MDSInternalContextBase::vec waiting_for_any_client_connection; + MDSInternalContextBase::que replay_queue; + map waiting_for_active_peer; + map waiting_for_mdsmap; epoch_t osd_epoch_barrier; @@ -300,8 +301,10 @@ class MDSRank { finished_queue.push_back(c); progress_thread.signal(); } - void queue_waiters(std::list& ls) { - finished_queue.splice( finished_queue.end(), ls ); + void queue_waiters(MDSInternalContextBase::vec& ls) { + MDSInternalContextBase::vec v; + v.swap(ls); + finished_queue.insert(finished_queue.end(), v.begin(), v.end()); progress_thread.signal(); } @@ -404,7 +407,7 @@ class MDSRank { waiting_for_mdsmap[e].push_back(c); } void enqueue_replay(MDSInternalContextBase *c) { - replay_queue.push_back(c); + replay_queue.push(c); } bool queue_one_replay(); diff --git a/src/mds/MDSTable.cc b/src/mds/MDSTable.cc index 86c380014c89e..dd5b7ba2e6e5b 100644 --- a/src/mds/MDSTable.cc +++ b/src/mds/MDSTable.cc @@ -104,13 +104,15 @@ void MDSTable::save_2(int r, version_t v) dout(10) << "save_2 v " << v << dendl; committed_version = v; - list ls; + MDSInternalContextBase::vec ls; while (!waitfor_save.empty()) { - if (waitfor_save.begin()->first > v) break; - ls.splice(ls.end(), waitfor_save.begin()->second); - waitfor_save.erase(waitfor_save.begin()); + auto it = waitfor_save.begin(); + if (it->first > v) break; + auto& v = it->second; + ls.insert(ls.end(), v.begin(), v.end()); + waitfor_save.erase(it); } - finish_contexts(g_ceph_context, ls,0); + finish_contexts(g_ceph_context, ls, 0); } diff --git a/src/mds/MDSTable.h b/src/mds/MDSTable.h index ed06aca1872ad..a7a8502ca9d9b 100644 --- a/src/mds/MDSTable.h +++ b/src/mds/MDSTable.h @@ -19,9 +19,9 @@ #include "mds_table_types.h" #include "include/buffer_fwd.h" +#include "MDSContext.h" + class MDSRank; -class Context; -class MDSInternalContextBase; class MDSTable { public: @@ -41,7 +41,7 @@ protected: version_t version, committing_version, committed_version, projected_version; - map > waitfor_save; + map waitfor_save; public: MDSTable(MDSRank *m, const char *n, bool is_per_mds) : diff --git a/src/mds/MDSTableClient.h b/src/mds/MDSTableClient.h index 3eb68c421ae0d..043ffc12664f2 100644 --- a/src/mds/MDSTableClient.h +++ b/src/mds/MDSTableClient.h @@ -50,7 +50,7 @@ protected: // pending commits map pending_commit; - map > ack_waiters; + map ack_waiters; void handle_reply(class MMDSTableQuery *m); void _logged_ack(version_t tid); diff --git a/src/mds/MDSTableServer.h b/src/mds/MDSTableServer.h index 5ace13f93ceb9..5d3f47ce4afa9 100644 --- a/src/mds/MDSTableServer.h +++ b/src/mds/MDSTableServer.h @@ -16,6 +16,7 @@ #define CEPH_MDSTABLESERVER_H #include "MDSTable.h" +#include "MDSContext.h" class MMDSTableRequest; diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 3bfcc4727a266..8da34844c6b2d 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -1528,7 +1528,7 @@ void Migrator::finish_export_inode_caps(CInode *in, mds_rank_t peer, void Migrator::finish_export_inode(CInode *in, mds_rank_t peer, map& peer_imported, - list& finished) + MDSInternalContextBase::vec& finished) { dout(12) << "finish_export_inode " << *in << dendl; @@ -1665,7 +1665,7 @@ uint64_t Migrator::encode_export_dir(bufferlist& exportbl, void Migrator::finish_export_dir(CDir *dir, mds_rank_t peer, map >& peer_imported, - list& finished, int *num_dentries) + MDSInternalContextBase::vec& finished, int *num_dentries) { dout(10) << "finish_export_dir " << *dir << dendl; @@ -2019,7 +2019,7 @@ void Migrator::export_finish(CDir *dir) // finish export (adjust local cache state) int num_dentries = 0; - list finished; + MDSInternalContextBase::vec finished; finish_export_dir(dir, it->second.peer, it->second.peer_imported, finished, &num_dentries); @@ -2241,7 +2241,7 @@ void Migrator::handle_export_prep(MExportDirPrep *m) CDir *dir; CInode *diri; - list finished; + MDSInternalContextBase::vec finished; // assimilate root dir. map::iterator it = import_state.find(m->get_dirfrag()); @@ -2620,7 +2620,7 @@ void Migrator::import_reverse(CDir *dir) cache->adjust_subtree_auth(dir, stat.peer); - C_ContextsBase *fin = new C_ContextsBase(g_ceph_context); + auto fin = new C_ContextsBase(g_ceph_context); if (!dir->get_inode()->is_auth() && !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid())) { dir->get_inode()->clear_scatter_dirty(); @@ -3152,10 +3152,10 @@ int Migrator::decode_import_dir(bufferlist::const_iterator& blp, // take all waiters on this dir // NOTE: a pass of imported data is guaranteed to get all of my waiters because // a replica's presense in my cache implies/forces it's presense in authority's. - list waiters; + MDSInternalContextBase::vec waiters; dir->take_waiting(CDir::WAIT_ANY_MASK, waiters); - for (list::iterator it = waiters.begin(); + for (MDSInternalContextBase::vec::iterator it = waiters.begin(); it != waiters.end(); ++it) import_root->add_waiter(CDir::WAIT_UNFREEZE, *it); // UNFREEZE will get kicked both on success or failure diff --git a/src/mds/Migrator.h b/src/mds/Migrator.h index 5e1a2693b63ae..c4bf0ebb5c532 100644 --- a/src/mds/Migrator.h +++ b/src/mds/Migrator.h @@ -19,6 +19,8 @@ #include "include/types.h" +#include "MDSContext.h" + #include #include #include @@ -312,7 +314,7 @@ public: map& exported_client_metadata_map); void finish_export_inode(CInode *in, mds_rank_t target, map& peer_imported, - list& finished); + MDSInternalContextBase::vec& finished); void finish_export_inode_caps(CInode *in, mds_rank_t target, map& peer_imported); @@ -323,7 +325,7 @@ public: map& exported_client_metadata_map); void finish_export_dir(CDir *dir, mds_rank_t target, map >& peer_imported, - list& finished, int *num_dentries); + MDSInternalContextBase::vec& finished, int *num_dentries); void clear_export_proxy_pins(CDir *dir); diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h index 128867f094731..17b916abf9c87 100644 --- a/src/mds/Mutation.h +++ b/src/mds/Mutation.h @@ -20,6 +20,7 @@ #include "include/filepath.h" #include "MDSCacheObject.h" +#include "MDSContext.h" #include "SimpleLock.h" #include "Capability.h" @@ -262,7 +263,7 @@ struct MDRequestImpl : public MutationImpl { Context *slave_commit; bufferlist rollback_bl; - list waiting_for_finish; + MDSInternalContextBase::vec waiting_for_finish; // export & fragment CDir* export_dir; diff --git a/src/mds/OpenFileTable.h b/src/mds/OpenFileTable.h index c37f264c94179..96e94de8119fb 100644 --- a/src/mds/OpenFileTable.h +++ b/src/mds/OpenFileTable.h @@ -18,10 +18,11 @@ #include "mdstypes.h" #include "Anchor.h" +#include "MDSContext.h" + class CDir; class CInode; class MDSRank; -class MDSInternalContextBase; class OpenFileTable { @@ -104,7 +105,7 @@ protected: std::vector > loaded_journals; map loaded_anchor_map; set loaded_dirfrags; - list waiting_for_load; + MDSInternalContextBase::vec waiting_for_load; bool load_done = false; void _reset_states() { @@ -129,7 +130,7 @@ protected: }; unsigned prefetch_state = 0; unsigned num_opening_inodes = 0; - list waiting_for_prefetch; + MDSInternalContextBase::vec waiting_for_prefetch; void _open_ino_finish(inodeno_t ino, int r); void _prefetch_inodes(); void _prefetch_dirfrags(); diff --git a/src/mds/ScatterLock.h b/src/mds/ScatterLock.h index 8665b93e8a927..9d8ba048b6555 100644 --- a/src/mds/ScatterLock.h +++ b/src/mds/ScatterLock.h @@ -18,6 +18,8 @@ #include "SimpleLock.h" +#include "MDSContext.h" + class ScatterLock : public SimpleLock { struct more_bits_t { @@ -194,7 +196,7 @@ public: encode(s, bl); } - void decode_state_rejoin(bufferlist::const_iterator& p, list& waiters, bool survivor) { + void decode_state_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters, bool survivor) { SimpleLock::decode_state_rejoin(p, waiters, survivor); if (is_flushing()) { set_dirty(); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index b717184857f9c..f7a9fe7b6dbb6 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -521,7 +521,7 @@ void Server::flush_client_sessions(set& client_set, MDSGatherBuilder& void Server::finish_flush_session(Session *session, version_t seq) { - list finished; + MDSInternalContextBase::vec finished; session->finish_flush(seq, finished); mds->queue_waiters(finished); } @@ -4213,7 +4213,7 @@ void Server::handle_client_file_setlock(MDRequestRef& mdr) dout(10) << " state prior to lock change: " << *lock_state << dendl; if (CEPH_LOCK_UNLOCK == set_lock.type) { list activated_locks; - list waiters; + MDSInternalContextBase::vec waiters; if (lock_state->is_waiting(set_lock)) { dout(10) << " unlock removing waiting lock " << set_lock << dendl; lock_state->remove_waiting(set_lock); @@ -8467,7 +8467,7 @@ void Server::_commit_slave_rename(MDRequestRef& mdr, int r, CDentry::linkage_t *destdnl = destdn->get_linkage(); - list finished; + MDSInternalContextBase::vec finished; if (r == 0) { // unfreeze+singleauth inode // hmm, do i really need to delay this? @@ -8978,7 +8978,7 @@ void Server::_rename_rollback_finish(MutationRef& mut, MDRequestRef& mdr, CDentr } if (mdr) { - list finished; + MDSInternalContextBase::vec finished; if (mdr->more()->is_ambiguous_auth) { if (srcdn->is_auth()) mdr->more()->rename_inode->unfreeze_inode(finished); diff --git a/src/mds/Server.h b/src/mds/Server.h index 39a4dcc6683ef..0b78858721b64 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -19,6 +19,7 @@ #include "MDSRank.h" #include "Mutation.h" +#include "MDSContext.h" class OSDMap; class PerfCounters; diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index f2fd342f6c916..0ce4dad90b8fc 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -33,6 +33,7 @@ struct MDRequestImpl; #include "CInode.h" #include "Capability.h" +#include "MDSContext.h" #include "msg/Message.h" enum { @@ -201,7 +202,7 @@ public: // -- caps -- private: version_t cap_push_seq; // cap push seq # - map > waitfor_flush; // flush session messages + map waitfor_flush; // flush session messages public: xlist caps; // inodes with caps; front=most recently used @@ -216,12 +217,14 @@ public: waitfor_flush[get_push_seq()].push_back(c); return get_push_seq(); } - void finish_flush(version_t seq, list& ls) { + void finish_flush(version_t seq, MDSInternalContextBase::vec& ls) { while (!waitfor_flush.empty()) { - if (waitfor_flush.begin()->first > seq) + auto it = waitfor_flush.begin(); + if (it->first > seq) break; - ls.splice(ls.end(), waitfor_flush.begin()->second); - waitfor_flush.erase(waitfor_flush.begin()); + auto& v = it->second; + ls.insert(ls.end(), v.begin(), v.end()); + waitfor_flush.erase(it); } } @@ -447,7 +450,7 @@ protected: public: map* > by_state; uint64_t set_state(Session *session, int state); - map > commit_waiters; + map commit_waiters; explicit SessionMap(MDSRank *m) : mds(m), projected(0), committing(0), committed(0), @@ -595,7 +598,7 @@ public: // -- loading, saving -- inodeno_t ino; - list waiting_for_load; + MDSInternalContextBase::vec waiting_for_load; object_t get_object_name() const; diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 17b3f85619496..0c839338d6922 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -305,7 +305,7 @@ public: void finish_waiters(uint64_t mask, int r=0) { parent->finish_waiting(mask << get_wait_shift(), r); } - void take_waiting(uint64_t mask, list& ls) { + void take_waiting(uint64_t mask, MDSInternalContextBase::vec& ls) { parent->take_waiting(mask << get_wait_shift(), ls); } void add_waiter(uint64_t mask, MDSInternalContextBase *c) { @@ -324,7 +324,7 @@ public: //assert(!is_stable() || gather_set.size() == 0); // gather should be empty in stable states. return s; } - void set_state_rejoin(int s, list& waiters, bool survivor) { + void set_state_rejoin(int s, MDSInternalContextBase::vec& waiters, bool survivor) { assert(!get_parent()->is_auth()); // If lock in the replica object was not in SYNC state when auth mds of the object failed. @@ -589,7 +589,7 @@ public: if (is_new) state = s; } - void decode_state_rejoin(bufferlist::const_iterator& p, list& waiters, bool survivor) { + void decode_state_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters, bool survivor) { __s16 s; using ceph::decode; decode(s, p); diff --git a/src/mds/SnapClient.cc b/src/mds/SnapClient.cc index ca49e2219bf04..d3379fee2c968 100644 --- a/src/mds/SnapClient.cc +++ b/src/mds/SnapClient.cc @@ -97,13 +97,14 @@ void SnapClient::handle_query_result(MMDSTableRequest *m) synced = true; if (synced && !waiting_for_version.empty()) { - std::list finished; - for (auto p = waiting_for_version.begin(); - p != waiting_for_version.end(); ) { - if (p->first > cached_version) + MDSInternalContextBase::vec finished; + while (!waiting_for_version.empty()) { + auto it = waiting_for_version.begin(); + if (it->first > cached_version) break; - finished.splice(finished.end(), p->second); - waiting_for_version.erase(p++); + auto& v = it->second; + finished.insert(finished.end(), v.begin(), v.end()); + waiting_for_version.erase(it); } if (!finished.empty()) mds->queue_waiters(finished); diff --git a/src/mds/SnapClient.h b/src/mds/SnapClient.h index b9d8d71cbb813..cf711231b37aa 100644 --- a/src/mds/SnapClient.h +++ b/src/mds/SnapClient.h @@ -19,8 +19,8 @@ #include "MDSTableClient.h" #include "snap.h" +#include "MDSContext.h" -class MDSInternalContextBase; class MDSRank; class LogSegment; @@ -33,7 +33,7 @@ class SnapClient : public MDSTableClient { set committing_tids; - map > waiting_for_version; + map waiting_for_version; uint64_t sync_reqid; bool synced; diff --git a/src/mds/SnapRealm.h b/src/mds/SnapRealm.h index d904852167b94..e16125a390457 100644 --- a/src/mds/SnapRealm.h +++ b/src/mds/SnapRealm.h @@ -22,8 +22,7 @@ #include "include/xlist.h" #include "include/elist.h" #include "common/snap_types.h" - -class MDSInternalContextBase; +#include "MDSContext.h" struct SnapRealm { protected: diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 12b0539c2e8f6..58939570d7d98 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -2722,7 +2722,7 @@ void EFragment::replay(MDSRank *mds) dout(10) << "EFragment.replay " << op_name(op) << " " << ino << " " << basefrag << " by " << bits << dendl; list resultfrags; - list waiters; + MDSInternalContextBase::vec waiters; list old_frags; // in may be NULL if it wasn't in our cache yet. if it's a prepare