]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: move CDir container members to mempool
authorPatrick Donnelly <pdonnell@redhat.com>
Fri, 12 Jan 2018 19:50:19 +0000 (11:50 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 7 Feb 2018 14:40:46 +0000 (06:40 -0800)
Partial-fix: http://tracker.ceph.com/issues/21402

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mds/CDir.cc
src/mds/CDir.h
src/mds/CInode.cc
src/mds/MDBalancer.cc
src/mds/MDCache.cc
src/mds/MDSRank.h
src/mds/Migrator.cc
src/mds/Server.cc
src/messages/MDirUpdate.h

index c7be753a246b2c5327170c7d1aa02d94923eb346..cb0cd07778db6c556605901f4f7d72859577be89 100644 (file)
@@ -229,7 +229,7 @@ bool CDir::check_rstats(bool scrub)
 
   frag_info_t frag_info;
   nest_info_t nest_info;
-  for (map_t::iterator i = items.begin(); i != items.end(); ++i) {
+  for (auto i = items.begin(); i != items.end(); ++i) {
     if (i->second->last != CEPH_NOSNAP)
       continue;
     CDentry::linkage_t *dnl = i->second->get_linkage();
@@ -271,7 +271,7 @@ bool CDir::check_rstats(bool scrub)
 
   if (!good) {
     if (!scrub) {
-      for (map_t::iterator i = items.begin(); i != items.end(); ++i) {
+      for (auto i = items.begin(); i != items.end(); ++i) {
        CDentry *dn = i->second;
        if (dn->get_linkage()->is_primary()) {
          CInode *in = dn->get_linkage()->inode;
@@ -295,8 +295,7 @@ bool CDir::check_rstats(bool scrub)
 CDentry *CDir::lookup(std::string_view name, snapid_t snap)
 { 
   dout(20) << "lookup (" << snap << ", '" << name << "')" << dendl;
-  map_t::iterator iter = items.lower_bound(dentry_key_t(snap, name,
-                                                       inode->hash_dentry_name(name)));
+  auto iter = items.lower_bound(dentry_key_t(snap, name, inode->hash_dentry_name(name)));
   if (iter == items.end())
     return 0;
   if (iter->second->get_name() == name &&
@@ -310,8 +309,7 @@ CDentry *CDir::lookup(std::string_view name, snapid_t snap)
 }
 
 CDentry *CDir::lookup_exact_snap(std::string_view name, snapid_t last) {
-  map_t::iterator p = items.find(dentry_key_t(last, name,
-                                             inode->hash_dentry_name(name)));
+  auto p = items.find(dentry_key_t(last, name, inode->hash_dentry_name(name)));
   if (p == items.end())
     return NULL;
   return p->second;
@@ -692,7 +690,7 @@ bool CDir::is_in_bloom(std::string_view name)
 void CDir::remove_null_dentries() {
   dout(12) << __func__ << " " << *this << dendl;
 
-  CDir::map_t::iterator p = items.begin();
+  auto p = items.begin();
   while (p != items.end()) {
     CDentry *dn = p->second;
     ++p;
@@ -720,7 +718,7 @@ void CDir::try_remove_dentries_for_stray()
   // clear dirty only when the directory was not snapshotted
   bool clear_dirty = !inode->snaprealm;
 
-  CDir::map_t::iterator p = items.begin();
+  auto p = items.begin();
   while (p != items.end()) {
     CDentry *dn = p->second;
     ++p;
@@ -787,7 +785,7 @@ void CDir::purge_stale_snap_data(const set<snapid_t>& snaps)
 {
   dout(10) << __func__ << " " << snaps << dendl;
 
-  CDir::map_t::iterator p = items.begin();
+  auto p = items.begin();
   while (p != items.end()) {
     CDentry *dn = p->second;
     ++p;
@@ -882,8 +880,12 @@ void CDir::prepare_old_fragment(map<string_snap_t, std::list<MDSInternalContextB
     auth_pin(this);
 
   if (!waiting_on_dentry.empty()) {
-    for (auto p = waiting_on_dentry.begin(); p != waiting_on_dentry.end(); ++p)
-      dentry_waiters[p->first].swap(p->second);
+    for (const auto &p : waiting_on_dentry) {
+      auto &e = dentry_waiters[p.first];
+      for (const auto &waiter : p.second) {
+        e.push_back(waiter);
+      }
+    }
     waiting_on_dentry.clear();
     put(PIN_DNWAITER);
   }
@@ -1007,7 +1009,7 @@ void CDir::split(int bits, list<CDir*>& subs, list<MDSInternalContextBase*>& wai
   
   // repartition dentries
   while (!items.empty()) {
-    CDir::map_t::iterator p = items.begin();
+    auto p = items.begin();
     
     CDentry *dn = p->second;
     frag_t subfrag = inode->pick_dirfrag(dn->get_name());
@@ -1017,14 +1019,17 @@ void CDir::split(int bits, list<CDir*>& subs, list<MDSInternalContextBase*>& wai
     f->steal_dentry(dn);
   }
 
-  for (auto& p : dentry_waiters) {
+  for (const auto &p : dentry_waiters) {
     frag_t subfrag = inode->pick_dirfrag(p.first.name);
     int n = (subfrag.value() & (subfrag.mask() ^ frag.mask())) >> subfrag.mask_shift();
     CDir *f = subfrags[n];
 
     if (f->waiting_on_dentry.empty())
       f->get(PIN_DNWAITER);
-    f->waiting_on_dentry[p.first].swap(p.second);
+    auto &e = f->waiting_on_dentry[p.first];
+    for (const auto &waiter : p.second) {
+      e.push_back(waiter);
+    }
   }
 
   // FIXME: handle dirty old rstat
@@ -1109,8 +1114,11 @@ void CDir::merge(list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool
 
   if (!dentry_waiters.empty()) {
     get(PIN_DNWAITER);
-    for (auto& p : dentry_waiters) {
-      waiting_on_dentry[p.first].swap(p.second);
+    for (const auto &p : dentry_waiters) {
+      auto &e = waiting_on_dentry[p.first];
+      for (const auto &waiter : p.second) {
+        e.push_back(waiter);
+      }
     }
   }
 
@@ -1231,15 +1239,17 @@ void CDir::take_dentry_waiting(std::string_view dname, snapid_t first, snapid_t
   
   string_snap_t lb(dname, first);
   string_snap_t ub(dname, last);
-  compact_map<string_snap_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dentry.lower_bound(lb);
-  while (p != waiting_on_dentry.end() &&
-        !(ub < p->first)) {
+  auto it = waiting_on_dentry.lower_bound(lb);
+  while (it != waiting_on_dentry.end() &&
+        !(ub < it->first)) {
     dout(10) << __func__ << " " << dname
             << " [" << first << "," << last << "] found waiter on snap "
-            << p->first.snapid
+            << it->first.snapid
             << " on " << *this << dendl;
-    ls.splice(ls.end(), p->second);
-    waiting_on_dentry.erase(p++);
+    for (const auto &waiter : it->second) {
+      ls.push_back(waiter);
+    }
+    waiting_on_dentry.erase(it++);
   }
 
   if (waiting_on_dentry.empty())
@@ -1250,10 +1260,11 @@ void CDir::take_sub_waiting(list<MDSInternalContextBase*>& ls)
 {
   dout(10) << __func__ << dendl;
   if (!waiting_on_dentry.empty()) {
-    for (compact_map<string_snap_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dentry.begin();
-        p != waiting_on_dentry.end();
-        ++p) 
-      ls.splice(ls.end(), p->second);
+    for (const auto &p : waiting_on_dentry) {
+      for (const auto &waiter : p.second) {
+        ls.push_back(waiter);
+      }
+    }
     waiting_on_dentry.clear();
     put(PIN_DNWAITER);
   }
@@ -1298,13 +1309,14 @@ void CDir::take_waiting(uint64_t mask, list<MDSInternalContextBase*>& ls)
 {
   if ((mask & WAIT_DENTRY) && !waiting_on_dentry.empty()) {
     // take all dentry waiters
-    while (!waiting_on_dentry.empty()) {
-      compact_map<string_snap_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dentry.begin();
-      dout(10) << "take_waiting dentry " << p->first.name
-              << " snap " << p->first.snapid << " on " << *this << dendl;
-      ls.splice(ls.end(), p->second);
-      waiting_on_dentry.erase(p);
+    for (const auto &p : waiting_on_dentry) {
+      dout(10) << "take_waiting dentry " << p.first.name
+              << " snap " << p.first.snapid << " on " << *this << dendl;
+      for (const auto &waiter : p.second) {
+        ls.push_back(waiter);
+      }
     }
+    waiting_on_dentry.clear();
     put(PIN_DNWAITER);
   }
   
@@ -1332,31 +1344,28 @@ void CDir::finish_waiting(uint64_t mask, int result)
 fnode_t *CDir::project_fnode()
 {
   assert(get_version() != 0);
-  fnode_t *p = new fnode_t;
-  *p = *get_projected_fnode();
-  projected_fnode.push_back(p);
+  auto &p = projected_fnode.emplace_back(*get_projected_fnode());
 
   if (scrub_infop && scrub_infop->last_scrub_dirty) {
-    p->localized_scrub_stamp = scrub_infop->last_local.time;
-    p->localized_scrub_version = scrub_infop->last_local.version;
-    p->recursive_scrub_stamp = scrub_infop->last_recursive.time;
-    p->recursive_scrub_version = scrub_infop->last_recursive.version;
+    p.localized_scrub_stamp = scrub_infop->last_local.time;
+    p.localized_scrub_version = scrub_infop->last_local.version;
+    p.recursive_scrub_stamp = scrub_infop->last_recursive.time;
+    p.recursive_scrub_version = scrub_infop->last_recursive.version;
     scrub_infop->last_scrub_dirty = false;
     scrub_maybe_delete_info();
   }
 
-  dout(10) << __func__ <<  " " << p << dendl;
-  return p;
+  dout(10) << __func__ <<  " " << &p << dendl;
+  return &p;
 }
 
 void CDir::pop_and_dirty_projected_fnode(LogSegment *ls)
 {
   assert(!projected_fnode.empty());
-  dout(15) << __func__ << " " << projected_fnode.front()
-          << " v" << projected_fnode.front()->version << dendl;
-  fnode = *projected_fnode.front();
+  auto &front = projected_fnode.front();
+  dout(15) << __func__ << " " << &front << " v" << front.version << dendl;
+  fnode = front;
   _mark_dirty(ls);
-  delete projected_fnode.front();
   projected_fnode.pop_front();
 }
 
@@ -1495,7 +1504,7 @@ void CDir::fetch(MDSInternalContextBase *c, std::string_view want_dn, bool ignor
   }
 
   if (c) add_waiter(WAIT_COMPLETE, c);
-  if (!want_dn.empty()) wanted_items.insert(std::string(want_dn));
+  if (!want_dn.empty()) wanted_items.insert(mempool::mds_co::string(want_dn));
   
   // already fetching?
   if (state_test(CDir::STATE_FETCHING)) {
@@ -1604,9 +1613,9 @@ void CDir::_omap_fetch(MDSInternalContextBase *c, const std::set<dentry_key_t>&
   } else {
     assert(c);
     std::set<std::string> str_keys;
-    for (auto p = keys.begin(); p != keys.end(); ++p) {
+    for (auto p : keys) {
       string str;
-      p->encode(str);
+      p.encode(str);
       str_keys.insert(str);
     }
     rd.omap_get_vals_by_keys(str_keys, &fin->omap, &fin->ret2);
@@ -1698,7 +1707,7 @@ CDentry *CDir::_load_dentry(
 
     if (stale) {
       if (!dn) {
-        stale_items.insert(std::string(key));
+        stale_items.insert(mempool::mds_co::string(key));
         *force_dirty = true;
       }
       return dn;
@@ -1733,7 +1742,7 @@ CDentry *CDir::_load_dentry(
     
     if (stale) {
       if (!dn) {
-        stale_items.insert(std::string(key));
+        stale_items.insert(mempool::mds_co::string(key));
         *force_dirty = true;
       }
       return dn;
@@ -1927,7 +1936,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
       continue;
     }
 
-    if (dn && (wanted_items.count(dname) > 0 || !complete)) {
+    if (dn && (wanted_items.count(mempool::mds_co::string(dname)) > 0 || !complete)) {
       dout(10) << " touching wanted dn " << *dn << dendl;
       inode->mdcache->touch_dentry(dn);
     }
@@ -2120,11 +2129,9 @@ void CDir::_omap_commit(int op_prio)
   object_locator_t oloc(cache->mds->mdsmap->get_metadata_pool());
 
   if (!stale_items.empty()) {
-    for (compact_set<string>::iterator p = stale_items.begin();
-        p != stale_items.end();
-        ++p) {
-      to_remove.insert(*p);
-      write_size += (*p).length();
+    for (const auto &p : stale_items) {
+      to_remove.insert(std::string(p));
+      write_size += p.length();
     }
     stale_items.clear();
   }
@@ -2399,18 +2406,21 @@ void CDir::_committed(int r, version_t v)
   // finishers?
   bool were_waiters = !waiting_for_commit.empty();
   
-  compact_map<version_t, list<MDSInternalContextBase*> >::iterator p = waiting_for_commit.begin();
-  while (p != waiting_for_commit.end()) {
-    compact_map<version_t, list<MDSInternalContextBase*> >::iterator n = p;
-    ++n;
-    if (p->first > committed_version) {
-      dout(10) << " there are waiters for " << p->first << ", committing again" << dendl;
-      _commit(p->first, -1);
+  auto it = waiting_for_commit.begin();
+  while (it != waiting_for_commit.end()) {
+    auto _it = it;
+    ++_it;
+    if (it->first > committed_version) {
+      dout(10) << " there are waiters for " << it->first << ", committing again" << dendl;
+      _commit(it->first, -1);
       break;
     }
-    cache->mds->queue_waiters(p->second);
-    waiting_for_commit.erase(p);
-    p = n;
+    std::list<MDSInternalContextBase*> t;
+    for (const auto &waiter : it->second)
+      t.push_back(waiter);
+    cache->mds->queue_waiters(t);
+    waiting_for_commit.erase(it);
+    it = _it;
   } 
 
   // try drop dentries in this dirfrag if it's about to be purged
@@ -2722,7 +2732,7 @@ void CDir::verify_fragstat()
   frag_info_t c;
   memset(&c, 0, sizeof(c));
 
-  for (map_t::iterator it = items.begin();
+  for (auto it = items.begin();
        it != items.end();
        ++it) {
     CDentry *dn = it->second;
@@ -3112,7 +3122,7 @@ void CDir::scrub_initialize(const ScrubHeaderRefConst& header)
   scrub_infop->others_scrubbing.clear();
   scrub_infop->others_scrubbed.clear();
 
-  for (map_t::iterator i = items.begin();
+  for (auto i = items.begin();
       i != items.end();
       ++i) {
     // TODO: handle snapshot scrubbing
@@ -3150,7 +3160,7 @@ void CDir::scrub_finished()
   scrub_infop->last_scrub_dirty = true;
 }
 
-int CDir::_next_dentry_on_set(set<dentry_key_t>& dns, bool missing_okay,
+int CDir::_next_dentry_on_set(dentry_key_set &dns, bool missing_okay,
                               MDSInternalContext *cb, CDentry **dnout)
 {
   dentry_key_t dnkey;
index 13079557798ed1ef2fc129e335016d6a7f3aa02c..f913749182990664174617762204b7a4b0493bad 100644 (file)
 #include <string>
 #include <string_view>
 
-#include "include/counter.h"
-#include "include/types.h"
-#include "include/buffer_fwd.h"
+#include "common/DecayCounter.h"
 #include "common/bloom_filter.hpp"
 #include "common/config.h"
-#include "common/DecayCounter.h"
-
-#include "MDSCacheObject.h"
-
+#include "include/buffer_fwd.h"
+#include "include/counter.h"
+#include "include/types.h"
 
 #include "CInode.h"
+#include "MDSCacheObject.h"
 
 class CDentry;
 class MDCache;
@@ -159,7 +157,7 @@ public:
 
   fnode_t fnode;
   snapid_t first;
-  compact_map<snapid_t,old_rstat_t> dirty_old_rstat;  // [value.first,key]
+  mempool::mds_co::compact_map<snapid_t,old_rstat_t> dirty_old_rstat;  // [value.first,key]
 
   // my inodes with dirty rstat data
   elist<CInode*> dirty_rstat_inodes;     
@@ -171,7 +169,7 @@ public:
 
 protected:
   version_t projected_version;
-  std::list<fnode_t*> projected_fnode;
+  mempool::mds_co::list<fnode_t> projected_fnode;
 
 public:
   elist<CDentry*> dirty_dentries;
@@ -189,14 +187,14 @@ public:
     if (projected_fnode.empty())
       return &fnode;
     else
-      return projected_fnode.back();
+      return &projected_fnode.back();
   }
 
   fnode_t *get_projected_fnode() {
     if (projected_fnode.empty())
       return &fnode;
     else
-      return projected_fnode.back();
+      return &projected_fnode.back();
   }
   fnode_t *project_fnode();
 
@@ -221,12 +219,13 @@ private:
   void log_mark_dirty();
 
 public:
-  typedef std::map<dentry_key_t, CDentry*> map_t;
+  typedef mempool::mds_co::map<dentry_key_t, CDentry*> dentry_key_map;
+  typedef mempool::mds_co::set<dentry_key_t> dentry_key_set;
 
   class scrub_info_t {
   public:
     /// inodes we contain with dirty scrub stamps
-    map<dentry_key_t,CInode*> dirty_scrub_stamps; // TODO: make use of this!
+    dentry_key_map dirty_scrub_stamps; // TODO: make use of this!
     struct scrub_stamps {
       version_t version;
       utime_t time;
@@ -247,12 +246,12 @@ public:
     bool pending_scrub_error;
 
     /// these are lists of children in each stage of scrubbing
-    set<dentry_key_t> directories_to_scrub;
-    set<dentry_key_t> directories_scrubbing;
-    set<dentry_key_t> directories_scrubbed;
-    set<dentry_key_t> others_to_scrub;
-    set<dentry_key_t> others_scrubbing;
-    set<dentry_key_t> others_scrubbed;
+    dentry_key_set directories_to_scrub;
+    dentry_key_set directories_scrubbing;
+    dentry_key_set directories_scrubbed;
+    dentry_key_set others_to_scrub;
+    dentry_key_set others_scrubbing;
+    dentry_key_set others_scrubbed;
 
     ScrubHeaderRefConst header;
 
@@ -290,7 +289,7 @@ public:
    * list will be filled with all CDentry * which have been returned
    * from scrub_dentry_next() but not sent back via scrub_dentry_finished().
    */
-  void scrub_dentries_scrubbing(list<CDentry*> *out_dentries);
+  void scrub_dentries_scrubbing(std::list<CDentry*> *out_dentries);
   /**
    * Report to the CDir that a CDentry has been scrubbed. Call this
    * for every CDentry returned from scrub_dentry_next().
@@ -321,15 +320,15 @@ private:
    * Check the given set (presumably one of those in scrub_info_t) for the
    * next key to scrub and look it up (or fail!).
    */
-  int _next_dentry_on_set(set<dentry_key_t>& dns, bool missing_okay,
+  int _next_dentry_on_set(dentry_key_set &dns, bool missing_okay,
                           MDSInternalContext *cb, CDentry **dnout);
 
 
 protected:
-  std::unique_ptr<scrub_info_t> scrub_infop;
+  std::unique_ptr<scrub_info_t> scrub_infop; // FIXME not in mempool
 
   // contents of this directory
-  map_t items;       // non-null AND null
+  dentry_key_map items;       // non-null AND null
   unsigned num_head_items;
   unsigned num_head_null;
   unsigned num_snap_items;
@@ -341,7 +340,7 @@ protected:
   version_t committing_version;
   version_t committed_version;
 
-  compact_set<string> stale_items;
+  mempool::mds_co::compact_set<mempool::mds_co::string> stale_items;
 
   // lock nesting, freeze
   static int num_frozen_trees;
@@ -352,7 +351,7 @@ protected:
 
   // cache control  (defined for authority; hints for replicas)
   __s32      dir_rep;
-  compact_set<__s32> dir_rep_by;      // if dir_rep == REP_LIST
+  mempool::mds_co::compact_set<__s32> dir_rep_by;      // if dir_rep == REP_LIST
 
   // popularity
   dirfrag_load_vec_t pop_me;
@@ -384,7 +383,7 @@ protected:
   friend class C_IO_Dir_OMAP_FetchedMore;
   friend class C_IO_Dir_Committed;
 
-  std::unique_ptr<bloom_filter> bloom;
+  std::unique_ptr<bloom_filter> bloom; // XXX not part of mempool::mds_co
   /* If you set up the bloom filter, you must keep it accurate!
    * It's deleted when you mark_complete() and is deliberately not serialized.*/
 
@@ -408,9 +407,9 @@ protected:
   const CInode *get_inode() const { return inode; }
   CDir *get_parent_dir() { return inode->get_parent_dir(); }
 
-  map_t::iterator begin() { return items.begin(); }
-  map_t::iterator end() { return items.end(); }
-  map_t::iterator lower_bound(dentry_key_t key) { return items.lower_bound(key); }
+  dentry_key_map::iterator begin() { return items.begin(); }
+  dentry_key_map::iterator end() { return items.end(); }
+  dentry_key_map::iterator lower_bound(dentry_key_t key) { return items.lower_bound(key); }
 
   unsigned get_num_head_items() const { return num_head_items; }
   unsigned get_num_head_null() const { return num_head_null; }
@@ -471,8 +470,8 @@ public:
 
 
 public:
-  void split(int bits, list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool replay);
-  void merge(list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool replay);
+  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);
 
   bool should_split() const {
     return (int)get_frag_size() > g_conf->mds_bal_split_size;
@@ -486,7 +485,7 @@ private:
   void prepare_new_fragment(bool replay);
   void prepare_old_fragment(map<string_snap_t, std::list<MDSInternalContextBase*> >& dentry_waiters, bool replay);
   void steal_dentry(CDentry *dn);  // from another dir.  used by merge/split.
-  void finish_old_fragment(list<MDSInternalContextBase*>& waiters, bool replay);
+  void finish_old_fragment(std::list<MDSInternalContextBase*>& waiters, bool replay);
   void init_fragment_pins();
 
 
@@ -594,7 +593,7 @@ private:
   void fetch(MDSInternalContextBase *c, std::string_view want_dn, bool ignore_authpinnability=false);
   void fetch(MDSInternalContextBase *c, const std::set<dentry_key_t>& keys);
 protected:
-  compact_set<string> wanted_items;
+  mempool::mds_co::compact_set<mempool::mds_co::string> wanted_items;
 
   void _omap_fetch(MDSInternalContextBase *fin, const std::set<dentry_key_t>& keys);
   void _omap_fetch_more(
@@ -608,7 +607,7 @@ protected:
       int pos,
       const std::set<snapid_t> *snaps,
       bool *force_dirty,
-      list<CInode*> *undef_inodes);
+      std::list<CInode*> *undef_inodes);
 
   /**
    * Mark this fragment as BADFRAG (common part of go_bad and go_bad_dentry)
@@ -629,7 +628,7 @@ protected:
                     bool complete, int r);
 
   // -- commit --
-  compact_map<version_t, std::list<MDSInternalContextBase*> > waiting_for_commit;
+  mempool::mds_co::compact_map<version_t, mempool::mds_co::list<MDSInternalContextBase*> > 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);
@@ -665,7 +664,7 @@ public:
 
   // -- waiters --
 protected:
-  compact_map< string_snap_t, std::list<MDSInternalContextBase*> > waiting_on_dentry;
+  mempool::mds_co::compact_map< string_snap_t, mempool::mds_co::list<MDSInternalContextBase*> > waiting_on_dentry; // FIXME string_snap_t not in mempool
 
 public:
   bool is_waiting_for_dentry(std::string_view dname, snapid_t snap) {
index ed2ecde96553f95d260482d1f33763779dd52707..ab68a7e054e1b9c9d76d997601e80814f3fd6566 100644 (file)
@@ -680,10 +680,8 @@ void CInode::close_dirfrag(frag_t fg)
   }
   
   // dump any remaining dentries, for debugging purposes
-  for (CDir::map_t::iterator p = dir->items.begin();
-       p != dir->items.end();
-       ++p) 
-    dout(14) << __func__ << " LEFTOVER dn " << *p->second << dendl;
+  for (const auto &p : dir->items)
+    dout(14) << __func__ << " LEFTOVER dn " << *p.second << dendl;
 
   assert(dir->get_num_ref() == 0);
   delete dir;
@@ -1770,7 +1768,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
        snapid_t fgfirst;
        nest_info_t rstat;
        nest_info_t accounted_rstat;
-       compact_map<snapid_t,old_rstat_t> dirty_old_rstat;
+       decltype(CDir::dirty_old_rstat) dirty_old_rstat;
        decode(fg, p);
        decode(fgfirst, p);
        decode(rstat, p);
@@ -2211,11 +2209,10 @@ void CInode::finish_scatter_gather_update(int type)
          dout(20) << fg << " dirty_old_rstat " << dir->dirty_old_rstat << dendl;
          mdcache->project_rstat_frag_to_inode(pf->rstat, pf->accounted_rstat,
                                               dir->first, CEPH_NOSNAP, this, true);
-         for (compact_map<snapid_t,old_rstat_t>::iterator q = dir->dirty_old_rstat.begin();
-              q != dir->dirty_old_rstat.end();
-              ++q)
-           mdcache->project_rstat_frag_to_inode(q->second.rstat, q->second.accounted_rstat,
-                                                q->second.first, q->first, this, true);
+         for (auto &p : dir->dirty_old_rstat) {
+           mdcache->project_rstat_frag_to_inode(p.second.rstat, p.second.accounted_rstat,
+                                                p.second.first, p.first, this, true);
+          }
          if (update)  // dir contents not valid if frozen or non-auth
            dir->check_rstats();
        } else {
index a55030e3bd0f86902c675f4f8bd8aabfdb039435..21667874ed71b279afbd607dbd06ef8fb49dfcc2 100644 (file)
@@ -979,9 +979,7 @@ void MDBalancer::find_exports(CDir *dir,
   dout(7) << " find_exports in " << dir_pop << " " << *dir << " need " << need << " (" << needmin << " - " << needmax << ")" << dendl;
 
   double subdir_sum = 0;
-  for (CDir::map_t::iterator it = dir->begin();
-       it != dir->end();
-       ++it) {
+  for (auto it = dir->begin(); it != dir->end(); ++it) {
     CInode *in = it->second->get_linkage()->get_inode();
     if (!in) continue;
     if (!in->is_dir()) continue;
@@ -1278,7 +1276,7 @@ int MDBalancer::dump_loads(Formatter *f)
     dir->dump_load(f, now, decayrate);
     f->close_section();
 
-    for (CDir::map_t::iterator it = dir->begin(); it != dir->end(); ++it) {
+    for (auto it = dir->begin(); it != dir->end(); ++it) {
       CInode *in = it->second->get_linkage()->get_inode();
       if (!in || !in->is_dir())
        continue;
index 2b119046e162a08ae2cf3a97e7dc132ef2fd5518..038ce8ee1e8d982b281e0ab8ebb73180d2978b06 100644 (file)
@@ -1531,7 +1531,7 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last)
   if (!in->client_caps.empty()) {
     const set<snapid_t>& snaps = in->find_snaprealm()->get_snaps();
     // clone caps?
-    for (auto p : in->client_caps) {
+    for (auto &p : in->client_caps) {
       client_t client = p.first;
       Capability *cap = p.second;
       int issued = cap->need_snapflush() ? CEPH_CAP_ANY_WR : cap->issued();
@@ -1855,37 +1855,37 @@ void MDCache::_project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snap
       first = ofirst;
 
       // find any intersection with last
-      compact_map<snapid_t,old_rstat_t>::iterator p = parent->dirty_old_rstat.lower_bound(last);
-      if (p == parent->dirty_old_rstat.end()) {
+      auto it = parent->dirty_old_rstat.lower_bound(last);
+      if (it == parent->dirty_old_rstat.end()) {
        dout(20) << "  no dirty_old_rstat with last >= last " << last << dendl;
        if (!parent->dirty_old_rstat.empty() && parent->dirty_old_rstat.rbegin()->first >= first) {
          dout(20) << "  last dirty_old_rstat ends at " << parent->dirty_old_rstat.rbegin()->first << dendl;
          first = parent->dirty_old_rstat.rbegin()->first+1;
        }
       } else {
-       // *p last is >= last
-       if (p->second.first <= last) {
-         // *p intersects [first,last]
-         if (p->second.first < first) {
-           dout(10) << " splitting off left bit [" << p->second.first << "," << first-1 << "]" << dendl;
-           parent->dirty_old_rstat[first-1] = p->second;
-           p->second.first = first;
+       // *it last is >= last
+       if (it->second.first <= last) {
+         // *it intersects [first,last]
+         if (it->second.first < first) {
+           dout(10) << " splitting off left bit [" << it->second.first << "," << first-1 << "]" << dendl;
+           parent->dirty_old_rstat[first-1] = it->second;
+           it->second.first = first;
          }
-         if (p->second.first > first)
-           first = p->second.first;
-         if (last < p->first) {
-           dout(10) << " splitting off right bit [" << last+1 << "," << p->first << "]" << dendl;
-           parent->dirty_old_rstat[last] = p->second;
-           p->second.first = last+1;
+         if (it->second.first > first)
+           first = it->second.first;
+         if (last < it->first) {
+           dout(10) << " splitting off right bit [" << last+1 << "," << it->first << "]" << dendl;
+           parent->dirty_old_rstat[last] = it->second;
+           it->second.first = last+1;
          }
        } else {
-         // *p is to the _right_ of [first,last]
-         p = parent->dirty_old_rstat.lower_bound(first);
-         // new *p last is >= first
-         if (p->second.first <= last &&  // new *p isn't also to the right, and
-             p->first >= first) {        // it intersects our first bit,
-           dout(10) << " staying to the right of [" << p->second.first << "," << p->first << "]..." << dendl;
-           first = p->first+1;
+         // *it is to the _right_ of [first,last]
+         it = parent->dirty_old_rstat.lower_bound(first);
+         // new *it last is >= first
+         if (it->second.first <= last &&  // new *it isn't also to the right, and
+             it->first >= first) {        // it intersects our first bit,
+           dout(10) << " staying to the right of [" << it->second.first << "," << it->first << "]..." << dendl;
+           first = it->first+1;
          }
          dout(10) << " projecting to new dirty_old_rstat [" << first << "," << last << "]" << dendl;
        }
@@ -2304,11 +2304,10 @@ void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob,
     parent->resync_accounted_rstat();
 
     if (g_conf->mds_snap_rstat) {
-      for (compact_map<snapid_t,old_rstat_t>::iterator p = parent->dirty_old_rstat.begin();
-          p != parent->dirty_old_rstat.end();
-          ++p)
-       project_rstat_frag_to_inode(p->second.rstat, p->second.accounted_rstat, p->second.first,
-                                   p->first, pin, true);//false);
+      for (auto &p : parent->dirty_old_rstat) {
+       project_rstat_frag_to_inode(p.second.rstat, p.second.accounted_rstat, p.second.first,
+                                   p.first, pin, true);
+      }
     }
     parent->dirty_old_rstat.clear();
     project_rstat_frag_to_inode(pf->rstat, pf->accounted_rstat, parent->first, CEPH_NOSNAP, pin, true);//false);
@@ -2635,7 +2634,7 @@ ESubtreeMap *MDCache::create_subtree_map()
     }
   }
 
-  for (auto p : dirs_to_add) {
+  for (auto &p : dirs_to_add) {
     CDir *dir = p.second;
     le->metablob.add_dir_context(dir, EMetaBlob::TO_ROOT);
     le->metablob.add_dir(dir, false);
@@ -3065,10 +3064,8 @@ void MDCache::handle_mds_recovery(mds_rank_t who)
       d->take_waiting(d_mask, waiters);
 
       // inode waiters too
-      for (CDir::map_t::iterator p = d->items.begin();
-          p != d->items.end();
-          ++p) {
-       CDentry *dn = p->second;
+      for (auto &p : d->items) {
+       CDentry *dn = p.second;
        CDentry::linkage_t *dnl = dn->get_linkage();
        if (dnl->is_primary()) {
          dnl->get_inode()->take_waiting(i_mask, waiters);
@@ -3656,10 +3653,10 @@ void MDCache::remove_inode_recursive(CInode *in)
     CDir *subdir = *p++;
 
     dout(10) << " removing dirfrag " << subdir << dendl;
-    CDir::map_t::iterator q = subdir->items.begin();
-    while (q != subdir->items.end()) {
-      CDentry *dn = q->second;
-      ++q;
+    auto it = subdir->items.begin();
+    while (it != subdir->items.end()) {
+      CDentry *dn = it->second;
+      ++it;
       CDentry::linkage_t *dnl = dn->get_linkage();
       if (dnl->is_primary()) {
        CInode *tin = dnl->get_inode();
@@ -3728,7 +3725,7 @@ void MDCache::trim_unlinked_inodes()
 {
   dout(7) << "trim_unlinked_inodes" << dendl;
   list<CInode*> q;
-  for (auto p : inode_map) {
+  for (auto &p : inode_map) {
     CInode *in = p.second;
     if (in->get_parent_dn() == NULL && !in->is_base()) {
       dout(7) << " will trim from " << *in << dendl;
@@ -3811,11 +3808,9 @@ void MDCache::recalc_auth_bits(bool replay)
       }
 
       // dentries in this dir
-      for (CDir::map_t::iterator q = dir->items.begin();
-          q != dir->items.end();
-          ++q) {
+      for (auto &p : dir->items) {
        // dn
-       CDentry *dn = q->second;
+       CDentry *dn = p.second;
        CDentry::linkage_t *dnl = dn->get_linkage();
        if (auth) {
          dn->state_set(CDentry::STATE_AUTH);
@@ -4173,10 +4168,8 @@ void MDCache::rejoin_walk(CDir *dir, MMDSCacheRejoin *rejoin)
   if (mds->is_rejoin()) {
     // WEAK
     rejoin->add_weak_dirfrag(dir->dirfrag());
-    for (CDir::map_t::iterator p = dir->items.begin();
-        p != dir->items.end();
-        ++p) {
-      CDentry *dn = p->second;
+    for (auto &p : dir->items) {
+      CDentry *dn = p.second;
       assert(dn->last == CEPH_NOSNAP);
       CDentry::linkage_t *dnl = dn->get_linkage();
       dout(15) << " add_weak_primary_dentry " << *dn << dendl;
@@ -4196,10 +4189,9 @@ void MDCache::rejoin_walk(CDir *dir, MMDSCacheRejoin *rejoin)
     rejoin->add_strong_dirfrag(dir->dirfrag(), dir->get_replica_nonce(), dir->get_dir_rep());
     dir->state_set(CDir::STATE_REJOINING);
 
-    for (CDir::map_t::iterator p = dir->items.begin();
-        p != dir->items.end(); ) {
-      CDentry *dn = p->second;
-      ++p;
+    for (auto it = dir->items.begin(); it != dir->items.end(); ) {
+      CDentry *dn = it->second;
+      ++it;
       dn->state_set(CDentry::STATE_REJOINING);
       CDentry::linkage_t *dnl = dn->get_linkage();
       CInode *in = dnl->is_primary() ? dnl->get_inode() : NULL;
@@ -4587,10 +4579,8 @@ void MDCache::rejoin_scour_survivor_replicas(mds_rank_t from, MMDSCacheRejoin *a
       } 
       
       // dentries
-      for (CDir::map_t::iterator p = dir->items.begin();
-          p != dir->items.end();
-          ++p) {
-       CDentry *dn = p->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
        
        if (dn->is_replica(from) &&
            (ack == NULL ||
@@ -4603,9 +4593,9 @@ void MDCache::rejoin_scour_survivor_replicas(mds_rank_t from, MMDSCacheRejoin *a
     }
   };
 
-  for (auto p : inode_map)
+  for (auto &p : inode_map)
     scour_func(p.second);
-  for (auto p : snap_inode_map)
+  for (auto &p : snap_inode_map)
     scour_func(p.second);
 }
 
@@ -5192,10 +5182,8 @@ void MDCache::rejoin_trim_undef_inodes()
        CDir *dir = *p;
        dir->clear_replica_map();
 
-       for (CDir::map_t::iterator p = dir->items.begin();
-            p != dir->items.end();
-            ++p) {
-         CDentry *dn = p->second;
+       for (auto &p : dir->items) {
+         CDentry *dn = p.second;
          dn->clear_replica_map();
 
          dout(10) << " trimming " << *dn << dendl;
@@ -6039,10 +6027,8 @@ void MDCache::rejoin_send_acks()
        it->second->add_dirfrag_base(dir);
       }
           
-      for (CDir::map_t::iterator q = dir->items.begin();
-          q != dir->items.end();
-          ++q) {
-       CDentry *dn = q->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
        CDentry::linkage_t *dnl = dn->get_linkage();
 
        // inode
@@ -6148,7 +6134,7 @@ void MDCache::reissue_all_caps()
 {
   dout(10) << "reissue_all_caps" << dendl;
 
-  for (auto p : inode_map) {
+  for (auto &p : inode_map) {
     CInode *in = p.second;
     if (in->is_head() && in->is_any_caps()) {
       // called by MDSRank::active_start(). There shouldn't be any frozen subtree.
@@ -6236,7 +6222,7 @@ void MDCache::_queued_file_recover_cow(CInode *in, MutationRef& mut)
 void MDCache::identify_files_to_recover()
 {
   dout(10) << "identify_files_to_recover" << dendl;
-  for (auto p : inode_map) {
+  for (auto &p : inode_map) {
     CInode *in = p.second;
     if (!in->is_auth())
       continue;
@@ -7037,8 +7023,8 @@ bool MDCache::trim_non_auth_subtree(CDir *dir)
 
   bool keep_dir = !can_trim_non_auth_dirfrag(dir);
 
-  CDir::map_t::iterator j = dir->begin();
-  CDir::map_t::iterator i = j;
+  auto j = dir->begin();
+  auto i = j;
   while (j != dir->end()) {
     i = j++;
     CDentry *dn = i->second;
@@ -7786,10 +7772,8 @@ bool MDCache::shutdown_export_strays()
        break;
     }
     
-    for (CDir::map_t::iterator p = dir->items.begin();
-        p != dir->items.end();
-        ++p) {
-      CDentry *dn = p->second;
+    for (auto &p : dir->items) {
+      CDentry *dn = p.second;
       CDentry::linkage_t *dnl = dn->get_linkage();
       if (dnl->is_null())
        continue;
@@ -9583,8 +9567,8 @@ void MDCache::scan_stray_dir(dirfrag_t next)
       dir->fetch(new C_MDC_RetryScanStray(this, dir->dirfrag()));
       return;
     }
-    for (CDir::map_t::iterator q = dir->items.begin(); q != dir->items.end(); ++q) {
-      CDentry *dn = q->second;
+    for (auto &p : dir->items) {
+      CDentry *dn = p.second;
       dn->state_set(CDentry::STATE_STRAY);
       CDentry::linkage_t *dnl = dn->get_projected_linkage();
       if (dnl->is_primary()) {
@@ -10432,10 +10416,14 @@ int MDCache::send_dir_updates(CDir *dir, bool bcast)
     //if (*it == except) continue;
     dout(7) << "sending dir_update on " << *dir << " to " << *it << dendl;
 
+    std::set<int32_t> s;
+    for (const auto &r : dir->dir_rep_by) {
+      s.insert(r);
+    }
     mds->send_message_mds(new MDirUpdate(mds->get_nodeid(),
                                         dir->dirfrag(),
                                         dir->dir_rep,
-                                        dir->dir_rep_by,
+                                        s,
                                         path,
                                         bcast),
                          *it);
@@ -10481,7 +10469,10 @@ void MDCache::handle_dir_update(MDirUpdate *m)
     // Update if it already exists. Othwerwise it got updated by discover reply.
     dout(5) << "dir_update on " << *dir << dendl;
     dir->dir_rep = m->get_dir_rep();
-    dir->dir_rep_by = m->get_dir_rep_by();
+    dir->dir_rep_by.clear();
+    for (const auto &e : m->get_dir_rep_by()) {
+      dir->dir_rep_by.insert(e);
+    }
   }
 
   // done
@@ -11079,10 +11070,8 @@ void MDCache::fragment_mark_and_complete(MDRequestRef& mdr)
 
     if (!dir->state_test(CDir::STATE_DNPINNEDFRAG)) {
       dout(15) << " marking " << *dir << dendl;
-      for (CDir::map_t::iterator p = dir->items.begin();
-          p != dir->items.end();
-          ++p) {
-       CDentry *dn = p->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
        dn->get(CDentry::PIN_FRAGMENTING);
        assert(!dn->state_test(CDentry::STATE_FRAGMENTING));
        dn->state_set(CDentry::STATE_FRAGMENTING);
@@ -11132,10 +11121,8 @@ void MDCache::fragment_unmark_unfreeze_dirs(list<CDir*>& dirs)
     if (dir->state_test(CDir::STATE_DNPINNEDFRAG)) {
       dir->state_clear(CDir::STATE_DNPINNEDFRAG);
 
-      for (CDir::map_t::iterator p = dir->items.begin();
-         p != dir->items.end();
-         ++p) {
-       CDentry *dn = p->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
        assert(dn->state_test(CDentry::STATE_FRAGMENTING));
        dn->state_clear(CDentry::STATE_FRAGMENTING);
        dn->put(CDentry::PIN_FRAGMENTING);
@@ -11469,10 +11456,8 @@ void MDCache::_fragment_stored(MDRequestRef& mdr)
     CDir *dir = *p;
     dout(10) << " result frag " << *dir << dendl;
 
-    for (CDir::map_t::iterator p = dir->items.begin();
-        p != dir->items.end();
-        ++p) { 
-      CDentry *dn = p->second;
+    for (auto &p : dir->items) {
+      CDentry *dn = p.second;
       assert(dn->state_test(CDentry::STATE_FRAGMENTING));
       dn->state_clear(CDentry::STATE_FRAGMENTING);
       dn->put(CDentry::PIN_FRAGMENTING);
@@ -11770,7 +11755,7 @@ void MDCache::force_readonly()
   mds->server->force_clients_readonly();
 
   // revoke write caps
-  for (auto p : inode_map) {
+  for (auto &p : inode_map) {
     CInode *in = p.second;
     if (in->is_head())
       mds->locker->eval(in, CEPH_CAP_LOCKS);
@@ -11935,10 +11920,8 @@ void MDCache::show_cache()
       CDir *dir = *p;
       dout(7) << "  dirfrag " << *dir << dendl;
 
-      for (CDir::map_t::iterator p = dir->items.begin();
-          p != dir->items.end();
-          ++p) {
-       CDentry *dn = p->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
        dout(7) << "   dentry " << *dn << dendl;
        CDentry::linkage_t *dnl = dn->get_linkage();
        if (dnl->is_primary() && dnl->get_inode()) 
@@ -11947,9 +11930,9 @@ void MDCache::show_cache()
     }
   };
 
-  for (auto p : inode_map)
+  for (auto &p : inode_map)
     show_func(p.second);
-  for (auto p : snap_inode_map)
+  for (auto &p : snap_inode_map)
     show_func(p.second);
 }
 
@@ -12061,10 +12044,8 @@ int MDCache::dump_cache(std::string_view fn, Formatter *f,
       if (f) {
         f->open_array_section("dentries");
       }
-      for (CDir::map_t::iterator q = dir->items.begin();
-          q != dir->items.end();
-          ++q) {
-       CDentry *dn = q->second;
+      for (auto &p : dir->items) {
+       CDentry *dn = p.second;
         if (f) {
          f->open_object_section("dentry");
           dn->dump(f);
@@ -12096,12 +12077,12 @@ int MDCache::dump_cache(std::string_view fn, Formatter *f,
     return 1;
   };
 
-  for (auto p : inode_map) {
+  for (auto &p : inode_map) {
     r = dump_func(p.second);
     if (r < 0)
       goto out;
   }
-  for (auto p : snap_inode_map) {
+  for (auto &p : snap_inode_map) {
     r = dump_func(p.second);
     if (r < 0)
       goto out;
@@ -12302,7 +12283,7 @@ void MDCache::repair_dirfrag_stats_work(MDRequestRef& mdr)
 
   frag_info_t frag_info;
   nest_info_t nest_info;
-  for (CDir::map_t::iterator it = dir->begin(); it != dir->end(); ++it) {
+  for (auto it = dir->begin(); it != dir->end(); ++it) {
     CDentry *dn = it->second;
     if (dn->last != CEPH_NOSNAP)
       continue;
@@ -12597,7 +12578,7 @@ void MDCache::clear_dirty_bits_for_stray(CInode* diri) {
   assert(diri->get_projected_parent_dir()->inode->is_stray());
   list<CDir*> ls;
   diri->get_dirfrags(ls);
-  for (auto p : ls) {
+  for (auto &p : ls) {
     if (p->is_auth() && !(p->is_frozen() || p->is_freezing()))
       p->try_remove_dentries_for_stray();
   }
index 2f69c94924334532e76b35fbdd62dd6ec57594ef..48cf3063a8829890dad492bf148cd5896222cdfe 100644 (file)
@@ -286,7 +286,7 @@ class MDSRank {
       finished_queue.push_back(c);
       progress_thread.signal();
     }
-    void queue_waiters(list<MDSInternalContextBase*>& ls) {
+    void queue_waiters(std::list<MDSInternalContextBase*>& ls) {
       finished_queue.splice( finished_queue.end(), ls );
       progress_thread.signal();
     }
index 7851c3b1720b068b1ec80fc66da41f948b4a0506..a28be44bc3d4bf1f2081cd6281a9a5e64e148244 100644 (file)
@@ -1219,8 +1219,8 @@ void Migrator::check_export_size(CDir *dir, export_state_t& stat, set<client_t>&
     dfs.pop_front();
 
     approx_size += frag_size;
-    for (CDir::map_t::iterator p = dir->begin(); p != dir->end(); ++p) {
-      CDentry *dn = p->second;
+    for (auto &p : *dir) {
+      CDentry *dn = p.second;
       if (dn->get_linkage()->is_null()) {
        approx_size += null_size;
        continue;
@@ -1593,9 +1593,8 @@ uint64_t Migrator::encode_export_dir(bufferlist& exportbl,
   
   // dentries
   list<CDir*> subdirs;
-  CDir::map_t::iterator it;
-  for (it = dir->begin(); it != dir->end(); ++it) {
-    CDentry *dn = it->second;
+  for (auto &p : *dir) {
+    CDentry *dn = p.second;
     CInode *in = dn->get_linkage()->get_inode();
     
     if (!dn->is_replicated())
@@ -1652,8 +1651,8 @@ uint64_t Migrator::encode_export_dir(bufferlist& exportbl,
   }
 
   // subdirs
-  for (list<CDir*>::iterator it = subdirs.begin(); it != subdirs.end(); ++it)
-    num_exported += encode_export_dir(exportbl, *it, exported_client_map, now);
+  for (auto &dir : subdirs)
+    num_exported += encode_export_dir(exportbl, dir, exported_client_map, now);
 
   return num_exported;
 }
@@ -1684,9 +1683,8 @@ void Migrator::finish_export_dir(CDir *dir, utime_t now, mds_rank_t peer,
 
   // dentries
   list<CDir*> subdirs;
-  CDir::map_t::iterator it;
-  for (it = dir->begin(); it != dir->end(); ++it) {
-    CDentry *dn = it->second;
+  for (auto &p : *dir) {
+    CDentry *dn = p.second;
     CInode *in = dn->get_linkage()->get_inode();
 
     // dentry
@@ -1824,11 +1822,12 @@ void Migrator::export_reverse(CDir *dir, export_state_t& stat)
     CDir *t = rq.front(); 
     rq.pop_front();
     t->abort_export();
-    for (CDir::map_t::iterator p = t->items.begin(); p != t->items.end(); ++p) {
-      p->second->abort_export();
-      if (!p->second->get_linkage()->is_primary())
+    for (auto &p : *t) {
+      CDentry *dn = p.second;
+      dn->abort_export();
+      if (!dn->get_linkage()->is_primary())
        continue;
-      CInode *in = p->second->get_linkage()->get_inode();
+      CInode *in = dn->get_linkage()->get_inode();
       in->abort_export();
       if (in->state_test(CInode::STATE_EVALSTALECAPS)) {
        in->state_clear(CInode::STATE_EVALSTALECAPS);
@@ -2641,9 +2640,8 @@ void Migrator::import_reverse(CDir *dir)
     if (cur->is_dirty())
       cur->mark_clean();
 
-    CDir::map_t::iterator it;
-    for (it = cur->begin(); it != cur->end(); ++it) {
-      CDentry *dn = it->second;
+    for (auto &p : *cur) {
+      CDentry *dn = p.second;
 
       // dentry
       dn->state_clear(CDentry::STATE_AUTH);
index 460632fe910507ddd22860a38b273e3288eee3fe..d923fecd93a2aad1b58df429beaaaf0b7652e1e9 100644 (file)
@@ -3824,9 +3824,10 @@ void Server::handle_client_readdir(MDRequestRef& mdr)
        continue;
       } else {
        // touch everything i _do_ have
-       for (CDir::map_t::iterator p = dir->begin(); p != dir->end(); ++p)
-         if (!p->second->get_linkage()->is_null())
-           mdcache->lru.lru_touch(p->second);
+       for (auto &p : *dir) {
+         if (!p.second->get_linkage()->is_null())
+           mdcache->lru.lru_touch(p.second);
+        }
 
        // already issued caps and leases, reply immediately.
        if (dnbl.length() > 0) {
index 68a5a35ba688697cb24d01183259a98f69acb189..892912a5aca7c4420e8504d9361087090c6bb9b2 100644 (file)
 #include "msg/Message.h"
 
 class MDirUpdate : public Message {
-  mds_rank_t from_mds = -1;
-  dirfrag_t dirfrag;
-  int32_t dir_rep = 5;
-  int32_t discover = 5;
-  compact_set<int32_t> dir_rep_by;
-  filepath path;
-  int tried_discover;
+public:
+  MDirUpdate() : Message(MSG_MDS_DIRUPDATE) {}
+  MDirUpdate(mds_rank_t f,
+            dirfrag_t dirfrag,
+             int dir_rep,
+             const std::set<int32_t>& dir_rep_by,
+             filepath& path,
+             bool discover = false) :
+    Message(MSG_MDS_DIRUPDATE), from_mds(f), dirfrag(dirfrag),
+    dir_rep(dir_rep), dir_rep_by(dir_rep_by), path(path) {
+    this->discover = discover ? 5 : 0;
+  }
 
- public:
   mds_rank_t get_source_mds() const { return from_mds; }
   dirfrag_t get_dirfrag() const { return dirfrag; }
   int get_dir_rep() const { return dir_rep; }
-  const compact_set<int>& get_dir_rep_by() const { return dir_rep_by; }
+  const std::set<int32_t>& get_dir_rep_by() const { return dir_rep_by; }
   bool should_discover() const { return discover > tried_discover; }
   const filepath& get_path() const { return path; }
 
   bool has_tried_discover() const { return tried_discover > 0; }
   void inc_tried_discover() { ++tried_discover; }
 
-  MDirUpdate() : Message(MSG_MDS_DIRUPDATE), tried_discover(0) {}
-  MDirUpdate(mds_rank_t f, 
-            dirfrag_t dirfrag,
-             int dir_rep,
-             compact_set<int>& dir_rep_by,
-             filepath& path,
-             bool discover = false) :
-    Message(MSG_MDS_DIRUPDATE), tried_discover(0) {
-    this->from_mds = f;
-    this->dirfrag = dirfrag;
-    this->dir_rep = dir_rep;
-    this->dir_rep_by = dir_rep_by;
-    this->discover = discover ? 5 : 0;
-    this->path = path;
-  }
-private:
-  ~MDirUpdate() override {}
-
-public:
   const char *get_type_name() const override { return "dir_update"; }
   void print(ostream& out) const override {
     out << "dir_update(" << get_dirfrag() << ")";
@@ -81,6 +66,17 @@ public:
     encode(dir_rep_by, payload);
     encode(path, payload);
   }
+
+private:
+  ~MDirUpdate() override {}
+
+  mds_rank_t from_mds = -1;
+  dirfrag_t dirfrag;
+  int32_t dir_rep = 5;
+  int32_t discover = 5;
+  std::set<int32_t> dir_rep_by;
+  filepath path;
+  int tried_discover = 0;
 };
 
 #endif