[issue36784] __import__ with empty folder after importlib.invalidate_caches causes reference leak
Karthikeyan Singaravelan
report at bugs.python.org
Sat May 4 02:10:23 EDT 2019
Karthikeyan Singaravelan <tir.karthi at gmail.com> added the comment:
Interesting, I used tracemalloc to see if it helps and it gave me a line in Lib/tempfile.py . Supplying path to support.temp_dir(path="/tmp/") causes random directory code was not to be hit and there was no memory leak. So I removed the _Random() initialization in _RandomNameSequence in Lib/tempfile.py and instead of self._rng.choice I used random.choice and still had the leak.
I replaced the code to generate random letters letters = [choose(c) for dummy in range(8)] where choose is random.choice with c = "a" and the memory leak stopped. I tried below combinations at line [0] and ran test to see if the memory leaks. I also tried -R 10:10 just to make sure my limits are higher enough. Using random.shuffle on a set of characters also causes leak. I am not sure why a combination of importlib.invalidate_caches, support.temp_dir using tempfile and __import__ causes these leaks or perhaps I am debugging or using huntrleaks in an incorrect manner.
# No leak
letters = [choose("a") for dummy in range(8)]
letters = ["a" for dummy in range(8)]
letters = [choose(self.characters[0]) for dummy in range(8)]
# Memory leak
letters = [choose("ab") for dummy in range(8)]
letters = [choose(self.characters[:]) for dummy in range(8)]
letters = [choose(list(self.characters)) for dummy in range(8)]
# Below also leaks
characters = list("abcde") # list("abcd") doesn't leak
self.rng.shuffle(characters)
letters = characters[:8]
from unittest import TestCase
import tracemalloc
import sys
import os
from test import support
def test_importlib_cache_tempdir():
import importlib
importlib.invalidate_caches()
with support.temp_dir() as path: # with support.temp_dir(path="/tmp") as path: (no leak)
dirname = os.path.dirname(path)
basename = os.path.basename(path)
os.mkdir(os.path.join(path, 'test2'))
with support.DirsOnSysPath(dirname):
__import__(f"{basename}.test2".format(basename=basename))
class Tests(TestCase):
def test_bug(self):
tracemalloc.start()
for _ in range(10):
test_importlib_cache_tempdir()
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')
print("[ Top 10 ]")
for stat in top_stats[:10]:
for line in stat.traceback.format():
print(line)
$ ./python.exe -m test -R 3:3 test_import_bug_tempdir
Run tests sequentially
0:00:00 load avg: 2.55 [1/1] test_import_bug_tempdir
beginning 6 repetitions
123456
[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap_external>", line 1378
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/tempfile.py", line 136
self._rng = _Random()
File "<frozen importlib._bootstrap_external>", line 1342
.[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "<frozen importlib._bootstrap_external>", line 64
File "<frozen importlib._bootstrap_external>", line 1342
File "<frozen importlib._bootstrap_external>", line 1378
.[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "<frozen importlib._bootstrap_external>", line 64
File "<frozen importlib._bootstrap_external>", line 1342
File "<frozen importlib._bootstrap_external>", line 1132
.[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "<frozen importlib._bootstrap_external>", line 64
File "<frozen importlib._bootstrap_external>", line 1342
File "<frozen importlib._bootstrap_external>", line 1132
.[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "<frozen importlib._bootstrap_external>", line 64
File "<frozen importlib._bootstrap_external>", line 1342
File "<frozen importlib._bootstrap_external>", line 1132
.[ Top 10 ]
File "<frozen importlib._bootstrap_external>", line 1486
File "<frozen importlib._bootstrap_external>", line 1461
File "<frozen importlib._bootstrap_external>", line 1469
File "<frozen importlib._bootstrap>", line 509
File "<frozen importlib._bootstrap>", line 683
File "<frozen importlib._bootstrap>", line 344
File "<frozen importlib._bootstrap>", line 36
File "<frozen importlib._bootstrap_external>", line 64
File "<frozen importlib._bootstrap_external>", line 1342
File "<frozen importlib._bootstrap_external>", line 1132
.
test_import_bug_tempdir leaked [980, 980, 980] references, sum=2940
test_import_bug_tempdir leaked [370, 370, 370] memory blocks, sum=1110
test_import_bug_tempdir failed
== Tests result: FAILURE ==
1 test failed:
test_import_bug_tempdir
Total duration: 3 sec 254 ms
Tests result: FAILURE
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue36784>
_______________________________________
More information about the Python-bugs-list
mailing list