]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: set seq correctly for rmsnap, snaprealm create
authorSage Weil <sage@newdream.net>
Wed, 13 Aug 2008 17:00:44 +0000 (10:00 -0700)
committerSage Weil <sage@newdream.net>
Wed, 13 Aug 2008 17:00:44 +0000 (10:00 -0700)
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/SnapClient.h
src/mds/SnapServer.cc

index d24782aaa3cfd0ca8efa1c4550dde52f84de3a4d..bf117ac92d55c0d6b65c02199e8f82733a25af79 100644 (file)
@@ -6087,7 +6087,7 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in)
 
   // allocate an id..
   if (!mdr->more()->stid) {
-    mds->snapclient->prepare_create_realm(in->ino(), &mdr->more()->stid, 
+    mds->snapclient->prepare_create_realm(in->ino(), &mdr->more()->stid, &mdr->more()->snapidbl,
                                          new C_MDS_RetryRequest(this, mdr));
     return;
   }
@@ -6101,8 +6101,12 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in)
   pi->version = in->pre_dirty();
   pi->rstat.rsnaprealms++;
 
+  bufferlist::iterator p = mdr->more()->snapidbl.begin();
+  snapid_t seq;
+  ::decode(seq, p);
+
   SnapRealm t(this, in);
-  t.created = mdr->more()->stid;
+  t.created = seq;
   bufferlist snapbl;
   ::encode(t, snapbl);
   
@@ -6215,8 +6219,12 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in
   mds->snapclient->commit(mdr->more()->stid, mut->ls);
 
   // create
+  bufferlist::iterator p = mdr->more()->snapidbl.begin();
+  snapid_t seq;
+  ::decode(seq, p);
+
   in->open_snaprealm();
-  in->snaprealm->seq = in->snaprealm->created = mdr->more()->stid;
+  in->snaprealm->seq = in->snaprealm->created = seq;
 
   do_realm_split_notify(in);
 
index 7413e3b77eb6a780dd8d74edaab04194b9684c8e..7e32a88ba90e2dce704db777e6c24e5c6856e1c0 100644 (file)
@@ -5179,12 +5179,15 @@ void Server::handle_client_rmsnap(MDRequest *mdr)
   // prepare
   if (!mdr->more()->stid) {
     mds->snapclient->prepare_destroy(diri->ino(), snapid,
-                                    &mdr->more()->stid,
+                                    &mdr->more()->stid, &mdr->more()->snapidbl,
                                     new C_MDS_RetryRequest(mds->mdcache, mdr));
     return;
   }
   version_t stid = mdr->more()->stid;
-  dout(10) << " stid is " << stid << dendl;
+  bufferlist::iterator p = mdr->more()->snapidbl.begin();
+  snapid_t seq;
+  ::decode(seq, p);  
+  dout(10) << " stid is " << stid << ", seq is " << seq << dendl;
 
   // journal
   inode_t *pi = diri->project_inode();
@@ -5204,8 +5207,8 @@ void Server::handle_client_rmsnap(MDRequest *mdr)
   snapid_t old_ld = diri->snaprealm->last_destroyed;
   SnapInfo old_info = diri->snaprealm->snaps[snapid];
   diri->snaprealm->snaps.erase(snapid);
-  diri->snaprealm->seq = stid;
-  diri->snaprealm->last_destroyed = stid;
+  diri->snaprealm->seq = seq;
+  diri->snaprealm->last_destroyed = seq;
   diri->encode_snap_blob(snapbl);
   diri->snaprealm->snaps[snapid] = old_info;
   diri->snaprealm->seq = old_seq;
@@ -5219,6 +5222,9 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid)
 {
   dout(10) << "_rmsnap_finish " << *mdr << " " << snapid << dendl;
   snapid_t stid = mdr->more()->stid;
+  bufferlist::iterator p = mdr->more()->snapidbl.begin();
+  snapid_t seq;
+  ::decode(seq, p);  
 
   diri->pop_and_dirty_projected_inode(mdr->ls);
   mdr->apply();
@@ -5227,8 +5233,8 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid)
 
   // remove snap
   diri->snaprealm->snaps.erase(snapid);
-  diri->snaprealm->last_destroyed = stid;
-  diri->snaprealm->seq = stid;
+  diri->snaprealm->last_destroyed = seq;
+  diri->snaprealm->seq = seq;
   dout(10) << "snaprealm now " << *diri->snaprealm << dendl;
 
   mdcache->do_realm_invalidate_and_update_notify(diri, CEPH_SNAP_OP_DESTROY);
index cb618c8e2adccb38cdeedaf7cde70cf90d1fbe42..e995a30cfe6729b668851ea9f0282eab72e6115d 100644 (file)
@@ -40,21 +40,21 @@ public:
     _prepare(bl, pstid, pbl, onfinish);
   }
 
-  void prepare_create_realm(inodeno_t ino, version_t *pstid, Context *onfinish) {
+  void prepare_create_realm(inodeno_t ino, version_t *pstid, bufferlist *pbl, Context *onfinish) {
     bufferlist bl;
     __u32 op = TABLE_OP_CREATE;
     ::encode(op, bl);
     ::encode(ino, bl);
-    _prepare(bl, pstid, 0, onfinish);
+    _prepare(bl, pstid, pbl, onfinish);
   }
 
-  void prepare_destroy(inodeno_t ino, snapid_t snapid, version_t *pstid, Context *onfinish) {
+  void prepare_destroy(inodeno_t ino, snapid_t snapid, version_t *pstid, bufferlist *pbl, Context *onfinish) {
     bufferlist bl;
     __u32 op = TABLE_OP_DESTROY;
     ::encode(op, bl);
     ::encode(ino, bl);
     ::encode(snapid, bl);
-    _prepare(bl, pstid, 0, onfinish);
+    _prepare(bl, pstid, pbl, onfinish);
   }
 };
 
index d63b27d617701458ee5305bf994f8671ab7fcc60..d6eb9a4259890b8870336010727f9e788f3b6878 100644 (file)
@@ -61,12 +61,12 @@ void SnapServer::_prepare(bufferlist &bl, __u64 reqid, int bymds)
        info.snapid = ++last_snap;
        pending_create[version] = info;
        dout(10) << "prepare v" << version << " create " << info << dendl;
-       bl.clear();
-       ::encode(info.snapid, bl);
       } else {
        pending_noop.insert(version);
        dout(10) << "prepare v" << version << " noop" << dendl;
       }
+      bl.clear();
+      ::encode(last_snap, bl);
     }
     break;