Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Fix long-standing bug where ReadWriteLock could drop logging contex…
Browse files Browse the repository at this point in the history
…ts (#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.
  • Loading branch information
squahtx authored Oct 8, 2021
1 parent bb228f3 commit 49a683d
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog.d/10993.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a long-standing bug where `ReadWriteLock`s could drop logging contexts on exit.
6 changes: 4 additions & 2 deletions synapse/util/async_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,8 @@ def _ctx_manager():
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()
Expand Down Expand Up @@ -466,7 +467,8 @@ def _ctx_manager():
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)

Expand Down

0 comments on commit 49a683d

Please sign in to comment.