Don't convert to deferreds when not necessary
3 files changed, 8 insertions, 2 deletions
diff --git a/synapse/util/async.py b/synapse/util/async.py
index 35380bf8ed..8495de496a 100644
--- a/synapse/util/async.py
+++ b/synapse/util/async.py
@@ -101,7 +101,7 @@ class ObservableDeferred(object):
return d
else:
success, res = self._result
- return defer.succeed(res) if success else defer.fail(res)
+ return res if success else defer.fail(res)
def observers(self):
return self._observers
diff --git a/synapse/util/caches/descriptors.py b/synapse/util/caches/descriptors.py
index 5c30ed235d..1607978e29 100644
--- a/synapse/util/caches/descriptors.py
+++ b/synapse/util/caches/descriptors.py
@@ -341,7 +341,10 @@ class CacheDescriptor(_CacheDescriptorBase):
cache.set(cache_key, result_d, callback=invalidate_callback)
observer = result_d.observe()
- return logcontext.make_deferred_yieldable(observer)
+ if isinstance(observer, defer.Deferred):
+ return logcontext.make_deferred_yieldable(observer)
+ else:
+ return observer
wrapped.invalidate = cache.invalidate
wrapped.invalidate_all = cache.invalidate_all
diff --git a/synapse/util/logcontext.py b/synapse/util/logcontext.py
index 857afee7cb..183d9cf62f 100644
--- a/synapse/util/logcontext.py
+++ b/synapse/util/logcontext.py
@@ -315,6 +315,9 @@ def preserve_context_over_deferred(deferred, context=None):
the deferred follow the synapse logcontext rules: try
``make_deferred_yieldable`` instead.
"""
+ if not isinstance(deferred, defer.Deferred):
+ return deferred
+
if context is None:
context = LoggingContext.current_context()
d = _PreservingContextDeferred(context)
|