On Fri, 2009-01-09 at 11:39 -0500, Jim Fulton wrote:
> On Jan 9, 2009, at 7:41 AM, Christian Theune wrote:
> > Hi,
> >
> > in ZEORaid we switched from using `restore` to `store` for replaying
> > transactions from another storage and found that the data records that
> > FileStorage returns aren't filling in the `data_txn` fields correctly,
> > but end up writing `None` all the time.
> What makes you think this is incorrect?
> data_txn should:
> 1. Not be in the interface.  It is an optimization that depends on a  
> peculiarity of FileStorage of a case that only arises (today) with  
> undo.  I'm inclined to remove this optimization. In fact, in the  
> presence of blobs, the optimization is dubious.  This implies that the  
> prev_txn argument to restore should be ignored.
> 2. data_txn should only be other than None for a record that was part  
> of an undo.  It is used to avoid copying data. Rather than copying  
> data, we simply record the position of the earlier record that  
> contains the data.

My thought was based on the presumption that the DataRecord interface was
described correctly (which it isn't as you point out below).

> > I'm not exactly sure how to fix this, but attached is a patch that  
> > makes
> > it work for the cases I could come up with.
> >
> > I'd like to add this change to the trunk (I'll write tests if this
> > change gets accepted).
> Your patch is incorrect.  data_txn is not the previous record  
> transaction id.  It is the transaction id of the transaction  
> containing data when the current record doesn;t contain any.  It is  
> used as an optimization by referring to data stored in an earlier  
> record rather than copying data to the current record.
> The relevant interface didn't originally mention this field. The  
> documentation you added is incorrect. I'm going to remove the field  
> (along with version and tid) from the interface.

Ah. That's the source of the misunderstanding, thanks for clearing that
up. This sounds like I should also clean up the DataRecord in the
BaseStorage because that also exposes data_txn, and storage iteration
protocol on ZEO transports this attribute as well.

Looks like I've got to use loadBefore() to find the transaction that an
object's modification was based on.


Christian Theune · c...@gocept.com
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 7 · fax +49 345 1229889 1
Zope and Plone consulting and development

Attachment: signature.asc
Description: This is a digitally signed message part

For more information about ZODB, see the ZODB Wiki:

ZODB-Dev mailing list  -  ZODB-Dev@zope.org

Reply via email to