Skip to content

Remove reference cycle when writing tarfiles #115256

Closed

Description

@pan324

Feature or enhancement

Proposal:

The following code keeps a file handle for eternity and even gc.collect does not help.

>>> import tarfile
>>> tarfile.TarFile("archive.tar.gz","w").add("somefile.py")

The culprit is a line that itself says that it is not needed. Indeed, it is never used anywhere. https://github.com/python/cpython/blob/main/Lib/tarfile.py#L2033

Now the example might be a rather bad style, but even a typical use case where a TarFile variable is defined and closed afterwards will also keep some stuff in memory until gc.collect happens due to this line. Removing the line also adds a ResourceWarning to the bad style example which currently does not appear.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. furkanonder commented on Feb 11, 2024

    @furkanonder
    Contributor
  2. encukou commented on Feb 12, 2024

    @encukou
    Member

    How can we know that no one is using this member?
    If it needs to be removed, it should be deprecated according to PEP-387.

    @furkanonder Do you have a particular question? I'm not sure why you mentioned me here.

  3. serhiy-storchaka commented on Feb 12, 2024

    @serhiy-storchaka
    Member

    When and why this field was added? How it was used in earlier versions? When and why the comment was added?

  4. pan324 commented on Feb 12, 2024

    @pan324
    ContributorAuthor

    It was not used even when it was introduced. Several other classes at the time also define self.tarfile and use it in methods but TarInfo does not inherit from them. Here's what things looked like 17 years ago:

    tarinfo.tarfile = self

    The comment was added by @vadmium 8 years ago when he extended some of the docstrings. f817a48

    The only public git repo I can find that accesses info.tarfile uses it to find replace symlink infos by their resolved infos: https://github.com/jlevy/instaclone/blob/master/instaclone/archives.py#L65-L75

    It appears that this is not just about lingering handles but may actually corrupt archives as reported here: #78843

  5. vadmium commented on Feb 12, 2024

    @vadmium
    Member

    I don't remember why I added the comment. I was probably studying how the module used TarInfo objects, and noticed it setting the tarfile attribute without any documentation or usage of that attribute.

    The attribute itself seems comes from implementing Pax format (c64e402).

  6. furkanonder commented on Feb 15, 2024

    @furkanonder
    Contributor

    How can we know that no one is using this member? If it needs to be removed, it should be deprecated according to PEP-387.

    @furkanonder Do you have a particular question? I'm not sure why you mentioned me here.

    I've seen you fixing issues with the tarfile module. I tagged you in case you might have an idea about the issue raised here. Sorry if I've disturbed you.

  7. added a commit that references this issue on Mar 4, 2024
  8. added a commit that references this issue on Mar 4, 2024
  9. added a commit that references this issue on Mar 25, 2024
  10. added a commit that references this issue on Apr 17, 2024
  11. hugovk commented on Jan 29, 2025

    @hugovk
    Member

    Triage: looks like this can be closed, please re-open if there more to do. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-featureA feature request or enhancement

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions