geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ke...@apache.org
Subject svn commit: r515447 - /geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java
Date Wed, 07 Mar 2007 04:36:04 GMT
Author: kevan
Date: Tue Mar  6 20:36:03 2007
New Revision: 515447

URL: http://svn.apache.org/viewvc?view=rev&rev=515447
Log:
GERONIMO-2838 Make sure that transaction recovery is handled properly. Multiple NamedXAResources
can share a single ResourceManager. Need to be sure that we're only committing/updating XidBranches
if the resource was the XAResource used for the transaction.

Modified:
    geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java

Modified: geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java?view=diff&rev=515447&r1=515446&r2=515447
==============================================================================
--- geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java
(original)
+++ geronimo/server/branches/1.2/modules/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/RecoveryImpl.java
Tue Mar  6 20:36:03 2007
@@ -97,14 +97,21 @@
             Xid xid = prepared[i];
             ByteArrayWrapper globalIdWrapper = new ByteArrayWrapper(xid.getGlobalTransactionId());
             XidBranchesPair xidNamesPair = (XidBranchesPair) ourXids.get(globalIdWrapper);
+            
             if (xidNamesPair != null) {
-                try {
-                    xaResource.commit(xid, false);
-                } catch (XAException e) {
-                    recoveryErrors.add(e);
-                    log.error(e);
+                
+                // Only commit if this NamedXAResource was the XAResource for the transaction.
+                // Otherwise, wait for recoverResourceManager to be called for the actual
XAResource 
+                // This is a bit wasteful, but given our management of XAResources by "name",
is about the best we can do.
+                if (isNameInTransaction(xidNamesPair, name)) {
+                    try {
+                        xaResource.commit(xid, false);
+                    } catch(XAException e) {
+                        recoveryErrors.add(e);
+                        log.error(e);
+                    }
+                    removeNameFromTransaction(xidNamesPair, name, true);
                 }
-                removeNameFromTransaction(xidNamesPair, name, true);
             } else if (xidFactory.matchesGlobalId(xid.getGlobalTransactionId())) {
                 //ours, but prepare not logged
                 try {
@@ -140,6 +147,16 @@
         }
     }
 
+    private boolean isNameInTransaction(XidBranchesPair xidBranchesPair, String name) {
+        for (Iterator branches = xidBranchesPair.getBranches().iterator(); branches.hasNext();)
{
+            TransactionBranchInfo transactionBranchInfo = (TransactionBranchInfo) branches.next();
+            if (name.equals(transactionBranchInfo.getResourceName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
     private void removeNameFromTransaction(XidBranchesPair xidBranchesPair, String name,
boolean warn) {
         int removed = 0;
         for (Iterator branches = xidBranchesPair.getBranches().iterator(); branches.hasNext();)
{



Mime
View raw message