summary refs log tree commit diff
diff options
context:
space:
mode:
authorSean Quah <seanq@element.io>2022-02-25 19:27:31 +0000
committerSean Quah <seanq@element.io>2022-03-08 17:11:51 +0000
commit0e118a09b7c75d0dba030ae6f141ee1e65e39cd3 (patch)
tree5c8d3c29ce0cf3f4cb487b35e94601a3ea3afbec
parentFix clean up when waiting readers or writers are cancelled (diff)
downloadsynapse-0e118a09b7c75d0dba030ae6f141ee1e65e39cd3.tar.xz
Don't cancel `Deferred`s that readers or writers are waiting on
-rw-r--r--synapse/util/async_helpers.py10
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: