From 6b7073fe552df5b46307cd2ee5a37b80b0320cf1 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Fri, 12 Jan 2018 11:50:19 -0800 Subject: [PATCH] mds: move CDir container members to mempool Partial-fix: http://tracker.ceph.com/issues/21402 Signed-off-by: Patrick Donnelly --- src/mds/CDir.cc | 148 ++++++++++++++++-------------- src/mds/CDir.h | 71 +++++++-------- src/mds/CInode.cc | 17 ++-- src/mds/MDBalancer.cc | 6 +- src/mds/MDCache.cc | 187 +++++++++++++++++--------------------- src/mds/MDSRank.h | 2 +- src/mds/Migrator.cc | 32 +++---- src/mds/Server.cc | 7 +- src/messages/MDirUpdate.h | 52 +++++------ 9 files changed, 251 insertions(+), 271 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index c7be753a246b2..cb0cd07778db6 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -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& 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(mapfirst].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& subs, list& 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& subs, list& 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& subs, list& 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 >::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& ls) { dout(10) << __func__ << dendl; if (!waiting_on_dentry.empty()) { - for (compact_map >::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& ls) { if ((mask & WAIT_DENTRY) && !waiting_on_dentry.empty()) { // take all dentry waiters - while (!waiting_on_dentry.empty()) { - compact_map >::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& } else { assert(c); std::set 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& 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::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 >::iterator p = waiting_for_commit.begin(); - while (p != waiting_for_commit.end()) { - compact_map >::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 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& 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; diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 13079557798ed..f913749182990 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -24,17 +24,15 @@ #include #include -#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 dirty_old_rstat; // [value.first,key] + mempool::mds_co::compact_map dirty_old_rstat; // [value.first,key] // my inodes with dirty rstat data elist dirty_rstat_inodes; @@ -171,7 +169,7 @@ public: protected: version_t projected_version; - std::list projected_fnode; + mempool::mds_co::list projected_fnode; public: elist 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 map_t; + typedef mempool::mds_co::map dentry_key_map; + typedef mempool::mds_co::set dentry_key_set; class scrub_info_t { public: /// inodes we contain with dirty scrub stamps - map 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 directories_to_scrub; - set directories_scrubbing; - set directories_scrubbed; - set others_to_scrub; - set others_scrubbing; - set 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 *out_dentries); + void scrub_dentries_scrubbing(std::list *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& 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_infop; + std::unique_ptr 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 stale_items; + mempool::mds_co::compact_set 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; + std::unique_ptr 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& subs, list& waiters, bool replay); - void merge(list& subs, list& waiters, bool replay); + void split(int bits, std::list& subs, list& waiters, bool replay); + void merge(std::list& subs, std::list& 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 >& dentry_waiters, bool replay); void steal_dentry(CDentry *dn); // from another dir. used by merge/split. - void finish_old_fragment(list& waiters, bool replay); + void finish_old_fragment(std::list& 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& keys); protected: - compact_set wanted_items; + mempool::mds_co::compact_set wanted_items; void _omap_fetch(MDSInternalContextBase *fin, const std::set& keys); void _omap_fetch_more( @@ -608,7 +607,7 @@ protected: int pos, const std::set *snaps, bool *force_dirty, - list *undef_inodes); + std::list *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 > waiting_for_commit; + mempool::mds_co::compact_map > waiting_for_commit; void _commit(version_t want, int op_prio); void _omap_commit(int op_prio); void _encode_dentry(CDentry *dn, bufferlist& bl, const std::set *snaps); @@ -665,7 +664,7 @@ public: // -- waiters -- protected: - compact_map< string_snap_t, std::list > waiting_on_dentry; + mempool::mds_co::compact_map< string_snap_t, mempool::mds_co::list > waiting_on_dentry; // FIXME string_snap_t not in mempool public: bool is_waiting_for_dentry(std::string_view dname, snapid_t snap) { diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index ed2ecde96553f..ab68a7e054e1b 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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 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::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 { diff --git a/src/mds/MDBalancer.cc b/src/mds/MDBalancer.cc index a55030e3bd0f8..21667874ed71b 100644 --- a/src/mds/MDBalancer.cc +++ b/src/mds/MDBalancer.cc @@ -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; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 2b119046e162a..038ce8ee1e8d9 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1531,7 +1531,7 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) if (!in->client_caps.empty()) { const set& 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::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::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 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 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& 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 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(); } diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 2f69c94924334..48cf3063a8829 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -286,7 +286,7 @@ class MDSRank { finished_queue.push_back(c); progress_thread.signal(); } - void queue_waiters(list& ls) { + void queue_waiters(std::list& ls) { finished_queue.splice( finished_queue.end(), ls ); progress_thread.signal(); } diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 7851c3b1720b0..a28be44bc3d4b 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -1219,8 +1219,8 @@ void Migrator::check_export_size(CDir *dir, export_state_t& stat, set& 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 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::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 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); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 460632fe91050..d923fecd93a2a 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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) { diff --git a/src/messages/MDirUpdate.h b/src/messages/MDirUpdate.h index 68a5a35ba6886..892912a5aca7c 100644 --- a/src/messages/MDirUpdate.h +++ b/src/messages/MDirUpdate.h @@ -19,44 +19,29 @@ #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 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& 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& get_dir_rep_by() const { return dir_rep_by; } + const std::set& 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& 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 dir_rep_by; + filepath path; + int tried_discover = 0; }; #endif -- 2.39.5