[ZODB-Dev] Re: Invalidating caches for module refresh doesn't seem to work

Philipp von Weitershausen philipp at weitershausen.de
Tue Jan 30 11:14:28 EST 2007


Jim Fulton wrote:
> On Jan 29, 2007, at 5:46 PM, Philipp von Weitershausen wrote:
>> After refreshing a product, Zope 2 uses the following stanza in 
>> App.RefreshFuncs.autoRefresh() to let the ZODB know that it should 
>> invalidate its pickle caches:
>>
>>         ... refresh products
>>         from ZODB import Connection
>>         Connection.resetCaches()
>>         transaction.commit()
>>         jar._resetCache()
>>         transaction.begin()
> 
> That is really weird code.  It looks very brittle.
> 
>> That way, persistent objects will use the newly reimported classes 
>> instead of continuing to use the old, no longer current classes.
> 
> I suppose that was the intent.
> 
>> For grok I tried to implement the same mechanism and copied that code 
>> almost verbatimly, only to find out it doesn't seem to work. 
>> Persistent objects will still be instances of the classes that should 
>> have been thrown away during the re-import of modules.
> 
>> Testing product refresh with both Zope 2.9 and 2.10 produces errors 
>> for me while Zope 2.8 works, which leads me to the assumption that a 
>> cache invalidation bug was introduced after ZODB 3.4. Is anybody else 
>> seeing this?
> 
> The way that connections were managed changes quite a bit in 3.4.
> 
>> I'm a bit surprised nobody else has complained about this so far...
> 
> Maybe people finally stopped using product-refresh because it doesn't work
> reliably.

What do I have to do to make it work reliably? I'd like to avoid having
to restart all of Zope. (Note that this is grok on Zope3, not
necessarily Zope 2).

>> Help with tracking this down would be greatly appreciated.
> 
> Shane originally wrote this.  Maybe he could help out. I'm not 
> interested myself. In fact, I'l be happy to see this code get  ripped 
> out.  If it stays in it needs a doctest to prevent future regression and 
> to explain how to use it, including what it's semantics and limitations 
> are.

So, are there any alternatives that let me refresh modules w/o server
restarts AND make the ZODB aware of this? Would closing and reopening
the database altogether be an option? I would assume it would leave the
connections that other threads have to the database in a funny state,
but I don't understand a whole lot about ZODB internals so I'm just
guessing.

-- 
http://worldcookery.com -- Professional Zope documentation and training
Next Zope 3 training at Camp5: http://trizpug.org/boot-camp/camp5



More information about the ZODB-Dev mailing list