python / python/cpython

ipaddress: lru_cache on instance methods causes memory leak (use cached_property instead)

Offen
#152,753 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

stdlib type-bug
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug report

Bug description:

Lib/ipaddress.py uses @functools.lru_cache() on four instance method properties:

  • IPv4Address.is_private (line 1321)
  • IPv4Address.is_global (line 1343)
  • IPv4Network.is_private (line 1552)
  • IPv6Address.is_private (line 2089)

Using lru_cache on instance methods causes a memory leak: the global cache holds
a reference to self, preventing garbage collection even after all other references
to the instance are dropped.

This can be demonstrated with:

import ipaddress, gc, weakref

a = ipaddress.IPv4Address('192.168.1.1')
ref = weakref.ref(a)
a.is_private  # trigger the cache
del a
gc.collect()
print(ref() is not None)  # True — instance is NOT collected (leak!)

The same file already uses @functools.cached_property for other properties
(e.g. with_prefixlen, compressed), which correctly ties cache lifetime to
the instance. Those do not leak:

n = ipaddress.IPv4Network('192.168.1.0/24')
ref = weakref.ref(n)
_ = n.with_prefixlen
del n
gc.collect()
print(ref() is not None)  # False — correctly collected

Fix: Replace @functools.lru_cache() with @functools.cached_property on
the four affected properties.
I would like to work on a fix for this issue.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-152790

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Lies die vier betroffenen Properties in Lib/ipaddress.py und vergleiche sie mit den bestehenden Verwendungen von cached_property in dieser Datei. Bestätige die Änderung anhand der Beispiele für weakref und Garbage Collection, damit die vier Address- und Network-Instanzen gesammelt werden können, nachdem ihre Referenzen entfernt wurden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.