| .TH VENTI-CACHE 3 |
| .SH NAME |
| VtBlock, VtCache, |
| vtblockcopy, |
| vtblockduplock, |
| vtblockput, |
| vtblockwrite, |
| vtcachealloc, |
| vtcacheallocblock, |
| 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, ulong maxmem); |
| .PP |
| .B |
| void vtcachefree(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, ulong size); |
| .PP |
| .B |
| VtBlock* vtcachelocal(VtCache *c, u32int addr, int type); |
| .PP |
| .B |
| VtBlock* vtcacheglobal(VtCache *c, uchar[VtScoreSize], int type, ulong size); |
| .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); |
| .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 (3) |
| and |
| .IR venti-client (3)), |
| with |
| .I maxmem |
| bytes of memory. |
| .PP |
| .I Vtcachefree |
| frees a cache and all the associated blocks. |
| .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 |
| .I type |
| and |
| .IR size . |
| .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 |
| .IR score , |
| .I dtype |
| and |
| .I size |
| 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 (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 (3), |
| .IR venti-client (3), |
| .IR venti-conn (3), |
| .IR venti-file (3), |
| .IR venti (7) |