Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ref leaks introduced by _io isolation (gh-101948) #104510

Closed
Eclips4 opened this issue May 15, 2023 · 12 comments · Fixed by #104516
Closed

Ref leaks introduced by _io isolation (gh-101948) #104510

Eclips4 opened this issue May 15, 2023 · 12 comments · Fixed by #104516
Assignees
Labels
release-blocker type-bug An unexpected behavior, bug, or error

Comments

@Eclips4
Copy link
Member

Eclips4 commented May 15, 2023

Tried on current main.

./python -m test -R 3:3 test_nntplib
0:00:00 load avg: 2.49 Run tests sequentially
0:00:00 load avg: 2.49 [1/1] test_nntplib
beginning 6 repetitions
123456
......
test_nntplib leaked [1222, 1220, 1222] references, sum=3664
test_nntplib leaked [828, 827, 829] memory blocks, sum=2484
test_nntplib failed (reference leak)

== Tests result: FAILURE ==

1 test failed:
    test_nntplib

Total duration: 640 ms
Tests result: FAILURE

OS: WSL Ubuntu 20.04 & Windows 10

UPD:
Leaked tests:
test_nntplib
test_gzip
test_httpservers
test_xmlrpc
test_tarfile

Linked PRs

@Eclips4 Eclips4 added the type-bug An unexpected behavior, bug, or error label May 15, 2023
@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

Commit which introduced it
cc @erlend-aasland

@erlend-aasland
Copy link
Contributor

Commit which introduced it

cc @erlend-aasland

Nice! We anticipated errors :) cc. @kumaraditya303 @vstinner

@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

Commit which introduced it
cc @erlend-aasland

Nice! We anticipated errors :) cc. @kumaraditya303 @vstinner

However, nttplib deprecated since 3.11. So, it's good that it wasn't cut out in 3.12 or earlier😄

@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

test_gzip also affected by this commit:

./python -m test -R 3:3 test_gzip
0:00:00 load avg: 0.00 Run tests sequentially
0:00:00 load avg: 0.00 [1/1] test_gzip
beginning 6 repetitions
123456
......
test_gzip leaked [4307, 4303, 4307] references, sum=12917
test_gzip leaked [3239, 3237, 3239] memory blocks, sum=9715
test_gzip failed (reference leak)

== Tests result: FAILURE ==

1 test failed:
    test_gzip

Total duration: 4.0 sec
Tests result: FAILURE

@sunmy2019
Copy link
Member

Incorrectly implemented GC likely causes this.

e.g. I tracked down one cyclic reference here:

class MockedNNTPTestsMixin:
    # Override in derived classes
    handler_class = None

    def setUp(self):
        super().setUp()
        self.make_server()

    def tearDown(self):
        super().tearDown()
+       self.handler._push_data = None
        del self.server

    def make_server(self, *args, **kwargs):
        self.handler = self.handler_class()
        self.sio, file = make_mock_file(self.handler)
        self.server = NNTPServer(file, 'test.server', *args, **kwargs)
        return self.server

self.handler._push_data contains reference to self.

When I add the above line, ref leaks drop from

test_nntplib leaked [1222, 1220, 1222] references, sum=3664
test_nntplib leaked [828, 827, 829] memory blocks, sum=2484

to

test_nntplib leaked [343, 343, 343] references, sum=1029
test_nntplib leaked [207, 207, 208] memory blocks, sum=622

@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

test_httpservers, test_xmlrpc, test_tarfile cause also cause reference leaks.
So, we have at least five tests with reference leaks:

  • test_nntplib
  • test_gzip
  • test_httpservers
  • test_xmlrpc
  • test_tarfile

@Eclips4 Eclips4 changed the title test_nntplib are leaked Some tests are leaked May 15, 2023
@sunmy2019
Copy link
Member

sunmy2019 commented May 15, 2023

@Eclips4 You can try doing similar things in #104457
186bf39 introduces three heap types; none have a *_clear set.

// PyIOBase_Type subclasses
ADD_TYPE(m, state->PyTextIOBase_Type, &textiobase_spec,
state->PyIOBase_Type);
ADD_TYPE(m, state->PyBufferedIOBase_Type, &bufferediobase_spec,
state->PyIOBase_Type);
ADD_TYPE(m, state->PyRawIOBase_Type, &rawiobase_spec,
state->PyIOBase_Type);

But I have not carefully examined the correct value, and I am unsure whether this will fix the issue.

@sunmy2019 sunmy2019 changed the title Some tests are leaked Ref leaks introduced by 186bf39 May 15, 2023
@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

@Eclips4 You can try doing similar things in #104457 186bf39 introduces three heap types; none have a *_clear set.

