# HG changeset patch # User Pierre-Yves David # Date 1660697024 -7200 # Node ID 360c156e1f811f690c3abc5ae2910b230a9c1c70 # Parent a974c52fb79a310468d5b0318ba30ad368bc395f obsstore: break the repo → obstore → repo loop This should help the garbage collector to do its job. On repository with many markers, the memory pressure from the obsstore can get quite serious. diff -r a974c52fb79a -r 360c156e1f81 mercurial/obsolete.py --- a/mercurial/obsolete.py Tue Aug 16 11:19:54 2022 -0400 +++ b/mercurial/obsolete.py Wed Aug 17 02:43:44 2022 +0200 @@ -70,6 +70,7 @@ import binascii import struct +import weakref from .i18n import _ from .pycompat import getattr @@ -561,10 +562,18 @@ # caches for various obsolescence related cache self.caches = {} self.svfs = svfs - self.repo = repo + self._repo = weakref.ref(repo) self._defaultformat = defaultformat self._readonly = readonly + @property + def repo(self): + r = self._repo() + if r is None: + msg = "using the obsstore of a deallocated repo" + raise error.ProgrammingError(msg) + return r + def __iter__(self): return iter(self._all)