Skip to content

Commit

Permalink
Merge pull request #7235 from p12tic/util-deferwaiter-cleanup
Browse files Browse the repository at this point in the history
util: Simplify DeferWaiter by removing unused cancel()
  • Loading branch information
p12tic committed Dec 3, 2023
2 parents c172a35 + 6ee44ba commit 13d1eb6
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 49 deletions.
38 changes: 0 additions & 38 deletions master/buildbot/test/unit/util/test_deferwaiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,44 +74,6 @@ def test_passes_result(self):
d = w.wait()
self.assertTrue(d.called)

@defer.inlineCallbacks
def test_cancel_not_called(self):
w = DeferWaiter()

d1 = defer.Deferred()
w.add(d1)
self.assertTrue(w.has_waited())

w.cancel()
self.assertFalse(w.has_waited())

d = w.wait()
self.assertTrue(d.called)
with self.assertRaises(defer.CancelledError):
yield d1

self.flushLoggedErrors(defer.CancelledError)

@defer.inlineCallbacks
def test_cancel_called(self):
w = DeferWaiter()

d1_waited = defer.Deferred()
d1 = defer.succeed(None)
d1.addCallback(lambda _: d1_waited)
w.add(d1)

w.cancel()

d = w.wait()
self.assertTrue(d.called)
self.assertTrue(d1.called)
self.assertTrue(d1_waited.called)
with self.assertRaises(defer.CancelledError):
yield d1

self.flushLoggedErrors(defer.CancelledError)


class RepeatedActionHandlerTests(unittest.TestCase, TestReactorMixin):

Expand Down
17 changes: 6 additions & 11 deletions master/buildbot/util/deferwaiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,38 +24,33 @@ class DeferWaiter:
""" This class manages a set of Deferred objects and allows waiting for their completion
"""
def __init__(self):
self._waited = {}
self._waited_count = 0
self._finish_notifier = Notifier()

def _finished(self, result, d):
# most likely nothing is consuming the errors, so do it here
if isinstance(result, failure.Failure):
log.err(result)

self._waited.pop(id(d))
if not self._waited:
self._waited_count -= 1
if self._waited_count == 0:
self._finish_notifier.notify(None)
return result

def add(self, d):
if not isinstance(d, defer.Deferred):
return None

self._waited[id(d)] = d
self._waited_count += 1
d.addBoth(self._finished, d)
return d

def cancel(self):
for d in list(self._waited.values()):
d.cancel()
self._waited.clear()

def has_waited(self):
return bool(self._waited)
return self._waited_count > 0

@defer.inlineCallbacks
def wait(self):
if not self._waited:
if self._waited_count == 0:
return
yield self._finish_notifier.wait()

Expand Down

0 comments on commit 13d1eb6

Please sign in to comment.