Inside iter_owners, only cache a maximum of 25 dblink instances, in order
authorZac Medico <zmedico@gentoo.org>
Mon, 16 Nov 2009 00:30:53 +0000 (00:30 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 16 Nov 2009 00:30:53 +0000 (00:30 -0000)
to avoid potentially running out of memory. (trunk r14815)

svn path=/main/branches/2.1.7/; revision=14833

pym/portage/dbapi/vartree.py

index aae16e43ff7622432505515f972c454825edd9f9..cb9c57216706b950a46a881748b4ffa6c295acd1 100644 (file)
@@ -48,6 +48,7 @@ from portage import _unicode_encode
 from portage.cache.mappings import slot_dict_class
 
 import codecs
+from collections import deque
 import re, shutil, stat, errno, copy, subprocess
 import logging
 import os as _os
@@ -902,12 +903,17 @@ class vardbapi(dbapi):
                        base_names = self._vardb._aux_cache["owners"]["base_names"]
 
                        dblink_cache = {}
+                       dblink_fifo = deque()
 
                        def dblink(cpv):
                                x = dblink_cache.get(cpv)
                                if x is None:
+                                       if len(dblink_fifo) >= 25:
+                                               # Ensure that we don't run out of memory.
+                                               del dblink_cache[dblink_fifo.popleft().mycpv]
                                        x = self._vardb._dblink(cpv)
                                        dblink_cache[cpv] = x
+                                       dblink_fifo.append(x)
                                return x
 
                        for path in path_iter: