From: runsisi Date: Sat, 24 Nov 2018 09:22:52 +0000 (+0800) Subject: osdc/Objecter: update op_target_t::paused in _calc_target X-Git-Tag: v14.1.0~693^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e7a23d86e0b90cfd91e7126f958c0501d537e280;p=ceph-ci.git osdc/Objecter: update op_target_t::paused in _calc_target LingerOp::target.paused has no chance to be touched by anyone (see Objecter::_send_linger), then the following bug exists: 1. ceph osd pause 2. rados watch -p pool oid 3. ceph osd unpause 3. the linger op will be in a lost state, i.e., osd op cancelled and the linger op will not be resent Fixes: http://tracker.ceph.com/issues/37398 Signed-off-by: runsisi --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9f5610770cf..608d943ad20 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -2884,10 +2884,12 @@ int Objecter::_calc_target(op_target_t *t, Connection *con, bool any_change) force_resend = true; } - bool unpaused = false; - if (t->paused && !target_should_be_paused(t)) { + bool unpaused = !target_should_be_paused(t); + if (t->paused && unpaused) { t->paused = false; - unpaused = true; + } else { + t->paused = !unpaused; + unpaused = false; } bool legacy_change =