]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: bracket mds journal events with {start,submit}_entry
authorSage Weil <sage@newdream.net>
Thu, 3 Dec 2009 20:12:55 +0000 (12:12 -0800)
committerSage Weil <sage@newdream.net>
Thu, 3 Dec 2009 20:12:55 +0000 (12:12 -0800)
This lets us catch nested journal events when they happen,
instead of down the line when dir/inode version numbers
look weird.

src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDSTableClient.cc
src/mds/MDSTableServer.cc
src/mds/Migrator.cc
src/mds/Server.cc
src/mds/journal.cc

index 72d973206281b64ccfb9f75fcdd65c9e9c418fc2..b3f29089f19aa7feae9b479f3f0414fea655d4b2 100644 (file)
@@ -1510,6 +1510,7 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock,
     metablob = &eu->metablob;
     le = eu;
   }
+  mds->mdlog->start_entry(le);
   if (update_size) {  // FIXME if/when we do max_size nested accounting
     mdcache->predirty_journal_parents(mut, metablob, in, 0, PREDIRTY_PRIMARY);
     // no cow, here!
@@ -1591,6 +1592,7 @@ void Locker::adjust_cap_wanted(Capability *cap, int wanted, int issue_seq)
       dout(10) << " adding to open file list " << *cur << dendl;
       LogSegment *ls = mds->mdlog->get_current_segment();
       EOpen *le = new EOpen(mds->mdlog);
+      mds->mdlog->start_entry(le);
       le->add_clean_inode(cur);
       ls->open_files.push_back(&cur->xlist_open_file);
       mds->mdlog->submit_entry(le);
@@ -1915,6 +1917,7 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
 
   // do the update.
   EUpdate *le = new EUpdate(mds->mdlog, "cap update");
+  mds->mdlog->start_entry(le);
 
   // xattrs update?
   map<string,bufferptr> *px = 0;
@@ -2823,6 +2826,8 @@ void Locker::scatter_writebehind(ScatterLock *lock)
   lock->start_flush();
 
   EUpdate *le = new EUpdate(mds->mdlog, "scatter_writebehind");
+  mds->mdlog->start_entry(le);
+
   mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false);
   mdcache->journal_dirty_inode(mut, &le->metablob, in);
   
index 621bd6375390d8a2f9fef2c5d26c3e812a3d6f84..472a03501e376e5772324522e90f58d8f44b0086 100644 (file)
@@ -389,7 +389,8 @@ void MDCache::_create_system_file(CDir *dir, const char *name, CInode *in, Conte
 
   mut->ls = mds->mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mds->mdlog, "create system file");
