GERONIMO-4519 When XAException.XA_RBROLLBACK arisen from XAResource.end, TM should not send rollback request again to the XAResource
git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/txmanager/trunk@735101 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
index 1eda347..00fb05a 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
@@ -475,10 +475,10 @@
default:
throw new IllegalStateException("Status is " + getStateString(status));
}
- rms = resourceManagers;
}
endResources();
+ rms = resourceManagers;
try {
rollbackResources(rms);
//only write rollback record if we have already written prepare record.
@@ -573,6 +573,11 @@
log.warn("Error ending association for XAResource " + xaRes + "; transaction will roll back. XA error code: " + e.errorCode, e);
synchronized (this) {
status = Status.STATUS_MARKED_ROLLBACK;
+ // when XAException is XA_RBROLLBACK, which indicates that XAResource has already rolled back the transaction, no need
+ // to send rollback request to the XAResource, thus remove it off resourceManagers list.
+ if (e.errorCode == XAException.XA_RBROLLBACK) {
+ resourceManagers.remove(manager);
+ }
}
}
}