From a3272040c7874941f6fe6e34239483e9f622e25a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 15 Jul 2008 10:39:26 -0700 Subject: [PATCH] mds: touch dir ctime on mksnap --- src/TODO | 2 -- src/mds/Server.cc | 61 +++++++++++++++++++++++++++++++++--------- src/mds/Server.h | 5 ++-- src/mds/SnapTable.cc | 4 +-- src/mds/SnapTable.h | 2 +- src/mds/events/ESnap.h | 8 ++++-- src/mds/journal.cc | 3 ++- 7 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/TODO b/src/TODO index 7861e728fd259..861b285de78c5 100644 --- a/src/TODO +++ b/src/TODO @@ -237,8 +237,6 @@ todo /- cdir fetch/store versioned dentries - emetablob.. journaling a versioned update.. -- set dir mtime on snap create - - migrator import/export of versioned dentries, inodes... drop them on export... - path_traverse handling of .snapshot? diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 0d46a77a8b41d..4e4a9616793d8 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -44,6 +44,7 @@ #include "events/ESession.h" #include "events/EOpen.h" #include "events/ECommitted.h" +#include "events/ESnap.h" #include "include/filepath.h" #include "common/Timer.h" @@ -4804,6 +4805,19 @@ void Server::handle_client_lssnap(MDRequest *mdr) reply_request(mdr, reply, diri); } + +struct C_MDS_mksnap_finish : public Context { + MDS *mds; + MDRequest *mdr; + CInode *diri; + SnapInfo info; + C_MDS_mksnap_finish(MDS *m, MDRequest *r, CInode *di, SnapInfo &i) : + mds(m), mdr(r), diri(di), info(i) {} + void finish(int r) { + mds->server->_mksnap_finish(mdr, diri, info); + } +}; + void Server::handle_client_mksnap(MDRequest *mdr) { MClientRequest *req = mdr->client_request; @@ -4854,9 +4868,6 @@ void Server::handle_client_mksnap(MDRequest *mdr) if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks)) return; - if (mdr->now == utime_t()) - mdr->now = g_clock.now(); - // make sure name is unique const string &snapname = req->get_path2(); if (diri->snaprealm && @@ -4876,13 +4887,43 @@ void Server::handle_client_mksnap(MDRequest *mdr) return; } + if (mdr->now == utime_t()) + mdr->now = g_clock.now(); + // allocate a snapid // HACK - snapid_t snapid = mds->snaptable->create(diri->ino(), snapname, mdr->now); + version_t snapv; + snapid_t snapid = mds->snaptable->create(diri->ino(), snapname, mdr->now, &snapv); dout(10) << " snapid is " << snapid << dendl; + // journal + SnapInfo info; + info.dirino = diri->ino(); + info.snapid = snapid; + info.name = req->get_path2(); + info.stamp = mdr->now; + + inode_t *pi = diri->project_inode(); + pi->ctime = info.stamp; + pi->version = diri->pre_dirty(); + + mdr->ls = mdlog->get_current_segment(); + ESnap *le = new ESnap(mdlog, true, info, snapv); + le->metablob.add_client_req(req->get_reqid()); + mds->locker->predirty_nested(mdr, &le->metablob, diri, 0, PREDIRTY_PRIMARY, false); + mdcache->journal_dirty_inode(&le->metablob, diri, diri->find_snaprealm()->get_latest_snap()); + + mdlog->submit_entry(le, new C_MDS_mksnap_finish(mds, mdr, diri, info)); +} + +void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) +{ + dout(10) << "_mksnap_finish " << *mdr << " " << info << dendl; - // GO. + diri->pop_and_dirty_projected_inode(mdr->ls); + mdr->apply(); + + snapid_t snapid = info.snapid; // create realm? inodeno_t split_parent = 0; @@ -4899,13 +4940,7 @@ void Server::handle_client_mksnap(MDRequest *mdr) split_parent = parent->inode->ino(); } - // add the snap - dout(10) << "snaprealm was " << *diri->snaprealm << dendl; - SnapInfo info; - info.dirino = diri->ino(); - info.snapid = snapid; - info.name = req->get_path2(); - info.stamp = mdr->now; + // create snap diri->snaprealm->snaps[snapid] = info; dout(10) << "snaprealm now " << *diri->snaprealm << dendl; @@ -4969,7 +5004,7 @@ void Server::handle_client_mksnap(MDRequest *mdr) mdr->ref = diri; mdr->ref_snapid = snapid; mdr->ref_snapdiri = diri; - MClientReply *reply = new MClientReply(req, 0); + MClientReply *reply = new MClientReply(mdr->client_request, 0); reply->set_snaps(diri->snaprealm->get_snaps()); reply_request(mdr, reply); } diff --git a/src/mds/Server.h b/src/mds/Server.h index c62027999630b..5c6556eb52f5e 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -19,14 +19,12 @@ class Logger; class LogEvent; -class C_MDS_rename_finish; class MDRequest; class Mutation; class EMetaBlob; class EUpdate; -class PVList; class MMDSSlaveRequest; - +struct SnapInfo; @@ -162,6 +160,7 @@ public: void handle_client_lssnap(MDRequest *mdr); void handle_client_mksnap(MDRequest *mdr); + void _mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info); void handle_client_rmsnap(MDRequest *mdr); // helpers diff --git a/src/mds/SnapTable.cc b/src/mds/SnapTable.cc index 547f262e63c23..16b4eadae3e60 100644 --- a/src/mds/SnapTable.cc +++ b/src/mds/SnapTable.cc @@ -34,7 +34,7 @@ void SnapTable::reset_state() pending_removal.clear(); } -snapid_t SnapTable::create(inodeno_t base, const string& name, utime_t stamp) +snapid_t SnapTable::create(inodeno_t base, const string& name, utime_t stamp, version_t *psnapv) { assert(is_active()); @@ -43,7 +43,7 @@ snapid_t SnapTable::create(inodeno_t base, const string& name, utime_t stamp) snaps[sn].dirino = base; snaps[sn].name = name; snaps[sn].stamp = stamp; - version++; + *psnapv = ++version; dout(10) << "create(" << base << "," << name << ") = " << sn << dendl; diff --git a/src/mds/SnapTable.h b/src/mds/SnapTable.h index bd7cf78302cfa..a4ee380aa0ed4 100644 --- a/src/mds/SnapTable.h +++ b/src/mds/SnapTable.h @@ -34,7 +34,7 @@ public: SnapTable(MDS *m) : MDSTable(m, "snap") { } // alloc or reclaim ids - snapid_t create(inodeno_t base, const string& name, utime_t stamp); + snapid_t create(inodeno_t base, const string& name, utime_t stamp, version_t *snapv); void remove(snapid_t sn); void init_inode(); diff --git a/src/mds/events/ESnap.h b/src/mds/events/ESnap.h index 5115a7252b4fe..8e1bfff3657a5 100644 --- a/src/mds/events/ESnap.h +++ b/src/mds/events/ESnap.h @@ -23,26 +23,30 @@ #include "../snap.h" class ESnap : public LogEvent { -protected: +public: + EMetaBlob metablob; bool create; SnapInfo snap; version_t version; // table version public: ESnap() : LogEvent(EVENT_SNAP) { } - ESnap(bool c, SnapInfo &sn, version_t v) : + ESnap(MDLog *mdl, bool c, SnapInfo &sn, version_t v) : LogEvent(EVENT_SNAP), + metablob(mdl), create(c), snap(sn), version(v) { } void encode(bufferlist& bl) const { ::encode(create, bl); ::encode(snap, bl); ::encode(version, bl); + ::encode(metablob, bl); } void decode(bufferlist::iterator &bl) { ::decode(create, bl); ::decode(snap, bl); ::decode(version, bl); + ::decode(metablob, bl); } void print(ostream& out) { diff --git a/src/mds/journal.cc b/src/mds/journal.cc index cfddab0820a86..e1cce8995df7b 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -639,7 +639,8 @@ void ESnap::replay(MDS *mds) assert(version-1 == mds->snaptable->get_version()); if (create) { - snapid_t s = mds->snaptable->create(snap.dirino, snap.name, snap.stamp); + version_t v; + snapid_t s = mds->snaptable->create(snap.dirino, snap.name, snap.stamp, &v); assert(s == snap.snapid); } else { mds->snaptable->remove(snap.snapid); -- 2.39.5