]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fill out calls in server
authorSage Weil <sage@newdream.net>
Sun, 25 May 2008 22:32:16 +0000 (15:32 -0700)
committerSage Weil <sage@newdream.net>
Sun, 25 May 2008 22:32:16 +0000 (15:32 -0700)
src/mds/CInode.h
src/mds/Locker.cc
src/mds/Locker.h
src/mds/Server.cc

index 2f5f09f7c4051e0b5b32475ddda63ad87363ce9c..0f5673b714db714866b8ebccf69557a15027af48 100644 (file)
@@ -159,6 +159,16 @@ class CInode : public MDSCacheObject {
   inode_t *project_inode();
   void pop_and_dirty_projected_inode(LogSegment *ls);
 
+  inode_t *get_previous_projected_inode() {
+    assert(!projected_inode.empty());
+    list<inode_t*>::reverse_iterator p = projected_inode.rbegin();
+    p++;
+    if (p != projected_inode.rend())
+      return *p;
+    else
+      return &inode;
+  }
+
   // -- cache infrastructure --
 private:
   map<frag_t,CDir*> dirfrags; // cached dir fragments
index bd3ed22a55e9881dd886de89d28d49febb954f6e..b918d9b21c4ecf6e8016c90452d6927574ae624d 100644 (file)
@@ -1215,7 +1215,8 @@ void Locker::revoke_client_leases(SimpleLock *lock)
 
 void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob,
                             CInode *in, CDir *parent,
-                            bool primary_dn, bool do_parent, int linkunlink)
+                            bool primary_dn, bool do_parent, int linkunlink,
+                            EMetaBlob *rollback)
 {
   dout(10) << "predirty_nested "
           << (do_parent ? "do_parent_mtime ":"")
@@ -1223,8 +1224,10 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob,
           << (primary_dn ? "primary_dn ":"remote_dn ")
           << " " << *in << dendl;
 
-  if (!parent)
+  if (!parent) {
+    assert(primary_dn);
     parent = in->get_projected_parent_dn()->get_dir();
+  }
 
   inode_t *curi = in->get_projected_inode();
 
@@ -1336,14 +1339,20 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob,
   assert(parent->is_auth());
   blob->add_dir_context(parent);
   blob->add_dir(parent, true);
-
+  if (rollback)
+    blob->add_dir_context(parent);
   for (list<CInode*>::iterator p = lsi.begin();
        p != lsi.end();
        p++) {
     CInode *cur = *p;
     inode_t *pi = cur->get_projected_inode();
     blob->add_primary_dentry(cur->get_projected_parent_dn(), true, 0, pi);
+    if (rollback) {
+      inode_t *oldi = cur->get_previous_projected_inode();
+      rollback->add_primary_dentry(cur->get_projected_parent_dn(), true, 0, oldi);
+    }
   }
 }
 
 
index 2d22d4ef8f7a92a4204770746525dbf109598abc..2e1fc01b848700651675e1992bf461c5036e5f29 100644 (file)
@@ -159,7 +159,8 @@ protected:
 
 public:
   void predirty_nested(Mutation *mut, EMetaBlob *blob, CInode *in, CDir *dir,
-                      bool do_nested, bool do_parent, int linkunlink=0);
+                      bool do_nested, bool do_parent, int linkunlink=0,
+                      EMetaBlob *rollback=0);
 
   // local
 protected:
index 2925625b2db6ba4ac046b2d94ea1659489bea5f8..014ac0627731463b8847ab40701d696840b92eca 100644 (file)
@@ -1612,6 +1612,7 @@ public:
 
     // apply
     in->pop_and_dirty_projected_inode(mdr->ls);
+    mdr->apply();
 
     mds->balancer->hit_inode(mdr->now, in, META_POP_IWR);   
 
@@ -1663,7 +1664,7 @@ void Server::handle_client_utime(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "utime");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
   mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
@@ -1704,7 +1705,7 @@ void Server::handle_client_chmod(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "chmod");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
 
   mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
@@ -1745,11 +1746,10 @@ void Server::handle_client_chown(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "chown");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
-  mdlog->submit_entry(le);
-  mdlog->wait_for_sync(new C_MDS_inode_update_finish(mds, mdr, cur));
+  mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
 
 
@@ -1805,11 +1805,10 @@ void Server::handle_client_setxattr(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "setxattr");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
-  mdlog->submit_entry(le);
-  mdlog->wait_for_sync(new C_MDS_inode_update_finish(mds, mdr, cur));
+  mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
 
 void Server::handle_client_removexattr(MDRequest *mdr)
