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);
+                    }
                 }
             }
         }