SVN: ZODB/branches/3.9/src/ Applied the patch (slightly modified) from

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <[email protected]>
Log message for revision 109789:
  Applied the patch (slightly modified) from
  
  https://bugs.launchpad.net/zodb/+bug/533015
  
  Much thanks to Hanno Schlichting and Nikolay Kim for coming up with
  the patch.
  

Changed:
  U   ZODB/branches/3.9/src/ZODB/tests/testConnection.py
  U   ZODB/branches/3.9/src/persistent/cPickleCache.c

-=-
Modified: ZODB/branches/3.9/src/ZODB/tests/testConnection.py
===================================================================
--- ZODB/branches/3.9/src/ZODB/tests/testConnection.py	2010-03-07 16:58:43 UTC (rev 109788)
+++ ZODB/branches/3.9/src/ZODB/tests/testConnection.py	2010-03-07 19:54:59 UTC (rev 109789)
@@ -662,11 +662,25 @@
         # sanity check
         self.assert_(cache.total_estimated_size >= 0)
 
+    def test_cache_garbage_collection_shrinking_object(self):
+        db = self.db
+        # activate size based cache garbage collection
+        db.setCacheSizeBytes(1000)
+        obj, conn, cache = self.obj, self.conn, self.conn._cache
+        # verify the change worked as expected
+        self.assertEqual(cache.cache_size_bytes, 1000)
+        # verify our entrance assumption is fullfilled
+        self.assert_(cache.total_estimated_size > 1)
+        # give the objects some size
+        obj.setValueWithSize(500)
+        transaction.savepoint()
+        self.assert_(cache.total_estimated_size > 500)
+        # make the object smaller
+        obj.setValueWithSize(100)
+        transaction.savepoint()
+        # make sure there was no overflow
+        self.assert_(cache.total_estimated_size != 0)
 
-
-
-
-
 # ---- stubs
 
 class StubObject(Persistent):

Modified: ZODB/branches/3.9/src/persistent/cPickleCache.c
===================================================================
--- ZODB/branches/3.9/src/persistent/cPickleCache.c	2010-03-07 16:58:43 UTC (rev 109788)
+++ ZODB/branches/3.9/src/persistent/cPickleCache.c	2010-03-07 19:54:59 UTC (rev 109789)
@@ -668,7 +668,8 @@
   PyObject *oid;
   cPersistentObject *v;
   unsigned int new_size;
-  if (!PyArg_ParseTuple(args, "OI:updateObjectSizeEstimation", &oid, &new_size))
+  if (!PyArg_ParseTuple(args, "OI:updateObjectSizeEstimation",
+                        &oid, &new_size))
     return NULL;
   /* Note: reference borrowed */
   v = (cPersistentObject *)PyDict_GetItem(self->data, oid);
@@ -680,8 +681,9 @@
       if (v->ring.r_next)
         {
           self->total_estimated_size += _estimated_size_in_bytes(
-               _estimated_size_in_24_bits(new_size) - v->estimated_size
-                                                                 );
+               (int)(_estimated_size_in_24_bits(new_size))
+                - (int)(v->estimated_size)
+               );
           /* we do this in "Connection" as we need it even when the
              object is not in the cache (or not the ring)
           */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.