]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix rmdir slave commit, rollback
authorSage Weil <sage@newdream.net>
Wed, 20 Jul 2011 20:06:01 +0000 (13:06 -0700)
committerSage Weil <sage@newdream.net>
Wed, 20 Jul 2011 20:06:37 +0000 (13:06 -0700)
We need to set the slave commit callback to journal a commit or rollback
as needed.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/Server.cc
src/mds/Server.h

index c0e7d13b431d836e6512a84de787b7da9f4e3eae..ee2c46b591a288c573c1b691d4c87c6a1d813c18 100644 (file)
@@ -4601,7 +4601,7 @@ struct C_MDS_SlaveRmdirPrep : public Context {
   C_MDS_SlaveRmdirPrep(Server *s, MDRequest *r, CDentry *d, CDentry *st)
     : server(s), mdr(r), dn(d), straydn(st) {}
   void finish(int r) {
-    server->_rmdir_logged_witness(mdr, dn, straydn);
+    server->_logged_slave_rmdir(mdr, dn, straydn);
   }
 };
 
@@ -4656,9 +4656,19 @@ void Server::handle_slave_rmdir_prep(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_rmdir_logged_witness(MDRequest *mdr, CDentry *dn, CDentry *straydn)
+struct C_MDS_SlaveRmdirCommit : public Context {
+  Server *server;
+  MDRequest *mdr;
+  C_MDS_SlaveRmdirCommit(Server *s, MDRequest *r)
+    : server(s), mdr(r) { }
+  void finish(int r) {
+    server->_commit_slave_rmdir(mdr, r);
+  }
+};
+
+void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn)
 {
-  dout(10) << "_rmdir_logged_witness " << *mdr << " on " << *dn << dendl;
+  dout(10) << "_logged_slave_rmdir " << *mdr << " on " << *dn << dendl;
 
   // update our cache now, so we are consistent with what is in the journal
   // when we journal a subtree map
@@ -4670,6 +4680,9 @@ void Server::_rmdir_logged_witness(MDRequest *mdr, CDentry *dn, CDentry *straydn
   MMDSSlaveRequest *reply = new MMDSSlaveRequest(mdr->reqid, MMDSSlaveRequest::OP_RMDIRPREPACK);
   mds->send_message_mds(reply, mdr->slave_to_mds);
 
+  // set up commit waiter
+  mdr->more()->slave_commit = new C_MDS_SlaveRmdirCommit(this, mdr);
+
   // done.
   mdr->slave_request->put();
   mdr->slave_request = 0;
@@ -4695,7 +4708,7 @@ void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
     dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl;
 }
 
-void Server::_commit_slave_rmdir(MDRequest *mdr, int r, CDentry *dn, CDentry *straydn)
+void Server::_commit_slave_rmdir(MDRequest *mdr, int r)
 {
   dout(10) << "_commit_slave_rmdir " << *mdr << " r=" << r << dendl;
   
index 2a227f8d6b0262565b93fb17d1b193ef1e8c255a..4055a49dcfe4378109362a0a7a699ef466f288b6 100644 (file)
@@ -194,9 +194,9 @@ public:
                            version_t);
   void _rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn);
   void handle_slave_rmdir_prep(MDRequest *mdr);
-  void _rmdir_logged_witness(MDRequest *mdr, CDentry *srcdn, CDentry *straydn);
+  void _logged_slave_rmdir(MDRequest *mdr, CDentry *srcdn, CDentry *straydn);
+  void _commit_slave_rmdir(MDRequest *mdr, int r);
   void handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack);
-  void _commit_slave_rmdir(MDRequest *mdr, int r, CDentry *dn, CDentry *straydn);
   void do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr);
   void _rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);