@@ -1850,11 +1849,10 @@ void Server::handle_client_removexattr(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "removexattr");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
-  mdlog->submit_entry(le);
-  mdlog->wait_for_sync(new C_MDS_inode_update_finish(mds, mdr, cur));
+  mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
 
 
@@ -2293,10 +2291,10 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
   // log + wait
   EUpdate *le = new EUpdate(mdlog, "link_local");
   le->metablob.add_client_req(mdr->reqid);
-  mds->locker->predirty_nested(mdr, &le->metablob, targeti, dn->dir, false, true, 1);
+  mds->locker->predirty_nested(mdr, &le->metablob, targeti, dn->dir, false, true, 1); // new dn
+  mds->locker->predirty_nested(mdr, &le->metablob, targeti, 0, true, true);           // targeti
   le->metablob.add_remote_dentry(dn, true, targeti->ino(), 
                                 MODE_TO_DT(targeti->inode.mode));  // new remote
-  le->metablob.add_dir_context(targeti->get_parent_dir());
   le->metablob.add_primary_dentry(targeti->parent, true, targeti, pi);  // update old primary
 
   mdlog->submit_entry(le, new C_MDS_link_local_finish(mds, mdr, dn, targeti, dnpv, tipv));
@@ -2452,12 +2450,9 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_prep", mdr->reqid, mdr->slave_to_mds, ESlaveUpdate::OP_PREPARE);
 
+  inode_t *oldi = dn->inode->get_projected_inode();
   inode_t *pi = dn->inode->project_inode();
 
-  // rollback case
-  le->rollback.add_dir_context(targeti->get_parent_dir());
-  le->rollback.add_primary_dentry(dn, true, targeti, pi);  // update old primary
-
   // update journaled target inode
   bool inc;
   if (mdr->slave_request->get_op() == MMDSSlaveRequest::OP_LINKPREP) {
@@ -2474,8 +2469,9 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
   dout(10) << " projected inode " << pi << " v " << pi->version << dendl;
 
   // commit case
-  le->commit.add_dir_context(targeti->get_parent_dir());
+  mds->locker->predirty_nested(mdr, &le->commit, dn->inode, 0, true, false, 0, &le->rollback);
   le->commit.add_primary_dentry(dn, true, targeti, pi);  // update old primary
+  le->rollback.add_primary_dentry(dn, true, targeti, oldi);
 
   mdlog->submit_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti, old_ctime, inc));
 }
@@ -2548,6 +2544,8 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti,
       targeti->inode.nlink++;
     else
       targeti->inode.nlink--;
+
+    // FIXME rctime etc.?
   }
 
   mdlog->submit_entry(le);
@@ -2742,11 +2740,11 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   if (dn->is_primary()) {
     // primary link.  add stray dentry.
     assert(straydn);
-    le->metablob.add_dir_context(straydn->dir);
+    mds->locker->predirty_nested(mdr, &le->metablob, dn->inode, straydn->dir, true, true, 1);
     le->metablob.add_primary_dentry(straydn, true, dn->inode, pi);
   } else {
     // remote link.  update remote inode.
-    le->metablob.add_dir_context(dn->inode->get_parent_dir());
+    mds->locker->predirty_nested(mdr, &le->metablob, dn->inode, 0, true, true);
     le->metablob.add_primary_dentry(dn->inode->parent, true, dn->inode);
   }
 
@@ -4061,13 +4059,13 @@ void Server::handle_client_truncate(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "truncate");
   le->metablob.add_client_req(mdr->reqid);
-  le->metablob.add_dir_context(cur->get_parent_dir());
   le->metablob.add_inode_truncate(cur->ino(), req->head.args.truncate.length, cur->inode.size);
   inode_t *pi = cur->project_inode();
   pi->mtime = ctime;
   pi->ctime = ctime;
   pi->version = pdv;
   pi->size = le64_to_cpu(req->head.args.truncate.length);
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
   mdlog->submit_entry(le, fin);
@@ -4250,13 +4248,13 @@ void Server::handle_client_opent(MDRequest *mdr)
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "open_truncate");
   le->metablob.add_client_req(mdr->reqid);
-  le->metablob.add_dir_context(cur->get_parent_dir());
   le->metablob.add_inode_truncate(cur->ino(), 0, cur->inode.size);
   inode_t *pi = cur->project_inode();
   pi->mtime = ctime;
   pi->ctime = ctime;
   pi->version = pdv;
   pi->size = 0;
+  mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
   mdlog->submit_entry(le, fin);
@@ -4342,7 +4340,6 @@ void Server::handle_client_openc(MDRequest *mdr)
   EUpdate *le = new EUpdate(mdlog, "openc");
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(in->ino(), mds->idalloc->get_version());
-
   mds->locker->predirty_nested(mdr, &le->metablob, in, dn->dir, true, true, 1);
   le->metablob.add_primary_dentry(dn, true, in, &in->inode);