]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix memory leak on top-level _ModuleMarker.
authorFederico Caselli <cfederico87@gmail.com>
Tue, 27 Aug 2024 17:20:44 +0000 (19:20 +0200)
committerFederico Caselli <cfederico87@gmail.com>
Tue, 27 Aug 2024 17:20:44 +0000 (19:20 +0200)
Correctly cleanup the internal top-level module registry when no
inner modules or classes are registered into it.

Fixes: #11788
Change-Id: I489dd6394dd3f14458379368b8c8f18d5a0bb109

doc/build/changelog/unreleased_20/11788.rst [new file with mode: 0644]
lib/sqlalchemy/orm/clsregistry.py
test/orm/declarative/test_clsregistry.py

diff --git a/doc/build/changelog/unreleased_20/11788.rst b/doc/build/changelog/unreleased_20/11788.rst
new file mode 100644 (file)
index 0000000..736cbd3
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, orm
+    :tickets: 11788
+
+    Correctly cleanup the internal top-level module registry when no
+    inner modules or classes are registered into it.
index 26113d8b24d3fa631bf5150a047ccf554d1bd19f..382d6aef9be3702e1add900fe2a4ac6441edab35 100644 (file)
@@ -287,8 +287,9 @@ class _ModuleMarker(ClsRegistryToken):
 
     def _remove_item(self, name: str) -> None:
         self.contents.pop(name, None)
-        if not self.contents and self.parent is not None:
-            self.parent._remove_item(self.name)
+        if not self.contents:
+            if self.parent is not None:
+                self.parent._remove_item(self.name)
             _registries.discard(self)
 
     def resolve_attr(self, key: str) -> Union[_ModNS, Type[Any]]:
index ffc8528125cf5fca0fa2f93c9ba9281a5d441ae0..0cf775e4d27aa9c00220aeb89dfc13e8b129a734 100644 (file)
@@ -230,7 +230,7 @@ class ClsRegistryTest(fixtures.TestBase):
             del f2
             gc_collect()
 
-            eq_(len(clsregistry._registries), 1)
+            eq_(len(clsregistry._registries), 0)
 
     def test_dupe_classes_name_race(self):
         """test the race condition that the class was garbage "