Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid) - Mailing list pgsql-jdbc

From Justin Bertram
Subject Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)
Date
Msg-id 500446595.828372.1309301560262.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com
Whole thread Raw
In response to Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)  (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>)
Responses Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)  (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>)
List 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(Xidxid).  The driver will throw an XAException with an errorCode of
XAER_RMERRback 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
itscall to javax.transaction.xa.XAResource.commit(..) [1].  This is the JTA mapping of the xa_commit() function from
theXA 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
oncethe 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_RETRYas appropriate.  Otherwise just about any failure during commitPrepared will result in unrecoverable
transactionsand 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

pgsql-jdbc by date:

Previous
From: Craig Ringer
Date:
Subject: Re: PgJDBC - Using certificate auth with jboss & postgres
Next
From: Heikki Linnakangas
Date:
Subject: Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)