[jboss-svn-commits] JBL Code SVN: r10754 - in labs/jbosstm/trunk: ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 4 09:02:49 EDT 2007


Author: jhalliday
Date: 2007-04-04 09:02:49 -0400 (Wed, 04 Apr 2007)
New Revision: 10754

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
Log:
Improved handling of exceptions generated during beforeCompletion synchronization processing, per JBAS-4238


Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2007-04-04 13:02:49 UTC (rev 10754)
@@ -177,6 +177,14 @@
 		return "/StateManager/BasicAction/AtomicAction/TwoPhaseCoordinator";
 	}
 
+	/**
+	 * Get any Throwable that was caught during commit processing but not directly rethrown.
+	 * @return
+	 */
+	public Throwable getDeferredThrowable() {
+		return _deferredThrowable;
+	}
+
 	protected TwoPhaseCoordinator (int at)
 	{
 		super(at);
@@ -239,17 +247,28 @@
 				try
 				{
 					problem = !_currentRecord.beforeCompletion();
+
+					// if something goes wrong, we can't just throw the exception, we need to continue to
+					// complete the transaction. However, the exception may have interesting information that
+					// we want later, so we keep a reference to it as well as logging it.
+
 				}
 				catch (Exception ex)
 				{
 					tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2", new Object[]
 					{ _currentRecord }, ex);
+					if(_deferredThrowable == null) {
+						_deferredThrowable = ex;
+					}
 					problem = true;
 				}
 				catch (Error er)
 				{
 					tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2", new Object[]
 					{ _currentRecord }, er);
+					if(_deferredThrowable == null) {
+						_deferredThrowable = er;
+					}
 					problem = true;
 				}
 			}
@@ -352,5 +371,5 @@
 	//private HashList _synchs;
 	private SortedSet _synchs;
 	private SynchronizationRecord _currentRecord; // the most recently processed Synchronization.
-
+	private Throwable _deferredThrowable;
 }

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java	2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java	2007-04-04 13:02:49 UTC (rev 10754)
@@ -111,16 +111,9 @@
 
 	if (_theSynch != null)
 	{
-	    try
-	    {
 		_theSynch.beforeCompletion();
-
 		return true;
-	    }
-	    catch (Exception e)
-	    {
-		return false;
-	    }
+		// Don't catch and swallow unchecked exceptions here, they may be useful to the caller.
 	}
 	else
 	    return false;

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2007-04-04 13:02:49 UTC (rev 10754)
@@ -48,10 +48,7 @@
 import com.arjuna.ats.jta.xa.XAModifier;
 
 import com.arjuna.ats.arjuna.LastResourceRecord;
-import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
-import com.arjuna.ats.arjuna.coordinator.ActionStatus;
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.AddOutcome;
+import com.arjuna.ats.arjuna.coordinator.*;
 import com.arjuna.ats.arjuna.common.*;
 
 import com.arjuna.common.util.logging.*;
@@ -243,8 +240,11 @@
 				throw new javax.transaction.HeuristicMixedException();
 			case ActionStatus.H_ROLLBACK:
 			case ActionStatus.ABORTED:
-				throw new RollbackException(
-						jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+				RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+				if(_theTransaction.getDeferredThrowable() != null) {
+					rollbackException.initCause(_theTransaction.getDeferredThrowable());
+				}
+				throw rollbackException;
 			default:
 				throw new IllegalStateException(
 						jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));
@@ -1264,8 +1264,11 @@
 					throw new javax.transaction.HeuristicMixedException();
 				case ActionStatus.H_ROLLBACK:
 				case ActionStatus.ABORTED:
-					throw new RollbackException(
-							jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+					RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+					if(_theTransaction.getDeferredThrowable() != null) {
+						rollbackException.initCause(_theTransaction.getDeferredThrowable());
+					}
+					throw rollbackException;
 				default:
 					throw new IllegalStateException(
 							jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));




More information about the jboss-svn-commits mailing list