]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use vector for context lists 23195/head
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 24 Jul 2018 13:51:28 +0000 (06:51 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 25 Jul 2018 23:05:34 +0000 (16:05 -0700)
Commands executed:

    sed -i 's/\([^:]\)list<MDSInternalContextBase[[:space:]]*\*>/\1MDSInternalContextBase::vec/g' *.cc *.h
    sed -i 's/std::list<MDSInternalContextBase[[:space:]]*\*>/MDSInternalContextBase::vec/g' *.cc *.h

With various incidental fixes.

Fixes: http://tracker.ceph.com/issues/25111
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
34 files changed:
src/mds/CDentry.h
src/mds/CDir.cc
src/mds/CDir.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc
src/mds/Locker.h
src/mds/LogSegment.h
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDSCacheObject.cc
src/mds/MDSCacheObject.h
src/mds/MDSContinuation.h
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/MDSTable.cc
src/mds/MDSTable.h
src/mds/MDSTableClient.h
src/mds/MDSTableServer.h
src/mds/Migrator.cc
src/mds/Migrator.h
src/mds/Mutation.h
src/mds/OpenFileTable.h
src/mds/ScatterLock.h
src/mds/Server.cc
src/mds/Server.h
src/mds/SessionMap.h
src/mds/SimpleLock.h
src/mds/SnapClient.cc
src/mds/SnapClient.h
src/mds/SnapRealm.h
src/mds/journal.cc

index c417bb261ac2f1d7c577aa78b02424248f190d2f..556a03a437a05d939f2be331b858c715d0face47 100644 (file)
@@ -29,6 +29,7 @@
 #include "include/filepath.h"
 
 #include "MDSCacheObject.h"
+#include "MDSContext.h"
 #include "SimpleLock.h"
 #include "LocalLock.h"
 #include "ScrubHeader.h"
index dbf3f809dca729d58cc6df4057daa03c5c1ab5a3..d0b231e1fc9c5bfc516e0cf8c76a6f87ed21e275 100644 (file)
@@ -905,7 +905,7 @@ void CDir::steal_dentry(CDentry *dn)
   dn->dir = this;
 }
 
-void CDir::prepare_old_fragment(map<string_snap_t, std::list<MDSInternalContextBase*> >& dentry_waiters, bool replay)
+void CDir::prepare_old_fragment(map<string_snap_t, MDSInternalContextBase::vec >& 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<MDSInternalContextBase*>& 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<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool replay)
+void CDir::split(int bits, list<CDir*>& 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<CDir*>& subs, list<MDSInternalContextBase*>& wai
     fragstatdiff.add_delta(fnode.accounted_fragstat, fnode.fragstat);
   dout(10) << " rstatdiff " << rstatdiff << " fragstatdiff " << fragstatdiff << dendl;
 
-  map<string_snap_t, std::list<MDSInternalContextBase*> > dentry_waiters;
+  map<string_snap_t, MDSInternalContextBase::vec > dentry_waiters;
   prepare_old_fragment(dentry_waiters, replay);
 
   // create subfrag dirs
@@ -1086,7 +1086,7 @@ void CDir::split(int bits, list<CDir*>& subs, list<MDSInternalContextBase*>& wai
   finish_old_fragment(waiters, replay);
 }
 
-void CDir::merge(list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool replay)
+void CDir::merge(list<CDir*>& subs, MDSInternalContextBase::vec& waiters, bool replay)
 {
   dout(10) << "merge " << subs << dendl;
 
@@ -1108,7 +1108,7 @@ void CDir::merge(list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool
   version_t rstat_version = inode->get_projected_inode()->rstat.version;
   version_t dirstat_version = inode->get_projected_inode()->dirstat.version;
 
-  map<string_snap_t, std::list<MDSInternalContextBase*> > dentry_waiters;
+  map<string_snap_t, MDSInternalContextBase::vec > 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> ls;
+    MDSInternalContextBase::vec ls;
     take_waiting(WAIT_SINGLEAUTH, ls);
     cache->mds->queue_waiters(ls);
   }
index fceedfa727bcc3ba1db50bd61f33bf983d5f8866..0bbd3f1caff7405d422757275d7c8643dfbc1ddb 100644 (file)
@@ -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<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool replay);
-  void merge(std::list<CDir*>& subs, std::list<MDSInternalContextBase*>& waiters, bool replay);
+  void split(int bits, std::list<CDir*>& subs, MDSInternalContextBase::vec& waiters, bool replay);
+  void merge(std::list<CDir*>& 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<string_snap_t, std::list<MDSInternalContextBase*> >& dentry_waiters, bool replay);
+  void prepare_old_fragment(map<string_snap_t, MDSInternalContextBase::vec >& dentry_waiters, bool replay);
   void steal_dentry(CDentry *dn);  // from another dir.  used by merge/split.
-  void finish_old_fragment(std::list<MDSInternalContextBase*>& 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<version_t, mempool::mds_co::list<MDSInternalContextBase*> > waiting_for_commit;
+  mempool::mds_co::compact_map<version_t, MDSInternalContextBase::vec_alloc<mempool::mds_co::pool_allocator> > 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<snapid_t> *snaps);
@@ -694,18 +695,18 @@ public:
 
   // -- waiters --
 protected:
-  mempool::mds_co::compact_map< string_snap_t, mempool::mds_co::list<MDSInternalContextBase*> > waiting_on_dentry; // FIXME string_snap_t not in mempool
+  mempool::mds_co::compact_map< string_snap_t, MDSInternalContextBase::vec_alloc<mempool::mds_co::pool_allocator> > 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<MDSInternalContextBase*>& ls);
-  void take_sub_waiting(std::list<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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
   
 
index d7c92409f3bf704b29075f9310dd377cb09b1273..e17241b23e2fd662f9995b72d7d51b325b641ff1 100644 (file)
@@ -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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& finished)
 
 void CInode::unfreeze_inode()
 {
-    list<MDSInternalContextBase*> 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<MDSInternalContextBase*> finished;
+    MDSInternalContextBase::vec finished;
     take_waiting(WAIT_UNFREEZE, finished);
     mdcache->mds->queue_waiters(finished);
   }
 }
 
