}
EUpdate *le = new EUpdate(mdlog, ename);
- mdlog->start_entry(le);
le->metablob.add_dir_context(dir);
le->metablob.add_dir(dir, true);
metablob = &eu->metablob;
le = eu;
}
- mds->mdlog->start_entry(le);
mdcache->predirty_journal_parents(mut, metablob, in, 0, PREDIRTY_PRIMARY);
// no cow, here!
if (mdcache->open_file_table.should_log_open(cur)) {
ceph_assert(cur->last == CEPH_NOSNAP);
EOpen *le = new EOpen(mds->mdlog);
- mds->mdlog->start_entry(le);
le->add_clean_inode(cur);
mds->mdlog->submit_entry(le);
}
}
EUpdate *le = new EUpdate(mds->mdlog, "snap flush");
- mds->mdlog->start_entry(le);
MutationRef mut = new MutationImpl();
mut->ls = mds->mdlog->get_current_segment();
// do the update.
EUpdate *le = new EUpdate(mds->mdlog, "cap update");
- mds->mdlog->start_entry(le);
bool xattr = (dirty & CEPH_CAP_XATTR_EXCL) &&
m->xattrbl.length() &&
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);
mdcache->journal_dirty_inode(mut.get(), &le->metablob, in);
mut->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, "create system file");
- mds->mdlog->start_entry(le);
if (!in->is_mdsdir()) {
predirty_journal_parents(mut, &le->metablob, in, dir, PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
bool do_parent_mtime = flags & PREDIRTY_DIR;
bool shallow = flags & PREDIRTY_SHALLOW;
- ceph_assert(mds->mdlog->entry_is_open());
-
// make sure stamp is set
if (mut->get_mds_stamp() == utime_t())
mut->set_mds_stamp(ceph_clock_now());
{
dout(10) << "log_leader_commit " << reqid << dendl;
uncommitted_leaders[reqid].committing = true;
- mds->mdlog->start_submit_entry(new ECommitted(reqid),
- new C_MDC_CommittedLeader(this, reqid));
+ mds->mdlog->submit_entry(new ECommitted(reqid), new C_MDC_CommittedLeader(this, reqid));
}
void MDCache::_logged_leader_commit(metareqid_t reqid)
show_subtrees();
ESubtreeMap *le = new ESubtreeMap();
- mds->mdlog->_start_entry(le);
map<dirfrag_t, CDir*> dirs_to_add;
ceph_assert(su);
// log commit
- mds->mdlog->start_submit_entry(new EPeerUpdate(mds->mdlog, "unknown", p.first, from,
+ mds->mdlog->submit_entry(new EPeerUpdate(mds->mdlog, "unknown", p.first, from,
EPeerUpdate::OP_COMMIT, su->origop),
new C_MDC_PeerCommit(this, from, p.first));
mds->mdlog->flush();
dout(10) << "ambiguous import auth known, must not be me " << *dir << dendl;
cancel_ambiguous_import(dir);
- mds->mdlog->start_submit_entry(new EImportFinish(dir, false));
+ mds->mdlog->submit_entry(new EImportFinish(dir, false));
// subtree may have been swallowed by another node claiming dir
// as their own.
} else {
dout(10) << "ambiguous import auth unclaimed, must be me " << *dir << dendl;
finish_ambiguous_import(q->first);
- mds->mdlog->start_submit_entry(new EImportFinish(dir, true));
+ mds->mdlog->submit_entry(new EImportFinish(dir, true));
}
}
ceph_assert(my_ambiguous_imports.empty());
finish->session_map);
ESessions *le = new ESessions(pv, std::move(rejoin_client_map),
std::move(rejoin_client_metadata_map));
- mds->mdlog->start_submit_entry(le, finish);
+ mds->mdlog->submit_entry(le, finish);
mds->mdlog->flush();
rejoin_client_map.clear();
rejoin_client_metadata_map.clear();
auto mut(std::make_shared<MutationImpl>());
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());
pi.inode->fscrypt_last_block = bufferlist();
EUpdate *le = new EUpdate(mds->mdlog, "truncate finish");
- mds->mdlog->start_entry(le);
predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
journal_dirty_inode(mut.get(), &le->metablob, in);
mds->inotable->project_release_ids(inos);
version_t piv = mds->inotable->get_projected_version();
ceph_assert(piv != 0);
- mds->mdlog->start_submit_entry(new EPurged(inos, ls->seq, piv),
+ mds->mdlog->submit_entry(new EPurged(inos, ls->seq, piv),
new C_MDS_purge_completed_finish(this, inos, ls, piv));
mds->mdlog->flush();
});
if (ls->num_events > 1 || !ls->dirty_dirfrags.empty()) {
// Current segment contains events other than subtreemap or
// there are dirty dirfrags (see CDir::log_mark_dirty())
- mds->mdlog->start_new_segment();
+ auto sle = create_subtree_map();
+ mds->mdlog->submit_entry(sle);
mds->mdlog->flush();
}
}
mdr->ls = mds->mdlog->get_current_segment();
EFragment *le = new EFragment(mds->mdlog, EFragment::OP_PREPARE, basedirfrag, info.bits);
- mds->mdlog->start_entry(le);
for (const auto& dir : info.dirs) {
dirfrag_rollback rollback;
// journal commit
EFragment *le = new EFragment(mds->mdlog, EFragment::OP_COMMIT, basedirfrag, info.bits);
- mds->mdlog->start_submit_entry(le, new C_MDC_FragmentCommit(this, basedirfrag, mdr));
+ mds->mdlog->submit_entry(le, new C_MDC_FragmentCommit(this, basedirfrag, mdr));
// unfreeze resulting frags
mdr->mark_event("old frags purged");
EFragment *le = new EFragment(mds->mdlog, EFragment::OP_FINISH, basedirfrag, bits);
- mds->mdlog->start_submit_entry(le);
+ mds->mdlog->submit_entry(le);
finish_uncommitted_fragment(basedirfrag, EFragment::OP_FINISH);
MutationRef mut(new MutationImpl());
mut->ls = mds->mdlog->get_current_segment();
EFragment *le = new EFragment(mds->mdlog, EFragment::OP_ROLLBACK, p->first, uf.bits);
- mds->mdlog->start_entry(le);
bool diri_auth = (diri->authority() != CDIR_AUTH_UNDEF);
frag_vec_t old_frags;
mdr->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, "repair_dirfrag");
- mds->mdlog->start_entry(le);
if (!good_fragstat) {
if (pf->fragstat.mtime > frag_info.mtime)
// -------------------------------------------------
-void MDLog::_start_entry(LogEvent *e)
+void MDLog::_submit_entry(LogEvent *le, MDSLogContextBase* c)
{
+ dout(20) << __func__ << " " << *le << dendl;
+ ceph_assert(ceph_mutex_is_locked_by_me(mds->mds_lock));
ceph_assert(ceph_mutex_is_locked_by_me(submit_mutex));
-
- ceph_assert(cur_event == NULL);
- cur_event = e;
+ ceph_assert(!mds->is_any_replay());
+ ceph_assert(!mds_is_shutting_down);
event_seq++;
- EMetaBlob *metablob = e->get_metablob();
+ EMetaBlob *metablob = le->get_metablob();
if (metablob) {
- metablob->event_seq = event_seq;
- metablob->last_subtree_map = get_last_segment_seq();
+ for (auto& in : metablob->get_touched_inodes()) {
+ in->last_journaled = event_seq;
+ }
}
-}
-
-void MDLog::cancel_entry(LogEvent *le)
-{
- ceph_assert(le == cur_event);
- cur_event = NULL;
- delete le;
-}
-
-void MDLog::_submit_entry(LogEvent *le, MDSLogContextBase *c)
-{
- ceph_assert(ceph_mutex_is_locked_by_me(submit_mutex));
- ceph_assert(!mds->is_any_replay());
- ceph_assert(!mds_is_shutting_down);
-
- ceph_assert(le == cur_event);
- cur_event = NULL;
// let the event register itself in the segment
ceph_assert(!segments.empty());
}
unflushed++;
-
+}
+
+void MDLog::_segment_upkeep(LogEvent* le)
+{
+ ceph_assert(ceph_mutex_is_locked_by_me(mds->mds_lock));
+ ceph_assert(ceph_mutex_is_locked_by_me(submit_mutex));
uint64_t period = journaler->get_layout_period();
+ auto ls = get_current_segment();
// start a new segment?
if (le->get_type() == EVENT_SUBTREEMAP ||
(le->get_type() == EVENT_IMPORTFINISH && mds->is_resolve())) {
// do not insert ESubtreeMap among EImportFinish events that finish
// disambiguate imports. Because the ESubtreeMap reflects the subtree
// state when all EImportFinish events are replayed.
- } else if (ls->end/period != ls->offset/period ||
- ls->num_events >= events_per_segment) {
+ } else if (ls->end/period != ls->offset/period || ls->num_events >= events_per_segment) {
dout(10) << "submit_entry also starting new segment: last = "
- << ls->seq << "/" << ls->offset << ", event seq = " << event_seq << dendl;
+ << ls->seq << "/" << ls->offset << ", event seq = " << event_seq << dendl;
_start_new_segment();
- } else if (debug_subtrees &&
- le->get_type() != EVENT_SUBTREEMAP_TEST) {
+ } else if (debug_subtrees && le->get_type() != EVENT_SUBTREEMAP_TEST) {
// debug: journal this every time to catch subtree replay bugs.
// use a different event id so it doesn't get interpreted as a
// LogSegment boundary on replay.
+ dout(10) << __func__ << ": creating test subtree map" << dendl;
LogEvent *sle = mds->mdcache->create_subtree_map();
sle->set_type(EVENT_SUBTREEMAP_TEST);
_submit_entry(sle, NULL);
Journaler *get_journaler() { return journaler; }
bool empty() const { return segments.empty(); }
+ uint64_t get_last_segment_seq() const {
+ ceph_assert(!segments.empty());
+ return segments.rbegin()->first;
+ }
+
bool is_capped() const { return mds_is_shutting_down; }
void cap();
void kick_submitter();
void shutdown();
- void _start_entry(LogEvent *e);
- void start_entry(LogEvent *e) {
- std::lock_guard l(submit_mutex);
- _start_entry(e);
- }
- void cancel_entry(LogEvent *e);
- void _submit_entry(LogEvent *e, MDSLogContextBase *c);
- void submit_entry(LogEvent *e, MDSLogContextBase *c = 0) {
- std::lock_guard l(submit_mutex);
- _submit_entry(e, c);
- submit_cond.notify_all();
- }
- void start_submit_entry(LogEvent *e, MDSLogContextBase *c = 0) {
+ void submit_entry(LogEvent *e, MDSLogContextBase* c = 0) {
std::lock_guard l(submit_mutex);
- _start_entry(e);
_submit_entry(e, c);
+ _segment_upkeep(e);
submit_cond.notify_all();
}
- bool entry_is_open() const { return cur_event != NULL; }
void wait_for_safe(Context* c);
void flush();
void _submit_thread();
- uint64_t get_last_segment_seq() const {
- ceph_assert(!segments.empty());
- return segments.rbegin()->first;
- }
LogSegment *get_oldest_segment() {
return segments.begin()->second;
}
// -- segments --
void _start_new_segment();
void _prepare_new_segment();
+ void _segment_upkeep(LogEvent* le);
void _journal_segment_subtree_map(MDSContext *onsync);
+ void _submit_entry(LogEvent *e, MDSLogContextBase *c);
void try_to_commit_open_file_table(uint64_t last_seq);
void _trim_expired_segments();
void write_head(MDSContext *onfinish);
- // -- events --
- LogEvent *cur_event = nullptr;
-
bool debug_subtrees;
uint64_t events_per_segment;
int64_t max_events;
pending_commit.erase(tid);
// log ACK.
- mds->mdlog->start_submit_entry(new ETableClient(table, TABLESERVER_OP_ACK, tid),
+ mds->mdlog->submit_entry(new ETableClient(table, TABLESERVER_OP_ACK, tid),
new C_LoggedAck(this, tid));
} else {
dout(10) << "got stray ack on tid " << tid << ", ignoring" << dendl;
ETableServer *le = new ETableServer(table, TABLESERVER_OP_PREPARE, req->reqid, from,
projected_version, projected_version);
- mds->mdlog->start_entry(le);
le->mutation = req->bl;
mds->mdlog->submit_entry(le, new C_Prepare(this, req, projected_version));
mds->mdlog->flush();
projected_version++;
committing_tids.insert(tid);
- mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_COMMIT, 0, MDS_RANK_NONE,
+ mds->mdlog->submit_entry(new ETableServer(table, TABLESERVER_OP_COMMIT, 0, MDS_RANK_NONE,
tid, projected_version),
new C_Commit(this, req));
}
projected_version++;
committing_tids.insert(tid);
- mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, MDS_RANK_NONE,
+ mds->mdlog->submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, MDS_RANK_NONE,
tid, projected_version),
new C_Rollback(this, req));
}
projected_version++;
ETableServer *le = new ETableServer(table, TABLESERVER_OP_SERVER_UPDATE, 0, MDS_RANK_NONE, 0, projected_version);
- mds->mdlog->start_entry(le);
le->mutation = bl;
mds->mdlog->submit_entry(le, new C_ServerUpdate(this, bl));
}
// log completion.
// include export bounds, to ensure they're in the journal.
EExport *le = new EExport(mds->mdlog, dir, it->second.peer);;
- mds->mdlog->start_entry(le);
le->metablob.add_dir_context(dir, EMetaBlob::TO_ROOT);
le->metablob.add_dir(dir, false);
// start the journal entry
EImportStart *le = new EImportStart(mds->mdlog, dir->dirfrag(), m->bounds, oldauth);
- mds->mdlog->start_entry(le);
le->metablob.add_dir_context(dir);
}
// log our failure
- mds->mdlog->start_submit_entry(new EImportFinish(dir, false)); // log failure
+ mds->mdlog->submit_entry(new EImportFinish(dir, false)); // log failure
mdcache->trim(num_dentries); // try trimming dentries
MutationRef mut = it->second.mut;
import_state.erase(it);
- mds->mdlog->start_submit_entry(new EImportFinish(dir, true));
+ mds->mdlog->submit_entry(new EImportFinish(dir, true));
// process delayed expires
mdcache->process_delayed_expire(dir);
// journal open client sessions
ESessions *le = new ESessions(pv, std::move(client_map),
std::move(client_metadata_map));
- mds->mdlog->start_submit_entry(le, finish);
+ mds->mdlog->submit_entry(le, finish);
mds->mdlog->flush();
}
ceph_assert(r == 0);
log_session_status("ACCEPTED", "");
});
- mdlog->start_submit_entry(new ESession(m->get_source_inst(), true, pv, client_metadata),
+ mdlog->submit_entry(new ESession(m->get_source_inst(), true, pv, client_metadata),
new C_MDS_session_finish(this, session, sseq, true, pv, fin));
mdlog->flush();
}
auto le = new ESession(session->info.inst, false, pv, inos_to_free, piv, session->delegated_inos);
auto fin = new C_MDS_session_finish(this, session, sseq, false, pv, inos_to_free, piv,
session->delegated_inos, mdlog->get_current_segment(), on_safe);
- mdlog->start_submit_entry(le, fin);
+ mdlog->submit_entry(le, fin);
mdlog->flush();
// clean up requests, too
if (cur->is_auth() && cur->last == CEPH_NOSNAP &&
mdcache->open_file_table.should_log_open(cur)) {
EOpen *le = new EOpen(mds->mdlog);
- mdlog->start_entry(le);
le->add_clean_inode(cur);
mdlog->submit_entry(le);
}
// 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(), req->get_oldest_client_tid());
journal_allocated_inos(mdr, &le->metablob);
mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
// project update
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "setattr");
- mdlog->start_entry(le);
auto pi = cur->project_inode(mdr);
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "open_truncate");
- mdlog->start_entry(le);
// prepare
auto pi = in->project_inode(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(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// 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(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// log + wait
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "set vxattr layout");
- mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// log + wait
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "remove dir layout vxattr");
- mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// 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(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// 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(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
// 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(), req->get_oldest_client_tid());
journal_allocated_inos(mdr, &le->metablob);
// 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(), req->get_oldest_client_tid());
journal_allocated_inos(mdr, &le->metablob);
mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
// 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(), req->get_oldest_client_tid());
journal_allocated_inos(mdr, &le->metablob);
mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
// log + wait
EUpdate *le = new EUpdate(mdlog, "link_local");
- mdlog->start_entry(le);
le->metablob.add_client_req(mdr->reqid, mdr->client_request->get_oldest_client_tid());
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
// 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, mdr->client_request->get_oldest_client_tid());
if (!mdr->more()->witnessed.empty()) {
dout(20) << " noting uncommitted_peers " << mdr->more()->witnessed << dendl;
mdr->ls = mdlog->get_current_segment();
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_link_prep", mdr->reqid, mdr->peer_to_mds,
EPeerUpdate::OP_PREPARE, EPeerUpdate::LINK);
- mdlog->start_entry(le);
-
auto pi = dnl->get_inode()->project_inode(mdr);
// update journaled target inode
// write a commit to the journal
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_link_commit", mdr->reqid, mdr->peer_to_mds,
EPeerUpdate::OP_COMMIT, EPeerUpdate::LINK);
- mdlog->start_entry(le);
submit_mdlog_entry(le, new C_MDS_CommittedPeer(this, mdr), mdr, __func__);
mdlog->flush();
} else {
// journal it
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_link_rollback", rollback.reqid, leader,
EPeerUpdate::OP_ROLLBACK, EPeerUpdate::LINK);
- mdlog->start_entry(le);
le->commit.add_dir_context(parent);
le->commit.add_dir(parent, true);
le->commit.add_primary_dentry(in->get_projected_parent_dn(), 0, true);
// prepare log entry
EUpdate *le = new EUpdate(mdlog, "unlink_local");
- mdlog->start_entry(le);
le->metablob.add_client_req(mdr->reqid, mdr->client_request->get_oldest_client_tid());
if (!mdr->more()->witnessed.empty()) {
dout(20) << " noting uncommitted_peers " << mdr->more()->witnessed << dendl;
mdr->ls = mdlog->get_current_segment();
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rmdir", mdr->reqid, mdr->peer_to_mds,
EPeerUpdate::OP_PREPARE, EPeerUpdate::RMDIR);
- mdlog->start_entry(le);
le->rollback = mdr->more()->rollback_bl;
le->commit.add_dir_context(straydn->get_dir());
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rmdir_commit", mdr->reqid,
mdr->peer_to_mds, EPeerUpdate::OP_COMMIT,
EPeerUpdate::RMDIR);
- mdlog->start_entry(le);
submit_mdlog_entry(le, new C_MDS_CommittedPeer(this, mdr), mdr, __func__);
mdlog->flush();
} else {
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rmdir_rollback", rollback.reqid, leader,
EPeerUpdate::OP_ROLLBACK, EPeerUpdate::RMDIR);
- mdlog->start_entry(le);
le->commit.add_dir_context(dn->get_dir());
le->commit.add_primary_dentry(dn, in, true);
// -- 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, req->get_oldest_client_tid());
if (!mdr->more()->witnessed.empty()) {
dout(20) << " noting uncommitted_peers " << mdr->more()->witnessed << dendl;
mdr->ls = mdlog->get_current_segment();
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rename_prep", mdr->reqid, mdr->peer_to_mds,
EPeerUpdate::OP_PREPARE, EPeerUpdate::RENAME);
- mdlog->start_entry(le);
le->rollback = mdr->more()->rollback_bl;
bufferlist blah; // inode import data... obviously not used if we're the peer
if (le->commit.empty()) {
dout(10) << " empty metablob, skipping journal" << dendl;
- mdlog->cancel_entry(le);
+ delete le;
mdr->ls = NULL;
_logged_peer_rename(mdr, srcdn, destdn, straydn);
} else {
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rename_commit", mdr->reqid,
mdr->peer_to_mds, EPeerUpdate::OP_COMMIT,
EPeerUpdate::RENAME);
- mdlog->start_entry(le);
submit_mdlog_entry(le, new C_MDS_CommittedPeer(this, mdr), mdr, __func__);
mdlog->flush();
} else {
// journal it
EPeerUpdate *le = new EPeerUpdate(mdlog, "peer_rename_rollback", rollback.reqid, leader,
EPeerUpdate::OP_ROLLBACK, EPeerUpdate::RENAME);
- mdlog->start_entry(le);
if (srcdn && (srcdn->authority().first == whoami || force_journal_src)) {
le->commit.add_dir_context(srcdir);
if (mdr && !mdr->more()->peer_update_journaled) {
ceph_assert(le->commit.empty());
- mdlog->cancel_entry(le);
+ delete le;
mut->ls = NULL;
_rename_rollback_finish(mut, mdr, srcdn, srcdnpv, destdn, straydn, splits, finish_mdr);
} else {
// journal the inode changes
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "mksnap");
- mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
le->metablob.add_table_transaction(TABLE_SNAP, stid);
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "rmsnap");
- mdlog->start_entry(le);
// project the snaprealm
auto &newnode = *pi.snapnode;
// journal the inode changes
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "renamesnap");
- mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
le->metablob.add_table_transaction(TABLE_SNAP, stid);
pf->version = dir->pre_dirty();
EUpdate *le = new EUpdate(mds->mdlog, "purge_stray truncate");
- mds->mdlog->start_entry(le);
le->metablob.add_dir_context(dir);
auto& dl = le->metablob.add_dir(dn->dir, true);
dn->push_projected_linkage(); // NULL
EUpdate *le = new EUpdate(mds->mdlog, "purge_stray");
- mds->mdlog->start_entry(le);
// update dirfrag fragstat, rstat
CDir *dir = dn->get_dir();
std::vector<std::pair<metareqid_t,uint64_t> > client_reqs;
std::vector<std::pair<metareqid_t,uint64_t> > client_flushes;
+ std::set<CInode*> touched;
+
public:
void encode(bufferlist& bl, uint64_t features) const;
void decode(bufferlist::const_iterator& bl);
void get_inodes(std::set<inodeno_t> &inodes) const;
+ const auto& get_touched_inodes(void) const {
+ return touched;
+ }
void get_paths(std::vector<std::string> &paths) const;
void get_dentries(std::map<dirfrag_t, std::set<std::string> > &dentries) const;
entity_name_t get_client_name() const {return client_name;}
void dump(Formatter *f) const;
static void generate_test_instances(std::list<EMetaBlob*>& ls);
- // soft stateadd
- uint64_t last_subtree_map;
- uint64_t event_seq;
// for replay, in certain cases
//LogSegment *_segment;
EMetaBlob() : opened_ino(0), renamed_dirino(0),
- inotablev(0), sessionmapv(0), allocated_ino(0),
- last_subtree_map(0), event_seq(0)
+ inotablev(0), sessionmapv(0), allocated_ino(0)
{}
EMetaBlob(const EMetaBlob&) = delete;
~EMetaBlob() { }
state, in->get_old_inodes());
// make note of where this inode was last journaled
- in->last_journaled = event_seq;
+
+ touched.insert(in);
//cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl;
}
}
void add_root(bool dirty, CInode *in) {
- in->last_journaled = event_seq;
+ touched.insert(in);
//cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl;
const auto& pi = in->get_projected_inode();
dout(20) << "try_to_expire requeueing snap needflush inode " << *in << dendl;
if (!le) {
le = new EOpen(mds->mdlog);
- mds->mdlog->start_entry(le);
}
le->add_clean_inode(in);
ls->open_files.push_back(&in->item_open_file);
}
// was the inode journaled in this blob?
- if (event_seq && diri->last_journaled == event_seq) {
+ if (touched.contains(diri)) {
dout(20) << "EMetaBlob::add_dir_context(" << dir << ") already have diri this blob " << *diri << dendl;
break;
}
// have we journaled this inode since the last subtree map?
- if (!maybenot && last_subtree_map && diri->last_journaled >= last_subtree_map) {
+ auto last_segment_seq = mds->mdlog->get_last_segment_seq();
+ if (!maybenot && diri->last_journaled >= last_segment_seq) {
dout(20) << "EMetaBlob::add_dir_context(" << dir << ") already have diri in this segment ("
- << diri->last_journaled << " >= " << last_subtree_map << "), setting maybenot flag "
+ << diri->last_journaled << " >= " << last_segment_seq << "), setting maybenot flag "
<< *diri << dendl;
maybenot = true;
}