diff options
author | Sean Quah <8349537+squahtx@users.noreply.github.com> | 2022-03-01 13:51:03 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-01 13:51:03 +0000 |
commit | 91bc15c772d22fbe814170ab2e0fdbfa50f9c372 (patch) | |
tree | d14ddf85fb4f98c4ce2eaf9d213fb8dc4afbe86d /synapse/util/async_helpers.py | |
parent | Order in-flight state group queries in biggest-first order (#11610) (diff) | |
download | synapse-91bc15c772d22fbe814170ab2e0fdbfa50f9c372.tar.xz |
Add `stop_cancellation` utility function (#12106)
Diffstat (limited to 'synapse/util/async_helpers.py')
-rw-r--r-- | synapse/util/async_helpers.py | 19 |
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 |