This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author xtreak
Recipients brett.cannon, eric.snow, ncoghlan, xtreak
Date 2019-05-04.06:10:23
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1556950223.47.0.95002157381.issue36784@roundup.psfhosted.org>
In-reply-to
Content
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
History
Date User Action Args
2019-05-04 06:10:23xtreaksetrecipients: + xtreak, brett.cannon, ncoghlan, eric.snow
2019-05-04 06:10:23xtreaksetmessageid: <1556950223.47.0.95002157381.issue36784@roundup.psfhosted.org>
2019-05-04 06:10:23xtreaklinkissue36784 messages
2019-05-04 06:10:23xtreakcreate