summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Nemec <bnemec@redhat.com>2019-01-23 15:13:12 +0000
committerBen Nemec <bnemec@redhat.com>2019-01-23 15:28:50 +0000
commit4eb61941f811a8ab96745a5ea07e6a4a89fe764c (patch)
treec6d146ec309167d383c7293e53967e10c40b27e8
parenteff0629790af2dda13d8566a20ceee21f4a52a7a (diff)
downloadoslo-utils-4eb61941f811a8ab96745a5ea07e6a4a89fe764c.tar.gz
Avoid double-setting event3.40.2
In commit cc8b51e1e16f6bdc7d6c0e571e2002e70cde098d we added a send on the old event when clearing an EventletEvent. However, this was done unconditionally, which means if the event was already sent then we attempt to send it again. This fails with: AssertionError: Trying to re-send() an already-triggered event. Similar to 14a53c4d8a9d5605b14a503803859df0d6d4b820, we should check if self._set is True and if so then we know that the event was already sent and we don't need to do it again. Change-Id: I660601383072d11e4a077aada8c1b8c30b9d8d1d Closes-Bug: 1812922
-rw-r--r--oslo_utils/eventletutils.py4
-rw-r--r--oslo_utils/tests/test_eventletutils.py10
2 files changed, 13 insertions, 1 deletions
diff --git a/oslo_utils/eventletutils.py b/oslo_utils/eventletutils.py
index 30fc41c..5d3c0a6 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 96205f0..b6ce995 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)