Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)

From: Justin Bertram <jbertram(at)redhat(dot)com>
To: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)
Date: 2011-06-28 22:52:40
Message-ID: 500446595.828372.1309301560262.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

I'm bringing this back up because, while the XAER_RMERR works in most cases it fails in at least one.

Consider the scenario where the database is shutdown administratively during org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid). The driver will throw an XAException with an errorCode of XAER_RMERR back to the transaction manager. However, the pg_prepared_xacts table will still contain a row for the transaction.

The method org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid) is invoked by the transaction manager as part of its call to javax.transaction.xa.XAResource.commit(..) [1]. This is the JTA mapping of the xa_commit() function from the XA specification [2]. According to this document, a return of XAER_RMERR means:

An error occurred in committing the work performed on behalf of the transaction
branch and the branch’s work has been rolled back. Note that returning this error
signals a catastrophic event to a transaction manager since other resource
managers may successfully commit their work on behalf of this branch. This error
should be returned only when a resource manager concludes that it can never
commit the branch and that it cannot hold the branch’s resources in a prepared
state. Otherwise, [XA_RETRY] should be returned.

However, since the pg_prepared_xacts table still contains a row for the transaction the XAER_RMERR is not accurate. A "catastrophic" failure has not occurred. It would be possible for the transaction manager to recover this transaction once the database is available again if XA_RETRY was returned instead.

I think it would be better if commitPrepared could differentiate between errors and return either XAER_RMERR or XA_RETRY as appropriate. Otherwise just about any failure during commitPrepared will result in unrecoverable transactions and require manual intervention to clean up the pg_prepared_xacts table.

[1] http://download.oracle.com/javaee/5/api/javax/transaction/xa/XAResource.html#commit(javax.transaction.xa.Xid, boolean)
[2] http://pubs.opengroup.org/onlinepubs/009680699/toc.pdf

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Craig Ringer 2011-06-28 23:42:28 Re: PgJDBC - Using certificate auth with jboss & postgres
Previous Message Eyal Edri 2011-06-28 15:00:22 PgJDBC - Using certificate auth with jboss & postgres