Only request_cleanup() if the request isn't already committing. If it
is, wait for it to commit before we clean up.
It might fix all of #3531, #3210, #1947, and #1548. Maybe.
Signed-off-by: Sage Weil <sage@inktank.com>
void MDCache::request_kill(MDRequest *mdr)
{
- dout(10) << "request_kill " << *mdr << dendl;
- request_cleanup(mdr);
+ if (!mdr->committing) {
+ dout(10) << "request_kill " << *mdr << dendl;
+ request_cleanup(mdr);
+ } else {
+ dout(10) << "request_kill " << *mdr << " -- already committing, no-op" << dendl;
+ }
}
mdlog->flush();
// clean up requests, too
- while (!session->requests.empty()) {
- MDRequest *mdr = session->requests.front(member_offset(MDRequest,
- item_session_request));
+ elist<MDRequest*>::iterator p = session->requests.begin(member_offset(MDRequest,
+ item_session_request));
+ while (!p.end()) {
+ MDRequest *mdr = *p;
+ ++p;
mdcache->request_kill(mdr);
}
-
}
void Server::reconnect_clients()