-  
+  mds->mdlog->start_entry(le);
+
   predirty_journal_parents(mut, &le->metablob, in, dir, PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
   le->metablob.add_primary_dentry(dn, true, in);
   if (mdir)
@@ -808,6 +809,8 @@ void MDCache::try_subtree_merge_at(CDir *dir)
       Mutation *mut = new Mutation;
       mut->ls = mds->mdlog->get_current_segment();
       EUpdate *le = new EUpdate(mds->mdlog, "subtree merge writebehind");
+      mds->mdlog->start_entry(le);
+
       le->metablob.add_dir_context(in->get_parent_dn()->get_dir());
       journal_dirty_inode(mut, &le->metablob, in);
       
@@ -1636,6 +1639,8 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
   bool do_parent_mtime = flags & PREDIRTY_DIR;
   bool shallow = flags & PREDIRTY_SHALLOW;
 
+  assert(mds->mdlog->entry_is_open());
+
   // declare now?
   if (mut->now == utime_t())
     mut->now = g_clock.real_now();
@@ -1898,10 +1903,10 @@ struct C_MDC_CommittedMaster : public Context {
 void MDCache::log_master_commit(metareqid_t reqid)
 {
   dout(10) << "log_master_commit " << reqid << dendl;
-  mds->mdlog->submit_entry(new ECommitted(reqid), 
-                          new C_MDC_CommittedMaster(this, reqid, 
-                                                    uncommitted_masters[reqid].ls,
-                                                    uncommitted_masters[reqid].waiters));
+  mds->mdlog->start_submit_entry(new ECommitted(reqid), 
+                                new C_MDC_CommittedMaster(this, reqid, 
+                                                          uncommitted_masters[reqid].ls,
+                                                          uncommitted_masters[reqid].waiters));
   mds->mdcache->uncommitted_masters.erase(reqid);
 }
 
@@ -1968,6 +1973,8 @@ ESubtreeMap *MDCache::create_subtree_map()
           << dendl;
   
   ESubtreeMap *le = new ESubtreeMap();
+  mds->mdlog->start_entry(le);
+
   
   CDir *mydir = 0;
   if (myin) {
@@ -2465,8 +2472,9 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack)
       // replay
       assert(uncommitted_slave_updates[from].count(*p));
       // log commit
-      mds->mdlog->submit_entry(new ESlaveUpdate(mds->mdlog, "unknown", *p, from,
-                                               ESlaveUpdate::OP_COMMIT, uncommitted_slave_updates[from][*p]->origop));
+      mds->mdlog->start_submit_entry(new ESlaveUpdate(mds->mdlog, "unknown", *p, from,
+                                                     ESlaveUpdate::OP_COMMIT,
+                                                     uncommitted_slave_updates[from][*p]->origop));
 
       delete uncommitted_slave_updates[from][*p];
       uncommitted_slave_updates[from].erase(*p);
@@ -2569,11 +2577,11 @@ void MDCache::disambiguate_imports()
     if (dir->authority().first != CDIR_AUTH_UNKNOWN) {
       dout(10) << "ambiguous import auth known, must not be me " << *dir << dendl;
       cancel_ambiguous_import(q->first);
-      mds->mdlog->submit_entry(new EImportFinish(dir, false));
+      mds->mdlog->start_submit_entry(new EImportFinish(dir, false));
     } else {
       dout(10) << "ambiguous import auth unknown, must be me " << *dir << dendl;
       finish_ambiguous_import(q->first);
-      mds->mdlog->submit_entry(new EImportFinish(dir, true));
+      mds->mdlog->start_submit_entry(new EImportFinish(dir, true));
     }
   }
   assert(my_ambiguous_imports.empty());
@@ -4368,6 +4376,7 @@ void MDCache::queue_file_recover(CInode *in)
     Mutation *mut = new Mutation;
     mut->ls = mds->mdlog->get_current_segment();
     EUpdate *le = new EUpdate(mds->mdlog, "queue_file_recover cow");
+    mds->mdlog->start_entry(le);
     predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
 
     s.erase(*s.begin());
@@ -4624,6 +4633,7 @@ void MDCache::truncate_inode_finish(CInode *in, LogSegment *ls)
   mut->add_projected_inode(in);
 
   EUpdate *le = new EUpdate(mds->mdlog, "truncate finish");
+  mds->mdlog->start_entry(le);
   le->metablob.add_dir_context(in->get_parent_dir());
   le->metablob.add_primary_dentry(in->get_projected_parent_dn(), true, in);
   le->metablob.add_truncate_finish(in->ino(), ls->offset);
@@ -6582,6 +6592,7 @@ void MDCache::_anchor_prepared(CInode *in, version_t atid, bool add)
   Mutation *mut = new Mutation;
   mut->ls = mds->mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mds->mdlog, add ? "anchor_create":"anchor_destroy");
+  mds->mdlog->start_entry(le);
   predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
   journal_dirty_inode(mut, &le->metablob, in);
   le->metablob.add_table_transaction(TABLE_ANCHOR, atid);
@@ -6656,6 +6667,8 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in)
   Mutation *mut = new Mutation;
   mut->ls = mds->mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mds->mdlog, "snaprealm_create");
+  mds->mdlog->start_entry(le);
+
   le->metablob.add_table_transaction(TABLE_SNAP, mdr->more()->stid);
 
   inode_t *pi = in->project_inode();
@@ -6934,6 +6947,8 @@ void MDCache::_purge_stray_purged(CDentry *dn)
   version_t pdv = dn->pre_dirty();
 
   EUpdate *le = new EUpdate(mds->mdlog, "purge_stray");
+  mds->mdlog->start_entry(le);
+
   le->metablob.add_dir_context(dn->dir);
   le->metablob.add_null_dentry(dn, true);
   le->metablob.add_destroyed_inode(in->ino());
@@ -8289,6 +8304,8 @@ void MDCache::fragment_stored(MDRequest *mdr)
 
   mdr->ls = mds->mdlog->get_current_segment();
   EFragment *le = new EFragment(mds->mdlog, diri->ino(), basefrag, bits);
+  mds->mdlog->start_entry(le);
+
   le->metablob.add_dir_context(*resultfrags.begin());
 
   // dft lock