-void CInode::clear_ambiguous_auth(list<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& finished)
 
 void CInode::clear_ambiguous_auth()
 {
-  list<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*>& waiters,
+void CInode::_decode_locks_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters,
                                  list<SimpleLock*>& eval_locks, bool survivor)
 {
   authlock.decode_state_rejoin(p, waiters, survivor);
index 083ddfb00e2d32cd9e2a8655388df518bb6ad02b..ef72340aa25c34b5936c7846d655ea4ba197676e 100644 (file)
@@ -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<MDSInternalContextBase*>& 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<frag_t, std::list<MDSInternalContextBase*> > waiting_on_dir;
+  mempool::mds_co::compact_map<frag_t, MDSInternalContextBase::vec > waiting_on_dir;
 public:
   void add_dir_waiter(frag_t fg, MDSInternalContextBase *c);
-  void take_dir_waiting(frag_t fg, std::list<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& waiters,
+  void _decode_locks_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters,
                            std::list<SimpleLock*>& 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<MDSInternalContextBase*>& finished);
+  void unfreeze_inode(MDSInternalContextBase::vec& finished);
   void unfreeze_inode();
 
   void freeze_auth_pin();
index 72c2c5182cb5665451c32209d0d4f412d51cd7ee..de9160ec517c93416617639dc18baff22f48a9ad 100644 (file)
@@ -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<MDSInternalContextBase*> *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<M
 bool Locker::eval(CInode *in, int mask, bool caps_imported)
 {
   bool need_issue = caps_imported;
-  list<MDSInternalContextBase*> 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<CInode*> *issue_set)
 {
   bool need_issue = false;
-  list<MDSInternalContextBase*> finishers;
+  MDSInternalContextBase::vec finishers;
 
   // kick locks now
   if (!in->filelock.is_stable())
@@ -1228,7 +1228,7 @@ void Locker::eval_cap_gather(CInode *in, set<CInode*> *issue_set)
 void Locker::eval_scatter_gathers(CInode *in)
 {
   bool need_issue = false;
-  list<MDSInternalContextBase*> finishers;
+  MDSInternalContextBase::vec finishers;
 
   dout(10) << "eval_scatter_gathers " << *in << dendl;
 
index f3dd5ca516486660c606cefa68e7c4c2297768a6..4e77ef9369d9af2a0836be42a6d65083248f744a 100644 (file)
@@ -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<CInode*> *pneed_issue=0);
   void drop_rdlocks_for_early_reply(MutationImpl *mut);
 
-  void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list<MDSInternalContextBase*> *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<MDSInternalContextBase*> *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())
index f5ef2078a19bd886e7a89c1cb84589ad7a10696e..cff5dea0df7584db994998268e11c6ab09e69c7e 100644 (file)
 #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<MDSInternalContextBase*> expiry_waiters;
+  MDSInternalContextBase::vec expiry_waiters;
 
   void wait_for_expiry(MDSInternalContextBase *c)
   {
index c465d6cc70a366f778c038e7077866722beba03d..1aeb03598f65bdef469f7265a80a6cd8fc4aa77e 100644 (file)
@@ -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<MDSInternalContextBase*> waiters;
+  MDSInternalContextBase::vec waiters;
 
   // wake up any waiters in their subtrees
   for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
@@ -5813,7 +5813,7 @@ void MDCache::export_remaining_imported_caps()
     mds->heartbeat_reset();
   }
 
-  for (map<inodeno_t, list<MDSInternalContextBase*> >::iterator p = cap_reconnect_waiters.begin();
+  for (map<inodeno_t, MDSInternalContextBase::vec >::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<inodeno_t, list<MDSInternalContextBase*> >::iterator it =
+    map<inodeno_t, MDSInternalContextBase::vec >::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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<CDir*>& resultfrags, 
-                                  list<MDSInternalContextBase*>& 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<CDir*> src, result;
-  list<MDSInternalContextBase*> 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<CDir*>& srcfrags,
                                   frag_t basefrag, int bits,
                                   list<CDir*>& resultfrags, 
-                                  list<MDSInternalContextBase*>& 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> waiters;
+    MDSInternalContextBase::vec waiters;
     list<CDir*> 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<CDir*> resultfrags;
     if (uf.old_frags.empty()) {
       // created by old format EFragment
-      list<MDSInternalContextBase*> waiters;
+      MDSInternalContextBase::vec waiters;
       adjust_dir_fragments(diri, p->first.frag, -uf.bits, resultfrags, waiters, true);
     } else {
       auto bp = uf.rollback.cbegin();
index 0b36e951e820119ad013cd969701327600a53d76..8e323dbade42136f74e102ce25d2f3a095e4d51f 100644 (file)
@@ -285,7 +285,7 @@ public:
   }
 
   // waiters
-  map<int, map<inodeno_t, list<MDSInternalContextBase*> > > waiting_for_base_ino;
+  map<int, map<inodeno_t, MDSInternalContextBase::vec > > 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<mds_rank_t> slaves;
     LogSegment *ls;
-    list<MDSInternalContextBase*> waiters;
+    MDSInternalContextBase::vec waiters;
     bool safe;
     bool committing;
     bool recovering;
@@ -557,7 +557,7 @@ protected:
 
   map<inodeno_t,map<client_t,map<mds_rank_t,cap_reconnect_t> > > cap_imports;  // ino -> client -> frommds -> capex
   set<inodeno_t> cap_imports_missing;
-  map<inodeno_t, list<MDSInternalContextBase*> > cap_reconnect_waiters;
+  map<inodeno_t, MDSInternalContextBase::vec > cap_reconnect_waiters;
   int cap_imports_num_opening;
   
   set<CInode*> rejoin_undef_inodes;
@@ -567,7 +567,7 @@ protected:
 
   vector<CInode*> rejoin_recover_q, rejoin_check_q;
   list<SimpleLock*> rejoin_eval_locks;
-  list<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*>& finished);
-  CDentry *add_replica_dentry(bufferlist::const_iterator& p, CDir *dir, list<MDSInternalContextBase*>& finished);
-  CInode *add_replica_inode(bufferlist::const_iterator& p, CDentry *dn, list<MDSInternalContextBase*>& 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<MDSInternalContextBase*> waiters;
+    MDSInternalContextBase::vec waiters;
     list<frag_t> old_frags;
     bufferlist rollback;
     ufragment() : bits(0), committed(false), ls(NULL) {}
@@ -1134,12 +1134,12 @@ private:
   map<dirfrag_t,fragment_info_t> fragments;
 
   void adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits,
-                           list<CDir*>& frags, list<MDSInternalContextBase*>& waiters, bool replay);
+                           list<CDir*>& frags, MDSInternalContextBase::vec& waiters, bool replay);
   void adjust_dir_fragments(CInode *diri,
                            list<CDir*>& srcfrags,
                            frag_t basefrag, int bits,
                            list<CDir*>& resultfrags, 
-                           list<MDSInternalContextBase*>& 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<dirfrag_t>& dfs, set<CDir*>& bounds);
index 74586ffb4a82a77a68ad26d9c84943195e990084..9cbb64aa0234a0286f429541d560c00d942caf04 100644 (file)
@@ -874,11 +874,7 @@ void MDLog::_expired(LogSegment *ls)
     expired_events += ls->num_events;
 
     // Trigger all waiters
-    for (std::list<MDSInternalContextBase*>::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);
index fa3704be21a963338d3a162c12bd5868f91d9888..cbc609a6fbe6a5f1c8cebf9fec300301062c983c 100644 (file)
@@ -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<MDSInternalContextBase*> waitfor_replay;
+  MDSInternalContextBase::vec waitfor_replay;
 
   void _replay();         // old way
   void _replay_thread();  // new way
index 6286bbe5d1cbd35f6c2df1913f96a2d93fc64a4c..6c6a676ba857d719ed2633ddbcf96a6f9d5ccd47 100644 (file)
@@ -8,7 +8,7 @@
 uint64_t MDSCacheObject::last_wait_seq = 0;
 
 void MDSCacheObject::finish_waiting(uint64_t mask, int result) {
-  std::list<MDSInternalContextBase*> finished;
+  MDSInternalContextBase::vec finished;
   take_waiting(mask, finished);
   finish_contexts(g_ceph_context, finished, result);
 }
index 5bad26590bb7ba076da040924944b5a7249c413f..c2bab86b5b06902e3678409a6257c451ee0695b1 100644 (file)
@@ -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<MDSInternalContextBase*>& 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.
index 0340a208432645d35138df117fb426be8d700863..06c320eac5ba52440262eaa347c25b897aef0dc6 100644 (file)
@@ -15,6 +15,8 @@
 #include "common/Continuation.h"
 #include "mds/Mutation.h"
 #include "mds/Server.h"
+
+#include "MDSContext.h"
  
 class MDSContinuation : public Continuation {
 protected:
index 6865d153efdf4c9671dcdd912fda8cd942c5b1bb..2289508410e18b8bc7b9a73f32dc2738ac344148 100644 (file)
@@ -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<MDSInternalContextBase*> 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<epoch_t,list<MDSInternalContextBase*> >::iterator p = waiting_for_mdsmap.begin();
+    map<epoch_t,MDSInternalContextBase::vec >::iterator p = waiting_for_mdsmap.begin();
     while (p != waiting_for_mdsmap.end() && p->first <= mdsmap->get_epoch()) {
-      list<MDSInternalContextBase*> ls;
+      MDSInternalContextBase::vec ls;
       ls.swap(p->second);
       waiting_for_mdsmap.erase(p++);
       finish_contexts(g_ceph_context, ls);
index 3a4a48d61d1f7bcce790dcb5631461b2df2d1fd4..7cf3be6a65e5b3600d8ff4d2663bcb9fc68cfa12 100644 (file)
@@ -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<Message*> waiting_for_nolaggy;
-    list<MDSInternalContextBase*> 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<MDSInternalContextBase*> waiting_for_active, waiting_for_replay, waiting_for_reconnect, waiting_for_resolve;
-    list<MDSInternalContextBase*> waiting_for_any_client_connection;
-    list<MDSInternalContextBase*> replay_queue;
-    map<mds_rank_t, list<MDSInternalContextBase*> > waiting_for_active_peer;
-    map<epoch_t, list<MDSInternalContextBase*> > 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<mds_rank_t, MDSInternalContextBase::vec > waiting_for_active_peer;
+    map<epoch_t, MDSInternalContextBase::vec > 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<MDSInternalContextBase*>& 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();
index 86c380014c89e0164100fc66a458d1173073b717..dd5b7ba2e6e5b6aa229f4dbfa3e9722a6239e33e 100644 (file)
@@ -104,13 +104,15 @@ void MDSTable::save_2(int r, version_t v)
   dout(10) << "save_2 v " << v << dendl;
   committed_version = v;
   
-  list<MDSInternalContextBase*> 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);
 }
 
 
index ed06aca1872ad4dc4e33b58e3656a39bc57bece8..a7a8502ca9d9bedad69c60ed571b904a0f4b6ecb 100644 (file)
@@ -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<version_t, list<MDSInternalContextBase*> > waitfor_save;
+  map<version_t, MDSInternalContextBase::vec > waitfor_save;
   
 public:
   MDSTable(MDSRank *m, const char *n, bool is_per_mds) :
index 3eb68c421ae0d64c1a474cedb412234131b44829..043ffc12664f22c2161091c34a0c7bf88357baf7 100644 (file)
@@ -50,7 +50,7 @@ protected:
 
   // pending commits
   map<version_t, LogSegment*> pending_commit;
-  map<version_t, list<MDSInternalContextBase*> > ack_waiters;
+  map<version_t, MDSInternalContextBase::vec > ack_waiters;
 
   void handle_reply(class MMDSTableQuery *m);  
   void _logged_ack(version_t tid);
index 5ace13f93ceb94941cc130da9761f3cca6e2f110..5d3f47ce4afa95ea2ab8fcdf2ff6a20da8eb84ed 100644 (file)
@@ -16,6 +16,7 @@
 #define CEPH_MDSTABLESERVER_H
 
 #include "MDSTable.h"
+#include "MDSContext.h"
 
 class MMDSTableRequest;
 
index 3bfcc4727a26617a0fb8c7a275cf3255aa9ff84d..8da34844c6b2d9ec99523879a10afea50ed377f0 100644 (file)
@@ -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<client_t,Capability::Import>& peer_imported,
-                                  list<MDSInternalContextBase*>& 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<inodeno_t,map<client_t,Capability::Import> >& peer_imported,
-                                list<MDSInternalContextBase*>& 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> finished;
+  MDSInternalContextBase::vec finished;
 
   // assimilate root dir.
   map<dirfrag_t,import_state_t>::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<MDSInternalContextBase, MDSInternalContextGather> *fin = new C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather>(g_ceph_context);
+  auto fin = new C_ContextsBase<MDSInternalContextBase, MDSInternalContextGather, MDSInternalContextBase::vec>(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<MDSInternalContextBase*> waiters;
+  MDSInternalContextBase::vec waiters;
   
   dir->take_waiting(CDir::WAIT_ANY_MASK, waiters);
-  for (list<MDSInternalContextBase*>::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
index 5e1a2693b63aed2001ec13bad96934032a39b9c0..c4bf0ebb5c532f8d7196a351e36f5113b16576b0 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "include/types.h"
 
+#include "MDSContext.h"
+
 #include <map>
 #include <list>
 #include <set>
@@ -312,7 +314,7 @@ public:
                                map<client_t,client_metadata_t>& exported_client_metadata_map);
   void finish_export_inode(CInode *in, mds_rank_t target,
                           map<client_t,Capability::Import>& peer_imported,
-                          list<MDSInternalContextBase*>& finished);
+                          MDSInternalContextBase::vec& finished);
   void finish_export_inode_caps(CInode *in, mds_rank_t target,
                                map<client_t,Capability::Import>& peer_imported);
 
@@ -323,7 +325,7 @@ public:
                        map<client_t,client_metadata_t>& exported_client_metadata_map);
   void finish_export_dir(CDir *dir, mds_rank_t target,
                         map<inodeno_t,map<client_t,Capability::Import> >& peer_imported,
-                        list<MDSInternalContextBase*>& finished, int *num_dentries);
+                        MDSInternalContextBase::vec& finished, int *num_dentries);
 
   void clear_export_proxy_pins(CDir *dir);
 
