Le 17/09/13 10:44, Godefroid Chapelle a écrit :

Plone 3 to 4 migration occasionally triggers a POSKeyError during
transaction commit. See

I encountered the issue yesterday.

I committed a test and a fix in branch 3.10.


Before the fix, the test triggered a traceback very similar to the one
seen when migrating Plone.

As I am not an expert of ZODB internals, I'd like someone to review my
fix even if the test suite does not break.

I confirm that I am not a ZODB internals expert :-(

The fix does avoid the issue triggered by my test.

But does NOT fix the Plone migration issue. IOW, the test is not reproducing the issue triggered by the Plone migration.

This is what I have found :

At the end of the Connection.commit() method, oids found in Connection._readCurrent mapping are checked for mismatch between the committed tid and the one stored in _readCurrent mapping.

If there is a mismatch, the object must be invalidated in cache.

In the Plone migration issue, when getting to the step where the committed tid is fetched, a POSKeyError is triggered by getTid() method.

I found out that the tid stored in _readCurrrent for this falty oid is equal to z64 (eight nul chars).

This is what I deduce :

the oid, tid pair (where tid is null) corresponds to an object that was added to the transaction but not completely cleaned up by the transaction rollback

(I am looking at rollback because my migration does call savepoint.rollback() five times and there are five oids with null tid leftover in Connection._readCurrent when the POSKeyError is triggered. But this might just be a coincidence.)

Any hint where to add the call to pop those falty oids out of _readCurrent during transaction rollback, or to enlighten me about things I misunderstand is welcome.

Godefroid Chapelle (aka __gotcha) http://bubblenet.be

For more information about ZODB, see http://zodb.org/

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

Reply via email to