package org.jboss.jbossts.xts.recovery.participant.at;
import com.arjuna.ats.arjuna.common.Uid;
import java.util.NoSuchElementException;
/**
* Abstract class defining API for managing both paritcipant and coordinator recovery
* On hteparticipant this is responsible for saving WS-AT participant recovery records
* during prepare, deleting them at commit and recreating and reactivating them during
* recovery.
* On the coordinator side it currently merely records whether coordinator recovery has
* copleted its first scan
*/
public abstract class XTSATRecoveryManager {
/*****************************************************************************************/
/* get or set the AT recovery manager singleton */
/*****************************************************************************************/
/**
* obtain a reference to the WS-AT recovery manager singleton instance
* @return the singleton instance
*/
public static XTSATRecoveryManager getRecoveryManager()
{
int i = 0;
while (theRecoveryManager == null && i++ < 2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
return theRecoveryManager;
}
/**
* set the WS-AT recovery manager singleton instance
* @param recoveryManager the instance to use as the recovery manager
* @return the singleton previously in use or null if it was not previously set
*/
public static XTSATRecoveryManager setRecoveryManager(XTSATRecoveryManager recoveryManager)
{
XTSATRecoveryManager old = theRecoveryManager;
theRecoveryManager = recoveryManager;
return old;
}
/*****************************************************************************************/
/* API used by application client code to register XTS recovery modules at application */
/* startup and to unregister them when the application is unloaded */
/*****************************************************************************************/
/**
* register an application specific recovery module which acts as a helper to recreate
* a WS-AT durable participant from the participant's recovery data saved at prepare
* @param module the module which will be used to identify and recreate participants
* for the application
* @throws NullPointerException if the supplied module is null
*/
public abstract void registerRecoveryModule(XTSATRecoveryModule module);
/**
* unregister an application specific recovery module previously registered as
* a helper to recretae WS-AT durable participants
* @param module the module to be unregistered
* @throws NoSuchElementException if the module is not currently registered
*/
public abstract void unregisterRecoveryModule(XTSATRecoveryModule module) throws NoSuchElementException;
/*****************************************************************************************/
/* API used by participant service to create and delete participant recovery records in */
/* persistent store during normal operation */
/*****************************************************************************************/
/**
* save the supplied participant recovery record to persistent storage
* @param participantRecoveryRecord
*/
public abstract boolean writeParticipantRecoveryRecord(ATParticipantRecoveryRecord participantRecoveryRecord);
/**
* remove any participant recovery record with the supplied id from persistent storage
* @param id
*/
public abstract boolean deleteParticipantRecoveryRecord(String id);
/*****************************************************************************************/
/* API used by recovery scanning thread to add entries to the AT recovery manager's */
/* table of recovered participant recovery records. */
/*****************************************************************************************/
/**
* test whether the supplied uid identifies an active participant or a recovered but inactive
* participant
* @param uid
*/
public abstract boolean isParticipantPresent(Uid uid);
/**
* add a recovered participant record to the table of unrecovered participants which
* need to be recreated following recovery
*
* @param uid the uid under which the participant was saved in the file store
* @param participantRecoveryRecord the in-memory represenattion of the recovery record
* saved to disk
*/
public abstract void addParticipantRecoveryRecord(Uid uid, ATParticipantRecoveryRecord participantRecoveryRecord);
/**
* see if a participant recovery record with a given id exists in the table of unrecovered
* participants
* @param id the identifier of the participant being sought
* @return the participant recovery record with the supplied id or null if it is not found
*/
public abstract ATParticipantRecoveryRecord findParticipantRecoveryRecord(String id);
/**
* process all entries in the recovered participant map and attempt to recreate the
* application participant and activate it
*/
public abstract void recoverParticipants();
/**
* test whether the first AT participant recovery scan has completed. this indicates whether
* there may or may not still be unknown participant recovery records on disk. If the first
* scan has not yet completed then a commit or rollback message for an unknown participant
* must be dropped. If it has then a commit or rollback for an unknown participant must be
* acknowledged with, respectively, a committed or aborted message.
*/
public abstract boolean isParticipantRecoveryStarted();
/**
* test whether the first AT coordinator recovery scan has completed. this indicates whether
* there may or may not still be unknown AT transcation records on disk. If the first
* scan has not yet completed then a prepare message for an unknown participant
* must be dropped. If it has then a perpare for an unknown participant must be
* acknowledged with a rollback message.
*/
public abstract boolean isCoordinatorRecoveryStarted();
/**
* test whether the first AT subordinate coordinator recovery scan has completed. this indicates
* whether there may or may not still be unknown AT subtransaction records on disk. If the first
* scan has not yet completed then a commit for an unknown subtransaction must raise an exception
* delaying commit of the parent transaction.
*/
public abstract boolean isSubordinateCoordinatorRecoveryStarted();
/**
* record the fact that the first AT coordinator recovery scan has completed.
*/
public abstract void setCoordinatorRecoveryStarted();
/**
* record the fact that the first AT subordinate coordinator recovery scan has completed.
*/
public abstract void setSubordinateCoordinatorRecoveryStarted();
/**
* the singleton instance of the recovery manager
*/
protected static XTSATRecoveryManager theRecoveryManager = null;
}