[Zope-Checkins] SVN: Zope/branches/2.9/lib/python/Shared/DC/ZRDB/tests/test_caching.py more documentary tests:

Chris Withers chris at simplistix.co.uk
Fri Nov 17 10:32:55 EST 2006


Log message for revision 71153:
  more documentary tests:
  - document 2 memory leaks, one in cache and one in tcache
  - test coverage for the patch Brian applied in Dec 2000

Changed:
  U   Zope/branches/2.9/lib/python/Shared/DC/ZRDB/tests/test_caching.py

-=-
Modified: Zope/branches/2.9/lib/python/Shared/DC/ZRDB/tests/test_caching.py
===================================================================
--- Zope/branches/2.9/lib/python/Shared/DC/ZRDB/tests/test_caching.py	2006-11-17 14:04:28 UTC (rev 71152)
+++ Zope/branches/2.9/lib/python/Shared/DC/ZRDB/tests/test_caching.py	2006-11-17 15:32:54 UTC (rev 71153)
@@ -180,7 +180,7 @@
     def test_different_queries_same_second(self):
         # This tests different queries being fired into the cache
         # in the same second.
-        # XXX The demonstrates a memory leak in the cache code
+        # XXX The demonstrates 2 memory leaks in the cache code
         self._check_cache({},{})
         # one
         self._do_query('query1',1.0)
@@ -191,6 +191,7 @@
         # two
         self._do_query( 'query2',1.1)
         self._check_cache(
+            # XXX oops, query1 is in the cache but it'll never be purged.
             {('query1',1,'conn_id'): (1.0,'result for query1'),
              ('query2',1,'conn_id'): (1.1,'result for query2'),},
             {1.0: ('query2',1,'conn_id'),}
@@ -198,6 +199,7 @@
         # three
         self._do_query('query3',1.2)
         self._check_cache(
+            # XXX oops, query1 and query2 are in the cache but will never be purged
             {('query1',1,'conn_id'): (1,'result for query1'),
              ('query2',1,'conn_id'): (1.1,'result for query2'),
              ('query3',1,'conn_id'): (1.2,'result for query3'),},
@@ -206,7 +208,7 @@
         # four - now we drop our first cache entry, this is an off-by-one error
         self._do_query('query4',1.3)
         self._check_cache(
-            # XXX - oops, why is query1 here still?
+            # XXX - oops, why is query1 here still? see above ;-)
             {('query1',1,'conn_id'): (1,'result for query1'),
              ('query2',1,'conn_id'): (1.1,'result for query2'),
              ('query3',1,'conn_id'): (1.2,'result for query3'),
@@ -216,7 +218,7 @@
         # five - now we drop another cache entry
         self._do_query('query5',1.4)
         self._check_cache(
-            # XXX - oops, why are query1 and query2 here still?
+            # XXX - oops, why are query1 and query2 here still? see above ;-)
             {('query1',1,'conn_id'): (1,'result for query1'),
              ('query2',1,'conn_id'): (1.1,'result for query2'),
              ('query3',1,'conn_id'): (1.2,'result for query3'),
@@ -225,6 +227,69 @@
             {1: ('query5',1,'conn_id'),}
             )
 
+    def test_time_tcache_expires(self):
+        # the first query gets cached
+        self._do_query('query1',1)
+        self._check_cache(
+            {('query1',1,'conn_id'): (1,'result for query1')},
+            {1: ('query1',1,'conn_id')}
+            )
+        # the 2nd gets cached, the cache is still smaller than max_cache / 2
+        self._do_query('query2',12)
+        self._check_cache(
+            {('query1',1,'conn_id'): (1,'result for query1'),
+             ('query2',1,'conn_id'): (12,'result for query2')},
+            {1: ('query1',1,'conn_id'),
+             12:('query2',1,'conn_id')}
+            )
+        # the 2rd trips the max_cache/2 trigger, so both our old queries get
+        # dumped
+        self._do_query('query',23)
+        self._check_cache(
+            {('query',1,'conn_id'): (23,'result for query')},
+            {23:('query',1,'conn_id')}
+            )
+    
+    def test_time_refreshed_cache(self):
+        # the first query gets cached
+        self._do_query('query1',1)
+        self._check_cache(
+            {('query1',1,'conn_id'): (1,'result for query1')},
+            {1: ('query1',1,'conn_id')}
+            )
+        # do the same query much later, so new one gets cached
+        # XXX memory leak as old tcache entry is left lying around
+        self._do_query('query1',12)
+        self._check_cache(
+            {('query1',1,'conn_id'): (12,'result for query1')},
+            {1: ('query1',1,'conn_id'), # XXX why is 1 still here?
+             12: ('query1',1,'conn_id')}
+            )
+    def test_cachetime_doesnt_match_tcache_time(self):
+        # get some old entries for one query in
+        # (the time are carefully picked to give out-of-order dict keys)
+        self._do_query('query1',4)
+        self._do_query('query1',19)
+        self._do_query('query1',44)
+        self._check_cache(
+            {('query1',1,'conn_id'): (44,'result for query1')},
+            {4: ('query1',1,'conn_id'),
+             19: ('query1',1,'conn_id'),
+             44: ('query1',1,'conn_id')}
+            )
+        # now do another query
+        self._do_query('query2',44.1)
+        # XXX whoops, because {4:True,19:True,44:True}.keys()==[44,19,4]
+        # the cache/tcache clearing code deletes the cache entry and
+        # then tries to do it again later with an older tcache entry.
+        # brian's patch in Dec 2000 works around this.
+        self._do_query('query3',44.2)
+        self._check_cache(
+            {('query1',1,'conn_id'): (44,'result for query1'),
+             ('query3',1,'conn_id'): (44.2,'result for query3')},
+            {44: ('query3',1,'conn_id')}
+            )
+        
 class DummyDA:
 
     def __call__(self):



More information about the Zope-Checkins mailing list