// PyIOBase_Type subclasses
ADD_TYPE(m, state->PyTextIOBase_Type, &textiobase_spec,
state->PyIOBase_Type);
ADD_TYPE(m, state->PyBufferedIOBase_Type, &bufferediobase_spec,
state->PyIOBase_Type);
ADD_TYPE(m, state->PyRawIOBase_Type, &rawiobase_spec,
state->PyIOBase_Type);

But I have not carefully examined the correct value, and I am unsure whether this will fix the issue.

Sure! I can try this, and later let you know results.

@Eclips4
Copy link
Member Author

Eclips4 commented May 15, 2023

Seems that implementing Py_tp_clear for textiobase_spec, bufferediobase_spec, rawiobase_spec doesn't make sense. There's no need in it. I'll check other types in iomodule_exec.

@erlend-aasland
Copy link
Contributor

Bisected and confirmed that 186bf39 is the first bad commit.

@kumaraditya303
Copy link
Contributor

kumaraditya303 commented May 15, 2023

#104516 fixes all the leaks mentioned

@erlend-aasland erlend-aasland changed the title Ref leaks introduced by 186bf39 Ref leaks introduced by _io isolation (gh-101948) May 16, 2023
@erlend-aasland erlend-aasland linked a pull request May 16, 2023 that will close this issue
@kumaraditya303
Copy link
Contributor

Thanks for the report.

carljm added a commit to carljm/cpython that referenced this issue May 16, 2023
* main:
  pythonGH-104510: Fix refleaks in `_io` base types (python#104516)
  pythongh-104539: Fix indentation error in logging.config.rst (python#104545)
  pythongh-104050: Don't star-import 'types' in Argument Clinic (python#104543)
  pythongh-104050: Add basic typing to CConverter in clinic.py (python#104538)
  pythongh-64595: Fix write file logic in Argument Clinic (python#104507)
  pythongh-104523: Inline minimal PGO rules (python#104524)
  pythongh-103861: Fix Zip64 extensions not being properly applied in some cases (python#103863)
  pythongh-69152: add method get_proxy_response_headers to HTTPConnection class (python#104248)
  pythongh-103763: Implement PEP 695 (python#103764)
  pythongh-104461: Run tkinter test_configure_screen on X11 only (pythonGH-104462)
  pythongh-104469: Convert _testcapi/watchers.c to use Argument Clinic (python#104503)
  pythongh-104482: Fix error handling bugs in ast.c (python#104483)
  pythongh-104341: Adjust tstate_must_exit() to Respect Interpreter Finalization (pythongh-104437)
  pythonGH-102613: Fix recursion error from `pathlib.Path.glob()` (pythonGH-104373)
carljm added a commit to carljm/cpython that referenced this issue May 17, 2023
* main: (26 commits)
  pythonGH-101520: Move tracemalloc functionality into core, leaving interface in Modules. (python#104508)
  typing: Add more tests for TypeVar (python#104571)
  pythongh-104572: Improve error messages for invalid constructs in PEP 695 contexts (python#104573)
  typing: Use PEP 695 syntax in typing.py (python#104553)
  pythongh-102153: Start stripping C0 control and space chars in `urlsplit` (python#102508)
  pythongh-104469: Update README.txt for _testcapi (pythongh-104529)
  pythonGH-103092: isolate `_elementtree` (python#104561)
  pythongh-104050: Add typing to Argument Clinic converters (python#104547)
  pythonGH-103906: Remove immortal refcounting in the interpreter (pythonGH-103909)
  pythongh-87474: Fix file descriptor leaks in subprocess.Popen (python#96351)
  pythonGH-103092: isolate `pyexpat`  (python#104506)
  pythongh-75367: Fix data descriptor detection in inspect.getattr_static (python#104517)
  pythongh-104050: Add more annotations to `Tools/clinic.py` (python#104544)
  pythongh-104555: Fix isinstance() and issubclass() for runtime-checkable protocols that use PEP 695 (python#104556)
  pythongh-103865: add monitoring support to LOAD_SUPER_ATTR (python#103866)
  CODEOWNERS: Assign new PEP 695 files to myself (python#104551)
  pythonGH-104510: Fix refleaks in `_io` base types (python#104516)
  pythongh-104539: Fix indentation error in logging.config.rst (python#104545)
  pythongh-104050: Don't star-import 'types' in Argument Clinic (python#104543)
  pythongh-104050: Add basic typing to CConverter in clinic.py (python#104538)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release-blocker type-bug An unexpected behavior, bug, or error
Projects
Development

Successfully merging a pull request may close this issue.

5 participants