diff --git a/oslo_utils/eventletutils.py b/oslo_utils/eventletutils.py index f5bca515..46d9ba7a 100644 --- a/oslo_utils/eventletutils.py +++ b/oslo_utils/eventletutils.py @@ -159,6 +159,9 @@ class _Event(object): isSet = is_set def set(self): + if self._set: + self._event.reset() + self._set = True self._event.send(True) diff --git a/oslo_utils/tests/test_eventletutils.py b/oslo_utils/tests/test_eventletutils.py index e5765c72..8e71e814 100644 --- a/oslo_utils/tests/test_eventletutils.py +++ b/oslo_utils/tests/test_eventletutils.py @@ -123,8 +123,8 @@ class EventletUtilsTest(test_base.BaseTestCase): eventletutils.warn_eventlet_not_patched, ['blah.blah']) - @mock.patch('oslo_utils.eventletutils._Event.clear') - def test_event_api_compat(self, mock_clear): + @mock.patch('oslo_utils.eventletutils._eventlet') + def test_event_api_compat(self, mock_eventlet): with mock.patch('oslo_utils.eventletutils.is_monkey_patched', return_value=True): e_event = eventletutils.Event() @@ -142,3 +142,11 @@ class EventletUtilsTest(test_base.BaseTestCase): for method in public_methods: self.assertTrue(hasattr(e_event, method)) + + # Ensure set() allows multiple invocations, same as in + # threading implementation. Must call reset on underlying + # Event before reusing it + e_event.set() + self.assertEqual(0, mock_eventlet.event.Event().reset.call_count) + e_event.set() + self.assertEqual(1, mock_eventlet.event.Event().reset.call_count)