[Zodb-checkins] SVN: ZODB/trunk/ Fixed bug 98275: Made ZEO cache more tolerant when invalidating current object

Christian Theune ct at gocept.com
Mon Dec 3 08:26:58 EST 2007


Log message for revision 82095:
  Fixed bug 98275: Made ZEO cache more tolerant when invalidating current object
  versions.
  

Changed:
  U   ZODB/trunk/NEWS.txt
  U   ZODB/trunk/src/ZEO/cache.py
  U   ZODB/trunk/src/ZEO/tests/testZEO.py

-=-
Modified: ZODB/trunk/NEWS.txt
===================================================================
--- ZODB/trunk/NEWS.txt	2007-12-03 12:27:13 UTC (rev 82094)
+++ ZODB/trunk/NEWS.txt	2007-12-03 13:26:58 UTC (rev 82095)
@@ -40,6 +40,9 @@
 ZEO
 ---
 
+- (3.9.0a1) Bug #98275: Made ZEO cache more tolerant when invalidating current
+  versions of objects.
+
 - (3.9.0a1) Fixed a serious bug that could cause client I/O to stop
   (hang). This was accomonied by a critical log message along the
   lines of: "RuntimeError: dictionary changed size during iteration".

Modified: ZODB/trunk/src/ZEO/cache.py
===================================================================
--- ZODB/trunk/src/ZEO/cache.py	2007-12-03 12:27:13 UTC (rev 82094)
+++ ZODB/trunk/src/ZEO/cache.py	2007-12-03 13:26:58 UTC (rev 82095)
@@ -364,7 +364,7 @@
             return
 
         # Add the data we have to the list of non-current data for oid.
-        assert tid is not None and cur_tid < tid
+        assert tid is not None and cur_tid <= tid
         # 0x1C = invalidate (hit, saving non-current)
         self._trace(0x1C, oid, version, tid)
         del self.current[oid]   # because we no longer have current data

Modified: ZODB/trunk/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/testZEO.py	2007-12-03 12:27:13 UTC (rev 82094)
+++ ZODB/trunk/src/ZEO/tests/testZEO.py	2007-12-03 13:26:58 UTC (rev 82095)
@@ -34,6 +34,8 @@
 import ZODB.tests.util
 from ZODB.tests.MinPO import MinPO
 from ZODB.tests.StorageTestBase import zodb_unpickle
+import persistent
+import transaction
 
 # ZODB test mixin classes
 from ZODB.tests import StorageTestBase, BasicStorage, VersionStorage, \
@@ -67,9 +69,34 @@
         # be identical.
         self.assertEqual(ZODB.__version__, ZEO.version)
 
+
+class CreativeGetState(persistent.Persistent):
+    def __getstate__(self):
+        self.name = 'me'
+        return super(CreativeGetState, self).__getstate__()
+
+
 class MiscZEOTests:
     """ZEO tests that don't fit in elsewhere."""
 
+    def checkCreativeGetState(self):
+        # This test covers persistent objects that provide their own 
+        # __getstate__ which modifies the state of the object.
+        # For details see bug #98275
+
+        db = ZODB.DB(self._storage)
+        cn = db.open()
+        rt = cn.root()
+        m = CreativeGetState()
+        m.attr = 'hi'
+        rt['a'] = m
+
+        # This commit used to fail because of the `Mine` object being put back
+        # into `changed` state although it was already stored causing the ZEO
+        # cache to bail out.
+        transaction.commit()
+        cn.close()
+
     def checkLargeUpdate(self):
         obj = MinPO("X" * (10 * 128 * 1024))
         self._dostore(data=obj)



More information about the Zodb-checkins mailing list