From e7a23d86e0b90cfd91e7126f958c0501d537e280 Mon Sep 17 00:00:00 2001 From: runsisi Date: Sat, 24 Nov 2018 17:22:52 +0800 Subject: [PATCH] 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 --- src/osdc/Objecter.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 = -- 2.39.5