[Zope-dev] cPickleCache endless loop...

Tim Peters tim at zope.com
Mon Jan 26 12:22:43 EST 2004


[Tim Peters]
>> It looks like ghostifying your "self" triggers self.__del__().  Then
>> the __del__ method unghostifies self, which has the side effect of
>> moving self to the MRU end of the ring, which in turn means the list
>> traversal will visit self *again*.  When it does, same thing happens
>> all over again, ad infinitum.

[Toby Dickenson]
> Not necessaralily ad infinitum. It will only run forever if the
> number of __del__-resurrecting objects in the cache is larger than
> the cache target size.

It's actually that the number of __del__-resurrecting objects *plus* the
number of non-ghostifiable objects in cache is larger than the cache target
size, right?

> Does that fit with your scenario?

Similarly <wink>, except that if there's a large number of non-ghostifiable
objects (more than the cache target size), then only one __del__-resurrected
object is enough to provoke an infinite loop.


>> 2. If you need a __del__ method (it's hard to imagine why, since it
>>    will get called whenever the object is ghostified, and has nothing
>>    to do with the object's actual lifetime), don't reference any
>>    persistent objects (and esp. not self) within it.

> or 2b as jeremy suggested, put your __del__ on a non-persistent sub
> object.

Yup.




More information about the Zope-Dev mailing list