UP

These are the primary tool of space banks{(p2,bank)}. All calls to range keys {including sever} are as prompt as the space being accessed.

Page Range

Each page range key PRANGE defines an injective function f from the non-negative integers less than N to coded disk addresses. N is some constant number that depends on the range key. {You learn this number from the provider of the key.}

f is an injective function iff For all x For all y If f(x) = f(y) then x = y.

If f(rcda) is defined, PRANGE(0,((4,rcda));==>c;K) returns 0 in c and a page key in K with RO off whose coded disk address is f(rcda); otherwise it returns 1 in c. If there is a permanent I/O error for that page, c is 3. {If the page is not on any mounted disk, the operation waits until it is.}

PRANGE(5,((4,rcda)); ==> c;K) is the same as order code 0 except that if the page is not on any mounted disk, c is 2.

{ni}PRANGE(?,((4,n),(4,m));==>c;PR) returns a new page range key PR whose range is a subrange of the range of PRANGE if n+m is less than the size of the range of PRANGE {otherwise c will be -1 and no key will be returned}. f(0) for the new key will be f(n) for the old key. The new key will be for m CDA's.

If (K is not a page key with RO off or there exists no number x such that f(x) is K's CDA) and 1 <= n <= 4 or n=6 then PRANGE(n;K==>-1;). If K is a page key with RO off and there exists a {unique} integer x such that the coded disk address of the page is f(x), then:

PRANGE(1;K==>c,((4,x));) returns that x and returns (if page is gratis then 1 else 0) in c.

PRANGE(2;K==>0;) {"sever"} changes all slots holding keys to the page designated by K to hold DK(0). Fine print: If the page being severed is the parameter page of the sever operation, the effect is unpredictable.

PRANGE(6;K==>0;) {"sever and zero"} is like sever {(sever)} but clears the page to zeros as well.

PRANGE(3;K==>0;) makes the page gratis.

PRANGE(4;K==>0;) makes the page non-gratis.

Design Note

It might be useful to have a call that copied the data from page A to page B. This could be optimized by not reading B from the disk. Unfortunately the CDA of B would still be required from the disk.

With FBA disks we can get the CDA cheap without the rest of the page.

These keys are restricted merely because we wish to keep for a while longer the freedom to change their architecture and we think there is no great need to spread them widely.

Applications can use range keys directly if rescinding is done by abandoning a range of CDAs. This is feasible with six byte CDAs (the current size). This requires reformating packs in order to ensure that the application or its assignees can no longer access the disk.

Node Range

{Same as above, substituting NRANGE for PRANGE and "node" for "page". Also, under "NRANGE(2,...)", if there is a process in the node the process disappears leaving the node busy.} Fine print: if, in a sever operation, the node being severed is part of the domain to which control is returned after the operation, the effect is unpredictable.

{ni}Relative Unspec

If K designates a page or key and R is a range key which can produce a node key or page key to that node or page then there is a call on R that returns the relative cda of the node or page along with all of the other information within the key K. {Including, perhaps, whether there is a process in the indicated node.} {This is tantamount to removing the clause "with RO off" in the operation described at (getcda).}

See (p3,scrut).

See (lim-range) for a possible new type of range key.