Fixes: https://tracker.ceph.com/issues/44316
The item p pointed to maybe cleaned during the process
of request_kill previous one.
Signed-off-by: Shen Hang <harryshen18@gmail.com>
(cherry picked from
432ea90)
Conflicts:
src/mds/Server.cc
mdr->mark_event("killing request");
if (mdr->committing) {
- dout(10) << "request_kill " << *mdr << " -- already committing, no-op" << dendl;
+ dout(10) << "request_kill " << *mdr << " -- already committing, remove it from sesssion requests" << dendl;
+ mdr->item_session_request.remove_myself();
} else {
dout(10) << "request_kill " << *mdr << dendl;
request_cleanup(mdr);
mdlog->flush();
// clean up requests, too
- elist<MDRequestImpl*>::iterator p =
- session->requests.begin(member_offset(MDRequestImpl,
- item_session_request));
- while (!p.end()) {
- MDRequestRef mdr = mdcache->request_get((*p)->reqid);
- ++p;
+ while(!session->requests.empty()) {
+ auto mdr = MDRequestRef(*session->requests.begin());
mdcache->request_kill(mdr);
}