[jboss-svn-commits] JBL Code SVN: r11681 - in labs/jbosstm/trunk/ArjunaCore/arjuna: classes/com/arjuna/ats/internal/arjuna/coordinator and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 4 10:26:26 EDT 2007


Author: kevin.conner at jboss.com
Date: 2007-05-04 10:26:26 -0400 (Fri, 04 May 2007)
New Revision: 11681

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java
Log:
Fixes for transaction reaper deadlock:JBTM-215

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java	2007-05-04 14:22:35 UTC (rev 11680)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java	2007-05-04 14:26:26 UTC (rev 11681)
@@ -36,8 +36,6 @@
 import com.arjuna.ats.arjuna.coordinator.Reapable;
 import com.arjuna.ats.arjuna.coordinator.ActionStatus;
 
-import com.arjuna.ats.internal.arjuna.template.OrderedList;
-import com.arjuna.ats.internal.arjuna.template.OrderedListIterator;
 import com.arjuna.ats.internal.arjuna.coordinator.*;
 
 import com.arjuna.ats.arjuna.logging.tsLogger;
@@ -125,11 +123,12 @@
 	{
 		if (_dynamic)
 		{
+                    try
+                    {
 			final ReaperElement head = (ReaperElement) _transactions.first();  //_list.peak();
-			if (head != null)
-			{
-				return head._absoluteTimeout - System.currentTimeMillis();
-			}
+			return head._absoluteTimeout - System.currentTimeMillis();
+                    }
+                    catch (final NoSuchElementException nsee) {} // fall through
 		}
 		return _checkPeriod;
 	}
@@ -154,26 +153,29 @@
 					"TransactionReaper::check ()");
 		}
 
-		if (_transactions.size() == 0)
-			return true;
+		do {
+			final ReaperElement e ;
+                        try
+                        {
+                            e = (ReaperElement)_transactions.first();
+                        }
+                        catch (final NoSuchElementException nsee)
+                        {
+                            return true ;
+                        }
 
-		synchronized(_transactions) {
-			Iterator iter = _transactions.iterator();
-			while (iter.hasNext()) {
-				ReaperElement e = (ReaperElement)iter.next();
+			if (tsLogger.arjLoggerI18N.debugAllowed())
+			{
+				tsLogger.arjLoggerI18N
+						.debug(
+								DebugLevel.FUNCTIONS,
+								VisibilityLevel.VIS_PUBLIC,
+								FacilityCode.FAC_ATOMIC_ACTION,
+								"com.arjuna.ats.arjuna.coordinator.TransactionReaper_2",
+								new Object[]
+								{ Long.toString(e._absoluteTimeout) });
+			}
 
-				if (tsLogger.arjLoggerI18N.debugAllowed())
-				{
-					tsLogger.arjLoggerI18N
-							.debug(
-									DebugLevel.FUNCTIONS,
-									VisibilityLevel.VIS_PUBLIC,
-									FacilityCode.FAC_ATOMIC_ACTION,
-									"com.arjuna.ats.arjuna.coordinator.TransactionReaper_2",
-									new Object[]
-									{ Long.toString(e._absoluteTimeout) });
-				}
-
 			final long now = System.currentTimeMillis();
 			if (now >= e._absoluteTimeout)
 			{
@@ -270,14 +272,13 @@
 					}
 				}
 
-				iter.remove();
+				_transactions.remove(e) ;
 			}
 			else
 			{
 				break;
 			}
-		}
-		}
+		} while(true) ;
 
 		return true;
 	}
@@ -320,13 +321,8 @@
 		 * Ignore if it's already in the list with a different timeout.
 		 * (This should never happen)
 		 */
