AlpineEnvironment1.cr
Copyright © 1986 by Xerox Corporation. All rights reserved.
Bill Jackson (bj) August 9, 1986 8:17:20 pm PDT
Carl Hauser, November 9, 1987 1:04:12 pm PST
AlpineEnvironment: PROGRAM 2201 VERSION 1 = BEGIN
DEPENDS UPON
Time (15) VERSION 2;
Copied types
GMT: TYPE = Time.Time;
Primitive types
ByteCount: TYPE = LONG INTEGER;
FalseBool: TYPE = BOOLEAN;
FileStore: TYPE = Principal; -- an Alpine instance
FileVersion: TYPE = LONG INTEGER;
OpenFileID: TYPE = LONG CARDINAL; -- represents a single client's access to a single file under a single transaction. Unique only within a single Alpine instance.
OwnerName: TYPE = STRING; -- an Alpine owner, not necessarily an RName
PageCount: TYPE = LONG INTEGER;
PageNumber: TYPE = LONG INTEGER; -- should be [0..maxPagesPerFile]
Principal: TYPE = STRING; -- an individual from some authentication domain (GV or CH)
RName: TYPE = STRING; -- an arbitrary Grapevine (or Clearinghouse) RName
Enumerated types
AccessRights: TYPE = {
readOnly(0),
readWrite(1)
};
CommitOrAbort: TYPE = { -- logically a subtype of Outcome
abort(0),
commit(1)
};
ConflictResolution: TYPE = {
wait(0),
fail(1)
};
LockFailure: TYPE = {
conflict(0), -- lock cannot immediately be set because a conflicting lock is already set by another transaction
timeout(1) -- lock cannot be set even after waiting a long time, perhaps due to undetected deadlock
};
LockMode: TYPE = {
none(0),
read(1),
update(2),
write(3),
readIntendUpdate(4),
readIntendWrite(5),
intendRead(6),
intendUpdate(7),
intendWrite(8)
};
NeededAccess: TYPE = {
alpineWheel(0),
fileModify(1),
fileRead(2),
handleReadWrite(3),
ownerCreate(4),
ownerEntry(5),
spaceQuota(6)
}; -- when access is denied, indicates the access control list in which client's membership was required but not present
OperationFailure: TYPE = {
busy(0), -- server is too busy to start another transaction
damagedLeaderPage(1), -- file properties are messed up (probable Alpine bug)
duplicateOwner(2),
duplicateVolumeGroup(3),
duplicateVolume(4),
inconsistentDescriptor(5), -- PageBuffer word count and PageRun page count are inconsistent
volumeFragmented(6), -- cannot find enough contiguous pages to create or extend file
insufficientSpace(7), -- in volume group to create or extend file, or in leader page to write property
nonexistentFilePage(8), -- attempted to access page beyond last page of file
notAlpineWheel(9), -- failure from AssertAlpineWheel
ownerDatabaseFull(10),
ownerFileFormatOrVolGroupMismatch(11),
ownerRecordFull(12),
ownerRecordInUse(13),
quotaExceeded(14), -- attempt to create or extend file would exceed owner's quota
regServersUnavailable(15), -- access check failed due to Grapevine unavailability
spaceInUseByThisOwner(16),
tooManyRNames(17),
totalQuotaExceeded(18),
unwritableProperty(19) -- attempted to write the version property with WriteProperties
};
Outcome: TYPE = {
abort(0),
commit(1),
unknown(2)
};
OwnerProperty: TYPE = {
createAccessList(0),
modifyAccessList(1),
quota(2),
spaceInUse(3),
rootFile(4)
};
Property: TYPE = {
byteLength(0),
createTime(1),
highWaterMark(2),
modifyAccess(3),
owner(4),
readAccess(5),
stringName(6),
version(7)
};
PropertySet: TYPE = ARRAY 8 OF FalseBool; -- PACKED ARRAY [Property]
RecoveryOption: TYPE = {
log(0),
noLog(1)
};
ReferencePattern: TYPE = {
random(0),
sequential(1)
}; -- a client-supplied hint about the expected pattern of references to pages of a file. Sequential means that when the client reads or writes an interval [p .. p+n) of the file, there is a high likelihood that it will reference pages [p+n .. p+2*n) in the near future. Random means that no such pattern is expected. Specifying this hint accurately enables the server to perform the operations more quickly and efficiently.
UnknownType: TYPE = {
coordinator(0), -- coordinator RName not known to Grapevine (CreateWorker)
fileID(1), -- no file with this ID in specified volume
openFileID(2), -- no open file with this ID, or ID presented from wrong conversation
owner(3), -- no owner with this name in owner data base for specified volume group
transID(4), -- no transaction active with this ID on this Alpine instance. It may be that the transaction has aborted or that the server has crashed and restarted.
volumeID(5), -- no volume with this ID is on-line
volumeGroupID(6) -- no volume group with this ID is on-line
};
WorkerState: TYPE = {
notReady(0),
readOnlyReady(1),
ready(2)
};
Array types
OwnerPropertySet: TYPE = ARRAY 5 OF FalseBool; -- PACKED ARRAY OwnerProperty
TransID: TYPE = ARRAY 9 OF CARDINAL; -- globally permanently unique capability for a transaction
FID: TYPE = ARRAY 2 OF CARDINAL; -- (File.FileID);
DA: TYPE = ARRAY 2 OF CARDINAL; -- (File.DA);
VolOrVolGroupID: TYPE = ARRAY 5 OF CARDINAL; -- File.VolumeID;
Record Types
FileID: TYPE = RECORD [
The permanent identification of a file. "id" is permanently unique relative to a volume.
id: FID, -- (0) (File.FileID)
da: DA -- (2) (File.DA)
]; -- volume-relative ID of a file
LockOption: TYPE = RECORD [
mode: LockMode,
ifConflict: ConflictResolution
];
PageRun: TYPE = RECORD [
firstPage: PageNumber,
count: CARDINAL
];
UniversalFile: TYPE = RECORD [ -- globally permanently unique identification of a file
volumeID: VolumeID,
fileID: FileID
];
VolumeGroupID: TYPE = RECORD [
vgid: VolOrVolGroupID
];
VolumeID: TYPE = RECORD [
vgid: VolOrVolGroupID
];
VolumeIDs: TYPE = SEQUENCE OF VolumeID;
Choice Types
OwnerPropertyValuePair: TYPE = CHOICE OwnerProperty OF {
createAccessList => AccessList, -- (0)
modifyAccessList => AccessList, -- (1)
quota => PageCount, -- (2)
spaceInUse => PageCount, -- (3) readOnly
rootFile => UniversalFile -- (4)
};
OwnerProperties: TYPE = SEQUENCE OF OwnerPropertyValuePair;
PropertyValuePair: TYPE = CHOICE Property OF {
byteLength => ByteCount, -- (0)
createTime => GMT, -- (1)
highWaterMark => PageCount, -- (2)
modifyAccess => AccessList, -- (3)
owner => OwnerName, -- (4)
readAccess => AccessList, -- (5)
stringName => STRING, -- (6)
version => FileVersion -- (7)
};
Properties: TYPE = SEQUENCE OF PropertyValuePair;
Sequence Types
AccessList: TYPE = SEQUENCE OF RName;
Constants
allOwnerProperties: OwnerPropertySet = [TRUE, TRUE, TRUE, TRUE, TRUE];
bytesPerPage: CARDINAL = 512; -- (wordsPerPage *Basics.bytesPerWord)
logBytesPerPage: CARDINAL = 9; -- (logWordsPerPage + Basics.logBytesPerWord)
logWordsPerPage: CARDINAL = 8; -- ugh!
maxPagesPerFile: LONG INTEGER = 17777777777B; -- (File.PageCount.LAST)
maxStringNameChars: CARDINAL = 100; -- max length of any string appearing in a property
nullFileID: FileID = [id: [0, 0], da: [0, 0]]; -- (File.nullFP) the ID of no file
nullOpenFileID: OpenFileID = 0; -- ID of no open file
nullRootFile: UniversalFile = [volumeID: nullVolumeID, fileID: nullFileID];
nullTransID: TransID = nullTransIDRep; -- ID of no transaction
nullTransIDRep: TransID = [0, 0, 0, 0, 0, 0, 0, 0, 0];
nullUniversalFile: UniversalFile = [volumeID: nullVolumeID, fileID: nullFileID];
nullVolumeGroupID: VolumeGroupID = [vgid: [0, 0, 0, 0, 0]]; -- (File.nullVolumeID) the ID of no volume group
nullVolumeID: VolumeID = [vgid: [0, 0, 0, 0, 0]]; -- (File.nullVolumeID) the ID of no volume
wordsPerPage: CARDINAL = 256; -- (File.wordsPerPage)
END.