summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Eckersberg <jeckersb@redhat.com>2018-04-04 12:45:27 -0400
committerJohn Eckersberg <jeckersb@redhat.com>2018-04-11 13:02:29 -0400
commit82678918aab77f946da3a13f40fe8731c54e8bd4 (patch)
tree84550da8545c251a8011ed68940e84295f567dba
parentda8d3c3bbcb640d91e2b014345387b532cc9978f (diff)
downloadoslo-utils-82678918aab77f946da3a13f40fe8731c54e8bd4.tar.gz
eventletutils: Fix behavior discrepency when reusing Events
The threading.Event object allows calling set() multiple times, but the eventlet.Event object only permits send() to be called once, before a reset() is required to reuse the Event. Calling eventletutils.Event.set() multiple times triggers an AssertionError from eventlet.Event. This change resets the underlying eventlet.Event if the set() method had already been called previously, and ensures the eventletutils.Event behaves the same as the threading.Event. Change-Id: If761b237266bbfe7e65c56e152074b5d1ccac74b
-rw-r--r--oslo_utils/eventletutils.py3
-rw-r--r--oslo_utils/tests/test_eventletutils.py12
2 files changed, 13 insertions, 2 deletions
diff --git a/oslo_utils/eventletutils.py b/oslo_utils/eventletutils.py
index f5bca51..46d9ba7 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 e5765c7..8e71e81 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)