diff --git a/oslo_utils/eventletutils.py b/oslo_utils/eventletutils.py index 30fc41c3..5d3c0a68 100644 --- a/oslo_utils/eventletutils.py +++ b/oslo_utils/eventletutils.py @@ -150,13 +150,15 @@ class EventletEvent(object): """ def __init__(self, *args, **kwargs): super(EventletEvent, self).__init__() + self._set = False self.clear() def clear(self): old_event = getattr(self, "_event", None) + was_set = self._set self._set = False self._event = _eventlet.event.Event() - if old_event is not None: + if old_event is not None and not was_set: old_event.send(True) def is_set(self): diff --git a/oslo_utils/tests/test_eventletutils.py b/oslo_utils/tests/test_eventletutils.py index 96205f01..b6ce9957 100644 --- a/oslo_utils/tests/test_eventletutils.py +++ b/oslo_utils/tests/test_eventletutils.py @@ -200,3 +200,13 @@ class EventletUtilsTest(test_base.BaseTestCase): b = greenthread.spawn(thread_b) with eventlet.timeout.Timeout(0.7): b.wait() + + @mock.patch('oslo_utils.eventletutils._eventlet.event.Event') + def test_event_clear_already_sent(self, mock_event): + old_event = mock.Mock() + new_event = mock.Mock() + mock_event.side_effect = [old_event, new_event] + event = eventletutils.EventletEvent() + event.set() + event.clear() + self.assertEqual(1, old_event.send.call_count)