Skip to content

Commit fce59b2

Browse files
committed
DEBUG: Logging contexts getting lost
Running a normal server (`daemonize: false`): ``` poetry run synapse_homeserver --config-path homeserver.yaml ``` Bad logs being seen: ``` PreserveLoggingContext: Expected logging context sentinel but found main ``` ``` LoggingContext: Expected logging context main was lost ```
1 parent a677d9b commit fce59b2

10 files changed

Lines changed: 122 additions & 45 deletions

File tree

synapse/app/_base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
from synapse.events.presence_router import load_legacy_presence_router
7373
from synapse.handlers.auth import load_legacy_password_auth_providers
7474
from synapse.http.site import SynapseSite
75+
from synapse.logging.context import PreserveLoggingContext, current_context
7576
from synapse.logging.opentracing import init_tracer
7677
from synapse.metrics import install_gc_manager, register_threadpool
7778
from synapse.metrics.background_process_metrics import run_as_background_process
@@ -182,7 +183,9 @@ def run() -> None:
182183
if gc_thresholds:
183184
gc.set_threshold(*gc_thresholds)
184185
install_gc_manager()
186+
logger.info("run-asdf1")
185187
run_command()
188+
logger.info("run-asdf2")
186189

187190
if daemonize:
188191
assert pid_file is not None
@@ -192,7 +195,9 @@ def run() -> None:
192195

193196
daemonize_process(pid_file, logger)
194197

198+
logger.info("asdf1")
195199
run()
200+
logger.info("asdf2")
196201

197202

198203
def quit_with_error(error_string: str) -> NoReturn:

synapse/app/homeserver.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -376,18 +376,18 @@ def setup(config_options: List[str]) -> SynapseHomeServer:
376376
except Exception as e:
377377
handle_startup_exception(e)
378378

379-
async def start() -> None:
380-
# Load the OIDC provider metadatas, if OIDC is enabled.
381-
if hs.config.oidc.oidc_enabled:
382-
oidc = hs.get_oidc_handler()
383-
# Loading the provider metadata also ensures the provider config is valid.
384-
await oidc.load_metadata()
379+
# async def start() -> None:
380+
# # Load the OIDC provider metadatas, if OIDC is enabled.
381+
# if hs.config.oidc.oidc_enabled:
382+
# oidc = hs.get_oidc_handler()
383+
# # Loading the provider metadata also ensures the provider config is valid.
384+
# await oidc.load_metadata()
385385

386-
await _base.start(hs)
386+
# await _base.start(hs)
387387

388-
hs.get_datastores().main.db_pool.updates.start_doing_background_updates()
388+
# hs.get_datastores().main.db_pool.updates.start_doing_background_updates()
389389

390-
register_start(start)
390+
# register_start(start)
391391

392392
return hs
393393

synapse/handlers/presence.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,14 @@ def __init__(self, hs: "HomeServer"):
529529
self.send_stop_syncing, UPDATE_SYNCING_USERS_MS
530530
)
531531

532-
hs.get_reactor().addSystemEventTrigger(
533-
"before",
534-
"shutdown",
535-
run_as_background_process,
536-
"generic_presence.on_shutdown",
537-
self.server_name,
538-
self._on_shutdown,
539-
)
532+
# hs.get_reactor().addSystemEventTrigger(
533+
# "before",
534+
# "shutdown",
535+
# run_as_background_process,
536+
# "generic_presence.on_shutdown",
537+
# self.server_name,
538+
# self._on_shutdown,
539+
# )
540540

541541
async def _on_shutdown(self) -> None:
542542
if self._track_presence:

