close_dirfrag(dirfrags.begin()->first);
}
-bool CInode::has_subtree_root_dirfrag()
+bool CInode::has_subtree_root_dirfrag(int auth)
{
for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
- if (p->second->is_subtree_root())
+ if (p->second->is_subtree_root() &&
+ (auth == -1 || p->second->dir_auth.first == auth))
return true;
return false;
}
CDir *add_dirfrag(CDir *dir);
void close_dirfrag(frag_t fg);
void close_dirfrags();
- bool has_subtree_root_dirfrag();
+ bool has_subtree_root_dirfrag(int auth=-1);
void force_dirfrags();
void verify_dirfrags();
set<CInode*> subtree_inodes;
for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
p != subtrees.end();
- ++p)
- subtree_inodes.insert(p->first->inode);
+ ++p) {
+ if (p->first->dir_auth.first == mds->get_nodeid())
+ subtree_inodes.insert(p->first->inode);
+ }
for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
p != subtrees.end();
if (dnl->get_inode()->is_dirty())
dnl->get_inode()->mark_clean();
// avoid touching scatterlocks for our subtree roots!
- if (subtree_inodes.count(dnl->get_inode()) == 0) {
- dnl->get_inode()->filelock.remove_dirty();
- dnl->get_inode()->nestlock.remove_dirty();
- dnl->get_inode()->dirfragtreelock.remove_dirty();
- }
+ if (subtree_inodes.count(dnl->get_inode()) == 0)
+ dnl->get_inode()->clear_scatter_dirty();
}
// recurse?
in->clear_dirty_rstat();
+ // no more auth subtree? clear scatter dirty
+ if (!in->has_subtree_root_dirfrag(mds->get_nodeid()))
+ in->clear_scatter_dirty();
+
in->item_open_file.remove_myself();
// waiters
cache->adjust_subtree_auth(dir, export_peer[dir]);
cache->try_subtree_merge(dir); // NOTE: may journal subtree_map as sideeffect
+ // no more auth subtree? clear scatter dirty
+ if (!dir->get_inode()->is_auth() &&
+ !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+ dir->get_inode()->clear_scatter_dirty();
+
// unpin path
export_unlock(dir);
cache->trim_non_auth_subtree(dir);
cache->adjust_subtree_auth(dir, import_peer[dir->dirfrag()]);
+ if (!dir->get_inode()->is_auth() &&
+ !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+ dir->get_inode()->clear_scatter_dirty();
+
// adjust auth bits.
list<CDir*> q;
q.push_back(dir);
if (in->is_dirty())
in->mark_clean();
in->clear_dirty_rstat();
+ if (!in->has_subtree_root_dirfrag(mds->get_nodeid()))
+ in->clear_scatter_dirty();
in->authlock.clear_gather();
in->linklock.clear_gather();