[jboss-svn-commits] JBL Code SVN: r11682 - in labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/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:28:16 EDT 2007
Author: kevin.conner at jboss.com
Date: 2007-05-04 10:28:15 -0400 (Fri, 04 May 2007)
New Revision: 11682
Modified:
labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java
labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java
Log:
Fixes for transaction reaper deadlock:JBTM-215
Modified: labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java 2007-05-04 14:26:26 UTC (rev 11681)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java 2007-05-04 14:28:15 UTC (rev 11682)
@@ -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/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java 2007-05-04 14:26:26 UTC (rev 11681)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperElement.java 2007-05-04 14:28:15 UTC (rev 11682)
@@ -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/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java 2007-05-04 14:26:26 UTC (rev 11681)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/reaper/ReaperTestCase.java 2007-05-04 14:28:15 UTC (rev 11682)
@@ -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