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);
}
};
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
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;
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;
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);