[ZODB-Dev] Newbie questions re persistent objects and connections: [Was: can Leo...]

Gary Poster gary at zope.com
Tue Sep 12 09:29:42 EDT 2006


On Sep 12, 2006, at 8:24 AM, Edward K. Ream wrote:

> This is a repost of my original: Can Leo use zodb as a file system.
> Both the title of the thread and the botched formatting may have  
> put people
> off, so let's try again :-)

I know Leo. :-)  It's cool.

Benji's email is the right reply.  I'll try to give you a few  
pointers to your specific questions.

In my reply, I warn you that I'll say things like "I would be worried  
about this approach" and "hypothetically" and other worrisome  
things.  My intent is to convey that the small amount of time I have  
to spend on this email just gives me time for gut feelings, and I  
haven't written an app like Leo or used the ZODB outside of message  
based systems, so I don't want to say "bad idea" outright.  Sorry for  
the wishy-washy replies.

...

> I want to know if this scheme can be used if there are multiple Leo  
> outlines
> open. In my (zodb newbie's) mind this question translates to the  
> following
> zodb-specific questions:
>
> 1. Is it possible associate a particular connection with a  
> particular Leo
> outline?

Only in application logic.  I would be worried about this approach.

>
> 2. Is it possible to **leave a connection open** for as long as a  
> particular
> Leo outline is open?

Yes.  I would be worried about this approach too.

> 3. If multiple Leo outlines  (and multiple connections) are open,  
> is it
> possible to define transactions that are specific to particular  
> connection?
> In particular, does something like connection.commit() exist, and  
> if so, how
> are connection-specific transactions defined?

Give each connection its own transaction manager.  For instance, see  
this file:

http://svn.zope.org/zc.queue/trunk/src/zc/queue/queue.txt? 
rev=67933&view=auto

starting with "NOTE: "... (the warning is just because the test  
depends on the ZODB when all it technically needs to depend on is  
persistence).

Doing this can be tricky, and as per usual, I would be worried about  
this approach. ;-)

> The reason I ask these particular questions is this:  If my  
> prototype opened
> an outline as above and then *closed* the connection, my prototype  
> threw
> this exception soon after I started to use the outline:
>
> Traceback (most recent call last):
>
>  File "C:\prog\tigris-cvs\leo\src\leoGlobals.py", line 5010, in  
> getScript
>    elif p == c.currentPosition():
>  File "C:\prog\tigris-cvs\leo\src\leoNodes.py", line 1370, in __cmp__
>    if p1.childIndex() != p2.childIndex():
>  File "C:\prog\tigris-cvs\leo\src\leoNodes.py", line 1580, in  
> childIndex
>    if not v or not v._back:
>  File "C:\Python24\Lib\site-packages\ZODB\Connection.py", line 587, in
> setstate
>    raise RuntimeError(msg)
> RuntimeError: Shouldn't load state for 0x60af when the connection  
> is closed
>
> Here p is an instance of a Leo position, a short-lived object that  
> *refers*
> to vnodes and tnodes but is *not* itself persistent.
>
> So is it possible for non-persistent objects to refer to persistent  
> objects?

Yes, while the connection is open.  After that, you get errors, as  
demonstrated above.

> Summary
>
> 1. It appears that zodb does not update persistent objects properly  
> when the
> connection that created those objects is closed.  I say this  
> because of the
> traceback given above.  Thus, I assume that *long-lasting*  
> connections are
> required to support persistent objects.  Is this assumption correct?

No.  That's one approach, and is hypothetically reasonable.

Another approach would be to have in-memory copies of the objects in  
the zodb (they could even be the same class, just without a database  
connection).  Saving the file pushes the copy's data to the ZODB and  
commits a transaction.  This would work with a single long running  
connection or with short connections, opened just for save and load.   
That would be my first take on ZODB integration with Leo, FWIW.

> 2. With multiple Leo outlines connected to multiple connections  
> there must
> be some way to **save one outline without saving them all**.
> (or to revert one outline without reverting them all.)  How do I  
> define
> outline-specific transactions?

Again, in a fly-by opinion, I think saving use case needs in-memory  
copies.

I think the reverting use case needs a mechanism other than ZODB  
undo.  If I had worlds enough and time, I would try to help you use  
zc.vault, which I think would be ideal for this purpose.  As it is,  
I'll just point you to this rather ovewhelming document and run  
away. :-(  http://svn.zope.org/zc.vault/trunk/src/zc/vault/README.txt? 
rev=69750&view=auto

I hope this helps a bit.  The main point of the email is to let you  
know that people care, and want to help out as possible. ;-)

Gary



More information about the ZODB-Dev mailing list