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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 7 17:47:02 EST 2008


Author: mark.little at jboss.com
Date: 2008-03-07 17:47:02 -0500 (Fri, 07 Mar 2008)
New Revision: 18776

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/recovery/RecoveryManager.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/PeriodicRecovery.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/RecoveryManagerImple.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/WorkerService.java
Log:
http://jira.jboss.com/jira/browse/JBTM-288

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/recovery/RecoveryManager.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/recovery/RecoveryManager.java	2008-03-07 22:03:11 UTC (rev 18775)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/recovery/RecoveryManager.java	2008-03-07 22:47:02 UTC (rev 18776)
@@ -31,12 +31,8 @@
 
 package com.arjuna.ats.arjuna.recovery;
 
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Properties;
 import java.util.Vector;
 
-import com.arjuna.common.util.propertyservice.PropertyManager;
 import com.arjuna.ats.internal.arjuna.recovery.RecoveryManagerImple;
 
 class ScanThread extends Thread
@@ -173,6 +169,24 @@
     }
     
     /**
+     * Suspend the recovery manager. If the recovery manager is in the process of
+     * doing recovery scans then it will be suspended afterwards, in order to
+     * preserve data integrity.
+     * 
+     * @param async wait for the recovery manager to finish any scans before returning.
+     */
+
+    public void suspendScan (boolean async)
+    {
+	_theImple.suspendScan(async);
+    }
+
+    public void resumeScan ()
+    {
+	_theImple.resumeScan();
+    }
+	
+    /**
      * Start the recovery manager thread.
      */
     public void startRecoveryManagerThread()

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/PeriodicRecovery.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/PeriodicRecovery.java	2008-03-07 22:03:11 UTC (rev 18775)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/PeriodicRecovery.java	2008-03-07 22:47:02 UTC (rev 18776)
@@ -40,8 +40,6 @@
 import java.net.*;
 import java.io.*;
 
-import com.arjuna.common.util.propertyservice.PropertyManager;
-
 import com.arjuna.ats.arjuna.recovery.RecoveryModule;
 import com.arjuna.ats.arjuna.recovery.RecoveryEnvironment;
 import com.arjuna.ats.arjuna.common.arjPropertyManager;
@@ -49,8 +47,6 @@
 import com.arjuna.ats.arjuna.logging.FacilityCode;
 import com.arjuna.ats.arjuna.logging.tsLogger;
 
-import com.arjuna.ats.internal.arjuna.utils.SocketProcessId;
-
 import com.arjuna.common.util.logging.*;
 
 /**
@@ -109,11 +105,50 @@
 
    public void shutdown ()
    {
-      _terminate = true;
+      _currentState = State.terminated;
 
       this.interrupt();
    }
 
+   public void suspendScan (boolean async)
+   {
+       synchronized (_signal)
+       {
+	   _currentState = State.suspended;
+	   
+	   this.interrupt();
+	   
+	   if (!async)
+	   {
+	       try
+	       {
+		   _signal.wait();
+	       }
+	       catch (InterruptedException ex)
+	       {
+	       }
+	   }
+       }
+   }
+   
+   public void resumeScan ()
+   {
+       /*
+        * If it's suspended, then it has to be blocked
+        * on the lock.
+        */
+       
+       if (_currentState == State.suspended)
+       {
+           _currentState = State.active;
+           
+           synchronized (_suspendLock)
+           {
+               _suspendLock.notify();
+           }
+       }
+   }
+   
    /**
     * Return the port specified by the property
     * com.arjuna.ats.internal.arjuna.recovery.recoveryPort,
@@ -220,11 +255,35 @@
 	    interrupted = true;
 	}
 
-	if ( _terminate )
+	if (_currentState == State.terminated)
 	{
 	    return true;
 	}
+	else
+	{
+	    if (_currentState == State.suspended)
+	    {
+		synchronized (_signal)
+		{
+		    _signal.notify();
+		}
 
+		while (_currentState == State.suspended)
+		{
+		    try
+		    {
+			synchronized (_suspendLock)
+			{
+			    _suspendLock.wait();
+			}
+		    }
+		    catch (InterruptedException ex)
+		    {
+		    }
+		}
+	    }
+	}
+
 	tsLogger.arjLogger.info("Periodic recovery - second pass <"+
 				_theTimestamper.format(new Date()) + ">" );
 
@@ -252,11 +311,32 @@
 	    interrupted = true;
 	}
 
-	if ( _terminate )
+	if (_currentState == State.terminated)
 	{
 	    return true;
 	}
+	else
+	{
+	    synchronized (_signal)
+	    {
+		_signal.notify();
+	    }
 
+	    while (_currentState == State.suspended)
+	    {
+		try
+		{
+		    synchronized (_suspendLock)
+		    {
+			_suspendLock.wait();
+		    }
+		}
+		catch (InterruptedException ex)
+		{
+		}
+	    }
+	}
+
 	return false; // keep going
     }
 
@@ -396,9 +476,14 @@
    private final void initialise ()
    {
       _recoveryModules = new Vector();
-      _terminate = false;
+      _currentState = State.active;
    }
 
+   private static enum State
+   {
+       created, active, terminated, suspended
+   }
+   
    // this refers to the modules specified in the recovery manager
    // property file which are dynamically loaded.
    private static Vector _recoveryModules = null;
@@ -414,7 +499,7 @@
    private static final int _defaultRecoveryPeriod = 120;
 
    // exit thread flag
-   private static boolean _terminate = false;
+   private static State _currentState = State.created;
 
    private static SimpleDateFormat _theTimestamper = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss");
 
@@ -422,7 +507,10 @@
 
     private static Listener _listener = null;
     private static WorkerService _workerService = null;
-
+    
+    private Object _suspendLock = new Object();
+    private Object _signal = new Object();
+    
    /*
     * Read the system properties to set the configurable options
     *

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/RecoveryManagerImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/RecoveryManagerImple.java	2008-03-07 22:03:11 UTC (rev 18775)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/RecoveryManagerImple.java	2008-03-07 22:47:02 UTC (rev 18776)
@@ -189,6 +189,24 @@
 		// ExpiredEntryMonitor.shutdown();
 	}
 
+	/**
+	 * Suspend the recovery manager. If the recovery manager is in the process of
+	 * doing recovery scans then it will be suspended afterwards, in order to
+	 * preserve data integrity.
+	 * 
+	 * @param async wait for the recovery manager to finish any scans before returning.
+	 */
+	
+	public void suspendScan (boolean async)
+	{
+	    _periodicRecovery.suspendScan(async);
+	}
+	
+	public void resumeScan ()
+	{
+	    _periodicRecovery.resumeScan();
+	}
+	
 	public void finalize ()
 	{
 		stop();

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/WorkerService.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/WorkerService.java	2008-03-07 22:03:11 UTC (rev 18775)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/recovery/WorkerService.java	2008-03-07 22:47:02 UTC (rev 18776)
@@ -31,7 +31,6 @@
  
 package com.arjuna.ats.internal.arjuna.recovery;
 
-import com.arjuna.ats.arjuna.logging.FacilityCode ;
 import com.arjuna.ats.arjuna.logging.tsLogger;
 import com.arjuna.ats.arjuna.recovery.Service;
 




More information about the jboss-svn-commits mailing list