A technique is described for guaranteeing recovery in a computer system comprising
of recovery contracts with a plurality of obligations for a message exchange between
a first component and a second component. Three forms of contract are described,
governing interactions between three types of components. Each contract is bilateral,
i.e. between a first component and a second component. The first and second components
have mutual agreement on when the contract will be released to facilitate log truncation,
and independent and/or autonomous recovery. The use of persistent and transactional
components and the requirements for ensuring that it is possible to replay the
components in a deterministic fashion, can result in a high cost or overhead in
logging of nondeterministic events, including component interactions. An appreciation
that this requirement may result in overly pessimistic logging has led to the definition
of three additional component types, a functional component, a subordinate component
and a read-only component.