From: Sage Weil Date: Thu, 3 Dec 2009 20:12:55 +0000 (-0800) Subject: mds: bracket mds journal events with {start,submit}_entry X-Git-Tag: v0.18~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b709a7283314aa9a29840ba6ed7266bdc1e7ece9;p=ceph.git mds: bracket mds journal events with {start,submit}_entry This lets us catch nested journal events when they happen, instead of down the line when dir/inode version numbers look weird. --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 72d973206281..b3f29089f19a 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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 *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); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 621bd6375390..472a03501e37 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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 diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index efb1c14bccad..36ae8699d67e 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -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) { diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index f7e43cacecd5..14dbb6c2ce2e 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -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(); diff --git a/src/mds/MDSTableClient.cc b/src/mds/MDSTableClient.cc index 5885eb9a5133..ef4101865157 100644 --- a/src/mds/MDSTableClient.cc +++ b/src/mds/MDSTableClient.cc @@ -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: diff --git a/src/mds/MDSTableServer.cc b/src/mds/MDSTableServer.cc index 6f3fb599436a..fbd9ac7fc632 100644 --- a/src/mds/MDSTableServer.cc +++ b/src/mds/MDSTableServer.cc @@ -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); } diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 885034491257..6ed4d1f868b9 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -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::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(); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 6663d5d357e6..46416f079e4c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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); diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 187e32db652e..fe59ba5f9f67 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -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 {