void MDCache::add_ambiguous_import(dirfrag_t base, vector<dirfrag_t>& bounds)
{
assert(my_ambiguous_imports.count(base) == 0);
- my_ambiguous_imports[base].swap( bounds );
+ my_ambiguous_imports[base].swap(bounds);
}
bool have_ambiguous_import(dirfrag_t base) {
return my_ambiguous_imports.count(base);
}
+ void get_ambiguous_import_bounds(dirfrag_t base, vector<dirfrag_t>& bounds) {
+ assert(my_ambiguous_imports.count(base));
+ bounds = my_ambiguous_imports[base];
+ }
void cancel_ambiguous_import(dirfrag_t dirino);
void finish_ambiguous_import(dirfrag_t dirino);
void resolve_start();
// put in ambiguous import list
mds->mdcache->add_ambiguous_import(base, bounds);
+ // set auth partially to us so we don't trim it
+ CDir *dir = mds->mdcache->get_dirfrag(base);
+ mds->mdcache->adjust_bounded_subtree_auth(dir, bounds, pair<int,int>(mds->get_nodeid(), mds->get_nodeid()));
+
// open client sessions?
if (mds->sessionmap.version >= cmapv) {
dout(10) << "EImportStart.replay sessionmap " << mds->sessionmap.version
dout(10) << "EImportFinish.replay " << base << " success=" << success << dendl;
if (success)
mds->mdcache->finish_ambiguous_import(base);
- else
+ else {
+ CDir *dir = mds->mdcache->get_dirfrag(base);
+ vector<dirfrag_t> bounds;
+ mds->mdcache->get_ambiguous_import_bounds(base, bounds);
+ mds->mdcache->adjust_bounded_subtree_auth(dir, bounds, pair<int,int>(CDIR_AUTH_UNKNOWN, CDIR_AUTH_UNKNOWN));
mds->mdcache->cancel_ambiguous_import(base);
+ mds->mdcache->try_trim_non_auth_subtree(dir);
+ }
} else {
dout(10) << "EImportFinish.replay " << base << " success=" << success
<< ", predates my subtree_map start point, ignoring"