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
|