[Mulgara-svn] r1104 - trunk/src/jar/resolver/java/org/mulgara/resolver
pag at mulgara.org
pag at mulgara.org
Wed Jul 23 21:27:46 UTC 2008
Author: pag
Date: 2008-07-23 14:27:44 -0700 (Wed, 23 Jul 2008)
New Revision: 1104
Modified:
trunk/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java
Log:
Fixed a problem with the idle timeouts in transactions where cancelled tasks were holding onto transactions. This solution required regular wakeups and rescheduling, which is undesirable, but we will need a new timeout handler in order to fix this correctly.
Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java 2008-07-23 05:18:09 UTC (rev 1103)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java 2008-07-23 21:27:44 UTC (rev 1104)
@@ -352,18 +352,19 @@
}
private class XAReaper extends TimerTask {
- private final MulgaraTransaction transaction;
+ private static final long WAKEUP_CYCLE = 20000; // 20 seconds
private final long txnDeadline;
private final long idleTimeout;
+ private MulgaraTransaction transaction;
public XAReaper(MulgaraTransaction transaction, long txnDeadline, long idleTimeout, long lastActive) {
this.transaction = transaction;
this.txnDeadline = txnDeadline;
this.idleTimeout = idleTimeout;
- if (lastActive <= 0)
- lastActive = System.currentTimeMillis();
- long nextWakeup = Math.min(txnDeadline, lastActive + idleTimeout);
+ long now = System.currentTimeMillis();
+ if (lastActive <= 0) lastActive = now;
+ long nextWakeup = Math.min(Math.min(txnDeadline, lastActive + idleTimeout), now + WAKEUP_CYCLE);
if (logger.isDebugEnabled()) {
logger.debug("Transaction-reaper created, txn=" + transaction + ", txnDeadline=" + txnDeadline +
@@ -381,12 +382,10 @@
long now = System.currentTimeMillis();
synchronized (getMutexLock()) {
- if (timeoutTasks.remove(transaction) == null)
- return; // looks like we got cleaned up
+ if (timeoutTasks.remove(transaction) == null) return; // looks like we got cleaned up
if (now < txnDeadline && ((lastActive <= 0) || (now < lastActive + idleTimeout))) {
- if (logger.isDebugEnabled())
- logger.debug("Transaction still active: " + lastActive + " time: " + now + " idle-timeout: " + idleTimeout + " - rescheduling timer");
+ if (logger.isDebugEnabled()) logger.debug("Transaction still active: " + lastActive + " time: " + now + " idle-timeout: " + idleTimeout + " - rescheduling timer");
timeoutTasks.put(transaction, new XAReaper(transaction, txnDeadline, idleTimeout, lastActive));
return;
@@ -407,5 +406,12 @@
}
}.start();
}
+
+ public boolean cancel() {
+ synchronized (getMutexLock()) {
+ transaction = null;
+ }
+ return super.cancel();
+ }
}
}
More information about the Mulgara-svn
mailing list