[Zope] sessions in the presence of conflicts
David H
bluepaul at earthlink.net
Wed Dec 14 21:37:07 EST 2005
Dennis Allison wrote:
>Zope 2.8.4, ZODB 3.4.2
>
>I am still trying to resolve a "session variables in the presence of
>conflicts" problem. The observed symptom is that suddenly either some
>session variables disappear or all session variables disappear. In both
>cases, Zope has raised a KeyError exception for the a particular session
>variable because it is not present and an attempt was being made to access
>it from the session.
>
>The cause appears to be related to the presence of a conflict error and a
>botched recovery, but the exact mechanism remains a mystery.
>
>Zope equates a session object with a TransientObject. For our instance,
>that's fine, since our only TransientObject is a session. For the general
>case, I would have thought a SessionObject inheriting from TransiendObject
>would have been used so that conflict resolution for sessions could be
>easily specialized.
>
>The conflict resolution for a TransientObject (that is, a Session Object)
>is clearly suboptimal. In the next paragraphs I'll review what is
>currently done and then propose a different approach which I am about to
>implement for our systems. Comments, corrections, and suggestions much
>appreciated.
>
>_p_resolveConflict(self, oldState, savedState, newState)
>
>returns the state of the object after resolving different changes. The
>arguments are:
>
> oldState -- state of the object at the beginning of the current
> transaction (mutable)
> savedState -- state currently stored in the database. This state
> was written after oldState and reflect changes made
> by a transaction that committed before the current
> transaction (immutable)
> newState -- state after changes made by the current transaction
> (immutable)
>
>The standard conflict resolution for a TransientObject resolves according
>to the following rules:
>
> 1. if any of the states are invalid (that is, has a key '_invalid')
> return the invalid state.
>
> 2. if any any of the attributes ['token','id','_created'] differ then
> there is a conflict, raise the conflict exception.
>
> 3. choose the state most recently modified, if possible.
>
> 4. otherwise, choose the state most recently accessed.
>
>It seems to me that we can do much better for sessions because we know a
>bit about the semantics of sessions. A session object is a
>dictionary-like object mapping key-value pairs. Adding or deleting keys
>or changing the value associated with a key are independent operations and
>do not conflict unless the keys are duplicated in both the transactions.
>Any conflict resolution mechanism needs to be able to manage multiple keys
>independently since the session object is modified as a unit. In
>addition, new keys may be added and old keys deleted; any conflict
>resolution mechanism at the key level needs to be comprehend those
>operations.
>
>A more session-friendly conflict resolution might use:
>
> 1. if any of the states are invalid (that is, has a key '_invalid')
> return the invalid state.
>
> 2. if any any of the states attributes ['token','id','_created']
> differ then there is a conflict, raise the conflict exception.
>
> 3. order the newState and savedState by modification time (or if that
> cannot be computed, by access time).
>
> 4. any key appearing in oldState's dictionary but not appearing in
> both savedState and newState should be removed from all. This
> corresponds to a key-value pair being deleted in one of the
> transactions. Insertions will be managed automatically by
> the updates.
>
> 5. beginning with the oldest, update oldState dictionary of key-value
> pairs using the dictionary part of newState and savedState. Return
> oldState.
>
>This does several things. First, it captures independent key-value
>changes made in both potentially conflicting transactions. Second, it
>provides a reasonable ordering for multiple (potentially conflicting)
>key-value pair updates. Third, it manages insertions and deletions to the
>session variable set in the presence of conflicts.
>
>Does this make sense? I have yet to figure out how to map a
>TransientObject "state" back to the object it represents, but it clearly
>is possible.
>
>
>
>
>
>
Dennis,
Im only curious and this is no recommendation ... and I asked this on
the list maybe a year ago (and got zero reponses)
Have you given "HappySession" a try? Has anyone? I've never had a
problem with it, but then its never been under much load and is no
longer actively supported (least last time I checked).
I converted back and forth between Zope SESSION and HappySession (for
reasons of legacy code). Their interfaces have just few differences,
e.g., HappySession['this'] returns None (if 'this' is not a key) and
SESSION raises an exception. That type of thing.
HappySession does not read/write to zodb (if I recall it stores session
data in RAM (session) cookies). I just do not know if its otherwise up
to your requirements.
All best,
David
More information about the Zope
mailing list