1 be7cbb4e 2005-07-12 devnull .TH VENTI-CACHE 3
3 be7cbb4e 2005-07-12 devnull VtBlock, VtCache,
4 be7cbb4e 2005-07-12 devnull vtblockcopy,
5 be7cbb4e 2005-07-12 devnull vtblockdirty,
6 be7cbb4e 2005-07-12 devnull vtblockduplock,
7 be7cbb4e 2005-07-12 devnull vtblockput,
8 be7cbb4e 2005-07-12 devnull vtblockwrite,
9 be7cbb4e 2005-07-12 devnull vtcachealloc,
10 be7cbb4e 2005-07-12 devnull vtcacheallocblock,
11 be7cbb4e 2005-07-12 devnull vtcacheblocksize,
12 be7cbb4e 2005-07-12 devnull vtcachefree,
13 be7cbb4e 2005-07-12 devnull vtcacheglobal,
14 be7cbb4e 2005-07-12 devnull vtcachelocal,
15 be7cbb4e 2005-07-12 devnull vtcachesetwrite,
16 be7cbb4e 2005-07-12 devnull vtglobaltolocal,
17 be7cbb4e 2005-07-12 devnull vtlocaltoglobal \- Venti block cache
18 be7cbb4e 2005-07-12 devnull .SH SYNOPSIS
20 be7cbb4e 2005-07-12 devnull #include <u.h>
22 be7cbb4e 2005-07-12 devnull #include <libc.h>
24 be7cbb4e 2005-07-12 devnull #include <venti.h>
25 be7cbb4e 2005-07-12 devnull .ta +\w'\fLxxxx 'u
27 be7cbb4e 2005-07-12 devnull typedef struct VtBlock
29 be7cbb4e 2005-07-12 devnull uchar *data;
30 be7cbb4e 2005-07-12 devnull uchar type;
31 be7cbb4e 2005-07-12 devnull uchar score[VtScoreSize];
32 be7cbb4e 2005-07-12 devnull u32int addr;
34 be7cbb4e 2005-07-12 devnull } VtBlock;
35 be7cbb4e 2005-07-12 devnull .ta +\w'\fLVtBlock* 'u +\w'\fLxxxxxxxx'u
38 be7cbb4e 2005-07-12 devnull VtCache* vtcachealloc(VtConn *z, int blocksize, ulong nblocks, int mode);
41 be7cbb4e 2005-07-12 devnull void vtcachefree(VtCache *c);
44 be7cbb4e 2005-07-12 devnull u32int vtcacheblocksize(VtCache *c);
47 be7cbb4e 2005-07-12 devnull int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
50 be7cbb4e 2005-07-12 devnull u32int vtglobaltolocal(uchar score[VtScoreSize])
53 be7cbb4e 2005-07-12 devnull void vtlocaltoglobal(u32int local, uchar score[VtScoreSize])
56 be7cbb4e 2005-07-12 devnull VtBlock* vtcacheallocblock(VtCache *c, int type);
59 be7cbb4e 2005-07-12 devnull VtBlock* vtcachelocal(VtCache *c, u32int addr, int type);
62 be7cbb4e 2005-07-12 devnull VtBlock* vtcacheglobal(VtCache *c, uchar[VtScoreSize], int type);
65 be7cbb4e 2005-07-12 devnull void vtblockput(VtBlock *b);
68 be7cbb4e 2005-07-12 devnull void vtblockduplock(VtBlock *b);
71 be7cbb4e 2005-07-12 devnull int vtblockwrite(VtBlock *b);
74 be7cbb4e 2005-07-12 devnull void vtcachesetwrite(VtCache *c,
77 be7cbb4e 2005-07-12 devnull VtBlock* vtblockcopy(VtBlock *b);
80 be7cbb4e 2005-07-12 devnull int vtblockdirty(VtBlock *b);
81 be7cbb4e 2005-07-12 devnull .SH DESCRIPTION
82 be7cbb4e 2005-07-12 devnull These functions provide access to a simple in-memory
83 be7cbb4e 2005-07-12 devnull cache of blocks already stored on a Venti server
84 be7cbb4e 2005-07-12 devnull and blocks that will eventually be stored on a Venti server.
86 be7cbb4e 2005-07-12 devnull .I Vtcachealloc
87 be7cbb4e 2005-07-12 devnull allocates a new cache using the client connection
90 be7cbb4e 2005-07-12 devnull .IR venti-conn (3)
92 be7cbb4e 2005-07-12 devnull .IR venti-client (3)),
93 be7cbb4e 2005-07-12 devnull with room for
94 be7cbb4e 2005-07-12 devnull .I nblocks
95 be7cbb4e 2005-07-12 devnull of maximum block size
96 be7cbb4e 2005-07-12 devnull .I blocksize .
98 be7cbb4e 2005-07-12 devnull .I Vtcachefree
99 be7cbb4e 2005-07-12 devnull frees a cache and all the associated blocks.
101 be7cbb4e 2005-07-12 devnull .I Vtcacheblocksize
103 be7cbb4e 2005-07-12 devnull XXX global vs local blocks
105 be7cbb4e 2005-07-12 devnull .I Vtcacheallocblock
106 be7cbb4e 2005-07-12 devnull allocates a new local block with the given
107 be7cbb4e 2005-07-12 devnull .IR type .
109 be7cbb4e 2005-07-12 devnull .I Vtcachelocal
110 be7cbb4e 2005-07-12 devnull retrieves the local block at address
112 be7cbb4e 2005-07-12 devnull from the cache.
113 be7cbb4e 2005-07-12 devnull The given
115 be7cbb4e 2005-07-12 devnull must match the type of the block found at
116 be7cbb4e 2005-07-12 devnull .IR addr .
118 be7cbb4e 2005-07-12 devnull .I Vtcacheglobal
119 be7cbb4e 2005-07-12 devnull retrieves the block with the given
120 be7cbb4e 2005-07-12 devnull .I score
122 be7cbb4e 2005-07-12 devnull .I dtype
123 be7cbb4e 2005-07-12 devnull from the cache, consulting the Venti server
124 be7cbb4e 2005-07-12 devnull if necessary.
125 be7cbb4e 2005-07-12 devnull If passed a local score,
126 be7cbb4e 2005-07-12 devnull .I vtcacheglobal
127 be7cbb4e 2005-07-12 devnull behaves as
128 be7cbb4e 2005-07-12 devnull .IR vtcachelocal .
130 be7cbb4e 2005-07-12 devnull The block references returned by
131 be7cbb4e 2005-07-12 devnull .IR vtcacheallocblock ,
132 be7cbb4e 2005-07-12 devnull .IR vtcachelocal ,
134 be7cbb4e 2005-07-12 devnull .I vtcacheglobal
135 be7cbb4e 2005-07-12 devnull must be released when no longer needed.
136 be7cbb4e 2005-07-12 devnull .I Vtblockput
137 be7cbb4e 2005-07-12 devnull releases such a reference.
139 be7cbb4e 2005-07-12 devnull It is occasionally convenient to have multiple variables
140 be7cbb4e 2005-07-12 devnull refer to the same block.
141 be7cbb4e 2005-07-12 devnull .I Vtblockduplock
142 be7cbb4e 2005-07-12 devnull increments the block's reference count so that
143 be7cbb4e 2005-07-12 devnull an extra
144 be7cbb4e 2005-07-12 devnull .I vtblockput
145 be7cbb4e 2005-07-12 devnull will be required in order to release the block.
147 be7cbb4e 2005-07-12 devnull .I Vtblockwrite
148 be7cbb4e 2005-07-12 devnull writes a local block to the Venti server,
149 be7cbb4e 2005-07-12 devnull changing the block to a global block.
150 be7cbb4e 2005-07-12 devnull It calls the cache's
151 be7cbb4e 2005-07-12 devnull .I write
152 be7cbb4e 2005-07-12 devnull function
153 be7cbb4e 2005-07-12 devnull to write the block to the server.
154 be7cbb4e 2005-07-12 devnull The default
155 be7cbb4e 2005-07-12 devnull .I write
156 be7cbb4e 2005-07-12 devnull function is
157 be7cbb4e 2005-07-12 devnull .I vtwrite
159 be7cbb4e 2005-07-12 devnull .IR venti-client (3));
160 be7cbb4e 2005-07-12 devnull .I vtsetcachewrite
161 be7cbb4e 2005-07-12 devnull sets it.
162 be7cbb4e 2005-07-12 devnull .I Vtsetcachewrite
163 be7cbb4e 2005-07-12 devnull is used by clients to install replacement functions
164 be7cbb4e 2005-07-12 devnull that run writes in the background or perform other
165 be7cbb4e 2005-07-12 devnull additional processing.
167 be7cbb4e 2005-07-12 devnull .I Vtblockcopy
168 be7cbb4e 2005-07-12 devnull copies a block in preparation for modifying its contents.
169 be7cbb4e 2005-07-12 devnull The old block may be a local or global block,
170 be7cbb4e 2005-07-12 devnull but the new block will be a local block.
172 be7cbb4e 2005-07-12 devnull The cache only evicts global blocks.
173 be7cbb4e 2005-07-12 devnull Local blocks can only leave the cache via
174 be7cbb4e 2005-07-12 devnull .IR vtblockwrite ,
175 be7cbb4e 2005-07-12 devnull which turns them into global blocks, making them candidates for
176 be7cbb4e 2005-07-12 devnull eviction.
178 be7cbb4e 2005-07-12 devnull If a new cache block must be allocated (for
179 be7cbb4e 2005-07-12 devnull .IR vtcacheallocblock ,
180 be7cbb4e 2005-07-12 devnull .IR vtcachelocal ,
181 be7cbb4e 2005-07-12 devnull .IR vtcacheglobal ,
183 be7cbb4e 2005-07-12 devnull .IR vtblockcopy ),
184 be7cbb4e 2005-07-12 devnull but the cache is filled (with local blocks and blocks that
185 be7cbb4e 2005-07-12 devnull have not yet been released with
186 be7cbb4e 2005-07-12 devnull .IR vtblockput ),
187 be7cbb4e 2005-07-12 devnull the library prints the score and reference count of
188 be7cbb4e 2005-07-12 devnull every block in the cache and then aborts.
189 be7cbb4e 2005-07-12 devnull A full cache indicates either that the cache is too small,
190 be7cbb4e 2005-07-12 devnull or, more commonly, that cache blocks are being leaked.
191 be7cbb4e 2005-07-12 devnull .SH SOURCE
192 be7cbb4e 2005-07-12 devnull .B \*9/src/libventi
193 be7cbb4e 2005-07-12 devnull .SH SEE ALSO
194 be7cbb4e 2005-07-12 devnull .IR venti (1),
195 be7cbb4e 2005-07-12 devnull .IR venti (3),
196 be7cbb4e 2005-07-12 devnull .IR venti-client (3),
197 be7cbb4e 2005-07-12 devnull .IR venti-conn (3),
198 be7cbb4e 2005-07-12 devnull .IR venti-file (3)