123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- .TH VENTI-CACHE 2
- .SH NAME
- VtBlock, VtCache,
- vtblockcopy,
- vtblockdirty,
- vtblockduplock,
- vtblockput,
- vtblockwrite,
- vtcachealloc,
- vtcacheallocblock,
- vtcacheblocksize,
- vtcachefree,
- vtcacheglobal,
- vtcachelocal,
- vtcachesetwrite,
- vtglobaltolocal,
- vtlocaltoglobal \- Venti block cache
- .SH SYNOPSIS
- .ft L
- #include <u.h>
- .br
- #include <libc.h>
- .br
- #include <venti.h>
- .ta +\w'\fLxxxx 'u
- .PP
- .ft L
- .nf
- typedef struct VtBlock
- {
- uchar *data;
- uchar type;
- uchar score[VtScoreSize];
- u32int addr;
- ...
- } VtBlock;
- .ta +\w'\fLVtBlock* 'u +\w'\fLxxxxxxxx'u
- .PP
- .B
- VtCache* vtcachealloc(VtConn *z, int blocksize, ulong nblocks);
- .PP
- .B
- void vtcachefree(VtCache *c);
- .PP
- .B
- u32int vtcacheblocksize(VtCache *c);
- .PP
- .B
- u32int vtglobaltolocal(uchar score[VtScoreSize])
- .br
- .B
- void vtlocaltoglobal(u32int local, uchar score[VtScoreSize])
- .PP
- .B
- VtBlock* vtcacheallocblock(VtCache *c, int type);
- .PP
- .B
- VtBlock* vtcachelocal(VtCache *c, u32int addr, int type);
- .PP
- .B
- VtBlock* vtcacheglobal(VtCache *c, uchar[VtScoreSize], int type);
- .PP
- .B
- void vtblockput(VtBlock *b);
- .PP
- .B
- void vtblockduplock(VtBlock *b);
- .PP
- .B
- int vtblockwrite(VtBlock *b);
- .PP
- .B
- void vtcachesetwrite(VtCache *c,
- .br
- .B
- int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
- .PP
- .B
- VtBlock* vtblockcopy(VtBlock *b);
- .PP
- .B
- int vtblockdirty(VtBlock *b);
- .SH DESCRIPTION
- These functions provide access to a simple in-memory
- cache of blocks already stored on a Venti server
- and blocks that will eventually be stored on a Venti server.
- .PP
- A
- .B VtBlock
- represents a venti data block.
- Blocks stored on a venti server,
- called
- .IR "global blocks" ,
- are named by the SHA1 hash of their contents.
- This hash is recorded as the block's
- .IR score .
- Such blocks are immutable.
- The cache also stores mutable blocks that have not yet been
- written to a venti server. These blocks are called
- .IR "local blocks" ,
- and have special scores that are 16 zero bytes
- followed by a 4-byte big-endian
- .IR address .
- The address is an index into the internal set of cache blocks.
- .PP
- The user-visible contents of a
- .B VtBlock
- are
- .BR data ,
- a pointer to the data;
- .BR type ,
- the venti block type;
- .BR score ,
- the block's score;
- and
- .BR addr ,
- the block's cache address.
- .PP
- .I Vtcachealloc
- allocates a new cache using the client connection
- .I z
- (see
- .IR venti-conn (2)
- and
- .IR venti-client (2)),
- with room for
- .I nblocks
- of maximum block size
- .I blocksize .
- .PP
- .I Vtcachefree
- frees a cache and all the associated blocks.
- .PP
- .I Vtcacheblocksize
- returns the cache's maximum block size.
- .PP
- .I Vtglobaltolocal
- returns the local address corresponding to the given
- local
- .IR score .
- If passed a global score,
- .I vtglobaltolocal
- returns the special constant
- .B NilBlock
- .RB ( ~0 ).
- .I Vtlocaltoglobal
- is the opposite, setting
- .I score
- to the local score for the cache address
- .IR local .
- .PP
- .I Vtcacheallocblock
- allocates a new local block with the given
- .IR type .
- .PP
- .I Vtcachelocal
- retrieves the local block at address
- .I addr
- from the cache.
- The given
- .I type
- must match the type of the block found at
- .IR addr .
- .PP
- .I Vtcacheglobal
- retrieves the block with the given
- .I score
- and
- .I dtype
- from the cache, consulting the Venti server
- if necessary.
- If passed a local score,
- .I vtcacheglobal
- invokes
- .I vtcachelocal
- appropriately.
- .PP
- The block references returned by
- .IR vtcacheallocblock ,
- .IR vtcachelocal ,
- and
- .I vtcacheglobal
- must be released when no longer needed.
- .I Vtblockput
- releases such a reference.
- .PP
- It is occasionally convenient to have multiple variables
- refer to the same block.
- .I Vtblockduplock
- increments the block's reference count so that
- an extra
- .I vtblockput
- will be required in order to release the block.
- .PP
- .I Vtblockwrite
- writes a local block to the Venti server,
- changing the block to a global block.
- It calls the cache's
- .I write
- function
- to write the block to the server.
- The default
- .I write
- function is
- .I vtwrite
- (see
- .IR venti-client (2));
- .I vtsetcachewrite
- sets it.
- .I Vtsetcachewrite
- is used by clients to install replacement functions
- that run writes in the background or perform other
- additional processing.
- .PP
- .I Vtblockcopy
- copies a block in preparation for modifying its contents.
- The old block may be a local or global block,
- but the new block will be a local block.
- .PP
- The cache only evicts global blocks.
- Local blocks can only leave the cache via
- .IR vtblockwrite ,
- which turns them into global blocks, making them candidates for
- eviction.
- .PP
- If a new cache block must be allocated (for
- .IR vtcacheallocblock ,
- .IR vtcachelocal ,
- .IR vtcacheglobal ,
- or
- .IR vtblockcopy ),
- but the cache is filled (with local blocks and blocks that
- have not yet been released with
- .IR vtblockput ),
- the library prints the score and reference count of
- every block in the cache and then aborts.
- A full cache indicates either that the cache is too small,
- or, more commonly, that cache blocks are being leaked.
- .SH SOURCE
- .B /sys/src/libventi
- .SH SEE ALSO
- .IR venti (2),
- .IR venti-client (2),
- .IR venti-conn (2),
- .IR venti-file (2),
- .IR venti (6)
|