Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/9523.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add extra logging to ObservableDeferred when callbacks throw exceptions.
26 changes: 18 additions & 8 deletions synapse/util/async_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,16 @@ def __init__(self, deferred: defer.Deferred, consumeErrors: bool = False):
def callback(r):
object.__setattr__(self, "_result", (True, r))
while self._observers:
observer = self._observers.pop()
try:
# TODO: Handle errors here.
self._observers.pop().callback(r)
except Exception:
pass
observer.callback(r)
except Exception as e:
logger.warning(
"%r threw an exception on .callback(%r), ignoring...",
observer,
r,
exc_info=e,
)
return r

def errback(f):
Expand All @@ -90,11 +95,16 @@ def errback(f):
# traces when we `await` on one of the observer deferreds.
f.value.__failure__ = f

observer = self._observers.pop()
try:
# TODO: Handle errors here.
self._observers.pop().errback(f)
except Exception:
pass
observer.errback(f)
except Exception as e:
logger.warning(
"%r threw an exception on .errback(%r), ignoring...",
observer,
f,
exc_info=e,
)

if consumeErrors:
return None
Expand Down