}
mdr->more()->waiting_on_slave.clear();
}
- } else {
+ } else if (!mdr->committing) {
dout(10) << " slave request " << *mdr << " has no prepare, finishing up" << dendl;
- if (mdr->slave_request)
+ if (mdr->slave_request || mdr->slave_rolling_back())
mdr->aborted = true;
else
finish.push_back(mdr);
if (mdr->has_more() && mdr->more()->slave_commit) {
Context *fin = mdr->more()->slave_commit;
mdr->more()->slave_commit = 0;
- int ret = mdr->aborted ? -1 : 0;
- mdr->aborted = false;
+ int ret;
+ if (mdr->aborted) {
+ mdr->aborted = false;
+ ret = -1;
+ mdr->more()->slave_rolling_back = true;
+ } else {
+ ret = 0;
+ mdr->committing = true;
+ }
fin->complete(ret); // this must re-call request_finish.
return;
}
return has_more() && more()->slave_commit;
}
+bool MDRequestImpl::slave_rolling_back()
+{
+ return has_more() && more()->slave_rolling_back;
+}
+
bool MDRequestImpl::did_ino_allocation() const
{
return alloc_ino || used_prealloc_ino || prealloc_inos.size();
bool has_journaled_slaves;
bool slave_update_journaled;
+ bool slave_rolling_back;
// for rename
set<mds_rank_t> extra_witnesses; // replica list from srcdn auth (rename)
More() :
slave_error(0),
has_journaled_slaves(false), slave_update_journaled(false),
+ slave_rolling_back(false),
srcdn_auth_mds(-1), inode_import_v(0), rename_inode(0),
is_freeze_authpin(false), is_ambiguous_auth(false),
is_remote_frozen_authpin(false), is_inode_exporter(false),
bool has_more() const;
bool has_witnesses();
bool slave_did_prepare();
+ bool slave_rolling_back();
bool did_ino_allocation() const;
bool freeze_auth_pin(CInode *inode);
void unfreeze_auth_pin(bool clear_inode=false);
// write a commit to the journal
ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_commit", mdr->reqid, mdr->slave_to_mds,
ESlaveUpdate::OP_COMMIT, ESlaveUpdate::LINK);
- mdlog->start_submit_entry(le, new C_MDS_CommittedSlave(this, mdr));
+ mdlog->start_entry(le);
+ submit_mdlog_entry(le, new C_MDS_CommittedSlave(this, mdr), mdr, __func__);
mdlog->flush();
} else {
do_link_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
mdr->more()->is_ambiguous_auth = false;
}
mds->queue_waiters(finished);
- if (finish_mdr)
+ if (finish_mdr || mdr->aborted)
mdcache->request_finish(mdr);
+ else
+ mdr->more()->slave_rolling_back = false;
}
mdcache->finish_rollback(mut->reqid);