index 128867f094731ccd9fff9a342b7a90d22e0f1a0e..17b916abf9c87d8535f733e737403f56432e31ab 100644 (file)
@@ -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<MDSInternalContextBase*> waiting_for_finish;
+    MDSInternalContextBase::vec waiting_for_finish;
 
     // export & fragment
     CDir* export_dir;
index c37f264c94179a125aa8752f0f34fc59b0b7a329..96e94de8119fb35a363f0a9641989e017759c09e 100644 (file)
 #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<std::map<std::string, bufferlist> > loaded_journals;
   map<inodeno_t, RecoveredAnchor> loaded_anchor_map;
   set<dirfrag_t> loaded_dirfrags;
-  list<MDSInternalContextBase*> 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<MDSInternalContextBase*> waiting_for_prefetch;
+  MDSInternalContextBase::vec waiting_for_prefetch;
   void _open_ino_finish(inodeno_t ino, int r);
   void _prefetch_inodes();
   void _prefetch_dirfrags();
index 8665b93e8a927482d47614a152244f5a4b450cf8..9d8ba048b655534e8029e86bf8fbe8d4374cf72a 100644 (file)
@@ -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<MDSInternalContextBase*>& 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();
index b717184857f9ce9216c745c5a7362d3a5c5c1729..f7a9fe7b6dbb64e50a76f7a6831cc905d348e5da 100644 (file)
@@ -521,7 +521,7 @@ void Server::flush_client_sessions(set<client_t>& client_set, MDSGatherBuilder&
 
 void Server::finish_flush_session(Session *session, version_t seq)
 {
-  list<MDSInternalContextBase*> 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<ceph_filelock> activated_locks;
-    list<MDSInternalContextBase*> 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<MDSInternalContextBase*> 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<MDSInternalContextBase*> finished;
+    MDSInternalContextBase::vec finished;
     if (mdr->more()->is_ambiguous_auth) {
       if (srcdn->is_auth())
        mdr->more()->rename_inode->unfreeze_inode(finished);
index 39a4dcc6683efe8437041c67b83c5d4532ce3e92..0b78858721b64f2be8d0c41f3224b56e8b853c82 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "MDSRank.h"
 #include "Mutation.h"
+#include "MDSContext.h"
 
 class OSDMap;
 class PerfCounters;
index f2fd342f6c9169eb4f254b6ec2d176c5cf33ecf4..0ce4dad90b8fc6f6ca8cfbfb4e0b734cef0e1e20 100644 (file)
@@ -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<version_t, list<MDSInternalContextBase*> > waitfor_flush; // flush session messages
+  map<version_t, MDSInternalContextBase::vec > waitfor_flush; // flush session messages
 
 public:
   xlist<Capability*> 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<MDSInternalContextBase*>& 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<int,xlist<Session*>* > by_state;
   uint64_t set_state(Session *session, int state);
-  map<version_t, list<MDSInternalContextBase*> > commit_waiters;
+  map<version_t, MDSInternalContextBase::vec > 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<MDSInternalContextBase*> waiting_for_load;
+  MDSInternalContextBase::vec waiting_for_load;
 
   object_t get_object_name() const;
 
index 17b3f85619496251e7fa4dc99bd8430c71fdab81..0c839338d6922297e8c3d31f34a311cf320af5ce 100644 (file)
@@ -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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& 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<MDSInternalContextBase*>& waiters, bool survivor) {
+  void decode_state_rejoin(bufferlist::const_iterator& p, MDSInternalContextBase::vec& waiters, bool survivor) {
     __s16 s;
     using ceph::decode;
     decode(s, p);
index ca49e2219bf04ae17d4b3a8b180ad33fb978ed30..d3379fee2c9689d5d36f6bfc911315ceb611170d 100644 (file)
@@ -97,13 +97,14 @@ void SnapClient::handle_query_result(MMDSTableRequest *m)
     synced = true;
 
   if (synced && !waiting_for_version.empty()) {
-    std::list<MDSInternalContextBase*> 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);
index b9d8d71cbb8136f7316faf2aeaf089fa5dc0b21d..cf711231b37aa1c57590b86fbf679ff89b1a1b6f 100644 (file)
@@ -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<version_t> committing_tids;
 
-  map<version_t, std::list<MDSInternalContextBase*> > waiting_for_version;
+  map<version_t, MDSInternalContextBase::vec > waiting_for_version;
 
   uint64_t sync_reqid;
   bool synced;
index d904852167b942f72a5ba10e181b3dcb8891982f..e16125a3904574d151392d6a35dd93fe7b4c372b 100644 (file)
@@ -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:
index 12b0539c2e8f6fd8cc72a6237f1415263692f148..58939570d7d98410104008b54cd33f286944433b 100644 (file)
@@ -2722,7 +2722,7 @@ void EFragment::replay(MDSRank *mds)
   dout(10) << "EFragment.replay " << op_name(op) << " " << ino << " " << basefrag << " by " << bits << dendl;
 
   list<CDir*> resultfrags;
-  list<MDSInternalContextBase*> waiters;
+  MDSInternalContextBase::vec waiters;
   list<frag_t> old_frags;
 
   // in may be NULL if it wasn't in our cache yet.  if it's a prepare