index efb1c14bccad5ea610d48fe518c0eec12bc0f7af..36ae8699d67eb987a7e46b922c13df230c8b1efc 100644 (file)
@@ -150,6 +150,9 @@ void MDLog::append()
 
 void MDLog::submit_entry( LogEvent *le, Context *c, bool wait_safe ) 
 {
+  assert(le == cur_event);
+  cur_event = NULL;
+
   if (!g_conf.mds_log) {
     // hack: log is disabled.
     if (c) {
index f7e43cacecd50ce03945f0604d3909295d54d41b..14dbb6c2ce2e3c940ddc5174c07f2b9217868c3e 100644 (file)
@@ -152,11 +152,12 @@ public:
                  logger(0),
                  replay_thread(this),
                  expiring_events(0), expired_events(0),
-                 writing_subtree_map(false) {
-  }              
+                 writing_subtree_map(false),
+                 cur_event(NULL) { }             
   ~MDLog();
 
 
+  // -- segments --
   void start_new_segment(Context *onsync=0);
   LogSegment *get_current_segment() { 
     return segments.empty() ? 0:segments.rbegin()->second; 
@@ -182,7 +183,21 @@ public:
   bool is_capped() { return capped; }
   void cap();
 
+  // -- events --
+private:
+  LogEvent *cur_event;
+public:
+  void start_entry(LogEvent *e) {
+    assert(cur_event == NULL);
+    cur_event = e;
+  }
   void submit_entry( LogEvent *e, Context *c = 0, bool wait_for_safe=false );
+  void start_submit_entry(LogEvent *e, Context *c = 0, bool wait_for_safe=false) {
+    start_entry(e);
+    submit_entry(e, c, wait_for_safe);
+  }
+  bool entry_is_open() { return cur_event != NULL; }
+
   void wait_for_sync( Context *c );
   void wait_for_safe( Context *c );
   void flush();
index 5885eb9a5133f614dbc06588c8e15ff5a13880cf..ef4101865157d60eb12e65a97b3203ed21a6d78f 100644 (file)
@@ -94,8 +94,8 @@ void MDSTableClient::handle_request(class MMDSTableRequest *m)
     assert(pending_commit[tid]->pending_commit_tids[table].count(tid));
     
     // log ACK.
-    mds->mdlog->submit_entry(new ETableClient(table, TABLESERVER_OP_ACK, tid),
-                            new C_LoggedAck(this, tid));
+    mds->mdlog->start_submit_entry(new ETableClient(table, TABLESERVER_OP_ACK, tid),
+                                  new C_LoggedAck(this, tid));
     break;
 
   default:
index 6f3fb599436a4a26e23a9937e382ad09774170e5..fbd9ac7fc6320f3aa481061e1738eaf67f11f7b3 100644 (file)
@@ -51,6 +51,7 @@ void MDSTableServer::handle_prepare(MMDSTableRequest *req)
   assert(g_conf.mds_kill_mdstable_at != 1);
 
   ETableServer *le = new ETableServer(table, TABLESERVER_OP_PREPARE, req->reqid, from, version, version);
+  mds->mdlog->start_entry(le);
   le->mutation = bl;  // original request, NOT modified return value coming out of _prepare!
   mds->mdlog->submit_entry(le, new C_Prepare(this, req, version));
   mds->mdlog->flush();
@@ -83,7 +84,8 @@ void MDSTableServer::handle_commit(MMDSTableRequest *req)
 
     _commit(tid);
     _note_commit(tid);
-    mds->mdlog->submit_entry(new ETableServer(table, TABLESERVER_OP_COMMIT, 0, -1, tid, version));
+    mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_COMMIT, 0, -1, 
+                                                   tid, version));
     mds->mdlog->wait_for_sync(new C_Commit(this, req));
   }
   else if (tid <= version) {
@@ -117,7 +119,8 @@ void MDSTableServer::handle_rollback(MMDSTableRequest *req)
   dout(7) << "handle_rollback " << *req << dendl;
   _rollback(req->tid);
   _note_rollback(req->tid);
-  mds->mdlog->submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, -1, req->tid, version));
+  mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, -1, 
+                                                 req->tid, version));
   delete req;
 }
 
@@ -130,6 +133,7 @@ void MDSTableServer::do_server_update(bufferlist& bl)
   dout(10) << "do_server_update len " << bl.length() << dendl;
   _server_update(bl);
   ETableServer *le = new ETableServer(table, TABLESERVER_OP_SERVER_UPDATE, 0, -1, 0, version);
