]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: link rollback works. nested anchor, replay fixups.
authorSage Weil <sage@newdream.net>
Thu, 29 May 2008 21:19:55 +0000 (14:19 -0700)
committerSage Weil <sage@newdream.net>
Thu, 29 May 2008 21:19:55 +0000 (14:19 -0700)
src/client/SyntheticClient.cc
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/Server.h
src/mds/events/ESlaveUpdate.h
src/mds/journal.cc

index d4ec5c57f918763abd35d9eda9118cd1973599a3..877eee795b19389455e0aefe20c348f584bf42ba 100644 (file)
@@ -2860,9 +2860,10 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int
 
   srand(0);
   if (1) {
+    bool renames = false; // thrash renames too?
     for (int k=0; k<n; k++) {
       
-      if (rand() % 10 == 0) {
+      if (renames && rand() % 10 == 0) {
        // rename some directories.  whee!
        int dep = (rand() % depth) + 1;
        string src = basedir;
@@ -2921,7 +2922,7 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int
       switch (o) {
       case 0: 
        client->mknod(src.c_str(), 0755); 
-       client->rename(src.c_str(), dst.c_str()); 
+       if (renames) client->rename(src.c_str(), dst.c_str()); 
        break;
       case 1: 
        client->mknod(src.c_str(), 0755); 
index 42cfc6c9e184e1bfef8b2022ad2947b32896e95a..b5ef31a4c1a26631693dc5e3ec1f47b3d72ce196 100644 (file)
@@ -73,6 +73,9 @@ ostream& operator<<(ostream& out, CInode& in)
   if (in.is_freezing_inode()) out << " FREEZING=" << in.auth_pin_freeze_allowance;
   if (in.is_frozen_inode()) out << " FROZEN";
 
+  if (in.get_nested_anchors())
+    out << " na=" << in.get_nested_anchors();
+
   if (in.inode.is_dir()) {
     out << " ds=" << in.inode.dirstat.size() << "=" 
        << in.inode.dirstat.nfiles << "+" << in.inode.dirstat.nsubdirs;
@@ -596,7 +599,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     {
       bool was_anchored = inode.anchored;
       ::decode(inode.anchored, p);
-      if (was_anchored != inode.anchored)
+      if (parent && was_anchored != inode.anchored)
        parent->adjust_nested_anchors((int)inode.anchored - (int)was_anchored);
     }
     break;
index dd71aa9b835819ca46f5cc1809293315e4983655..e6bc6143d58d9b3e6e9001797c40ba8efc29686f 100644 (file)
@@ -508,6 +508,7 @@ public:
   void auth_unpin();
 
   void adjust_nested_anchors(int by);
+  int get_nested_anchors() { return nested_anchors; }
 
   // -- freeze --
   bool is_freezing_inode() { return state_test(STATE_FREEZING); }
index aab167b3f8c55f31cc5a5df04a8e8066092c723b..cf82ad3a5dd55a82e9b21ba146c13cbcac7a8f5f 100644 (file)
@@ -1411,9 +1411,9 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack)
       // perform rollback (and journal a rollback entry)
       // note: this will hold up the resolve a bit, until the rollback entries journal.
       if (uncommitted_slave_updates[from][*p]->origop == ESlaveUpdate::LINK)
-       mds->server->do_link_rollback(uncommitted_slave_updates[from][*p]->rollback, 0);
+       mds->server->do_link_rollback(uncommitted_slave_updates[from][*p]->rollback, from, 0);
       else if (uncommitted_slave_updates[from][*p]->origop == ESlaveUpdate::RENAME)  
-       mds->server->do_rename_rollback(uncommitted_slave_updates[from][*p]->rollback, 0);    
+       mds->server->do_rename_rollback(uncommitted_slave_updates[from][*p]->rollback, from, 0);    
       else
        assert(0);
 
@@ -2446,6 +2446,8 @@ void MDCache::handle_cache_rejoin_ack(MMDSCacheRejoin *ack)
        ++p) {
     CInode *in = get_inode(p->inode.ino);
     if (!in) continue;
+    if (in->parent && in->inode.anchored != p->inode.anchored)
+      in->parent->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored );
     in->inode = p->inode;
     in->symlink = p->symlink;
     in->dirfragtree = p->dirfragtree;
@@ -2522,6 +2524,8 @@ void MDCache::handle_cache_rejoin_full(MMDSCacheRejoin *full)
     set<CInode*>::iterator q = rejoin_undef_inodes.find(in);
     if (q != rejoin_undef_inodes.end()) {
       CInode *in = *q;
+      if (in->parent && in->inode.anchored != p->inode.anchored)
+       in->parent->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored );
       in->inode = p->inode;
       in->symlink = p->symlink;
       in->dirfragtree = p->dirfragtree;
index de49b3a94cc71495fc6ae1558dfedd419a2726fa..6c756c77a536e992093480da01ca6ef5f1b693d2 100644 (file)
@@ -2303,6 +2303,8 @@ void Server::_link_remote(MDRequest *mdr, CDentry *dn, CInode *targeti)
   }
   dout(10) << " targeti auth has prepared nlink++" << dendl;
 
+  assert(0);  // test hack: verify that remote slave can do a live rollback.
+
   // go.
   // predirty dentry
   dn->pre_dirty();
@@ -2475,7 +2477,7 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti)
     mdlog->submit_entry(le);
     mds->mdcache->request_finish(mdr);
   } else {
-    do_link_rollback(mdr->more()->rollback_bl, mdr);
+    do_link_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
   }
 }
 
