[Python-checkins] cpython (merge 3.5 -> 3.6): Issue #23839: Various caches now are cleared before running every test file.

serhiy.storchaka python-checkins at python.org
Fri Nov 11 04:49:17 EST 2016


https://hg.python.org/cpython/rev/c89f213b21e8
changeset:   105050:c89f213b21e8
branch:      3.6
parent:      105043:4c81a107ccab
parent:      105049:89776a40e0ec
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Fri Nov 11 11:46:44 2016 +0200
summary:
  Issue #23839: Various caches now are cleared before running every test file.

files:
  Lib/test/libregrtest/refleak.py |  109 +++++++++++++++----
  Lib/test/libregrtest/runtest.py |    3 +-
  Misc/NEWS                       |    5 +
  3 files changed, 91 insertions(+), 26 deletions(-)


diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py
--- a/Lib/test/libregrtest/refleak.py
+++ b/Lib/test/libregrtest/refleak.py
@@ -122,17 +122,9 @@
 
 def dash_R_cleanup(fs, ps, pic, zdc, abcs):
     import gc, copyreg
-    import _strptime, linecache
-    import urllib.parse, urllib.request, mimetypes, doctest
-    import struct, filecmp, collections.abc
-    from distutils.dir_util import _path_created
+    import collections.abc
     from weakref import WeakSet
 
-    # Clear the warnings registry, so they can be displayed again
-    for mod in sys.modules.values():
-        if hasattr(mod, '__warningregistry__'):
-            del mod.__warningregistry__
-
     # Restore some original values.
     warnings.filters[:] = fs
     copyreg.dispatch_table.clear()
@@ -159,6 +151,23 @@
             obj._abc_cache.clear()
             obj._abc_negative_cache.clear()
 
+    clear_caches()
+
+    # Collect cyclic trash and read memory statistics immediately after.
+    func1 = sys.getallocatedblocks
+    func2 = sys.gettotalrefcount
+    gc.collect()
+    return func1(), func2(), fd_count()
+
+
+def clear_caches():
+    import gc
+
+    # Clear the warnings registry, so they can be displayed again
+    for mod in sys.modules.values():
+        if hasattr(mod, '__warningregistry__'):
+            del mod.__warningregistry__
+
     # Flush standard output, so that buffered data is sent to the OS and
     # associated Python objects are reclaimed.
     for stream in (sys.stdout, sys.stderr, sys.__stdout__, sys.__stderr__):
@@ -166,20 +175,74 @@
             stream.flush()
 
     # Clear assorted module caches.
-    _path_created.clear()
+    # Don't worry about resetting the cache if the module is not loaded
+    try:
+        distutils_dir_util = sys.modules['distutils.dir_util']
+    except KeyError:
+        pass
+    else:
+        distutils_dir_util._path_created.clear()
     re.purge()
-    _strptime._regex_cache.clear()
-    urllib.parse.clear_cache()
-    urllib.request.urlcleanup()
-    linecache.clearcache()
-    mimetypes._default_mime_types()
-    filecmp._cache.clear()
-    struct._clearcache()
-    doctest.master = None
+
     try:
-        import ctypes
-    except ImportError:
-        # Don't worry about resetting the cache if ctypes is not supported
+        _strptime = sys.modules['_strptime']
+    except KeyError:
+        pass
+    else:
+        _strptime._regex_cache.clear()
+
+    try:
+        urllib_parse = sys.modules['urllib.parse']
+    except KeyError:
+        pass
+    else:
+        urllib_parse.clear_cache()
+
+    try:
+        urllib_request = sys.modules['urllib.request']
+    except KeyError:
+        pass
+    else:
+        urllib_request.urlcleanup()
+
+    try:
+        linecache = sys.modules['linecache']
+    except KeyError:
+        pass
+    else:
+        linecache.clearcache()
+
+    try:
+        mimetypes = sys.modules['mimetypes']
+    except KeyError:
+        pass
+    else:
+        mimetypes._default_mime_types()
+
+    try:
+        filecmp = sys.modules['filecmp']
+    except KeyError:
+        pass
+    else:
+        filecmp._cache.clear()
+
+    try:
+        struct = sys.modules['struct']
+    except KeyError:
+        pass
+    else:
+        struct._clearcache()
+
+    try:
+        doctest = sys.modules['doctest']
+    except KeyError:
+        pass
+    else:
+        doctest.master = None
+
+    try:
+        ctypes = sys.modules['ctypes']
+    except KeyError:
         pass
     else:
         ctypes._reset_cache()
@@ -192,11 +255,7 @@
         for f in typing._cleanups:
             f()
 
-    # Collect cyclic trash and read memory statistics immediately after.
-    func1 = sys.getallocatedblocks
-    func2 = sys.gettotalrefcount
     gc.collect()
-    return func1(), func2(), fd_count()
 
 
 def warm_caches():
diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py
--- a/Lib/test/libregrtest/runtest.py
+++ b/Lib/test/libregrtest/runtest.py
@@ -7,7 +7,7 @@
 import traceback
 import unittest
 from test import support
-from test.libregrtest.refleak import dash_R
+from test.libregrtest.refleak import dash_R, clear_caches
 from test.libregrtest.save_env import saved_test_environment
 
 
@@ -146,6 +146,7 @@
         else:
             # Always import it from the test package
             abstest = 'test.' + test
+        clear_caches()
         with saved_test_environment(test, ns.verbose, ns.quiet, pgo=ns.pgo) as environment:
             start_time = time.time()
             the_module = importlib.import_module(abstest)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -55,6 +55,11 @@
 
 - Issue #28513: Documented command-line interface of zipfile.
 
+Tests
+-----
+
+- Issue #23839: Various caches now are cleared before running every test file.
+
 
 What's New in Python 3.6.0 beta 3
 =================================

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list