From: Sage Weil Date: Mon, 7 Jan 2013 20:58:39 +0000 (-0800) Subject: osdc/Objecter: fix linger_ops iterator invalidation on pool deletion X-Git-Tag: v0.57~240^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=62586884afd56f2148205bdadc5a67037a750a9b;p=ceph.git 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 --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 04a74b87b66b..339499fd96a3 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) {