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

Commit

Permalink
Fix HomeServers leaking due to #15334
Browse files Browse the repository at this point in the history
When the gen-0 GC is run at the end of each test, the `TestCase` object
usually still holds references to the `HomeServer` used during the test.
As a result, the `HomeServer` gets promoted to gen-1 and then never
garbage collected.

Fix this by periodically running full GCs.

Signed-off-by: Sean Quah <seanq@matrix.org>
  • Loading branch information
Sean Quah committed May 18, 2023
1 parent 3c20fd9 commit 9de5c9d
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions tests/unittest.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,13 +229,20 @@ def tearDown(orig: Callable[[], R]) -> R:
#
# The easiest way to do this would be to do a full GC after each test
# run, but that is very expensive. Instead, we disable GC (above) for
# the duration of the test so that we only need to run a gen-0 GC, which
# is a lot quicker.
# the duration of the test and only run a gen-0 GC, which is a lot
# quicker. This doesn't clean up everything, since the TestCase
# instance still holds references to objects created during the test,
# such as HomeServers, so we do a full GC every so often.

@around(self)
def tearDown(orig: Callable[[], R]) -> R:
ret = orig()
gc.collect(0)
# Run a full GC every 50 gen-0 GCs.
gen0_stats = gc.get_stats()[0]
gen0_collections = gen0_stats["collections"]
if gen0_collections % 50 == 0:
gc.collect()
gc.enable()
set_current_context(SENTINEL_CONTEXT)

Expand Down

0 comments on commit 9de5c9d

Please sign in to comment.