From: Sage Weil Date: Sun, 20 Jul 2014 22:00:55 +0000 (-0700) Subject: mds: push objecter completions to a Finisher X-Git-Tag: v0.86~213^2~63 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2e308123187e2b333958c6eb07a375c8bbacc1c9;p=ceph.git mds: push objecter completions to a Finisher Most/all of the MDS completions need to be reentrant (and potentially call back into the Objecter). Shove them all onto a Finisher to make sure that is safe. Signed-off-by: Sage Weil --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index efe9bea4a4cc..af0414356adc 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1364,7 +1364,8 @@ void CDir::_tmap_fetch(const string& want_dn) object_locator_t oloc(cache->mds->mdsmap->get_metadata_pool()); ObjectOperation rd; rd.tmap_get(&fin->bl, NULL); - cache->mds->objecter->read(oid, oloc, rd, CEPH_NOSNAP, NULL, 0, fin); + cache->mds->objecter->read(oid, oloc, rd, CEPH_NOSNAP, NULL, 0, + new C_OnFinisher(fin, &cache->mds->finisher)); } void CDir::_tmap_fetched(bufferlist& bl, const string& want_dn, int r) @@ -1423,7 +1424,8 @@ void CDir::_omap_fetch(const string& want_dn) ObjectOperation rd; rd.omap_get_header(&fin->hdrbl, &fin->ret1); rd.omap_get_vals("", "", (uint64_t)-1, &fin->omap, &fin->ret2); - cache->mds->objecter->read(oid, oloc, rd, CEPH_NOSNAP, NULL, 0, fin); + cache->mds->objecter->read(oid, oloc, rd, CEPH_NOSNAP, NULL, 0, + new C_OnFinisher(fin, &cache->mds->finisher)); } void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, @@ -1791,7 +1793,9 @@ void CDir::_omap_commit(int op_prio) map to_set; C_GatherBuilder gather(g_ceph_context, - new C_IO_Dir_Committed(this, get_version())); + new C_OnFinisher(new C_IO_Dir_Committed(this, + get_version()), + &cache->mds->finisher)); SnapContext snapc; object_t oid = get_ondisk_object(); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 469c68b5dce9..b58186ec0363 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -923,8 +923,12 @@ void CInode::store(Context *fin) object_t oid = CInode::get_object_name(ino(), frag_t(), ".inode"); object_locator_t oloc(mdcache->mds->mdsmap->get_metadata_pool()); - mdcache->mds->objecter->mutate(oid, oloc, m, snapc, ceph_clock_now(g_ceph_context), 0, - NULL, new C_IO_Inode_Stored(this, get_version(), fin) ); + Context *newfin = + new C_OnFinisher(new C_IO_Inode_Stored(this, get_version(), fin), + &mdcache->mds->finisher); + mdcache->mds->objecter->mutate(oid, oloc, m, snapc, + ceph_clock_now(g_ceph_context), 0, + NULL, newfin); } void CInode::_stored(version_t v, Context *fin) @@ -952,7 +956,7 @@ void CInode::fetch(Context *fin) dout(10) << "fetch" << dendl; C_IO_Inode_Fetched *c = new C_IO_Inode_Fetched(this, fin); - C_GatherBuilder gather(g_ceph_context, c); + C_GatherBuilder gather(g_ceph_context, new C_OnFinisher(c, &mdcache->mds->finisher)); object_t oid = CInode::get_object_name(ino(), frag_t(), ""); object_locator_t oloc(mdcache->mds->mdsmap->get_metadata_pool()); @@ -1058,7 +1062,9 @@ void CInode::store_backtrace(Context *fin, int op_prio) SnapContext snapc; object_t oid = get_object_name(ino(), frag_t(), ""); object_locator_t oloc(pool); - Context *fin2 = new C_IO_Inode_StoredBacktrace(this, inode.backtrace_version, fin); + Context *fin2 = new C_OnFinisher( + new C_IO_Inode_StoredBacktrace(this, inode.backtrace_version, fin), + &mdcache->mds->finisher); if (!state_test(STATE_DIRTYPOOL) || inode.old_pools.empty()) { mdcache->mds->objecter->mutate(oid, oloc, op, snapc, ceph_clock_now(g_ceph_context), diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 541ed21d0d64..7b8e7490059a 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7947,8 +7947,10 @@ void MDCache::_open_ino_backtrace_fetched(inodeno_t ino, bufferlist& bl, int err dout(10) << " old object in pool " << info.pool << ", retrying pool " << backtrace.pool << dendl; info.pool = backtrace.pool; - C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino); - fetch_backtrace(ino, info.pool, fin->bl, fin); + C_IO_MDC_OpenInoBacktraceFetched *fin = + new C_IO_MDC_OpenInoBacktraceFetched(this, ino); + fetch_backtrace(ino, info.pool, fin->bl, + new C_OnFinisher(fin, &mds->finisher)); return; } } else if (err == -ENOENT) { @@ -7957,8 +7959,10 @@ void MDCache::_open_ino_backtrace_fetched(inodeno_t ino, bufferlist& bl, int err dout(10) << " no object in pool " << info.pool << ", retrying pool " << meta_pool << dendl; info.pool = meta_pool; - C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino); - fetch_backtrace(ino, info.pool, fin->bl, fin); + C_IO_MDC_OpenInoBacktraceFetched *fin = + new C_IO_MDC_OpenInoBacktraceFetched(this, ino); + fetch_backtrace(ino, info.pool, fin->bl, + new C_OnFinisher(fin, &mds->finisher)); return; } } @@ -8182,8 +8186,10 @@ void MDCache::do_open_ino(inodeno_t ino, open_ino_info_t& info, int err) info.checking = mds->get_nodeid(); info.checked.clear(); info.checked.insert(mds->get_nodeid()); - C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino); - fetch_backtrace(ino, info.pool, fin->bl, fin); + C_IO_MDC_OpenInoBacktraceFetched *fin = + new C_IO_MDC_OpenInoBacktraceFetched(this, ino); + fetch_backtrace(ino, info.pool, fin->bl, + new C_OnFinisher(fin, &mds->finisher)); } else { assert(!info.ancestors.empty()); info.checking = mds->get_nodeid(); @@ -9132,7 +9138,9 @@ void MDCache::purge_stray(CDentry *dn) // dir. on recovery, we'll need to re-eval all strays anyway. SnapContext nullsnapc; - C_GatherBuilder gather(g_ceph_context, new C_IO_MDC_PurgeStrayPurged(this, dn)); + C_GatherBuilder gather( + g_ceph_context, + new C_OnFinisher(new C_IO_MDC_PurgeStrayPurged(this, dn), &mds->finisher)); if (in->is_dir()) { object_locator_t oloc(mds->mdsmap->get_metadata_pool()); @@ -11186,7 +11194,11 @@ void MDCache::_fragment_committed(dirfrag_t basedirfrag, list& resultfrag ufragment &uf = it->second; // remove old frags - C_GatherBuilder gather(g_ceph_context, new C_IO_MDC_FragmentFinish(this, basedirfrag, resultfrags)); + C_GatherBuilder gather( + g_ceph_context, + new C_OnFinisher( + new C_IO_MDC_FragmentFinish(this, basedirfrag, resultfrags), + &mds->finisher)); SnapContext nullsnapc; object_locator_t oloc(mds->mdsmap->get_metadata_pool()); diff --git a/src/mds/MDSTable.cc b/src/mds/MDSTable.cc index 4cd5e60457f5..9b200ee1f413 100644 --- a/src/mds/MDSTable.cc +++ b/src/mds/MDSTable.cc @@ -22,6 +22,8 @@ #include "include/types.h" #include "common/config.h" +#include "common/Finisher.h" + #include "include/assert.h" @@ -69,7 +71,9 @@ void MDSTable::save(Context *onfinish, version_t v) mds->objecter->write_full(oid, oloc, snapc, bl, ceph_clock_now(g_ceph_context), 0, - NULL, new C_IO_MT_Save(this, version)); + NULL, + new C_OnFinisher(new C_IO_MT_Save(this, version), + &mds->finisher)); } void MDSTable::save_2(int r, version_t v) @@ -138,7 +142,8 @@ void MDSTable::load(Context *onfinish) C_IO_MT_Load *c = new C_IO_MT_Load(this, onfinish); object_t oid = get_object_name(); object_locator_t oloc(mds->mdsmap->get_metadata_pool()); - mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, c); + mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, + new C_OnFinisher(c, &mds->finisher)); } void MDSTable::load_2(int r, bufferlist& bl, Context *onfinish) diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index f1aa68bd51ca..b95b3dc1a61a 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -74,7 +74,8 @@ void SessionMap::load(Context *onload) C_IO_SM_Load *c = new C_IO_SM_Load(this); object_t oid = get_object_name(); object_locator_t oloc(mds->mdsmap->get_metadata_pool()); - mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, c); + mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, + new C_OnFinisher(c, &mds->finisher)); } void SessionMap::_load_finish(int r, bufferlist &bl) @@ -134,7 +135,9 @@ void SessionMap::save(Context *onsave, version_t needv) mds->objecter->write_full(oid, oloc, snapc, bl, ceph_clock_now(g_ceph_context), 0, - NULL, new C_IO_SM_Save(this, version)); + NULL, + new C_OnFinisher(new C_IO_SM_Save(this, version), + &mds->finisher)); } void SessionMap::_save_finish(version_t v)