Last edited by
MBrown on January 30, 1984 11:50:47 am PST
Taft on 1-Feb-82 12:57:26
Hauser, March 8, 1985 11:13:52 am PST
Bob Hagmann March 23, 1988 9:31:03 am PST
YggTransactionInternal:
DEFINITIONS =
BEGIN
State:
TYPE = { unknown, active, preparing, ready, completing,
fpmComplete, fpmCompleteBeingForcedOut, complete };
StateDuringRecovery: TYPE = { active, ready, committed, aborted };
Outcome: TYPE = YggEnvironment.Outcome --{abort, commit, unknown}--;
Object:
TYPE =
MONITORED
RECORD [
transID: YggEnvironment.TransID ← YggEnvironment.nullTransID, --immutable--
beginRecord: YggInternal.LogRecordID ← YggInternal.nullLogRecordID, --immutable--
coordinator: YggImport.Handle ← YggImport.nullHandle, --immutable--
locks: YggInternal.LockTransHeaderHandle ← NIL, --immutable--
coordinatorIsRemote: BOOL ← TRUE,
state: State ← unknown, --increases monotonically to complete--
outcome: Outcome ← unknown, --changes during state transition ready -> completing--
allowableDifficulty: Difficulty ← hard,
hard -> normal -> zero during preparing or completing state.
Prevents new actions that dirty owner DB caches (CreateFile, ...) from starting
during Prepare. ReadPages and WritePages are allowed during Prepare.
nStarts: [0..maxStarts] ← 0,
Number of actions in progress for this worker. More precisely, the
number of StartWorking calls that returned TRUE, minus number of StopWorking calls.
stateDuringRecovery: StateDuringRecovery ← active,
State maintained during the analysis pass of recovery.
timeOfLastStartWork: BasicTime.
GMT,
Time of last successful call to StartWork.
estimatedUpdateCost:
INT ← 0,
0 means that the transaction is readonly. The estimatedUpdateCost increases during
the transaction.
fileInstanceList: YggInternal.FileInstanceHandle ←
NIL,
Data structure giving access to all files opened by this transaction.
enabledWheelList:
LIST
OF
YggDummyRPC.ConversationID ←
NIL,
List of all conversations that are enabled to perform "protected" Yggdrasil operations
under this transaction.
continueWorker: Handle ← nullHandle, --holds continuation transaction, if any--
next: Handle ← nullHandle --WorkerMap data structure--
];
Handle: TYPE = REF Object;
nullHandle: Handle = NIL;
shortWaitTime:
INT = 100;
Timeout for a condition variable on which workers wait in order to let
some transient condition pass.
Difficulty: TYPE = YggInternal.Difficulty; --{zero, normal, hard}
WorkLevel:
TYPE = YggInternal.WorkLevel;
--Difficulty [normal .. hard]
no interface procedure involving transactions has zero difficulty
most have normal difficulty
anything that can dirty a cache that must be flushed during Prepare is hard.
maxStarts:
CARDINAL = 7;
Bound on number of concurrent actions allowed for a single worker.
Persistent worker state.
Note that workerReady and workerComplete log records contain no information
other than the transaction ID, so we don't define structures for them here.
BeginLogRep:
TYPE =
MACHINE
DEPENDENT
RECORD [
coordinator: StrBody];
CompletingLogRep:
TYPE =
MACHINE
DEPENDENT
RECORD [
outcome: YggInternal.WorkerOutcome];
StrBody:
TYPE =
MACHINE
DEPENDENT
RECORD [
length: CARDINAL ← 0, maxLength: CARDINAL ← YggDummyRPC.maxShortStringLength,
text: PACKED ARRAY[0..YggDummyRPC.maxShortStringLength) OF CHAR];
END.