diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-08-21 14:28:49 -0700 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2013-08-21 16:01:04 -0700 |
commit | 38a0ca66a79af4b541e6322467ae3a8a4483cc72 (patch) | |
tree | 755453de904661bd36968eed5bae834cac6e7a34 | |
parent | d26ba3ab0374e77847c742dd00cb3bc9301214c2 (diff) | |
download | ceph-38a0ca66a79af4b541e6322467ae3a8a4483cc72.tar.gz |
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 <josh.durgin@inktank.com>
Reviewed-by: Sage Weil <sage.weil@inktank.com>
-rw-r--r-- | src/osdc/Objecter.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index eb490cef330..5749f9fd762 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -625,10 +625,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<tid_t,Op*>::iterator p = ops.begin(); p != ops.end(); ++p) { @@ -638,6 +638,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<tid_t, LingerOp*>::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<tid_t, Op*>::iterator p = need_resend.begin(); p != need_resend.end(); ++p) { |