@@ -2489,7 +2491,7 @@ struct C_MDS_LoggedLinkRollback : public Context {
   }
 };
 
-void Server::do_link_rollback(bufferlist &rbl, MDRequest *mdr)
+void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
 {
   link_rollback rollback;
   bufferlist::iterator p = rbl.begin();
@@ -2528,7 +2530,7 @@ void Server::do_link_rollback(bufferlist &rbl, MDRequest *mdr)
   else
     pi->nlink++;
 
-  ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_rollback", rollback.reqid, -1,
+  ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_rollback", rollback.reqid, master,
                                      ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::LINK);
   le->commit.add_dir_context(parent);
   le->commit.add_dir(parent, true);
@@ -3229,6 +3231,9 @@ void Server::handle_client_rename(MDRequest *mdr)
     _rename_prepare_witness(mdr, last, srcdn, destdn, straydn);
     return;
   }
+
+  // test hack: bail after slave does prepare, so we can verify it's _live_ rollback.
+  //if (!mdr->more()->slaves.empty()) assert(0); 
   
   // -- prepare anchor updates -- 
   if (!linkmerge || srcdn->is_primary()) {
@@ -3879,7 +3884,7 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
 
   } else {
     // abort
-    do_rename_rollback(mdr->more()->rollback_bl, mdr);
+    do_rename_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
 
     // rollback export.  readjust subtree map, if it was a dir.
     assert(0); // write me
@@ -3890,13 +3895,13 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
   mds->mdcache->request_finish(mdr);
 }
 
-void Server::do_rename_rollback(bufferlist &rbl, MDRequest *mdr)
+void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr)
 {
   rename_rollback rollback;
   bufferlist::iterator p = rbl.begin();
   ::decode(rollback, p);
 
-  ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_abort", rollback.reqid, -1,
+  ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_abort", rollback.reqid, master,
                                      ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::RENAME);
 
 
index cd9d2c484ab2e91d8dd69237f726f27e425d3e6a..f9ae0241ffbcd85e3e1d33c6cd6ee1f0825d81e1 100644 (file)
@@ -143,7 +143,7 @@ public:
   void _logged_slave_link(MDRequest *mdr, CInode *targeti);
   void _commit_slave_link(MDRequest *mdr, int r, CInode *targeti);
   void handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
-  void do_link_rollback(bufferlist &rbl, MDRequest *mdr);
+  void do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr);
   void _do_link_rollback_finish(Mutation *mut, MDRequest *mdr);
 
   // unlink
@@ -178,7 +178,7 @@ public:
   void handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
   void _logged_slave_rename(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
   void _commit_slave_rename(MDRequest *mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
-  void do_rename_rollback(bufferlist &rbl, MDRequest *mdr);
+  void do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr);
 
 };
 
index c854fa3e8b83362b82925a26a1a7a1c0d7be1bba..6600a6cb2d3b83d325a0b76b2b8144bae3b0df96 100644 (file)
@@ -132,7 +132,7 @@ public:
   void print(ostream& out) {
     if (type.length())
       out << type << " ";
-    out << " " << op;
+    out << " " << (int)op;
     if (origop == LINK) out << " link";
     if (origop == RENAME) out << " rename";
     out << " " << reqid;
index 3c923c3bae243b147ea6190ddb7f7cd16d132173..72359895dd617519e9a21dd6c6c0f694e4e38ea9 100644 (file)
@@ -346,12 +346,16 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg)
          dout(10) << "EMetaBlob.replay unlinking " << *in << dendl;
          in->get_parent_dn()->get_dir()->unlink_inode(in->get_parent_dn());
        }
+       if (in->get_parent_dn() && in->inode.anchored != p->inode.anchored)
+         in->get_parent_dn()->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored );
        in->inode = p->inode;
        in->dirfragtree = p->dirfragtree;
        in->xattrs = p->xattrs;
        if (in->inode.is_symlink()) in->symlink = p->symlink;
        if (p->dirty) in->_mark_dirty(logseg);
        if (dn->get_inode() != in) {
+         if (!dn->is_null())  // note: might be remote.  as with stray reintegration.
+           dir->unlink_inode(dn);
          dir->link_primary_inode(dn, in);
          dout(10) << "EMetaBlob.replay linked " << *in << dendl;
        } else {
@@ -460,7 +464,8 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg)
   for (list<metareqid_t>::iterator p = client_reqs.begin();
        p != client_reqs.end();
        ++p)
-    mds->sessionmap.add_completed_request(*p);
+    if (p->name.is_client())
+      mds->sessionmap.add_completed_request(*p);
 
 
   // update segment
@@ -487,7 +492,7 @@ void ESession::replay(MDS *mds)
 
   } else {
     dout(10) << "ESession.replay sessionmap " << mds->sessionmap.version
-            << " < " << cmapv << dendl;
+            << " < " << cmapv << " " << (open ? "open":"close") << dendl;
     mds->sessionmap.projected = ++mds->sessionmap.version;
     assert(mds->sessionmap.version == cmapv);
     if (open) {