From 1a2d9edde0311b51d3d68b87c20dea3061b2395b Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 21 Aug 2013 14:28:49 -0700 Subject: objecter: resend unfinished lingers when osdmap is no longer paused Plain Ops that haven't finished yet need to be resent if the osdmap transitions from full or paused to unpaused. If these Ops are triggered by LingerOps, they will be cancelled instead (since should_resend = false), but the LingerOps that triggered them will not be resent. Fix this by checking the registered flag for all linger ops, and resending any of them that aren't paused anymore. Fixes: #6070 Signed-off-by: Josh Durgin Reviewed-by: Sage Weil (cherry picked from commit 38a0ca66a79af4b541e6322467ae3a8a4483cc72) --- src/osdc/Objecter.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 178ea67dade..4a76d724b30 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -583,10 +583,10 @@ void Objecter::handle_osd_map(MOSDMap *m) // was/is paused? if (was_pauserd || was_pausewr || pauserd || pausewr) maybe_request_map(); - + // unpause requests? if ((was_pauserd && !pauserd) || - (was_pausewr && !pausewr)) + (was_pausewr && !pausewr)) { for (map::iterator p = ops.begin(); p != ops.end(); ++p) { @@ -596,6 +596,16 @@ void Objecter::handle_osd_map(MOSDMap *m) !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write need_resend[op->tid] = op; } + for (map::iterator lp = linger_ops.begin(); + lp != linger_ops.end(); + ++lp) { + LingerOp *op = lp->second; + if (!op->registered && + !pauserd && // not still paused as a read + !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write + need_resend_linger.push_back(op); + } + } // resend requests for (map::iterator p = need_resend.begin(); p != need_resend.end(); ++p) { -- cgit v1.2.1