From 322f87f8a9721a20733320a072a46aa1aa0378d2 Mon Sep 17 00:00:00 2001 From: ownedu Date: Tue, 10 Oct 2017 10:16:05 +0800 Subject: [PATCH] msg/async/rdma: fix a coredump bug which is introduced by PR #18053, where the iterator is not working properly after erase(). Signed-off-by: Yan Lei --- src/msg/async/rdma/RDMAStack.cc | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/msg/async/rdma/RDMAStack.cc b/src/msg/async/rdma/RDMAStack.cc index 080abb6d07efa..f02f30529d179 100644 --- a/src/msg/async/rdma/RDMAStack.cc +++ b/src/msg/async/rdma/RDMAStack.cc @@ -244,17 +244,20 @@ void RDMADispatcher::polling() perf_logger->set(l_msgr_rdma_inflight_tx_chunks, inflight); if (num_dead_queue_pair) { Mutex::Locker l(lock); // FIXME reuse dead qp because creating one qp costs 1 ms - for (auto &i : dead_queue_pairs) { + auto it = dead_queue_pairs.begin(); + while (it != dead_queue_pairs.end()) { + auto i = *it; // Bypass QPs that do not collect all Tx completions yet. - if (i->get_tx_wr()) - continue; - ldout(cct, 10) << __func__ << " finally delete qp=" << i << dendl; - delete i; - auto it = std::find(dead_queue_pairs.begin(), dead_queue_pairs.end(), i); - if (it != dead_queue_pairs.end()) - dead_queue_pairs.erase(it); - perf_logger->dec(l_msgr_rdma_active_queue_pair); - --num_dead_queue_pair; + if (i->get_tx_wr()) { + ldout(cct, 20) << __func__ << " bypass qp=" << i << " tx_wr=" << i->get_tx_wr() << dendl; + ++it; + } else { + ldout(cct, 10) << __func__ << " finally delete qp=" << i << dendl; + delete i; + it = dead_queue_pairs.erase(it); + perf_logger->dec(l_msgr_rdma_active_queue_pair); + --num_dead_queue_pair; + } } } if (!num_qp_conn && done && dead_queue_pairs.empty()) -- 2.39.5