// ====================================================================
// subtree management
-void MDCache::list_subtrees(list<CDir*>& ls)
-{
- for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
- p != subtrees.end();
- ++p)
- ls.push_back(p->first);
-}
-
/*
* adjust the dir_auth of a subtree.
* merge with parent and/or child subtrees, if is it appropriate.
// join/split subtrees as appropriate
public:
bool is_subtrees() { return !subtrees.empty(); }
- void list_subtrees(list<CDir*>& ls);
+ template<typename T>
+ void get_subtrees(T& c) {
+ if constexpr (std::is_same_v<T, std::vector<CDir*>>)
+ c.reserve(c.size() + subtrees.size());
+ for (const auto& p : subtrees) {
+ c.push_back(p.first);
+ }
+ }
void adjust_subtree_auth(CDir *root, mds_authority_t auth, bool adjust_pop=true);
void adjust_subtree_auth(CDir *root, mds_rank_t a, mds_rank_t b=CDIR_AUTH_UNKNOWN) {
adjust_subtree_auth(root, mds_authority_t(a,b));
ceph_assert(f != NULL);
std::lock_guard l(mds_lock);
- std::list<CDir*> subtrees;
- mdcache->list_subtrees(subtrees);
+ std::vector<CDir*> subtrees;
+ mdcache->get_subtrees(subtrees);
f->open_array_section("subtrees");
- for (std::list<CDir*>::iterator i = subtrees.begin(); i != subtrees.end(); ++i) {
- const CDir *dir = *i;
-
+ for (const auto& dir : subtrees) {
f->open_object_section("subtree");
{
f->dump_bool("is_auth", dir->is_auth());
bool Server::_need_force_journal(CInode *diri, bool empty)
{
- list<CDir*> ls;
- diri->get_dirfrags(ls);
+ std::vector<CDir*> dirs;
+ diri->get_dirfrags(dirs);
bool force_journal = false;
if (empty) {
- for (list<CDir*>::iterator p = ls.begin(); p != ls.end(); ++p) {
- if ((*p)->is_subtree_root() && (*p)->get_dir_auth().first == mds->get_nodeid()) {
- dout(10) << " frag " << (*p)->get_frag() << " is auth subtree dirfrag, will force journal" << dendl;
+ for (const auto& dir : dirs) {
+ if (dir->is_subtree_root() && dir->get_dir_auth().first == mds->get_nodeid()) {
+ dout(10) << " frag " << dir->get_frag() << " is auth subtree dirfrag, will force journal" << dendl;
force_journal = true;
break;
} else
- dout(20) << " frag " << (*p)->get_frag() << " is not auth subtree dirfrag" << dendl;
+ dout(20) << " frag " << dir->get_frag() << " is not auth subtree dirfrag" << dendl;
}
} else {
// see if any children of our frags are auth subtrees.
- list<CDir*> subtrees;
- mdcache->list_subtrees(subtrees);
- dout(10) << " subtrees " << subtrees << " frags " << ls << dendl;
- for (list<CDir*>::iterator p = ls.begin(); p != ls.end(); ++p) {
- CDir *dir = *p;
- for (list<CDir*>::iterator q = subtrees.begin(); q != subtrees.end(); ++q) {
- if (dir->contains(*q)) {
- if ((*q)->get_dir_auth().first == mds->get_nodeid()) {
- dout(10) << " frag " << (*p)->get_frag() << " contains (maybe) auth subtree, will force journal "
- << **q << dendl;
+ std::vector<CDir*> subtrees;
+ mdcache->get_subtrees(subtrees);
+ dout(10) << " subtrees " << subtrees << " frags " << dirs << dendl;
+ for (const auto& dir : dirs) {
+ for (const auto& subtree : subtrees) {
+ if (dir->contains(subtree)) {
+ if (subtree->get_dir_auth().first == mds->get_nodeid()) {
+ dout(10) << " frag " << dir->get_frag() << " contains (maybe) auth subtree, will force journal "
+ << *subtree << dendl;
force_journal = true;
break;
} else
- dout(20) << " frag " << (*p)->get_frag() << " contains but isn't auth for " << **q << dendl;
+ dout(20) << " frag " << dir->get_frag() << " contains but isn't auth for " << *subtree << dendl;
} else
- dout(20) << " frag " << (*p)->get_frag() << " does not contain " << **q << dendl;
+ dout(20) << " frag " << dir->get_frag() << " does not contain " << *subtree << dendl;
}
if (force_journal)
break;
}
}
- list<CDir*> subs;
- mds->mdcache->list_subtrees(subs);
- for (list<CDir*>::iterator p = subs.begin(); p != subs.end(); ++p) {
- CDir *dir = *p;
+ std::vector<CDir*> dirs;
+ mds->mdcache->get_subtrees(dirs);
+ for (const auto& dir : dirs) {
if (dir->get_dir_auth().first != mds->get_nodeid())
continue;
if (subtrees.count(dir->dirfrag()) == 0) {