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

Commit

Permalink
Remove a reference cycle
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston committed Sep 13, 2023
1 parent 7afb5e0 commit e140a7d
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion synapse/metrics/background_process_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,13 +322,15 @@ def __init__(self, name: str, instance_id: Optional[Union[int, str]] = None):
if instance_id is None:
instance_id = id(self)
super().__init__("%s-%s" % (name, instance_id))
self._proc = _BackgroundProcess(name, self)
self._proc: Optional[_BackgroundProcess] = _BackgroundProcess(name, self)

def start(self, rusage: "Optional[resource.struct_rusage]") -> None:
"""Log context has started running (again)."""

super().start(rusage)

assert self._proc is not None

# We've become active again so we make sure we're in the list of active
# procs. (Note that "start" here means we've become active, as opposed
# to starting for the first time.)
Expand All @@ -345,10 +347,15 @@ def __exit__(

super().__exit__(type, value, traceback)

assert self._proc is not None

# The background process has finished. We explicitly remove and manually
# update the metrics here so that if nothing is scraping metrics the set
# doesn't infinitely grow.
with _bg_metrics_lock:
_background_processes_active_since_last_scrape.discard(self._proc)

self._proc.update_metrics()

# Set proc to None to break the reference cycle.
self._proc = None

0 comments on commit e140a7d

Please sign in to comment.