]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: push objecter completions to a Finisher
authorSage Weil <sage@redhat.com>
Sun, 20 Jul 2014 22:00:55 +0000 (15:00 -0700)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:02 +0000 (01:34 +0100)
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 <sage@redhat.com>
src/mds/CDir.cc
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/MDSTable.cc
src/mds/SessionMap.cc

index efe9bea4a4cc577e846b1b6b6d1169a357fcec8b..af0414356adc3cd202752c8b03d36947030d4c3f 100644 (file)
@@ -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<string, bufferlist>& omap,
@@ -1791,7 +1793,9 @@ void CDir::_omap_commit(int op_prio)
   map<string, bufferlist> 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();
index 469c68b5dce980075a632c983204953fb3e1de04..b58186ec0363489f0b61bd7bd2cd84fb53ddb6a3 100644 (file)
@@ -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),
index 541ed21d0d6434acc18b4339d45e113ec9729fa3..7b8e7490059a062adcbef3a6d00ea5ad5d6da166 100644 (file)
@@ -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<CDir*>& 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());
index 4cd5e60457f535b499bdabdd9473257ec9481df0..9b200ee1f413fa5137fcb92921e3ebede32852c0 100644 (file)
@@ -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)
index f1aa68bd51ca5c19466eb98b4c1a29f41d391e91..b95b3dc1a61a36d574e80d8012a55e371c7c842e 100644 (file)
@@ -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)