Merge pull request #2921 from matrix-org/rav/unyielding_make_deferred_yieldable

Rewrite make_deferred_yieldable avoiding inlineCallbacks
This commit is contained in:
Richard van der Hoff 2018-03-01 15:39:10 +00:00 committed by GitHub
commit 2324124a72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -299,10 +299,6 @@ def preserve_fn(f):
Useful for wrapping functions that return a deferred which you don't yield Useful for wrapping functions that return a deferred which you don't yield
on. on.
""" """
def reset_context(result):
LoggingContext.set_current_context(LoggingContext.sentinel)
return result
def g(*args, **kwargs): def g(*args, **kwargs):
current = LoggingContext.current_context() current = LoggingContext.current_context()
res = f(*args, **kwargs) res = f(*args, **kwargs)
@ -323,12 +319,11 @@ def preserve_fn(f):
# which is supposed to have a single entry and exit point. But # which is supposed to have a single entry and exit point. But
# by spawning off another deferred, we are effectively # by spawning off another deferred, we are effectively
# adding a new exit point.) # adding a new exit point.)
res.addBoth(reset_context) res.addBoth(_set_context_cb, LoggingContext.sentinel)
return res return res
return g return g
@defer.inlineCallbacks
def make_deferred_yieldable(deferred): def make_deferred_yieldable(deferred):
"""Given a deferred, make it follow the Synapse logcontext rules: """Given a deferred, make it follow the Synapse logcontext rules:
@ -342,9 +337,16 @@ def make_deferred_yieldable(deferred):
(This is more-or-less the opposite operation to preserve_fn.) (This is more-or-less the opposite operation to preserve_fn.)
""" """
with PreserveLoggingContext(): if isinstance(deferred, defer.Deferred) and not deferred.called:
r = yield deferred prev_context = LoggingContext.set_current_context(LoggingContext.sentinel)
defer.returnValue(r) deferred.addBoth(_set_context_cb, prev_context)
return deferred
def _set_context_cb(result, context):
"""A callback function which just sets the logging context"""
LoggingContext.set_current_context(context)
return result
# modules to ignore in `logcontext_tracer` # modules to ignore in `logcontext_tracer`