I'm working with Theuni on the BlobStorage, and am trying to understand the
different 2-Phase-Commit protocols that are in use in ZODB at the same time.
As I understand it, tpc_* is the old protocol, and prepare/commit is the new

The sequence in Transaction._commitResources is
  tpc_begin      (ignored by DataManagerAdapter)
  commit         (ignored)
  tpc_vote       (translated to prepare)
  tpc_finish     (translated to commit)

Which means, the old protocol is completed first, before the new protocol is
even started.

Now, Connection uses the old protocol, and we've got a BlobDataManager that uses
the new protocol. The BlobDataManager needs to do work during prepare, but it is
only called to do this work *after* the Connection has already committed.
Needless to say, the commit fails, because the preparation hasn't been done.

Maybe I misunderstood the protocol and the preparation work should be handled
differently. In any case I'm rather confused by this double-protocal situation
and would be grateful if someone enlightened me here.


For more information about ZODB, see the ZODB Wiki:

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

Reply via email to