From be7cbb4ef2cb02aa9ac48c02dc1ee585a8e49043 Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 12 Jul 2005 15:24:18 +0000 Subject: venti, now with documentation! --- man/man3/venti-cache.3 | 198 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 man/man3/venti-cache.3 (limited to 'man/man3/venti-cache.3') diff --git a/man/man3/venti-cache.3 b/man/man3/venti-cache.3 new file mode 100644 index 00000000..bdd18ec4 --- /dev/null +++ b/man/man3/venti-cache.3 @@ -0,0 +1,198 @@ +.TH VENTI-CACHE 3 +.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 +.br +#include +.br +#include +.ta +\w'\fLxxxx 'u +.PP +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, int mode); +.PP +.B +void vtcachefree(VtCache *c); +.PP +.B +u32int vtcacheblocksize(VtCache *c); +.br +.B + int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int)); +.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, +.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 +.I Vtcachealloc +allocates a new cache using the client connection +.I z +(see +.IR venti-conn (3) +and +.IR venti-client (3)), +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 +.PP +XXX global vs local blocks +.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 +behaves as +.IR vtcachelocal . +.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 (3)); +.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 \*9/src/libventi +.SH SEE ALSO +.IR venti (1), +.IR venti (3), +.IR venti-client (3), +.IR venti-conn (3), +.IR venti-file (3) -- cgit v1.2.3