[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