Fix logging context warnings when losing replication connection (#10984)
Instead of triggering `__exit__` manually on the replication handler's logging context, use it as a context manager so that there is an `__enter__` call to balance the `__exit__`.
This commit is contained in:
parent
013e0f9cae
commit
6a67f3786a
|
@ -0,0 +1 @@
|
|||
Fix spurious warnings about losing the logging context on the `ReplicationCommandHandler` when losing the replication connection.
|
|
@ -182,9 +182,13 @@ class BaseReplicationStreamProtocol(LineOnlyReceiver):
|
|||
|
||||
# a logcontext which we use for processing incoming commands. We declare it as a
|
||||
# background process so that the CPU stats get reported to prometheus.
|
||||
self._logging_context = BackgroundProcessLoggingContext(
|
||||
"replication-conn", self.conn_id
|
||||
)
|
||||
with PreserveLoggingContext():
|
||||
# thanks to `PreserveLoggingContext()`, the new logcontext is guaranteed to
|
||||
# capture the sentinel context as its containing context and won't prevent
|
||||
# GC of / unintentionally reactivate what would be the current context.
|
||||
self._logging_context = BackgroundProcessLoggingContext(
|
||||
"replication-conn", self.conn_id
|
||||
)
|
||||
|
||||
def connectionMade(self):
|
||||
logger.info("[%s] Connection established", self.id())
|
||||
|
@ -434,8 +438,12 @@ class BaseReplicationStreamProtocol(LineOnlyReceiver):
|
|||
if self.transport:
|
||||
self.transport.unregisterProducer()
|
||||
|
||||
# mark the logging context as finished
|
||||
self._logging_context.__exit__(None, None, None)
|
||||
# mark the logging context as finished by triggering `__exit__()`
|
||||
with PreserveLoggingContext():
|
||||
with self._logging_context:
|
||||
pass
|
||||
# the sentinel context is now active, which may not be correct.
|
||||
# PreserveLoggingContext() will restore the correct logging context.
|
||||
|
||||
def __str__(self):
|
||||
addr = None
|
||||
|
|
|
@ -100,9 +100,13 @@ class RedisSubscriber(txredisapi.SubscriberProtocol):
|
|||
|
||||
# a logcontext which we use for processing incoming commands. We declare it as a
|
||||
# background process so that the CPU stats get reported to prometheus.
|
||||
self._logging_context = BackgroundProcessLoggingContext(
|
||||
"replication_command_handler"
|
||||
)
|
||||
with PreserveLoggingContext():
|
||||
# thanks to `PreserveLoggingContext()`, the new logcontext is guaranteed to
|
||||
# capture the sentinel context as its containing context and won't prevent
|
||||
# GC of / unintentionally reactivate what would be the current context.
|
||||
self._logging_context = BackgroundProcessLoggingContext(
|
||||
"replication_command_handler"
|
||||
)
|
||||
|
||||
def connectionMade(self):
|
||||
logger.info("Connected to redis")
|
||||
|
@ -182,8 +186,12 @@ class RedisSubscriber(txredisapi.SubscriberProtocol):
|
|||
super().connectionLost(reason)
|
||||
self.synapse_handler.lost_connection(self)
|
||||
|
||||
# mark the logging context as finished
|
||||
self._logging_context.__exit__(None, None, None)
|
||||
# mark the logging context as finished by triggering `__exit__()`
|
||||
with PreserveLoggingContext():
|
||||
with self._logging_context:
|
||||
pass
|
||||
# the sentinel context is now active, which may not be correct.
|
||||
# PreserveLoggingContext() will restore the correct logging context.
|
||||
|
||||
def send_command(self, cmd: Command):
|
||||
"""Send a command if connection has been established.
|
||||
|
|
Loading…
Reference in New Issue