From: Yan, Zheng Date: Wed, 18 Jan 2017 02:53:00 +0000 (+0800) Subject: mds: fix race between submitting EImportFinish and SubtreeMap X-Git-Tag: v12.0.0~43^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3100af0c2aefe4b9dbf5910d3cd0ef6bdf6fd693;p=ceph.git mds: fix race between submitting EImportFinish and SubtreeMap MDCache::create_subtree_map() use MDCache::my_ambiguous_imports and Migrator::is_ambiguous_import() to decide if a subtree is ambiguous import. Submitting log event can start new segment and submit an extra SubtreeMap. So before submitting EImportFinish event, we need to cleanup MDCache::my_ambiguous_imports and Migrator::import_state. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index d1271e6ba58f..c0e54385b3d5 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3207,6 +3207,7 @@ void MDCache::handle_resolve(MMDSResolve *m) claimed_by_sender = true; } + my_ambiguous_imports.erase(p); // no longer ambiguous. if (claimed_by_sender) { dout(7) << "ambiguous import failed on " << *dir << dendl; migrator->import_reverse(dir); @@ -3214,7 +3215,6 @@ void MDCache::handle_resolve(MMDSResolve *m) dout(7) << "ambiguous import succeeded on " << *dir << dendl; migrator->import_finish(dir, true); } - my_ambiguous_imports.erase(p); // no longer ambiguous. } p = next; } @@ -3507,7 +3507,7 @@ void MDCache::disambiguate_imports() map >::iterator q = my_ambiguous_imports.begin(); CDir *dir = get_dirfrag(q->first); - if (!dir) continue; + assert(dir); if (dir->authority() != me_ambig) { dout(10) << "ambiguous import auth known, must not be me " << *dir << dendl; diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index d9c867ea802b..07d4e8764d45 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -2375,6 +2375,7 @@ void Migrator::import_reverse(CDir *dir) dout(7) << "import_reverse " << *dir << dendl; import_state_t& stat = import_state[dir->dirfrag()]; + stat.state = IMPORT_ABORTING; set bounds; cache->get_subtree_bounds(dir, bounds); @@ -2493,7 +2494,6 @@ void Migrator::import_reverse(CDir *dir) cache->trim(-1, num_dentries); // try trimming dentries // notify bystanders; wait in aborting state - stat.state = IMPORT_ABORTING; import_notify_abort(dir, bounds); }