SVN: ZODB/trunk/src/ Forward ported r109789, r110123-110124 from 3.9 branch to trunk

Hanno Schlichting <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <20100323225325.8F3DF7083BC__14052.8976488442$1269384814$gmane$org@cvs.zope.org>
Log message for revision 110125:
  Forward ported r109789, r110123-110124 from 3.9 branch to trunk
  

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZODB/tests/testConnection.py
  U   ZODB/trunk/src/persistent/cPickleCache.c

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-03-23 22:48:36 UTC (rev 110124)
+++ ZODB/trunk/src/CHANGES.txt	2010-03-23 22:53:24 UTC (rev 110125)
@@ -8,6 +8,9 @@
 Bugs Fixed
 ----------
 
+- Fixed bug in cPickleCache's byte size estimation logic.
+  (https://bugs.launchpad.net/zodb/+bug/533015)
+
 - When using using a ClientStorage in a Storage server, there was a
   threading bug that caused clients to get disconnected.
 

Modified: ZODB/trunk/src/ZODB/tests/testConnection.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testConnection.py	2010-03-23 22:48:36 UTC (rev 110124)
+++ ZODB/trunk/src/ZODB/tests/testConnection.py	2010-03-23 22:53:24 UTC (rev 110125)
@@ -685,11 +685,27 @@
         # 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)
+        # the size is not larger than the allowed maximum
+        self.assert_(cache.total_estimated_size <= 1000)
 
-
-
-
-
 # ---- stubs
 
 class StubObject(Persistent):

Modified: ZODB/trunk/src/persistent/cPickleCache.c
===================================================================
--- ZODB/trunk/src/persistent/cPickleCache.c	2010-03-23 22:48:36 UTC (rev 110124)
+++ ZODB/trunk/src/persistent/cPickleCache.c	2010-03-23 22:53:24 UTC (rev 110125)
@@ -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.