]> git.apps.os.sepia.ceph.com Git - ceph-ci.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)
committerrunsisi <luo.runbing@zte.com.cn>
Tue, 27 Nov 2018 07:40:29 +0000 (15:40 +0800)
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>
src/osdc/Objecter.cc

index 9f5610770cf7ca036a7ce75b34c127045a3c3780..608d943ad20190cf93051b4b1ba441e13d70c780 100644 (file)
@@ -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 =