-- File DBStats.mesa
-- Last edited by:
-- MBrown on November 29, 1982 2:04 pm
-- Cattell on March 14, 1983 2:08 pm
-- Willie-Sue on June 24, 1982 12:00 pm
DIRECTORY IO, Rope;
DBStats: DEFINITIONS = BEGIN
-- This is the interface to the Cedar database statistics gathering facility.
-- There are two kinds of "events": counter and timer.
-- Counter events are for logging the freqency with which a specific action or set of
--actions is performed. If e is a counter event, then Inc[e] causes e's counter to be
--incremented by 1. Inc[e] is very inexpensive to perform.
-- Timer events are for logging the time required for a specific action or set of
--actions. If e is a timer event, then Starting[e] records the current time in a
--variable associated with e. Then when Stopping[e] is performed at some later time,
--it notes the difference between the current time and the time recorded by the
--previous Starting[e]. At a minimum, the average value of this time interval is
--maintained; a more elaborate implementation may also be supplied (max value,
--standard deviation, histogram, ...). Starting[e] and Stopping[e] involve one
--procedure call each and hence are more expensive than Inc[e] (but note that events
--are statically typed so only one set of operations applies to an event in any case).
-- When two calls to Starting[e] occur in succession with no intervening Stopping[e],
--the first Starting[e] is ignored; when two calls to Stopping[e] occur consecutively,
--the last is ignored. Each of these situations counts as a "glitch", and the number
--of glitches is reported for debugging purposes during Print, described below.
--Glitches may occur due to a failure to call Stopping[e] during the UNWIND of a
--procedure activation that called Starting[e]; a glitch is not a fatal error because
--we consider it cumbersome to provide a catch for UNWIND simply to avoid glitches.
-- Any program using this package must initialize the stats implementation module by
--calling DBStats.Initialize[] before calling Inc[e] or Starting[e]. The current
--state of all active counters and timers is appended to the file "DBStats.log" by
--DBStats.Print[]; this does not change the state of counters or timers, but resets
--the count of glitches to 0. ERROR is raised if Print is called before Initialize.
--Initialize should be called to reinitialize the stats module after printing if
--independent statistics are desired.
-- Inc[e], Starting[e], and Stopping[e] are all INLINE procedures, and calls to them
--with compile-time constant parameters produce no code when the procedure bodies
--below are made empty. Hence calls to these procedures may be imbedded freely in a
--system for testing, and then this defs module can be stubbed (all procs INLINE with
--empty bodies) for the efficient "production" version.
Initialize: PROC[];
-- Initializes stats module.
CounterEvent: TYPE = {
-- DBCache--
CacheReadOrWrite,
CacheHTLookup,
CacheHTConflictInLookup,
CacheMiss,
CacheWritePageBack,
-- DBSegment--
SegmentAllocPage,
SegmentFreePage,
-- DBStorage (Tuples)--
StorageCreateTuple,
StorageCreateSystemTuple,
StorageDestroyTuple,
StorageReadTupleset,
StorageReadField,
StorageWriteField,
StorageInitVecPage,
StorageCheckVecPage,
StorageAllocVec,
StorageFreeVec,
StorageModifyVec,
StorageModifyDifficultVec,
StorageCompactPage,
CloseDBGroupScansActive,
CloseDBTuplesetScansActive,
-- DBStorage (BTree)--
DBIndexInsert,
DBIndexDelete,
DBIndexOpenScan,
DBIndexNextScan,
DBIndexBiggerKey,
DBIndexEqualKey,
BTreeSearchPage,
BTreeSwapInPage,
BTreeSwapOutPage,
-- DBView--
CreateEntity,
CreateRelship,
ReleaseRelshipSet,
ReleaseEntitySet,
SurrogateCreateRelship,
SurrogateDestroyRelship,
DomainOf,
RelationOf,
SystemGetF,
DictionaryGetF,
DictionarySetF,
GetTupleInfo,
GetTupleInfoMiss,
GetRelationInfo,
GetRelationInfoMiss,
GetAttributeInfo,
GetAttributeInfoMiss,
GetDomainInfo,
GetDomainInfoMiss,
SystemGetAttributeInfo
};
Inc: PROC[event: CounterEvent] = INLINE { CounterArray[event] ← CounterArray[event] + 1 };
-- Increments the counter associated with event.
TimerEvent: TYPE = {
-- DBFile--
PilotFileCreateTransaction,
PilotFileFinishTransaction,
PilotFileOpen,
PilotFileReadPage,
PilotFileWritePage,
PilotFileGetSize,
PilotFileSetSize,
AlpineFileCreateTransaction,
AlpineFileFinishTransaction,
AlpineFileOpen,
AlpineFileReadPage,
AlpineFileWritePage,
AlpineFileGetSize,
AlpineFileSetSize,
-- DBModel--
GetP,
SetP,
GetF,
SetF,
SurrogateGetF,
SurrogateSetF,
NameOf,
ChangeName,
DeclareEntity,
DeclareRelship,
DestroyEntity,
DestroyRelship,
RelationSubset,
DomainSubset,
NextRelship,
PrevRelship,
NextEntity,
PrevEntity,
GetDomainRefAttributes,
OpenToClose
};
FileTimerEvent: TYPE = TimerEvent [PilotFileCreateTransaction .. AlpineFileSetSize];
Starting: PROC[event: TimerEvent] = INLINE { StartTimer[event] };
-- Glitch if an unmatched Starting[event]; older Starting[event] is superceded by
--this one.
Stopping: PROC[event: TimerEvent] = INLINE { StopTimer[event] };
-- Logs time since previous Starting[event].
-- Glitch if no unmatched Starting[event]; this Stopping call is ignored.
Aborting: PROC[event: TimerEvent] = INLINE { AbortTimer[event] };
-- Cancel count of event (same as Stopping, but doesn't count the time).
Print: PROC[heading: Rope.ROPE ← NIL, out: IO.STREAM← NIL, verbose: BOOLEAN ← FALSE];
-- Prints current state of stats module to outStream, then resets glitch count.
-- If verbose then print all events, otherwise just print nonzero ones.
-- Private implementation details
CounterArray: PRIVATE ARRAY CounterEvent OF LONG CARDINAL;
StartTimer: PRIVATE PROC[event: TimerEvent];
StopTimer: PRIVATE PROC[event: TimerEvent];
AbortTimer: PRIVATE PROC[event: TimerEvent];
END.--DBStats
CHANGE LOG
Created by MBrown on September 18, 1980 11:12 PM
Changed by MBrown on September 21, 1980 2:50 PM
-- Document the fact that Print prints to file DBStats.log, not IODefs.WriteChar.
Changed by MBrown on September 21, 1980 9:59 PM
-- Introduce glitches (instead of raising ERROR), based on use of timer events in
--DBFileImpl.
Changed by Cattell on September 22, 1980 3:13 PM
-- Added some timer events.
Changed by MBrown on October 31, 1980 10:03 AM
-- Added header parm to Print; added new DBTuples timer events.
Changed by MBrown on November 10, 1980 3:35 PM
-- Flushed all DBTuples timer events.
Changed by MBrown on November 14, 1980 3:37 PM
-- Added BTree counter events.
Changed by MBrown on November 14, 1980 5:32 PM
-- Added Attribute cache counter events.
Changed by MBrown on December 8, 1980 5:41 PM
-- Added OpenToClose timer event, defined FileTimerEvent subrange.
Changed by MBrown on December 16, 1980 10:33 AM
-- Added FileAbortTransaction timer event.
Changed by MBrown on February 26, 1981 10:08 AM
-- Added putChar, cleanup, and verbose parms to Print.
Changed by MBrown on 17-Jun-81 12:05:42
-- Added CloseDBGroupScansActive, CloseDBTuplesetScansActive counters.
Changed by Cattell on 15-Dec-81 10:16:23
-- Modified to use IOStream.
Changed by Cattell on April 29, 1982 8:23 pm
-- Added DBView events.
Changed by Willie-Sue on June 24, 1982 12:00 pm
-- IOStream => IO
Changed by Cattell on October 11, 1982 3:25 pm
-- Added more DBView events, removed old DBTuples events. Added Aborting.
Changed by MBrown on November 29, 1982 2:04 pm
-- New DBFile events