-
-		Integer oldTimeout = (Integer)_timeouts.get(control);
-		if(oldTimeout != null) {
-			ReaperElement key = new ReaperElement((Reapable)control, oldTimeout.intValue());
-			if(_transactions.contains(key)) {
-				return false;
-			}
+		if(_transactions.contains(e)) {
+			return false;
 		}
 
 		synchronized (this)

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java	2007-05-04 14:22:35 UTC (rev 11680)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java	2007-05-04 14:26:26 UTC (rev 11681)
@@ -37,8 +37,6 @@
 import com.arjuna.ats.arjuna.coordinator.Reapable;
 import com.arjuna.ats.arjuna.logging.FacilityCode;
 
-import com.arjuna.ats.internal.arjuna.template.OrderedListElement;
-
 public class ReaperElement implements Comparable
 {
 
@@ -84,7 +82,7 @@
 
 	public boolean equals(Object obj)
 	{
-		return (this.compareTo(obj) == 0 ? true : false);
+		return (compareTo(obj) == 0);
 	}
 
 	public int hashCode()
@@ -106,14 +104,10 @@
 	{
 		ReaperElement other = (ReaperElement)o;
 
-		if(_absoluteTimeout == other._absoluteTimeout) {
-			if(_control.get_uid().equals(other._control.get_uid())) {
-				return 0;
-			} else if (_control.get_uid().greaterThan(other._control.get_uid())) {
-				return 1;
-			} else {
-				return -1;
-			}
+                if(_control.get_uid().equals(other._control.get_uid())) {
+                        return 0;
+                } else if(_absoluteTimeout == other._absoluteTimeout) {
+			return (_control.get_uid().greaterThan(other._control.get_uid()) ? 1 : -1) ;
 		} else {
 			return (_absoluteTimeout > other._absoluteTimeout) ? 1 : -1;
 		}

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java	2007-05-04 14:22:35 UTC (rev 11680)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java	2007-05-04 14:26:26 UTC (rev 11681)
@@ -46,7 +46,7 @@
 		// test set+readback of interval
 		TransactionReaper.create(100);
 		TransactionReaper reaper = TransactionReaper.transactionReaper();
-		assertTrue(reaper.checkingPeriod() == 100);
+		assertEquals(100, reaper.checkingPeriod());
 
 
 		Reapable reapable = new MockReapable(new Uid());
@@ -74,30 +74,30 @@
 		// test that duplicate insertion fails
 		assertTrue(reaper.insert(reapable, 10));
 		assertFalse(reaper.insert(reapable, 10));
-		assertTrue(reaper.numberOfTransactions() == 1);
+		assertEquals(1, reaper.numberOfTransactions());
 		assertTrue(reaper.remove(reapable));
-		assertTrue(reaper.numberOfTransactions() == 0);
+		assertEquals(0, reaper.numberOfTransactions());
 
 		// test that timeout change fails
 		assertTrue(reaper.insert(reapable, 10));
 		assertFalse(reaper.insert(reapable, 20));
-		assertTrue(reaper.numberOfTransactions() == 1);
-		assertTrue(reaper.getTimeout(reapable) == 10);
+		assertEquals(1, reaper.numberOfTransactions());
+                assertEquals(10, reaper.getTimeout(reapable));
 		assertTrue(reaper.remove(reapable));
-		assertTrue(reaper.numberOfTransactions() == 0);
+                assertEquals(0, reaper.numberOfTransactions());
 
 		// test reaping
 		reaper.insert(reapable, 1); // seconds
 		reaper.insert(reapable2, 5);
-		assertTrue(reaper.numberOfTransactions() == 2);
+                assertEquals(2, reaper.numberOfTransactions());
 		reaper.check();
-		assertTrue(reaper.numberOfTransactions() == 2);
+                assertEquals(2, reaper.numberOfTransactions());
 		Thread.sleep(2*1000);
 		reaper.check();
-		assertTrue(reaper.numberOfTransactions() == 1);
+                assertEquals(1, reaper.numberOfTransactions());
 		Thread.sleep(4*1000);
 		reaper.check();
-		assertTrue(reaper.numberOfTransactions() == 0);
+                assertEquals(0, reaper.numberOfTransactions());
 
 	}
 




More information about the jboss-svn-commits mailing list