[Zodb-checkins] SVN: ZODB/trunk/ - Fixed bug 113932 by changing automatic garbage collection to only work on

Christian Theune ct at gocept.com
Wed Jun 6 11:45:55 EDT 2007


Log message for revision 76430:
   - Fixed bug 113932 by changing automatic garbage collection to only work on
     closed connections.
  

Changed:
  U   ZODB/trunk/NEWS.txt
  U   ZODB/trunk/src/ZODB/DB.py
  U   ZODB/trunk/src/ZODB/tests/test_cache.py

-=-
Modified: ZODB/trunk/NEWS.txt
===================================================================
--- ZODB/trunk/NEWS.txt	2007-06-06 15:43:27 UTC (rev 76429)
+++ ZODB/trunk/NEWS.txt	2007-06-06 15:45:55 UTC (rev 76430)
@@ -10,6 +10,10 @@
   will be removed in ZODB 3.9.  (They have been widely recognized as
   deprecated for quite a while.)
 
+- Changed the automatic garbage collection when opening a connection to only
+  apply the garbage collections on those connections in the pool that are
+  closed. (This fixed issue 113932.)
+
 ZEO
 ---
 

Modified: ZODB/trunk/src/ZODB/DB.py
===================================================================
--- ZODB/trunk/src/ZODB/DB.py	2007-06-06 15:43:27 UTC (rev 76429)
+++ ZODB/trunk/src/ZODB/DB.py	2007-06-06 15:45:55 UTC (rev 76430)
@@ -160,10 +160,18 @@
             assert result in self.all
         return result
 
-    def map(self, f):
-        """For every live connection c, invoke f(c)."""
-        self.all.map(f)
+    def map(self, f, open_connections=True):
+        """For every live connection c, invoke f(c).
 
+        If `open_connections` is false then only call f(c) on closed
+        connections.
+
+        """
+        if open_connections:
+            self.all.map(f)
+        else:
+            map(f, self.available)
+
 class DB(object):
     """The Object Database
     -------------------
@@ -360,12 +368,17 @@
         finally:
             self._r()
 
-    # Call f(c) for all connections c in all pools in all versions.
-    def _connectionMap(self, f):
+    def _connectionMap(self, f, open_connections=True):
+        """Call f(c) for all connections c in all pools in all versions.
+
+        If `open_connections` is false then f(c) is only called on closed
+        connections.
+
+        """
         self._a()
         try:
             for pool in self._pools.values():
-                pool.map(f)
+                pool.map(f, open_connections=open_connections)
         finally:
             self._r()
 
@@ -608,7 +621,7 @@
             result.open(transaction_manager)
 
             # A good time to do some cache cleanup.
-            self._connectionMap(lambda c: c.cacheGC())
+            self._connectionMap(lambda c: c.cacheGC(), open_connections=False)
 
             return result
 

Modified: ZODB/trunk/src/ZODB/tests/test_cache.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/test_cache.py	2007-06-06 15:43:27 UTC (rev 76429)
+++ ZODB/trunk/src/ZODB/tests/test_cache.py	2007-06-06 15:45:55 UTC (rev 76430)
@@ -51,6 +51,9 @@
 
     init = classmethod(init)
 
+class PersistentObject(Persistent):
+    pass
+
 class CacheTests:
 
     def test_cache(self):
@@ -204,6 +207,35 @@
         4
         """
 
+    def test_gc_on_open_connections(self):
+        r"""Test that automatic GC is not applied to open connections.
 
+        This test (and the corresponding fix) was introduced because of bug
+        report 113923.
+
+        We start with a persistent object and add a list attribute::
+
+            >>> db = databaseFromString("<zodb>\n"
+            ...                         "cache-size 0\n"
+            ...                         "<mappingstorage/>\n"
+            ...                         "</zodb>")
+            >>> cn1 = db.open()
+            >>> r = cn1.root()
+            >>> r['ob'] = PersistentObject()
+            >>> r['ob'].l = []
+            >>> transaction.commit()
+
+        Now, let's modify the object in a way that doesn't get noticed. Then,
+        we open another connection which triggers automatic garbage
+        connection. After that, the object should not have been ghostified::
+
+            >>> r['ob'].l.append(1)
+            >>> cn2 = db.open()
+            >>> r['ob'].l
+            [1]
+
+        """
+
+
 def test_suite():
     return doctest.DocTestSuite()



More information about the Zodb-checkins mailing list