From 6a00ce0dc24626fdfa210ddec6334bde3c8a20db Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 7 Jan 2013 12:58:39 -0800 Subject: [PATCH] osdc/Objecter: fix linger_ops iterator invalidation on pool deletion The call to check_linger_pool_dne() may unregister the linger request, invalidating the iterator. To avoid this, increment the iterator at the top of the loop. This mirror the fix in 4bf9078286d58c2cd4e85cb8b31411220a377092 for regular non-linger ops. Fixes: #3734 Signed-off-by: Sage Weil Reviewed-by: Samuel Just Reviewed-by: Greg Farnum (cherry picked from commit 62586884afd56f2148205bdadc5a67037a750a9b) --- src/osdc/Objecter.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 04a74b87b66ba..339499fd96a32 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -399,10 +399,10 @@ void Objecter::scan_requests(bool skipped_map, list& need_resend_linger) { // check for changed linger mappings (_before_ regular ops) - for (map::iterator p = linger_ops.begin(); - p != linger_ops.end(); - p++) { - LingerOp *op = p->second; + map::iterator lp = linger_ops.begin(); + while (lp != linger_ops.end()) { + LingerOp *op = lp->second; + ++lp; // check_linger_pool_dne() may touch linger_ops; prevent iterator invalidation ldout(cct, 10) << " checking linger op " << op->linger_id << dendl; int r = recalc_linger_op_target(op); switch (r) { -- 2.39.5