[Zope3-checkins] CVS: Zope3/src/persistence - cache.py:1.6
Tim Peters
tim.one@comcast.net
Mon, 17 Mar 2003 14:44:02 -0500
Update of /cvs-repository/Zope3/src/persistence
In directory cvs.zope.org:/tmp/cvs-serv18615/src/persistence
Modified Files:
cache.py
Log Message:
Cache.incrgc(): If garbage collection happens to occur while iterating
over __active, weakrefs can cause __active to change size. This in turn
could cause a mysterious "Transaction failed during second phase
of two-phase commit" TransactionError. The cure is to use .items()
instead of .iteritems().
=== Zope3/src/persistence/cache.py 1.5 => 1.6 ===
--- Zope3/src/persistence/cache.py:1.5 Tue Mar 11 17:09:06 2003
+++ Zope3/src/persistence/cache.py Mon Mar 17 14:44:01 2003
@@ -90,12 +90,14 @@
now = int(time() % 86400)
# Implement a trivial LRU cache by sorting the items by access
- # time and trundling over the list until we've reached out
+ # time and trundling over the list until we've reached our
# target size. The number of objects in the cache should be
# relatively small (thousands) so the memory for the list is
- # pretty minimal.
+ # pretty minimal. Caution: Don't use iteritems(). Because of
+ # weakrefs, if garbage collection happens to occur, __active
+ # can change size.
L = []
- for oid, ob in self.__active.iteritems():
+ for oid, ob in self.__active.items():
if ob is not None:
ob = ob()
# The _p_atime field is seconds since the start of the day.