diff options
author | Victor Stinner <vstinner@python.org> | 2021-09-01 15:45:27 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-01 15:45:27 (GMT) |
commit | 679cb4781ea370c3b3ce40d3334dc404d7e9d92b (patch) | |
tree | ded25a0c00d4b1be1af5cb8a585de51bf5fad3be | |
parent | 863154c9292e70c5a8a1a3f22ef4ee42e2304281 (diff) | |
download | cpython-679cb4781ea370c3b3ce40d3334dc404d7e9d92b.zip cpython-679cb4781ea370c3b3ce40d3334dc404d7e9d92b.tar.gz cpython-679cb4781ea370c3b3ce40d3334dc404d7e9d92b.tar.bz2 |
bpo-44895: libregrtest: refleak check clears types later (GH-28113)
libregrtest now clears the type cache later to reduce the risk of
false alarm when checking for reference leaks. Previously, the type
cache was cleared too early and libregrtest raised a false alarm
about reference leaks under very specific conditions.
Move also support.gc_collect() outside clear/cleanup functions to
make the garbage collection more explicit.
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
-rw-r--r-- | Lib/test/libregrtest/refleak.py | 13 | ||||
-rw-r--r-- | Lib/test/libregrtest/runtest.py | 14 | ||||
-rw-r--r-- | Lib/test/libregrtest/utils.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst | 5 |
4 files changed, 20 insertions, 14 deletions
diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index b94826a..096b538 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -85,13 +85,15 @@ def dash_R(ns, test_name, test_func): flush=True) dash_R_cleanup(fs, ps, pic, zdc, abcs) + support.gc_collect() for i in rep_range: test_func() + dash_R_cleanup(fs, ps, pic, zdc, abcs) + support.gc_collect() - # dash_R_cleanup() ends with collecting cyclic trash: - # read memory statistics immediately after. + # Read memory statistics immediately after the garbage collection alloc_after = getallocatedblocks() - _getquickenedcount() rc_after = gettotalrefcount() fd_after = fd_count() @@ -166,9 +168,6 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): zipimport._zip_directory_cache.clear() zipimport._zip_directory_cache.update(zdc) - # clear type cache - sys._clear_type_cache() - # Clear ABC registries, restoring previously saved ABC registries. abs_classes = [getattr(collections.abc, a) for a in collections.abc.__all__] abs_classes = filter(isabstract, abs_classes) @@ -179,8 +178,12 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): obj.register(ref()) obj._abc_caches_clear() + # Clear caches clear_caches() + # Clear type cache at the end: previous function calls can modify types + sys._clear_type_cache() + def warm_caches(): # char cache diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 489ab98..fe4693b 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -297,9 +297,13 @@ def _runtest_inner2(ns: Namespace, test_name: str) -> bool: test_runner() refleak = False finally: - cleanup_test_droppings(test_name, ns.verbose) + # First kill any dangling references to open files etc. + # This can also issue some ResourceWarnings which would otherwise get + # triggered during the following test run, and possibly produce + # failures. + support.gc_collect() - support.gc_collect() + cleanup_test_droppings(test_name, ns.verbose) if gc.garbage: support.environment_altered = True @@ -330,6 +334,7 @@ def _runtest_inner( try: clear_caches() + support.gc_collect() with save_env(ns, test_name): refleak = _runtest_inner2(ns, test_name) @@ -373,11 +378,6 @@ def _runtest_inner( def cleanup_test_droppings(test_name: str, verbose: int) -> None: - # First kill any dangling references to open files etc. - # This can also issue some ResourceWarnings which would otherwise get - # triggered during the following test run, and possibly produce failures. - support.gc_collect() - # Try to clean up junk commonly left behind. While tests shouldn't leave # any files or directories behind, when a test fails that can be tedious # for it to arrange. The consequences can be especially nasty on Windows, diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 89d7e7e..ad18b50 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -217,5 +217,3 @@ def clear_caches(): else: for f in typing._cleanups: f() - - support.gc_collect() diff --git a/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst b/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst new file mode 100644 index 0000000..038466f --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst @@ -0,0 +1,5 @@ +libregrtest now clears the type cache later to reduce the risk of false alarm +when checking for reference leaks. Previously, the type cache was cleared too +early and libregrtest raised a false alarm about reference leaks under very +specific conditions. +Patch by Irit Katriel and Victor Stinner. |