[Zope3-checkins] CVS: Zope3/src/persistence - interfaces.py:1.6
Jeremy Hylton
jeremy@zope.com
Wed, 16 Apr 2003 17:56:10 -0400
Update of /cvs-repository/Zope3/src/persistence
In directory cvs.zope.org:/tmp/cvs-serv20962
Modified Files:
interfaces.py
Log Message:
Update ICache interface.
=== Zope3/src/persistence/interfaces.py 1.5 => 1.6 ===
--- Zope3/src/persistence/interfaces.py:1.5 Fri Mar 7 15:19:54 2003
+++ Zope3/src/persistence/interfaces.py Wed Apr 16 17:56:10 2003
@@ -194,8 +194,9 @@
def _p_deactivate():
"""Deactivate the object
- Change the object to the ghost state is it is in the
- up-to-date state.
+ If possible, change an object in the up-to-date state to the
+ ghost state. It may not be possible to make some persistent
+ objects ghosts.
"""
class IPersistentNoReadConflicts(IPersistent):
@@ -247,59 +248,76 @@
class ICache(Interface):
"""In-memory object cache
- Cache objects are used by data managers to implement in-memory
- object caches with automatic object deactivation and removal of
- unreferenced objects.
-
- Cache objects depend heavily on the Persistent object C API.
+ The cache serves two purposes. It peforms pointer swizzling, and
+ it keeps a bounded set of recently used but otherwise unreferenced
+ in objects to avoid the cost of re-loading them.
+
+ Pointer swizzling is the process of converting between persistent
+ object ids and Python object ids. When a persistent object is
+ serialized, its references to other persistent objects are
+ represented as persitent object ids (oids). When the object is
+ unserialized, the oids are converted into references to Python
+ objects. If several different serialized objects refer to the
+ same object, they must all refer to the same object when they are
+ unserialized.
+
+ A cache stores persistent objects, but it treats ghost objects and
+ non-ghost or active objects differently. It has weak references
+ to ghost objects, because ghost objects are only stored in the
+ cache to satisfy the pointer swizzling requirement. It has strong
+ references to active objects, because it caches some number of
+ them even if they are unreferenced.
+
+ The cache keeps some number of recently used but otherwise
+ unreferenced objects in memory. We assume that there is a good
+ chance the object will be used again soon, so keeping it memory
+ avoids the cost of recreating the object.
+
+ An ICache implementation is intended for use by an
+ IPersistentDataManager.
"""
- def __getitem__(key):
- """Get a cached object
- """
-
- def __setitem__(key, value):
- """Add an object to the cache
- """
+ def get(oid):
+ """Return the object from the cache or None."""
- def __len__():
- """Return the number of objects in the cache
- """
+ def set(oid, obj):
+ """Store obj in the cache under oid.
- def get(oid, default=None):
- """Get a cached object
+ obj must implement IPersistent
"""
- def incrgc(multiple=1):
- """Perform incremental garbage collection
-
- An positive integer argument can be provided to specify a
- number of incremental steps to take.
- """
+ def remove(oid):
+ """Remove oid from the cache if it exists."""
def invalidate(oids):
- """Invalidate the object for the given object ids
- """
-
- def invalidateMany(oids):
- """Invalidate the objects for the given collection of object ids
+ """Make all of the objects in oids ghosts.
- If oids is None, all of the objects in the cache are
- invalidated.
+ `oids` is an iterable object that yields oids.
+
+ The cache must attempt to change each object to a ghost by
+ calling _p_deactivate().
- The collection must be iterable as if it was a sequence of oids.
+ If an oid is not in the cache, ignore it.
"""
-class ICachePolicy(Interface):
+ def clear():
+ """Invalidate all the active objects."""
- def maximum_quiet(cache_size):
- """Return a number of seconds
+ def activate(oid):
+ """Notification that object oid is now active.
- Objects that haven't been accessed in the last number seconds
- should be deactivated.
+ The caller is notifying the cache of a state change.
+
+ Raises LookupError if oid is not in cache.
"""
- def incremental_check_count(cache_size):
- """Return the number of objects that should be checked in an
- incremental garbage collection.
+ def shrink():
+ """Remove excess active objects from the cache."""
+
+ def statistics():
+ """Return dictionary of statistics about cache size.
+
+ Contains at least the following keys:
+ active -- number of active objects
+ ghosts -- number of ghost objects
"""