diff --git a/oslo_service/loopingcall.py b/oslo_service/loopingcall.py index 9e6a8799..dc958040 100644 --- a/oslo_service/loopingcall.py +++ b/oslo_service/loopingcall.py @@ -121,7 +121,8 @@ class LoopingCallBase(object): return not self._abort.is_set() def stop(self): - self._abort.set() + if self._running: + self._abort.set() def wait(self): return self.done.wait() diff --git a/oslo_service/tests/test_loopingcall.py b/oslo_service/tests/test_loopingcall.py index 9ca0afe2..35d05a1a 100644 --- a/oslo_service/tests/test_loopingcall.py +++ b/oslo_service/tests/test_loopingcall.py @@ -100,6 +100,16 @@ class LoopingCallTestCase(test_base.BaseTestCase): wait_ev.set() timer.wait() + def test_no_double_stop(self): + def _raise_it(): + raise loopingcall.LoopingCallDone(False) + + timer = loopingcall.FixedIntervalLoopingCall(_raise_it) + timer.start(interval=0.5) + + timer.stop() + timer.stop() + def test_repeat(self): self.num_runs = 2