+  mds->mdlog->start_entry(le);
   le->mutation = bl;
   mds->mdlog->submit_entry(le);
 }
index 885034491257a0da634aa4af041b7e7941bb22cf..6ed4d1f868b9a514bffb7cc1a690fafcc2504862 100644 (file)
@@ -1128,6 +1128,8 @@ void Migrator::handle_export_ack(MExportDirAck *m)
   // log completion. 
   //  include export bounds, to ensure they're in the journal.
   EExport *le = new EExport(mds->mdlog, dir);
+  mds->mdlog->start_entry(le);
+
   le->metablob.add_dir_context(dir);
   le->metablob.add_dir( dir, false );
   for (set<CDir*>::iterator p = bounds.begin();
@@ -1654,6 +1656,8 @@ void Migrator::handle_export_dir(MExportDir *m)
 
   // start the journal entry
   EImportStart *le = new EImportStart(dir->dirfrag(), m->bounds);
+  mds->mdlog->start_entry(le);
+
   le->metablob.add_dir_context(dir);
   
   // adjust auth (list us _first_)
@@ -1821,7 +1825,7 @@ void Migrator::import_reverse(CDir *dir)
   }
         
   // log our failure
-  mds->mdlog->submit_entry(new EImportFinish(dir, false));     // log failure
+  mds->mdlog->start_submit_entry(new EImportFinish(dir, false));       // log failure
        
   // bystanders?
   if (import_bystanders[dir].empty()) {
@@ -1923,7 +1927,7 @@ void Migrator::import_finish(CDir *dir)
   dout(7) << "import_finish on " << *dir << dendl;
 
   // log finish
-  mds->mdlog->submit_entry(new EImportFinish(dir, true));
+  mds->mdlog->start_submit_entry(new EImportFinish(dir, true));
 
   // clear updated scatterlocks
   /*
@@ -2298,6 +2302,7 @@ void Migrator::handle_export_caps(MExportCaps *ex)
 
   C_M_LoggedImportCaps *finish = new C_M_LoggedImportCaps(this, in, ex->get_source().num());
   ESessions *le = new ESessions(++mds->sessionmap.projected);
+  mds->mdlog->start_entry(le);
 
   // decode new caps
   bufferlist::iterator blp = ex->cap_bl.begin();
index 6663d5d357e638a77ddaf8aa037219abc3318178..46416f079e4c418e1abf46971365d3dc0db704fa 100644 (file)
@@ -196,8 +196,8 @@ void Server::handle_client_session(MClientSession *m)
     mds->sessionmap.set_state(session, Session::STATE_OPENING);
     mds->sessionmap.touch_session(session);
     pv = ++mds->sessionmap.projected;
-    mdlog->submit_entry(new ESession(m->get_source_inst(), true, pv),
-                       new C_MDS_session_finish(mds, session, true, pv));
+    mdlog->start_submit_entry(new ESession(m->get_source_inst(), true, pv),
+                             new C_MDS_session_finish(mds, session, true, pv));
     mdlog->flush();
     break;
 
@@ -242,8 +242,8 @@ void Server::handle_client_session(MClientSession *m)
       } else
        piv = 0;
       
-      mdlog->submit_entry(new ESession(m->get_source_inst(), false, pv, both, piv),
-                         new C_MDS_session_finish(mds, session, false, pv, both, piv));
+      mdlog->start_submit_entry(new ESession(m->get_source_inst(), false, pv, both, piv),
+                               new C_MDS_session_finish(mds, session, false, pv, both, piv));
       mdlog->flush();
     }
     break;
@@ -352,8 +352,8 @@ void Server::terminate_sessions()
     if (session->is_closing()) continue;
     mds->sessionmap.set_state(session, Session::STATE_CLOSING);
     version_t pv = ++mds->sessionmap.projected;
-    mdlog->submit_entry(new ESession(session->inst, false, pv),
-                       new C_MDS_session_finish(mds, session, false, pv));
+    mdlog->start_submit_entry(new ESession(session->inst, false, pv),
+                             new C_MDS_session_finish(mds, session, false, pv));
     mdlog->flush();
   }
 }
@@ -431,8 +431,8 @@ void Server::_finish_session_purge(Session *session)
   assert(session->is_stale_purging());
   mds->sessionmap.set_state(session, Session::STATE_STALE_CLOSING);
   version_t pv = ++mds->sessionmap.projected;
-  mdlog->submit_entry(new ESession(session->inst, false, pv),
-                     new C_MDS_session_finish(mds, session, false, pv));
+  mdlog->start_submit_entry(new ESession(session->inst, false, pv),
+                           new C_MDS_session_finish(mds, session, false, pv));
   mdlog->flush();
 }
 
@@ -490,8 +490,8 @@ void Server::handle_client_reconnect(MClientReconnect *m)
     dout(7) << " client had no session, removing from session map" << dendl;
     assert(session);  // ?
     version_t pv = ++mds->sessionmap.projected;
-    mdlog->submit_entry(new ESession(session->inst, false, pv),
-                       new C_MDS_session_finish(mds, session, false, pv));
+    mdlog->start_submit_entry(new ESession(session->inst, false, pv),
+                             new C_MDS_session_finish(mds, session, false, pv));
     mdlog->flush();
   } else {
     
@@ -2055,6 +2055,7 @@ void Server::handle_client_open(MDRequest *mdr)
   if (!cur->xlist_open_file.is_on_xlist()) {
     LogSegment *ls = mds->mdlog->get_current_segment();
     EOpen *le = new EOpen(mds->mdlog);
+    mdlog->start_entry(le);
     le->add_clean_inode(cur);
     ls->open_files.push_back(&cur->xlist_open_file);
     mds->mdlog->submit_entry(le);
@@ -2181,6 +2182,7 @@ void Server::handle_client_openc(MDRequest *mdr)
   // prepare finisher
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "openc");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   journal_allocated_inos(mdr, &le->metablob);
   mdcache->predirty_journal_parents(mdr, &le->metablob, in, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
@@ -2463,6 +2465,7 @@ void Server::handle_client_setattr(MDRequest *mdr)
   // project update
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "setattr");
+  mdlog->start_entry(le);
 
   pi = cur->project_inode();
 
@@ -2546,6 +2549,7 @@ void Server::handle_client_opent(MDRequest *mdr, int cmode)
 
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "open_truncate");
+  mdlog->start_entry(le);
   le->metablob.add_truncate_start(in->ino());
   le->metablob.add_client_req(mdr->reqid);
 
@@ -2617,6 +2621,7 @@ void Server::handle_client_setlayout(MDRequest *mdr)
   // log + wait
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "setlayout");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
   mdcache->journal_dirty_inode(mdr, &le->metablob, cur);
@@ -2698,6 +2703,7 @@ void Server::handle_client_setxattr(MDRequest *mdr)
   // log + wait
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "setxattr");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
   mdcache->journal_cow_inode(mdr, &le->metablob, cur);
@@ -2742,6 +2748,7 @@ void Server::handle_client_removexattr(MDRequest *mdr)
   // log + wait
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "removexattr");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
   mdcache->journal_cow_inode(mdr, &le->metablob, cur);
@@ -2833,6 +2840,7 @@ void Server::handle_client_mknod(MDRequest *mdr)
   // prepare finisher
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "mknod");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   journal_allocated_inos(mdr, &le->metablob);
   
@@ -2883,6 +2891,7 @@ void Server::handle_client_mkdir(MDRequest *mdr)
   // prepare finisher
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "mkdir");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   journal_allocated_inos(mdr, &le->metablob);
   mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
@@ -2946,6 +2955,7 @@ void Server::handle_client_symlink(MDRequest *mdr)
   // prepare finisher
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "symlink");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(req->get_reqid());
   journal_allocated_inos(mdr, &le->metablob);
   mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
@@ -3056,6 +3066,7 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
 
   // log + wait
   EUpdate *le = new EUpdate(mdlog, "link_local");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(mdr->reqid);
   mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, 1);      // new dn
   mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, 0, PREDIRTY_PRIMARY);           // targeti
@@ -3143,6 +3154,7 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti
   // add to event
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, inc ? "link_remote":"unlink_remote");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(mdr->reqid);
   if (!mdr->more()->slaves.empty()) {
     dout(20) << " noting uncommitted_slaves " << mdr->more()->slaves << dendl;
@@ -3269,6 +3281,7 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_prep", mdr->reqid, mdr->slave_to_mds,
                                      ESlaveUpdate::OP_PREPARE, ESlaveUpdate::LINK);
+  mdlog->start_entry(le);
 
   inode_t *pi = dnl->get_inode()->project_inode();
 
@@ -3365,7 +3378,7 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti)
     // write a commit to the journal
     ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_commit", mdr->reqid, mdr->slave_to_mds,
                                        ESlaveUpdate::OP_COMMIT, ESlaveUpdate::LINK);
-    mdlog->submit_entry(le, new C_MDS_CommittedSlave(this, mdr));
+    mdlog->start_submit_entry(le, new C_MDS_CommittedSlave(this, mdr));
     mdlog->flush();
   } else {
     do_link_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
@@ -3442,6 +3455,7 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   // journal it
   ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_rollback", rollback.reqid, master,
                                      ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::LINK);
+  mdlog->start_entry(le);
   le->commit.add_dir_context(parent);
   le->commit.add_dir(parent, true);
   le->commit.add_primary_dentry(in->get_parent_dn(), true, 0);
@@ -3641,6 +3655,7 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
 
   // prepare log entry
   EUpdate *le = new EUpdate(mdlog, "unlink_local");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(mdr->reqid);
 
   if (straydn) {
@@ -4140,6 +4155,7 @@ void Server::handle_client_rename(MDRequest *mdr)
   // -- prepare journal entry --
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "rename");
+  mdlog->start_entry(le);
   le->metablob.add_client_req(mdr->reqid);
   if (!mdr->more()->slaves.empty()) {
     dout(20) << " noting uncommitted_slaves " << mdr->more()->slaves << dendl;
@@ -4757,6 +4773,7 @@ void Server::handle_slave_rename_prep(MDRequest *mdr)
     mdr->ls = mdlog->get_current_segment();
     ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_prep", mdr->reqid, mdr->slave_to_mds,
                                        ESlaveUpdate::OP_PREPARE, ESlaveUpdate::RENAME);
+    mdlog->start_entry(le);
     le->rollback = mdr->more()->rollback_bl;
 
     bufferlist blah;  // inode import data... obviously not used if we're the slave
@@ -4835,7 +4852,9 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
   ESlaveUpdate *le;
   if (r == 0) {
     // write a commit to the journal
-    le = new ESlaveUpdate(mdlog, "slave_rename_commit", mdr->reqid, mdr->slave_to_mds, ESlaveUpdate::OP_COMMIT, ESlaveUpdate::RENAME);
+    le = new ESlaveUpdate(mdlog, "slave_rename_commit", mdr->reqid, mdr->slave_to_mds,
+                         ESlaveUpdate::OP_COMMIT, ESlaveUpdate::RENAME);
+    mdlog->start_entry(le);
 
     // unfreeze+singleauth inode
     //  hmm, do i really need to delay this?
@@ -5075,6 +5094,8 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   // journal it
   ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_rollback", rollback.reqid, master,
                                      ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::RENAME);
+  mdlog->start_entry(le);
+
   le->commit.add_dir_context(srcdir);
   le->commit.add_primary_dentry(srcdn, true, 0);
   le->commit.add_dir_context(destdir);
@@ -5328,6 +5349,8 @@ void Server::handle_client_mksnap(MDRequest *mdr)
 
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "mksnap");
+  mdlog->start_entry(le);
+
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_table_transaction(TABLE_SNAP, stid);
   mdcache->predirty_journal_parents(mdr, &le->metablob, diri, 0, PREDIRTY_PRIMARY, false);
@@ -5472,6 +5495,8 @@ void Server::handle_client_rmsnap(MDRequest *mdr)
   
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "rmsnap");
+  mdlog->start_entry(le);
+
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_table_transaction(TABLE_SNAP, stid);
   mdcache->predirty_journal_parents(mdr, &le->metablob, diri, 0, PREDIRTY_PRIMARY, false);
index 187e32db652e0a9da9404cbc4a618d9b170fdf42..fe59ba5f9f67d3fd40ac544352a8624d2eb2ba5a 100644 (file)
@@ -165,7 +165,10 @@ C_Gather *LogSegment::try_to_expire(MDS *mds)
       if (in->is_any_caps()) {
        if (in->is_any_caps_wanted()) {
          dout(20) << "try_to_expire requeueing open file " << *in << dendl;
-         if (!le) le = new EOpen(mds->mdlog);
+         if (!le) {
+           le = new EOpen(mds->mdlog);
+           mds->mdlog->start_entry(le);
+         }
          le->add_clean_inode(in);
          ls->open_files.push_back(&in->xlist_open_file);
        } else {