[storm] why weakrefdict for cache?

Bernd Dorn bernd.dorn at lovelysystems.com
Mon Sep 3 15:41:07 BST 2007


On 03.09.2007, at 16:15, Gustavo Niemeyer wrote:

>
>> this is reasonable ... i just thought about that we might have zope
>> specific caching requirements, that might be common to zope
>> applications, such as ReferenceSet caching etc. But as you said, it
>> is the job of a pluggable caching mechanism.
>
> True.. we may have a pluggable cache for zstorm, if we find out that
> the the default isn't good for Zope applications.  Even then, it'd
> be good if we managed to find a caching system that does a good job
> for most cases, including ours (lovely + Landscape + whoever is
> watching :-).
>
>> When do you think will such someone find time to implement caching.
>> Or shall we (lovely) start to do this?
>
> There's a feature in Landscape which is urging my attention, so I'm
> unlikely to be able to look at this before some time next week. Here
> is an initial implementation plan, in case you want to tackle it:

for me it's impossible to before next week :-( but we will need this  
feature at the end of september, so if you can't find the time up  
till then, we gonna implement it.

>
> - Let's rename Store._cache to Store._alive.  That reflects better
>   what this attribute means.  We shouldn't have to touch the use of
>   _alive (caching will work side-by-side with the current system).
>
> - We create a cache implementation in cache.py.  It has a very
>   simple API: add(), remove(), and clear().  Store._cache will hold
>   it (let's not implement the "pluggable" aspect in the first
>   version, so that we have time to learn if our API is right).
>
> - Whenever an object is returned to the user from the Store
>   or from a ResultSet (no matter if it's loaded from database or
>   not), it's add()ed to the cache.
>
> - Internally, the cache maintains two structures: one dictionary
>   with {obj_info: obj} (this has the strongref to the obj), and
>   one list of obj_infos.  We can't have just a list of the
>   objects themselves because we don't want to touch any special
>   methods in the object implementation (e.g. __eq__).
>
> - If Cache.add() finds that obj_info is already in the dictionary,
>   it removes the object from the list, and reinserts it at the
>   start.  If the list goes above N, the last element is popped
>   from the list and the dictionary.
>
> - Store.invalidate() takes the item off the cache.  It should also
>   be taken off on _remove_from_alive (which is _remove_from_cache
>   right now, but will be renamed).
>
> - We need 100% test coverage for that, if possible using TDD.
>
>
> How does that look?
>

this looks very good!

what do you think about referenceset caching use-cases? not for the  
first iteration, but i would keep it in mind

> -- 
> Gustavo Niemeyer
> http://niemeyer.net




More information about the storm mailing list