]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: update op_target_t::paused in _calc_target
authorrunsisi <luo.runbing@zte.com.cn>
Sat, 24 Nov 2018 09:22:52 +0000 (17:22 +0800)
committerAshish Singh <assingh@redhat.com>
Fri, 28 Dec 2018 17:03:28 +0000 (22:33 +0530)
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 <luo.runbing@zte.com.cn>
(cherry picked from commit e7a23d86e0b90cfd91e7126f958c0501d537e280)

src/osdc/Objecter.cc

index df8bc236a3dc8ade44168de01e8ed8e6dda54f46..33a418ec038545f87857a9ef3ce2e8c5f58494b9 100644 (file)
@@ -2872,10 +2872,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 =