Class AbstractRecord
java.lang.Object
com.arjuna.ats.arjuna.StateManager
com.arjuna.ats.arjuna.coordinator.AbstractRecord
- Direct Known Subclasses:
ActivationRecord
,CommitMarkableResourceRecord
,ExtendedResourceRecord
,LastResourceRecord
,LockRecord
,RecoveryRecord
,ResourceRecord
,RESTRecord
,XAResourceRecord
Abstract Record Class
This class provides an abstract template that defines the interface that the
atomic action system uses to notify objects that various state transitions
have occurred as the 2PC protocol executes. Record types derived from this
class manage certain properties of objects such as recovery information,
concurrency control information etc, and all must redefine the operations
defined here as abstract to take appropriate action.
Many functions are declared pure virtual to force a definition to occur in
any derived class. These are currently all functions dealing with atomic
action coordination as well as the following list management functions:
typeIs: returns the record type of the instance. This is one of the values of
the enumerated type Record_type value: Some arbitrary value associated with
the record instance merge: Used when two records need to merge together.
Currently this is only used by CadaverRecords to merge information from
PersistenceRecords shouldAdd: returns TRUE is the record should be added to
the list FALSE if it should be discarded shouldMerge: returns TRUE is the two
records should be merged into a single record, FALSE if it should be
discarded shouldReplace: returns TRUE if the record should replace an
existing one, FALSE otherwise.
- Since:
- 1.0.
- Version:
- $Id: AbstractRecord.java 2342 2006-03-30 13:06:17Z $
- Author:
- Mark Little (mark@arjuna.com)
-
Field Summary
Fields inherited from class com.arjuna.ats.arjuna.StateManager
modifyingActions, objectModel, objectUid, synchronizationLock, usingActions
-
Constructor Summary
ModifierConstructorDescriptionCreates a 'blank' abstract record.protected
AbstractRecord
(Uid storeUid) Create a new instance with the specified paramaters.protected
AbstractRecord
(Uid storeUid, String objType, int otype) Create a new instance with the specified parameters. -
Method Summary
Modifier and TypeMethodDescriptionabstract void
Alter the current record with the one presented.void
Clearing the heuristic state on the resource.static AbstractRecord
create
(int type) boolean
doSave()
Should this record be saved in the intentions list? If the record is saved, then it may be recovered later in the event of a failure.final boolean
equals
(AbstractRecord ar) Determine if two records are equal in that both are the same type and have the same order value (determined via 'order()').boolean
Forget any heuristic outcome which this implementation may have produced.protected final AbstractRecord
getNext()
protected final AbstractRecord
These few functions are link manipulation primitives used by the RecordList processing software to chain instances together.Return the type of the abstract record.final boolean
Determine if two records are greater than in that both are the same type and their Uids are greater than.boolean
Defines if the participant record permits the use of the one phase commit optimization.final boolean
Determine if two records are less than in that both are the same type and their Uids are less than.abstract void
Merge the current record with the one presented.abstract int
A rollback of a nested transaction has occurred.int
Cleanup is called if a nested is detected to be an orphan.abstract int
A commit of a nested transaction has occurred.int
Perform a nested one phase commit.abstract int
A prepare for a nested transaction has occurred.order()
Return the Uid of this abstract record so that it can be ordered in the intentions list.void
print
(PrintWriter strm) Write information about this specific instance to the specified stream.boolean
Determine if records are discarded on action abort or must be propagated to parents.boolean
Determine if records are discarded on action commit or must be propagated to parents.void
The current record is about to replace the one presented.boolean
restore_state
(InputObjectState os, int i) During recovery, the transaction log is given to the recovery system and it will recreate a transaction instance to perform necessary recovery actions.boolean
save_state
(OutputObjectState os, int i) When the transaction is required to make the intentions list persistent, it scans the list and asks each record whether or not it requires state to be saved (by calling doSave).protected final void
Set the next element in the list to the specified instance.protected final void
Set the previous element in the list to the specified instance.abstract void
abstract boolean
Should we add the record presented to the intentions list?abstract boolean
Should we alter the current record with the one presented?abstract boolean
Should we merge the current record with the one presented?abstract boolean
Should we replace the record presented with the current record?abstract int
A rollback of a top-level transaction has occurred.int
Cleanup is called if a top-level action is detected to be an orphan.abstract int
A commit of a top-level transaction has occurred.int
Perform a top-level one phase commit.abstract int
A prepare for a top-level transaction has occurred.type()
Re-implementation of abstract methods inherited from base class.abstract int
typeIs()
abstract Object
value()
If this abstract record caused a heuristic then it should return an object which implementsHeuristicInformation
Methods inherited from class com.arjuna.ats.arjuna.StateManager
activate, activate, cleanup, createLists, deactivate, deactivate, deactivate, destroy, disable, forgetAction, get_uid, getCreationTimeMillis, getMutex, getObjectModel, getStore, getStoreRoot, loadObjectState, lockMutex, modified, objectType, packHeader, persist, rememberAction, setStatus, setupStore, setupStore, setupStore, status, terminate, tryLockMutex, unlockMutex, unpackHeader
-
Constructor Details
-
AbstractRecord
Create a new instance with the specified parameters.- Parameters:
storeUid
- the unique id for this instance.objType
- the type of the instance.otype
- the ObjectType of the object.- See Also:
-
AbstractRecord
Create a new instance with the specified paramaters.- Parameters:
storeUid
- the unique id for this instance.
-
AbstractRecord
public AbstractRecord()Creates a 'blank' abstract record. This is used during crash recovery when recreating the prepared list of a server atomic action.
-
-
Method Details
-
typeIs
public abstract int typeIs()- Returns:
RecordType
value.
-
value
If this abstract record caused a heuristic then it should return an object which implementsHeuristicInformation
- Returns:
Object
to be used to order.
-
setValue
-
nestedAbort
public abstract int nestedAbort()A rollback of a nested transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
nestedCommit
public abstract int nestedCommit()A commit of a nested transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
nestedPrepare
public abstract int nestedPrepare()A prepare for a nested transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
topLevelAbort
public abstract int topLevelAbort()A rollback of a top-level transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
topLevelCommit
public abstract int topLevelCommit()A commit of a top-level transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
topLevelPrepare
public abstract int topLevelPrepare()A prepare for a top-level transaction has occurred.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
order
Return the Uid of this abstract record so that it can be ordered in the intentions list. This is also the Uid that the record was saved with in the object store.- Returns:
Uid
for this instance.- See Also:
-
getTypeOfObject
Return the type of the abstract record. Used in ordering the instances in the intentions list. This is also the type that the record was saved with in the object store.- Returns:
String
representing type.
-
propagateOnAbort
public boolean propagateOnAbort()Determine if records are discarded on action abort or must be propagated to parents.- Returns:
true
if the record should be propagated to the parent transaction if the current transaction rolls back,false
otherwise. The default isfalse
.
-
propagateOnCommit
public boolean propagateOnCommit()Determine if records are discarded on action commit or must be propagated to parents.- Returns:
true
if the record should be propagated to the parent transaction if the current transaction commits,false
otherwise. The default istrue
.
-
equals
Determine if two records are equal in that both are the same type and have the same order value (determined via 'order()').- Returns:
true
if equal,false
otherwise.
-
lessThan
Determine if two records are less than in that both are the same type and their Uids are less than.- Returns:
true
if equal,false
otherwise.
-
greaterThan
Determine if two records are greater than in that both are the same type and their Uids are greater than.- Returns:
true
if equal,false
otherwise.
-
topLevelCleanup
public int topLevelCleanup()Cleanup is called if a top-level action is detected to be an orphan. NOTE nested actions are never orphans since their parents would be aborted we may as well abort them as well.- Returns:
TwoPhaseOutcome
as default is the same as topLevelAbort.
-
nestedCleanup
public int nestedCleanup()Cleanup is called if a nested is detected to be an orphan. NOTE nested actions are never orphans since their parents would be aborted we may as well abort them as well.- Returns:
TwoPhaseOutcome
as default is the same as nestedAbort.
-
doSave
public boolean doSave()Should this record be saved in the intentions list? If the record is saved, then it may be recovered later in the event of a failure. Note, however, that the size of the intentions list on disk is critical to the performance of the system (disk I/O is a bottleneck).- Returns:
true
if it should be saved,false
otherwise.false
is the default.
-
type
Re-implementation of abstract methods inherited from base class.- Overrides:
type
in classStateManager
-
print
Write information about this specific instance to the specified stream.- Overrides:
print
in classStateManager
- Parameters:
strm
- the stream on which to output.
-
save_state
When the transaction is required to make the intentions list persistent, it scans the list and asks each record whether or not it requires state to be saved (by calling doSave). If the answer is yes, then save_state is called and the record instance must save enough information to enable it to be restored from that state later. The basic AbstractRecord save_state will save common data that is required by the base class during recovery. If a derived class calls super.save_state then it must be called before packing any other data item.- Overrides:
save_state
in classStateManager
- Returns:
true
if successful,false
otherwise.
-
restore_state
During recovery, the transaction log is given to the recovery system and it will recreate a transaction instance to perform necessary recovery actions. This transaction will recreate the intentions list and give each recreated AbstractRecord the state that that was saved during transaction persistence. The base class will restore information that it needs from the log. Data items must be unpacked in the same order that they were packed.- Overrides:
restore_state
in classStateManager
- Returns:
true
if successful,false
otherwise.
-
forgetHeuristic
public boolean forgetHeuristic()Forget any heuristic outcome which this implementation may have produced.- Returns:
true
by default. Iffalse
is returned then the instance must be remembered by the transaction (in the log) in order for recovery to retry later or for a system administrator to be able to determine which resources have not been successfully completed.
-
clearHeuristicDecision
public void clearHeuristicDecision()Clearing the heuristic state on the resource. If the resource maintains a state of the prior heuristic outcome then it should use this method to clear the state and forget the heuristic. -
nestedOnePhaseCommit
public int nestedOnePhaseCommit()Perform a nested one phase commit.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
isPermittedTopLevelOnePhaseCommit
public boolean isPermittedTopLevelOnePhaseCommit()Defines if the participant record permits the use of the one phase commit optimization.
By default it's expected this to be true but the children records can override this if it's necessary for them to forbid 1PC to be run.
- Returns:
- true if 1PC could be run for the participant, otherwise false
-
topLevelOnePhaseCommit
public int topLevelOnePhaseCommit()Perform a top-level one phase commit.- Returns:
TwoPhaseOutcome
to indicate success/failure.- See Also:
-
create
-
merge
Merge the current record with the one presented.- Parameters:
a
- the record with which to merge.
-
alter
Alter the current record with the one presented.- Parameters:
a
- the record with which to alter.
-
shouldAdd
Should we add the record presented to the intentions list?- Parameters:
a
- The record to try to add.- Returns:
true
if the record should be added,false
otherwise.
-
shouldAlter
Should we alter the current record with the one presented?- Parameters:
a
- The record to try to alter.- Returns:
true
if the record should be altered,false
otherwise.
-
shouldMerge
Should we merge the current record with the one presented?- Parameters:
a
- The record to try to merge.- Returns:
true
if the record should be merged,false
otherwise.
-
shouldReplace
Should we replace the record presented with the current record?- Parameters:
a
- The record to try to replace.- Returns:
true
if the record should be replaced,false
otherwise.
-
replace
The current record is about to replace the one presented. This method is invoked to give the current record a chance to copy information, for example, from the record being replaced.- Parameters:
a
- the record that will replace this instance.
-
getPrevious
These few functions are link manipulation primitives used by the RecordList processing software to chain instances together.- Returns:
- the previous element in the intentions list, or null.
-
getNext
- Returns:
- the next element in the intentions list, or null.
-
setPrevious
Set the previous element in the list to the specified instance.- Parameters:
ar
- the instance to become previous.
-
setNext
Set the next element in the list to the specified instance.- Parameters:
ar
- the instance to become next.
-