[ZODB-Dev] ZEO, FileStorage, and Undo

brian.r.brinegar.1 brinegar@purdue.edu
Thu, 22 Aug 2002 10:58:49 -0500 (EST)


On Thu, 22 Aug 2002, Jeremy Hylton wrote:

>   >> brinegar@purdue.edu wrote: Hello,
>   >>
>   >> We have a large FileStorage database ~5 gigs. When any of our
>   >> users click would the "Undo" tab in a management screen the
>   >> request would eventually time out and our ZopeWatch script would
>   >> restart the server.
>   >>
>   >> Well this didn't happen every time, it only happens if 20
>   >> transactions haven't occurred, or haven't occurred recently. In
>   >> either of these cases the entire ZODB is searched for
>   >> transactions.
>
> Yes.  That's unfortunately true.
>
>   >> So I wrote a patch for undoLog in FileStorage to batch by days
>   >> instead of
>   >> # of transactions. This lets us show batches of 2 days at a time
>   >> # instead
>   >> of 20 transactions. Thus we never have to search more than 2 days
>   >> worth of the database. I also MonkeyPatched the manage_UndoForm
>   >> in App.UndoSupport.
>   >>
>   >> While doing this I noticed that at the beginning of undoLog
>   >> FileStorage acquires a lock (_lock_acquire). Is this necessary if
>   >> it's only doing reads?
>
> Yes.  Every FileStorage method that reads the database needs to hold
> the lock to protect the file position.  The read-only methods call
> seek() and read() on the file object.  If two read-only methods
> executed at the same time, there's no guarantee they would read the
> data they wanted to read.
>
>   >> We have a ZEO with 3 Zeo Clients and 1 Zeo Server when someone
>   >> hits Undo the Zeo Server locks and all 3 clients sit waiting. It
>   >> appears from experience as a user that_lock_acquire locks reads
>   >> and writes.
>
> Yes.  It's really a shame that this behavior locks up the ZEO server
> and prevents anyone else from making progress.  I've discussed this a
> few times as a worry, but I've never heard complaints about it in real
> life.  Well-- make that I had never heard until now.
>
>   >> We have a system with potential for thousands of content
>   >> maintainers. It is undesirable to have our entire site die for 20
>   >> seconds everytime one of them clicks "Undo". We could disable
>   >> Undos, however the transactional database was one of the reasons
>   >> we choose Zope.
>   >>
>   >> Any suggestions? Is there a way to lock only for writes? So that
>   >> pages can still be served?
>
> I think we could change the search process so that acquire and
> released the lock for each transaction.  That might make the undo a
> lot slower, but it would also allow other threads to make progress
> while undoLog() is running.  To implement this, we'd need to modify
> FileStorage to change its lock behavior and ZEO to run undoLog() in a
> separate thread.  These both sound easy.  If I sent you a patch, would
> you want to give it a try?

I think this is a great idea. I will try to incorporate it into the
batching patch I am already working. I can implement the changes to
undoLog, however I am not sure what needs to be changed in ZEO. If any
help would be greatly appriciated.

Thanks,
-Brian Brinegar
 ECN Web Systems Developer
 Purdue University
 West Lafayette, IN