if (pending_prepare[reqid].pbl)
*pending_prepare[reqid].pbl = m->bl;
pending_prepare.erase(reqid);
+ prepared_update[tid] = reqid;
if (onfinish) {
onfinish->finish(0);
delete onfinish;
}
- }
+ }
+ else if (prepared_update.count(tid)) {
+ dout(10) << "got duplicated agree on " << reqid << " atid " << tid << dendl;
+ assert(prepared_update[tid] == reqid);
+ assert(!server_ready);
+ }
else if (pending_commit.count(tid)) {
dout(10) << "stray agree on " << reqid << " tid " << tid
<< ", already committing, will resend COMMIT" << dendl;
{
dout(10) << "commit " << tid << dendl;
+ assert(prepared_update.count(tid));
+ prepared_update.erase(tid);
+
assert(pending_commit.count(tid) == 0);
pending_commit[tid] = ls;
ls->pending_commit_tids[table].insert(tid);
};
map<uint64_t, _pending_prepare> pending_prepare;
+ map<version_t, uint64_t> prepared_update;
list<_pending_prepare> waiting_for_reqid;
// pending commits
void MDSTableServer::handle_rollback(MMDSTableRequest *req)
{
dout(7) << "handle_rollback " << *req << dendl;
- _rollback(req->get_tid());
- _note_rollback(req->get_tid());
+
+ version_t tid = req->get_tid();
+ assert(pending_for_mds.count(tid));
+ _rollback(tid);
+ _note_rollback(tid);
mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, -1,
- req->get_tid(), version));
+ tid, version));
req->put();
}