diff options
author | Sean Quah <seanq@element.io> | 2022-02-25 19:27:31 +0000 |
---|---|---|
committer | Sean Quah <seanq@element.io> | 2022-03-08 17:11:51 +0000 |
commit | 0e118a09b7c75d0dba030ae6f141ee1e65e39cd3 (patch) | |
tree | 5c8d3c29ce0cf3f4cb487b35e94601a3ea3afbec | |
parent | Fix clean up when waiting readers or writers are cancelled (diff) | |
download | synapse-0e118a09b7c75d0dba030ae6f141ee1e65e39cd3.tar.xz |
Don't cancel `Deferred`s that readers or writers are waiting on
-rw-r--r-- | synapse/util/async_helpers.py | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/synapse/util/async_helpers.py b/synapse/util/async_helpers.py index d391b0c2a8..bb777e7613 100644 --- a/synapse/util/async_helpers.py +++ b/synapse/util/async_helpers.py @@ -529,9 +529,10 @@ class ReadWriteLock: # We wait for the latest writer to finish writing. We can safely ignore # any existing readers... as they're readers. # May raise a `CancelledError` if the `Deferred` wrapping us is - # cancelled. + # cancelled. The `Deferred` we are waiting on must not be cancelled, + # since we do not own it. if curr_writer: - await make_deferred_yieldable(curr_writer) + await make_deferred_yieldable(stop_cancellation(curr_writer)) yield finally: with PreserveLoggingContext(): @@ -562,8 +563,9 @@ class ReadWriteLock: try: # Wait for all current readers and the latest writer to finish. # May raise a `CancelledError` if the `Deferred` wrapping us is - # cancelled. - await make_deferred_yieldable(to_wait_on_defer) + # cancelled. The `Deferred`s we are waiting on must not be cancelled, + # since we do not own them. + await make_deferred_yieldable(stop_cancellation(to_wait_on_defer)) yield finally: |