[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