synapse/logging/context.py

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,10 +411,13 @@ def __exit__(
411411
current = set_current_context(self.previous_context)
412412
if current is not self:
413413
if current is SENTINEL_CONTEXT:
414-
logcontext_error("Expected logging context %s was lost" % (self,))
414+
logcontext_error(
415+
"LoggingContext: Expected logging context %s was lost" % (self,)
416+
)
415417
else:
416418
logcontext_error(
417-
"Expected logging context %s but found %s" % (self, current)
419+
"LoggingContext: Expected logging context %s but found %s"
420+
% (self, current)
418421
)
419422

420423
# the fact that we are here suggests that the caller thinks that everything
@@ -636,23 +639,44 @@ def __init__(
636639

637640
def __enter__(self) -> None:
638641
self._old_context = set_current_context(self._new_context)
642+
import traceback
643+
644+
logger.info(
645+
"asdf PreserveLoggingContext enter new=%s old=%s %s",
646+
self._new_context,
647+
self._old_context,
648+
traceback.format_stack()[-2].replace(
649+
"/home/eric/Documents/github/element/synapse/", ""
650+
),
651+
)
639652

640653
def __exit__(
641654
self,
642655
type: Optional[Type[BaseException]],
643656
value: Optional[BaseException],
644657
traceback: Optional[TracebackType],
645658
) -> None:
659+
import traceback
660+
661+
logger.info(
662+
"asdf PreserveLoggingContext exit new=%s old=%s %s",
663+
self._new_context,
664+
self._old_context,
665+
traceback.format_stack()[-2].replace(
666+
"/home/eric/Documents/github/element/synapse/", ""
667+
),
668+
)
646669
context = set_current_context(self._old_context)
647670

648671
if context != self._new_context:
649672
if not context:
650673
logcontext_error(
651-
"Expected logging context %s was lost" % (self._new_context,)
674+
"PreserveLoggingContext: Expected logging context %s was lost"
675+
% (self._new_context,)
652676
)
653677
else:
654678
logcontext_error(
655-
"Expected logging context %s but found %s"
679+
"PreserveLoggingContext: Expected logging context %s but found %s"
656680
% (
657681
self._new_context,
658682
context,
@@ -684,6 +708,15 @@ def set_current_context(context: LoggingContextOrSentinel) -> LoggingContextOrSe
684708

685709
current = current_context()
686710

711+
# import traceback
712+
713+
logger.info(
714+
"asdf set_current_context new=%s old=%s",
715+
context,
716+
current,
717+
# traceback.format_stack(),
718+
)
719+
687720
if current is not context:
688721
rusage = get_thread_resource_usage()
689722
current.stop(rusage)

synapse/metrics/background_process_metrics.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,12 @@ async def run() -> Optional[R]:
260260
with BackgroundProcessLoggingContext(
261261
name=desc, server_name=server_name, instance_id=count
262262
) as context:
263+
logger.info(
264+
"asdf run_as_background_process %s %s previous_context=%s",
265+
desc,
266+
context,
267+
context.previous_context,
268+
)
263269
try:
264270
if bg_start_span:
265271
ctx = start_active_span(

synapse/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,8 @@ def setup(self) -> None:
366366
# Register background tasks required by this server. This must be done
367367
# somewhat manually due to the background tasks not being registered
368368
# unless handlers are instantiated.
369-
if self.config.worker.run_background_tasks:
370-
self.setup_background_tasks()
369+
# if self.config.worker.run_background_tasks:
370+
# self.setup_background_tasks()
371371

372372
def start_listening(self) -> None: # noqa: B027 (no-op by design)
373373
"""Start the HTTP, manhole, metrics, etc listeners

synapse/storage/database.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
from twisted.enterprise import adbapi
5454
from twisted.internet.interfaces import IReactorCore
55+
from twisted.internet import defer
5556

5657
from synapse.api.errors import StoreError
5758
from synapse.config.database import DatabaseConnectionConfig
@@ -642,13 +643,31 @@ def __init__(
642643

643644
# Check ASAP (and then later, every 1s) to see if we have finished
644645
# background updates of tables that aren't safe to update.
645-
self._clock.call_later(
646-
0.0,
647-
run_as_background_process,
648-
"upsert_safety_check",
649-
self.server_name,
650-
self._check_safe_to_upsert,
651-
)
646+
# self._clock.call_later(
647+
# 0.0,
648+
# run_as_background_process,
649+
# "upsert_safety_check",
650+
# self.server_name,
651+
# self._check_safe_to_upsert,
652+
# )
653+
654+
# self._clock.call_later(
655+
# 0.0,
656+
# run_as_background_process,
657+
# "asdf_call_later",
658+
# self.server_name,
659+
# self.asdf,
660+
# )
661+
run_as_background_process("asdf_call_later", self.server_name, self.asdf)
662+
run_as_background_process("qwer_call_later", self.server_name, self.qwer)
663+
664+
async def asdf(self) -> None:
665+
# Await some dummy value
666+
await self._clock.sleep(1.0)
667+
668+
async def qwer(self) -> None:
669+
# Await some dummy value
670+
await self._clock.sleep(1.0)
652671

653672
def name(self) -> str:
654673
"Return the name of this database"

synapse/storage/databases/main/cache.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626

2727
from synapse.api.constants import EventTypes
2828
from synapse.config._base import Config
29-
from synapse.metrics.background_process_metrics import wrap_as_background_process
29+
from synapse.metrics.background_process_metrics import (
30+
wrap_as_background_process,
31+
run_as_background_process,
32+
)
3033
from synapse.replication.tcp.streams import BackfillStream, CachesStream
3134
from synapse.replication.tcp.streams.events import (
3235
EventsStream,
@@ -128,13 +131,19 @@ def __init__(
128131
# old rows.
129132
# This is only applicable when Postgres is in use; this table is unused
130133
# and not populated at all when SQLite is the active database engine.
131-
if hs.config.worker.run_background_tasks and isinstance(
132-
self.database_engine, PostgresEngine
133-
):
134-
self.hs.get_clock().call_later(
135-
CATCH_UP_CLEANUP_INTERVAL_MS / 1000,
136-
self._clean_up_cache_invalidation_wrapper,
137-
)
134+
# if hs.config.worker.run_background_tasks and isinstance(
135+
# self.database_engine, PostgresEngine
136+
# ):
137+
# self.hs.get_clock().call_later(
138+
# CATCH_UP_CLEANUP_INTERVAL_MS / 1000,
139+
# self._clean_up_cache_invalidation_wrapper,
140+
# )
141+
142+
# run_as_background_process("qwer_call_later", self.server_name, self.qwer)
143+
144+
# async def qwer(self) -> None:
145+
# # Await some dummy value
146+
# await self._clock.sleep(1.0)
138147

139148
async def get_all_updated_caches(
140149
self, instance_name: str, last_id: int, current_id: int, limit: int

synapse/storage/databases/main/lock.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ def __init__(
9999
# lead to a race, as we may drop the lock while we are still processing.
100100
# However, a) it should be a small window, b) the lock is best effort
101101
# anyway and c) we want to really avoid leaking locks when we restart.
102-
hs.get_reactor().addSystemEventTrigger(
103-
"before",
104-
"shutdown",
105-
self._on_shutdown,
106-
)
102+
# hs.get_reactor().addSystemEventTrigger(
103+
# "before",
104+
# "shutdown",
105+
# self._on_shutdown,
106+
# )
107107

108108
self._acquiring_locks: Set[Tuple[str, str]] = set()
109109

synapse/util/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ async def sleep(self, seconds: float) -> None:
124124
with context.PreserveLoggingContext():
125125
self._reactor.callLater(seconds, d.callback, seconds)
126126
await d
127+
logger.info("asdf sleep done")
127128

128129
def time(self) -> float:
129130
"""Returns the current system time in seconds since epoch."""
@@ -158,6 +159,8 @@ def looping_call(
158159
*args: Positional arguments to pass to function.
159160
**kwargs: Key arguments to pass to function.
160161
"""
162+
# TODO: remove
163+
return
161164
return self._looping_call_common(f, msec, False, *args, **kwargs)
162165

163166
def looping_call_now(
@@ -213,12 +216,14 @@ def call_later(
213216
**kwargs: Key arguments to pass to function.
214217
"""
215218

216-
def wrapped_callback(*args: Any, **kwargs: Any) -> None:
219+
def wrapped_call_later_callback(*args: Any, **kwargs: Any) -> None:
217220
with context.PreserveLoggingContext():
218221
callback(*args, **kwargs)
219222

220223
with context.PreserveLoggingContext():
221-
return self._reactor.callLater(delay, wrapped_callback, *args, **kwargs)
224+
return self._reactor.callLater(
225+
delay, wrapped_call_later_callback, *args, **kwargs
226+
)
222227

223228
def cancel_call_later(self, timer: IDelayedCall, ignore_errs: bool = False) -> None:
224229
try:

0 commit comments

Comments
 (0)