summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
authorSean Quah <8349537+squahtx@users.noreply.github.com>2022-03-01 13:51:03 +0000
committerGitHub <noreply@github.com>2022-03-01 13:51:03 +0000
commit91bc15c772d22fbe814170ab2e0fdbfa50f9c372 (patch)
treed14ddf85fb4f98c4ce2eaf9d213fb8dc4afbe86d /synapse
parentOrder in-flight state group queries in biggest-first order (#11610) (diff)
downloadsynapse-91bc15c772d22fbe814170ab2e0fdbfa50f9c372.tar.xz
Add `stop_cancellation` utility function (#12106)
Diffstat (limited to 'synapse')
-rw-r--r--synapse/util/async_helpers.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/synapse/util/async_helpers.py b/synapse/util/async_helpers.py
index a83296a229..81320b8972 100644
--- a/synapse/util/async_helpers.py
+++ b/synapse/util/async_helpers.py
@@ -665,3 +665,22 @@ def maybe_awaitable(value: Union[Awaitable[R], R]) -> Awaitable[R]:
         return value
 
     return DoneAwaitable(value)
+
+
+def stop_cancellation(deferred: "defer.Deferred[T]") -> "defer.Deferred[T]":
+    """Prevent a `Deferred` from being cancelled by wrapping it in another `Deferred`.
+
+    Args:
+        deferred: The `Deferred` to protect against cancellation. Must not follow the
+            Synapse logcontext rules.
+
+    Returns:
+        A new `Deferred`, which will contain the result of the original `Deferred`,
+        but will not propagate cancellation through to the original. When cancelled,
+        the new `Deferred` will fail with a `CancelledError` and will not follow the
+        Synapse logcontext rules. `make_deferred_yieldable` should be used to wrap
+        the new `Deferred`.
+    """
+    new_deferred: defer.Deferred[T] = defer.Deferred()
+    deferred.chainDeferred(new_deferred)
+    return new_deferred