]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: touch dir ctime on mksnap
authorSage Weil <sage@newdream.net>
Tue, 15 Jul 2008 17:39:26 +0000 (10:39 -0700)
committerSage Weil <sage@newdream.net>
Tue, 15 Jul 2008 17:39:26 +0000 (10:39 -0700)
src/TODO
src/mds/Server.cc
src/mds/Server.h
src/mds/SnapTable.cc
src/mds/SnapTable.h
src/mds/events/ESnap.h
src/mds/journal.cc

index 7861e728fd259b68502b342bef5eec2f9ad6af4c..861b285de78c5d3f287c59a470cd760713fd2741 100644 (file)
--- 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?
index 0d46a77a8b41de083dd72fb97725802ff27cd805..4e4a9616793d86a938c71e115cc249def800a44b 100644 (file)
@@ -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);
 }
index c62027999630b3cb84d65370e42339affcdae297..5c6556eb52f5e6e1bee96430839d967fe4440e72 100644 (file)
 
 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
index 547f262e63c23100a524b3b8c6e8f261859aa37d..16b4eadae3e6029babf5888d2c11f08e369e6177 100644 (file)
@@ -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;
 
index bd7cf78302cfa76b16c4959a9f7b4d3b4c76b6d1..a4ee380aa0ed49a4d79a92f4f09c5aa15aeb88a5 100644 (file)
@@ -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();
index 5115a7252b4fe284e563fbca7809975181a5a23b..8e1bfff3657a58aa0fcb5ab043ac4a57f58a8c06 100644 (file)
 #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) {
index cfddab0820a86389f9b5fd5b20b2b851e56de275..e1cce8995df7b4bf1e7adee62acc09d3713e3f7d 100644 (file)
@@ -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);