Randomness (RE: [Zope-dev] CoreSessionTracking 0.8)

Chris McDonough chrism@digicool.com
Fri, 25 May 2001 05:25:28 -0400


Matt Hamilton wrote:
> Looking into it further I don't think it is a CST fault :)  I think I have
> fixed the problem.  It was me not setting _p_changed on an object with a
> dict after adding items to the dict.  Hence the session wasn't being lost,
> just the conents of the cart itself were not very persistent :)

Gotcha... (I can't tell you how many times I've done that ;-)

> > Yes, any sort of object can go into session data... there are some
> > caveats documented in the helpfile (for instance, acquisition-wrapped
> > objects shouldn't be stored in session data), but otherwise anything's
> > game.
> 
> I can't find anything about acquisition-wrapped objects in the helpfile,
> what is the problem with them?

Eek, you're right.  This is a funny situation.  I had thought I had
documented this.  But first I need to figure out what to document. 
Maybe that's why I didn't.

The ZODB in general does not like to store acquisition-wrapped objects. 
It's usually the case in CST that you're prevented from doing this by
the fact that you're generally using a mounted storage, and
acqusition-wrapped objects in the context of Zope usually contain object
references from the "main" storage (raising the InvalidObjectReference
error documented in the helpfile).  However, in cases like yours, where
you're using a session data container that's *in* the "main" storage,
you'll get past that hurdle (because your objects can't/don't contain
references to another database).  But you *should* be prevented from
storing acqusition-wrapped objects in any database because it doesn't
make sense to preserve an acqusition wrapper anywhere, they're
completely ephemeral.

But of course I just tried it, and it didn't raise any error.  ;-)  Hee
hee.  This means one of two things:

1.  ZODB was "fixed" at some point to unwrap acquisition-wrapped objects
before putting them in storage.  This is likely.  I dimly remember
something like this happening, although I can't find it documented in
any HISTORY or CHANGES files (not altogether surprising).

2.  ZODB is blithely storing acquistion wrappers.

If the answer is 1, everything's fine, and ignore my claim about not
being able to pass acquisition-wrapped objects into session storage. 
Know that if you move to a mounted database in the future, and your code
passes in objects pulled out of "main" Zope storage to session storage,
that code will likely break.

If the answer is 2, everything's not so fine.  I'll likely need to
change the CST code to unwrap acquisition-wrapped objects before storing
them, just to head potential problems off at the pass.  I just did a
preliminary test, and it appears that it *is* storing
acquisition-wrapped objects.  This is bad if it's true.  :-(

In the meantime, to be safe, before you store an object in session
storage, unwrap it by getting its aq_base, e.g.:

ob = getattr(ob, 'aq_base', on)

or use the utility function aq_base from Acquistion to safely do the
same:

from Acquisition import aq_base
ob = aq_base(ob)

Ah the bugs keep on piling on over here,

- C


> 
> -Matt
> 
> --
> Matt Hamilton                                         matth@netsight.co.uk
> Netsight Internet Solutions, Ltd.          Business Vision on the Internet
> http://www.netsight.co.uk                               +44 (0)117 9090901
> Web Hosting | Web Design  | Domain Names  |  Co-location  | DB Integration