From 49a683d871add82fb1a8125c6803ac15ec7d341b Mon Sep 17 00:00:00 2001 From: Sean Quah <8349537+squahtx@users.noreply.github.com> Date: Fri, 8 Oct 2021 12:27:16 +0100 Subject: Fix long-standing bug where `ReadWriteLock` could drop logging contexts (#10993) Use `PreserveLoggingContext()` to ensure that logging contexts are not lost when exiting a read/write lock. When exiting a read/write lock, callbacks on a `Deferred` are triggered as a signal to any waiting coroutines. Any waiting coroutine that becomes runnable is likely to follow the Synapse logging context rules and will restore its own logging context, then either run to completion or await another `Deferred`, resetting the logging context in the process. --- synapse/util/async_helpers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'synapse/util') diff --git a/synapse/util/async_helpers.py b/synapse/util/async_helpers.py index 82d918a05f..5df80ea8e7 100644 --- a/synapse/util/async_helpers.py +++ b/synapse/util/async_helpers.py @@ -438,7 +438,8 @@ class ReadWriteLock: try: yield finally: - new_defer.callback(None) + with PreserveLoggingContext(): + new_defer.callback(None) self.key_to_current_readers.get(key, set()).discard(new_defer) return _ctx_manager() @@ -466,7 +467,8 @@ class ReadWriteLock: try: yield finally: - new_defer.callback(None) + with PreserveLoggingContext(): + new_defer.callback(None) if self.key_to_current_writer[key] == new_defer: self.key_to_current_writer.pop(key) -- cgit 1.4.1