[Zope] zope operations atomic?

Kapil Thangavelu k_vertigo@yahoo.com
Thu, 1 Nov 2001 14:29:44 -0800 (PST)


chris,

thanks for the illuminating response.

kapil


--- Chris McDonough <chrism@digicool.com> wrote:
> Clark OBrien wrote:
>  > It is what happens with this retrying that
> interests me. As the example
>  > given
>  > below shows, this retry may never succeed. Thus
> long running 
> operations may
>  > never complete and are effectively starved by
> faster running operations.
>  >
>  >
>  >
>  > Assume in Zope I have a folder structure like
> this.
>  >
>  > Folder-1
>  >   -Folder-2
>  >       -Folder-3
>  >          ....
>  >             ..
>  >               Folder-1000
>  >
>  >
>  > Suppose I have a script traverseFolder(root) that
> starts at a given 
> root and
>  > traverses sub-folders adding the attribute foo.
>  >
>  > If I continuously call
> traversefolder(Folder-1000) how could
>  > traverseFolder(Folder-1) ever complete. I mean,
> by the time
>  > traverseFolder(Folder-1) could complete
> traverseFolder(Folder-1000) would
>  > have already committed several times. What would
> happen with the request
>  > that started traverseFolder(Folder-1), would it
> keep being retried ad
>  > infinitum.
>  > It is basically starved out of contention by a
> faster running operations.
> 
> It does get interesting when you consider that the
> longer-running 
> transaction might always tend to lose on read
> conflicts because:
> 
> a) read conflicts can't be resolved.
> b) the longer-running transaction *might* "ghost
> out" Folder-1000
>     to conserve RAM during the traversal after the
> first (aborted)
>     commit.
> 
> If b) is true in your example for every run of
> traverseFolder(Folder-1), 
> your contention that it will never commit might
> prove correct.  It'd be 
> slightly interesting to try it to see what the
> behavior actually is. 
> Would you be willing to do so?
> 
> In any case, we have an answer to this problem if
> you're willing to lose 
> a bit of consistency.  CoreSessionTracking's
> LowConflictConnection class 
> comes in handy here.  If your application is very
> write-intensive and 
> you've carefully coded a massive hotspot ala your
> example into it, you 
> can turn off read conflicts by using this class at
> the expense of some 
> consistency.
> 
> With read conflicts turned off,  I'm positive your
> example will 
> eventually resolve itself.  Maybe it'll take a few
> minutes of retries, 
> but it will eventually finish. I say that because
> the longer running of 
> the two scripts will eventually be able to do the
> commit because it's 
> statistically as likely to "win" a commit as the
> shorter-running script 
> when there's a write conflict; it just has fewer
> opportunities to do so.
> 
> And actually if you used a special FooFolder instead
> of a Folder for 
> this demonstration, the only thing that changed was
> foo, and the value 
> of foo was often the same in both connections on the
> object upon which 
> the transaction conflicted, you could resolve most
> of the conflicts that 
> could potentially occur here (save for the read
> conflicts) by giving it 
> a _p_resolveConflict that looked something like
> this:
> 
> class FooFolder:
>     def _p_resolveConflict(self, old, saved, new):
>        marker = []
>        for k,v in saved.items():
>           if new.get(k, marker) != v:
>               return None
>        for k,v in new.items():
>           if saved.get(k, marker) != v:
>               return None
>        return new
> 
> 
> However, the real answer is:  Dont design your
> application like this if 
> you can help it.  This is not a good pattern.  It's
> best to avoid 
> hotspots like Folder-1000 in your example.  It's no
> different than 
> continually beating the snot out of a field in a row
> in a relational 
> database table with writes from multiple threads,
> where one of the 
> threads is running an overnight transaction and the
> others are just 
> incrementing the field every second.  You have the
> same consistency, 
> contention, and timeliness issues there, AFAICT,
> except that it's 
> expressed in terms of pages, locks, and dirty reads.
>  (I'm sure there's 
> an Oracle person waiting around to "WRONG!" me to
> death, however.  ;-)
> 
> - C
> 
> 


__________________________________________________
Do You Yahoo!?
Make a great connection at Yahoo! Personals.
http://personals.yahoo.com