[ZODB-Dev] [Enhancement Proposal] Garanteed lifetime for volatile variables

Jim Fulton jim at zope.com
Fri Oct 6 16:55:37 EDT 2006


Dieter Maurer wrote:
> Jim Fulton wrote at 2006-10-6 16:02 -0400:
>> Dieter Maurer wrote:
>>> Jim Fulton wrote at 2006-10-6 15:08 -0400:
>>>> ...
>>>>>> You could implement your sticky attribute at the application level:
>>>>>>
>>>>>>
>>>>>>     def _p_deactivate(self):
>>>>>>         if getattr(self, '_p_sticky', False):
>>>>>>            return
>>>>>>         Persistent._p_deactivate(self)
>>>>>>
>>>>>> You could provide any policy you want, without making the policy part
>>>>>> of ZODB.
>>>>> But, such an object would never again be deactivated (unless
>>>>> "_p_sticky" is reset). In my proposal, such objects may be
>>>>> invalidated at transaction boundaries.
>>>>>
>>>>> This may not be a big problem, as there are probably not too many
>>>>> objects that have "_p_sticky" defined permanently
>>>>> ("Shared.DC.ZRDB.Connection" and
>>>>> "Products.CMFCore.Skinnable.ObjectManager" would be examples).
>>>> Good point.  I left off that you could register a callback on transaction
>>>> commit to clear the sticky flag.
>>> Not a nice perspective -- for too reasons:
>>>
>>>   *  When would I register the callback?
>> When you set the volatile data that needed to be sticky.
> 
> You miss my "Class level sticky declaration" use case...
> 
> 
> Registering when I set the "_v_" variable would probably not be enough
> at least not when the registration is valid only for one transaction --
> what I expect (but am not sure of):
> 
>    The "_p_sticky" would need to be deactivated at any transaction
>    boundary as long as the object is in the cache -- independent
>    of whether or not I have set any "_v_" variable in the transaction.
> 
>> ...
>>>      Sure, the callback should not need to look at all objects in
>>>      the cache to find the sticky ones.
>>>
>>>      This means, the callback would need to be registered for
>>>      each object potentially relevant at transaction boundary time.
>> Yes, any object that needed to be sticky would need to have a callback
>> registered.
> 
> And this is difficult when the registration is only active for a single
> transaction: the object may remain in the cache without me touching
> it in the following transactions. Nevertheless, it should be possible
> to garbage collect it at transaction boundaries.
> 
> If, on the other hand, the registration is active until explicitely canceled,
> I explicitely need to cancel it when the object is flushed from
> the cache. I would have to add respective code in "_p_deactivate"
> (which I have already overridden) and in "_p_invalidate" (which
> I would need to override as well).
> 
>>>      In principle, all objects in the cache can be relevant...
>> All objects are sticky?
> 
> The "Class level sticky declaration" use case means that sticky
> objects can come into existence without any explicit action.
> 
> Thus, while not all objects are sticky, any object in the cache could
> be sticky.
> 
>>>   *  The examples above have their "_p_sticky" defined at
>>>      class level -- as they make vital use of volatile attributes
>>>      and need a garanteed lifetime for them until transaction boundary.
>> Hm, so stickyness is a property of the class?  Why store _p_sticky on
>> the instance then?
> 
> As explained in the proposal:
> 
>   We have 3 use cases for volatile attributes:

I didn't ask why you use volatile attributes.

I asked why _p_sticky needs to be stored on each instance,
since it is set at the class level.

...

>> - This isn't unique to _v_ attributes.  An object could
>>   have other non-persistent data that is precious.
> 
> No: only "_v_" attributes are lost at deactivation

No, normally all state is lost at deactivation, including _v_
attributes.  Of course, most other state can be reloaded
from the database.

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org


More information about the ZODB-Dev mailing list