// move items nested beneath me, under me.
set<CDir*>::iterator p = subtrees[root].begin();
while (p != subtrees[root].end()) {
- set<CDir*>::iterator next = p;
- ++next;
if (get_subtree_root((*p)->get_parent_dir()) == dir) {
// move under me
dout(10) << " claiming child bound " << **p << dendl;
subtrees[dir].insert(*p);
- subtrees[root].erase(p);
- }
- p = next;
+ p = subtrees[root].erase(p);
+ } else
+ ++p;
}
// i am a bound of the parent subtree.
// move items nested beneath me, under me.
set<CDir*>::iterator p = subtrees[root].begin();
while (p != subtrees[root].end()) {
- set<CDir*>::iterator next = p;
- ++next;
if (get_subtree_root((*p)->get_parent_dir()) == dir) {
// move under me
dout(10) << " claiming child bound " << **p << dendl;
subtrees[dir].insert(*p);
- subtrees[root].erase(p);
- }
- p = next;
+ p = subtrees[root].erase(p);
+ } else
+ ++p;
}
// i am a bound of the parent subtree.
if (info.notify_ack_waiting.erase(who) &&
info.notify_ack_waiting.empty()) {
fragment_drop_locks(info);
- fragment_maybe_finish(p++);
+ p = fragment_maybe_finish(p);
} else {
++p;
}
continue;
}
- ++p;
dout(10) << "cancelling fragment " << df << " bit " << info.bits << dendl;
std::vector<CDir*> dirs;
info.dirs.swap(dirs);
- fragments.erase(df);
+ p = fragments.erase(p);
fragment_unmark_unfreeze_dirs(dirs);
}
// check for any import success/failure (from this node)
map<dirfrag_t, vector<dirfrag_t> >::iterator p = my_ambiguous_imports.begin();
while (p != my_ambiguous_imports.end()) {
- map<dirfrag_t, vector<dirfrag_t> >::iterator next = p;
- ++next;
CDir *dir = get_dirfrag(p->first);
ceph_assert(dir);
dout(10) << "checking ambiguous import " << *dir << dendl;
claimed_by_sender = true;
}
- my_ambiguous_imports.erase(p); // no longer ambiguous.
+ p = my_ambiguous_imports.erase(p); // no longer ambiguous.
if (claimed_by_sender) {
dout(7) << "ambiguous import failed on " << *dir << dendl;
migrator->import_reverse(dir);
dout(7) << "ambiguous import succeeded on " << *dir << dendl;
migrator->import_finish(dir, true);
}
- }
- p = next;
+ } else
+ ++p;
}
}
++q;
} else {
// remove reconnect with no session
- p.second.second.erase(q++);
+ q = p.second.second.erase(q);
}
}
rejoins[target]->cap_exports[p.first] = p.second.second;
}
}
}
- cap_imports.erase(p++); // remove and move on
+ p = cap_imports.erase(p); // remove and move on
}
} else {
trim_non_auth();
}
}
- rejoin_pending_snaprealms.erase(it++);
+ it = rejoin_pending_snaprealms.erase(it);
in->put(CInode::PIN_OPENINGSNAPPARENTS);
send_snaps(splits);
set<CDir*>::iterator r = q->second.begin();
while (r != subtrees[dir].end()) {
new_bounds.insert(*r);
- subtrees[dir].erase(r++);
+ r = subtrees[dir].erase(r);
}
subtrees.erase(q);
//info.mdr.reset();
}
-void MDCache::fragment_maybe_finish(const fragment_info_iterator it)
+MDCache::fragment_info_iterator MDCache::fragment_maybe_finish(const fragment_info_iterator it)
{
ceph_assert(kill_dirfrag_at != dirfrag_killpoint::FRAGMENT_MAYBE_FINISH);
if (!it->second.finishing)
- return;
+ return it;
// unmark & auth_unpin
for (const auto &dir : it->second.resultfrags) {
mds->balancer->maybe_fragment(dir, false);
}
- fragments.erase(it);
+ return fragments.erase(it);
}