1 a0d146ed 2005-07-12 devnull typedef struct Config Config;
2 a0d146ed 2005-07-12 devnull typedef struct AMap AMap;
3 a0d146ed 2005-07-12 devnull typedef struct AMapN AMapN;
4 a0d146ed 2005-07-12 devnull typedef struct Arena Arena;
5 a0d146ed 2005-07-12 devnull typedef struct AState AState;
6 7a400ee9 2007-09-25 rsc typedef struct ArenaCIG ArenaCIG;
7 a0d146ed 2005-07-12 devnull typedef struct ArenaHead ArenaHead;
8 a0d146ed 2005-07-12 devnull typedef struct ArenaPart ArenaPart;
9 a0d146ed 2005-07-12 devnull typedef struct ArenaTail ArenaTail;
10 a0d146ed 2005-07-12 devnull typedef struct ATailStats ATailStats;
11 a0d146ed 2005-07-12 devnull typedef struct CIBlock CIBlock;
12 a0d146ed 2005-07-12 devnull typedef struct Clump Clump;
13 a0d146ed 2005-07-12 devnull typedef struct ClumpInfo ClumpInfo;
14 a0d146ed 2005-07-12 devnull typedef struct Graph Graph;
15 a0d146ed 2005-07-12 devnull typedef struct IAddr IAddr;
16 a0d146ed 2005-07-12 devnull typedef struct IBucket IBucket;
17 a0d146ed 2005-07-12 devnull typedef struct IEStream IEStream;
18 a0d146ed 2005-07-12 devnull typedef struct IEntry IEntry;
19 a0d146ed 2005-07-12 devnull typedef struct IFile IFile;
20 a0d146ed 2005-07-12 devnull typedef struct ISect ISect;
21 a0d146ed 2005-07-12 devnull typedef struct Index Index;
22 a0d146ed 2005-07-12 devnull typedef struct Lump Lump;
23 a0d146ed 2005-07-12 devnull typedef struct DBlock DBlock;
24 a0d146ed 2005-07-12 devnull typedef struct Part Part;
25 a0d146ed 2005-07-12 devnull typedef struct Statbin Statbin;
26 a0d146ed 2005-07-12 devnull typedef struct Statdesc Statdesc;
27 a0d146ed 2005-07-12 devnull typedef struct Stats Stats;
28 a0d146ed 2005-07-12 devnull typedef struct ZBlock ZBlock;
29 a0d146ed 2005-07-12 devnull typedef struct Round Round;
30 a0d146ed 2005-07-12 devnull typedef struct Bloom Bloom;
32 7a400ee9 2007-09-25 rsc #pragma incomplete IEStream
34 7a400ee9 2007-09-25 rsc #define TWID32 ((u32int)~(u32int)0)
35 7a400ee9 2007-09-25 rsc #define TWID64 ((u64int)~(u64int)0)
36 a0d146ed 2005-07-12 devnull #define TWID8 ((u8int)~(u8int)0)
41 75d04888 2009-05-25 rsc * formerly fundamental constant,
42 75d04888 2009-05-25 rsc * now a server-imposed limitation.
44 75d04888 2009-05-25 rsc VtMaxLumpSize = 56*1024,
46 a0d146ed 2005-07-12 devnull ABlockLog = 9, /* log2(512), the quantum for reading arenas */
47 a0d146ed 2005-07-12 devnull ANameSize = 64,
48 a0d146ed 2005-07-12 devnull MaxDiskBlock = 64*1024, /* max. allowed size for a disk block */
49 a0d146ed 2005-07-12 devnull MaxIoSize = 64*1024, /* max. allowed size for a disk io operation */
50 a0d146ed 2005-07-12 devnull PartBlank = 256*1024, /* untouched section at beginning of partition */
51 a0d146ed 2005-07-12 devnull HeadSize = 512, /* size of a header after PartBlank */
52 a0d146ed 2005-07-12 devnull MinArenaSize = 1*1024*1024, /* smallest reasonable arena size */
53 a0d146ed 2005-07-12 devnull IndexBase = 1024*1024, /* initial address to use in an index */
54 a0d146ed 2005-07-12 devnull MaxIo = 64*1024, /* max size of a single read or write operation */
55 a0d146ed 2005-07-12 devnull ICacheBits = 16, /* default bits for indexing icache */
56 ce31e3d4 2008-07-04 rsc MaxAMap = 31*1024, /* max. allowed arenas in an address mapping; must be < 32*1024 */
57 f5a8ea6f 2011-06-02 rsc Unspecified = TWID32,
60 a0d146ed 2005-07-12 devnull * return codes from syncarena
62 a0d146ed 2005-07-12 devnull SyncDataErr = 1 << 0, /* problem reading the clump data */
63 a0d146ed 2005-07-12 devnull SyncCIErr = 1 << 1, /* found erroneous clump directory entries */
64 a0d146ed 2005-07-12 devnull SyncCIZero = 1 << 2, /* found unwritten clump directory entries */
65 a0d146ed 2005-07-12 devnull SyncFixErr = 1 << 3, /* error writing fixed data */
66 a0d146ed 2005-07-12 devnull SyncHeader = 1 << 4, /* altered header fields */
69 a0d146ed 2005-07-12 devnull * error severity
71 a0d146ed 2005-07-12 devnull EOk = 0, /* error expected in normal operation */
72 a0d146ed 2005-07-12 devnull EStrange, /* strange error that should be logged */
73 a0d146ed 2005-07-12 devnull ECorrupt, /* corrupted data found in arenas */
74 a0d146ed 2005-07-12 devnull EICorrupt, /* corrupted data found in index */
75 a0d146ed 2005-07-12 devnull EAdmin, /* should be brought to administrators' attention */
76 a0d146ed 2005-07-12 devnull ECrash, /* really bad internal error */
77 a0d146ed 2005-07-12 devnull EBug, /* a limitation which should be fixed */
78 a0d146ed 2005-07-12 devnull EInconsist, /* inconsistencies between index and arena */
82 a0d146ed 2005-07-12 devnull * internal disk formats for the venti archival storage system
85 a0d146ed 2005-07-12 devnull * magic numbers on disk
87 28b49df3 2006-07-18 devnull _ClumpMagic = 0xd15cb10cU, /* clump header, deprecated */
88 a0d146ed 2005-07-12 devnull ClumpFreeMagic = 0, /* free clump; terminates active clump log */
90 28b49df3 2006-07-18 devnull ArenaPartMagic = 0xa9e4a5e7U, /* arena partition header */
91 28b49df3 2006-07-18 devnull ArenaMagic = 0xf2a14eadU, /* arena trailer */
92 28b49df3 2006-07-18 devnull ArenaHeadMagic = 0xd15c4eadU, /* arena header */
94 28b49df3 2006-07-18 devnull BloomMagic = 0xb1004eadU, /* bloom filter header */
95 a0d146ed 2005-07-12 devnull BloomMaxHash = 32,
97 28b49df3 2006-07-18 devnull ISectMagic = 0xd15c5ec7U, /* index header */
99 a0d146ed 2005-07-12 devnull ArenaPartVersion = 3,
100 a0d146ed 2005-07-12 devnull ArenaVersion4 = 4,
101 a0d146ed 2005-07-12 devnull ArenaVersion5 = 5,
102 a0d146ed 2005-07-12 devnull BloomVersion = 1,
103 a0d146ed 2005-07-12 devnull IndexVersion = 1,
104 a0d146ed 2005-07-12 devnull ISectVersion1 = 1,
105 a0d146ed 2005-07-12 devnull ISectVersion2 = 2,
108 a0d146ed 2005-07-12 devnull * encodings of clumps on disk
110 a0d146ed 2005-07-12 devnull ClumpEErr = 0, /* can't happen */
111 a0d146ed 2005-07-12 devnull ClumpENone, /* plain */
112 a0d146ed 2005-07-12 devnull ClumpECompress, /* compressed */
113 a0d146ed 2005-07-12 devnull ClumpEMax,
116 a0d146ed 2005-07-12 devnull * sizes in bytes on disk
118 a0d146ed 2005-07-12 devnull U8Size = 1,
119 a0d146ed 2005-07-12 devnull U16Size = 2,
120 a0d146ed 2005-07-12 devnull U32Size = 4,
121 a0d146ed 2005-07-12 devnull U64Size = 8,
123 a0d146ed 2005-07-12 devnull ArenaPartSize = 4 * U32Size,
124 a0d146ed 2005-07-12 devnull ArenaSize4 = 2 * U64Size + 6 * U32Size + ANameSize + U8Size,
125 a0d146ed 2005-07-12 devnull ArenaSize5 = ArenaSize4 + U32Size,
126 28b49df3 2006-07-18 devnull ArenaSize5a = ArenaSize5 + 2 * U8Size + 2 * U32Size + 2 * U64Size,
127 a0d146ed 2005-07-12 devnull ArenaHeadSize4 = U64Size + 3 * U32Size + ANameSize,
128 a0d146ed 2005-07-12 devnull ArenaHeadSize5 = ArenaHeadSize4 + U32Size,
129 a0d146ed 2005-07-12 devnull BloomHeadSize = 4 * U32Size,
130 a0d146ed 2005-07-12 devnull ISectSize1 = 7 * U32Size + 2 * ANameSize,
131 a0d146ed 2005-07-12 devnull ISectSize2 = ISectSize1 + U32Size,
132 a0d146ed 2005-07-12 devnull ClumpInfoSize = U8Size + 2 * U16Size + VtScoreSize,
133 a0d146ed 2005-07-12 devnull ClumpSize = ClumpInfoSize + U8Size + 3 * U32Size,
134 a0d146ed 2005-07-12 devnull MaxBloomSize = 1<<(32-3), /* 2^32 bits */
135 a0d146ed 2005-07-12 devnull MaxBloomHash = 32, /* bits per score */
137 a0d146ed 2005-07-12 devnull * BUG - The various block copies that manipulate entry buckets
138 a0d146ed 2005-07-12 devnull * would be faster if we bumped IBucketSize up to 8 and IEntrySize up to 40,
139 a0d146ed 2005-07-12 devnull * so that everything is word-aligned. Buildindex is actually cpu-bound
140 a0d146ed 2005-07-12 devnull * by the (byte at a time) copying in qsort.
142 a0d146ed 2005-07-12 devnull IBucketSize = U32Size + U16Size,
143 a0d146ed 2005-07-12 devnull IEntrySize = U64Size + U32Size + 2*U16Size + 2*U8Size + VtScoreSize,
144 28b49df3 2006-07-18 devnull IEntryTypeOff = VtScoreSize + U32Size + U16Size + U64Size + U16Size,
145 28b49df3 2006-07-18 devnull IEntryAddrOff = VtScoreSize + U32Size + U16Size,
147 a0d146ed 2005-07-12 devnull MaxClumpBlocks = (VtMaxLumpSize + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog,
149 28b49df3 2006-07-18 devnull IcacheFrac = 1000000, /* denominator */
151 28b49df3 2006-07-18 devnull SleepForever = 1000000000, /* magic value for sleep time */
153 a0d146ed 2005-07-12 devnull * dirty flags - order controls disk write order
155 a0d146ed 2005-07-12 devnull DirtyArena = 1,
156 a0d146ed 2005-07-12 devnull DirtyArenaCib,
157 a0d146ed 2005-07-12 devnull DirtyArenaTrailer,
158 a0d146ed 2005-07-12 devnull DirtyMax,
160 7a400ee9 2007-09-25 rsc ArenaCIGSize = 10*1024, // about 0.5 MB worth of IEntry.
162 a0d146ed 2005-07-12 devnull VentiZZZZZZZZ
165 a0d146ed 2005-07-12 devnull extern char TraceDisk[];
166 a0d146ed 2005-07-12 devnull extern char TraceLump[];
167 a0d146ed 2005-07-12 devnull extern char TraceBlock[];
168 a0d146ed 2005-07-12 devnull extern char TraceProc[];
169 a0d146ed 2005-07-12 devnull extern char TraceWork[];
170 a0d146ed 2005-07-12 devnull extern char TraceQuiet[];
171 a0d146ed 2005-07-12 devnull extern char TraceRpc[];
174 a0d146ed 2005-07-12 devnull * results of parsing and initializing a config file
176 a0d146ed 2005-07-12 devnull struct Config
178 a0d146ed 2005-07-12 devnull char *index; /* name of the index to initialize */
179 a0d146ed 2005-07-12 devnull int naparts; /* arena partitions initialized */
180 a0d146ed 2005-07-12 devnull ArenaPart **aparts;
181 a0d146ed 2005-07-12 devnull int nsects; /* index sections initialized */
182 a0d146ed 2005-07-12 devnull ISect **sects;
183 a0d146ed 2005-07-12 devnull Bloom *bloom; /* bloom filter */
184 a0d146ed 2005-07-12 devnull u32int bcmem;
185 a0d146ed 2005-07-12 devnull u32int mem;
186 a0d146ed 2005-07-12 devnull u32int icmem;
187 a0d146ed 2005-07-12 devnull int queuewrites;
188 a0d146ed 2005-07-12 devnull char* haddr;
189 a0d146ed 2005-07-12 devnull char* vaddr;
190 a0d146ed 2005-07-12 devnull char* webroot;
194 a0d146ed 2005-07-12 devnull * a Part is the low level interface to files or disks.
195 a0d146ed 2005-07-12 devnull * there are two main types of partitions
196 a0d146ed 2005-07-12 devnull * arena paritions, which some number of arenas, each in a sub-partition.
197 a0d146ed 2005-07-12 devnull * index partition, which only have one subpartition.
199 a0d146ed 2005-07-12 devnull struct Part
201 a0d146ed 2005-07-12 devnull int fd; /* rock for accessing the disk */
202 a0d146ed 2005-07-12 devnull int mode;
203 a0d146ed 2005-07-12 devnull u64int offset;
204 a0d146ed 2005-07-12 devnull u64int size; /* size of the partiton */
205 a0d146ed 2005-07-12 devnull u32int blocksize; /* block size for reads and writes */
206 a0d146ed 2005-07-12 devnull u32int fsblocksize; /* minimum file system block size */
207 a0d146ed 2005-07-12 devnull char *name;
208 a0d146ed 2005-07-12 devnull char *filename;
209 a0d146ed 2005-07-12 devnull Channel *writechan; /* chan[dcache.nblock](DBlock*) */
213 a0d146ed 2005-07-12 devnull * a cached block from the partition
214 a0d146ed 2005-07-12 devnull * yuck -- most of this is internal structure for the cache
215 a0d146ed 2005-07-12 devnull * all other routines should only use data
217 a0d146ed 2005-07-12 devnull struct DBlock
219 a0d146ed 2005-07-12 devnull u8int *data;
221 a0d146ed 2005-07-12 devnull Part *part; /* partition in which cached */
222 a0d146ed 2005-07-12 devnull u64int addr; /* base address on the partition */
223 a0d146ed 2005-07-12 devnull u32int size; /* amount of data available, not amount allocated; should go away */
224 a0d146ed 2005-07-12 devnull u32int mode;
225 a0d146ed 2005-07-12 devnull u32int dirty;
226 a0d146ed 2005-07-12 devnull u32int dirtying;
227 a0d146ed 2005-07-12 devnull DBlock *next; /* doubly linked hash chains */
228 a0d146ed 2005-07-12 devnull DBlock *prev;
229 a0d146ed 2005-07-12 devnull u32int heap; /* index in heap table */
230 a0d146ed 2005-07-12 devnull u32int used; /* last reference times */
231 a0d146ed 2005-07-12 devnull u32int used2;
232 a0d146ed 2005-07-12 devnull u32int ref; /* reference count */
233 a0d146ed 2005-07-12 devnull RWLock lock; /* for access to data only */
234 fa325e9b 2020-01-10 cross Channel *writedonechan;
235 a0d146ed 2005-07-12 devnull void* chanbuf[1]; /* buffer for the chan! */
239 a0d146ed 2005-07-12 devnull * a cached block from the partition
240 a0d146ed 2005-07-12 devnull * yuck -- most of this is internal structure for the cache
241 a0d146ed 2005-07-12 devnull * all other routines should only use data
242 a0d146ed 2005-07-12 devnull * double yuck -- this is mostly the same as a DBlock
244 a0d146ed 2005-07-12 devnull struct Lump
246 a0d146ed 2005-07-12 devnull Packet *data;
248 a0d146ed 2005-07-12 devnull Part *part; /* partition in which cached */
249 a0d146ed 2005-07-12 devnull u8int score[VtScoreSize]; /* score of packet */
250 a0d146ed 2005-07-12 devnull u8int type; /* type of packet */
251 a0d146ed 2005-07-12 devnull u32int size; /* amount of data allocated to hold packet */
252 a0d146ed 2005-07-12 devnull Lump *next; /* doubly linked hash chains */
253 a0d146ed 2005-07-12 devnull Lump *prev;
254 a0d146ed 2005-07-12 devnull u32int heap; /* index in heap table */
255 a0d146ed 2005-07-12 devnull u32int used; /* last reference times */
256 a0d146ed 2005-07-12 devnull u32int used2;
257 a0d146ed 2005-07-12 devnull u32int ref; /* reference count */
258 a0d146ed 2005-07-12 devnull QLock lock; /* for access to data only */
262 a0d146ed 2005-07-12 devnull * mapping between names and address ranges
264 a0d146ed 2005-07-12 devnull struct AMap
266 a0d146ed 2005-07-12 devnull u64int start;
267 a0d146ed 2005-07-12 devnull u64int stop;
268 a0d146ed 2005-07-12 devnull char name[ANameSize];
272 a0d146ed 2005-07-12 devnull * an AMap along with a length
274 a0d146ed 2005-07-12 devnull struct AMapN
277 a0d146ed 2005-07-12 devnull AMap *map;
281 a0d146ed 2005-07-12 devnull * an ArenaPart is a partition made up of Arenas
282 a0d146ed 2005-07-12 devnull * it exists because most os's don't support many partitions,
283 a0d146ed 2005-07-12 devnull * and we want to have many different Arenas
285 a0d146ed 2005-07-12 devnull struct ArenaPart
287 a0d146ed 2005-07-12 devnull Part *part;
288 a0d146ed 2005-07-12 devnull u64int size; /* size of underlying partition, rounded down to blocks */
289 a0d146ed 2005-07-12 devnull Arena **arenas;
290 a0d146ed 2005-07-12 devnull u32int tabbase; /* base address of arena table on disk */
291 a0d146ed 2005-07-12 devnull u32int tabsize; /* max. bytes in arena table */
294 a0d146ed 2005-07-12 devnull * fields stored on disk
296 a0d146ed 2005-07-12 devnull u32int version;
297 a0d146ed 2005-07-12 devnull u32int blocksize; /* "optimal" block size for reads and writes */
298 a0d146ed 2005-07-12 devnull u32int arenabase; /* base address of first arena */
301 a0d146ed 2005-07-12 devnull * stored in the arena mapping table on disk
303 a0d146ed 2005-07-12 devnull AMap *map;
304 a0d146ed 2005-07-12 devnull int narenas;
308 a0d146ed 2005-07-12 devnull * info about one block in the clump info cache
310 a0d146ed 2005-07-12 devnull struct CIBlock
312 a0d146ed 2005-07-12 devnull u32int block; /* blocks in the directory */
313 a0d146ed 2005-07-12 devnull int offset; /* offsets of one clump in the data */
314 a0d146ed 2005-07-12 devnull DBlock *data;
318 fa325e9b 2020-01-10 cross * Statistics kept in the tail.
320 a0d146ed 2005-07-12 devnull struct ATailStats
322 a0d146ed 2005-07-12 devnull u32int clumps; /* number of clumps */
323 a0d146ed 2005-07-12 devnull u32int cclumps; /* number of compressed clumps */
324 a0d146ed 2005-07-12 devnull u64int used;
325 a0d146ed 2005-07-12 devnull u64int uncsize;
326 a0d146ed 2005-07-12 devnull u8int sealed;
330 a0d146ed 2005-07-12 devnull * Arena state - represents a point in the data log
332 a0d146ed 2005-07-12 devnull struct AState
334 a0d146ed 2005-07-12 devnull Arena *arena;
335 a0d146ed 2005-07-12 devnull u64int aa; /* index address */
336 a0d146ed 2005-07-12 devnull ATailStats stats;
340 a0d146ed 2005-07-12 devnull * an Arena is a log of Clumps, preceeded by an ArenaHeader,
341 a0d146ed 2005-07-12 devnull * and followed by a Arena, each in one disk block.
342 a0d146ed 2005-07-12 devnull * struct on disk is not always up to date, but should be self-consistent.
343 a0d146ed 2005-07-12 devnull * to sync after reboot, follow clumps starting at used until ClumpFreeMagic if found.
344 a0d146ed 2005-07-12 devnull * <struct name="Arena" type="Arena *">
345 a0d146ed 2005-07-12 devnull * <field name="name" val="s->name" type="AName"/>
346 a0d146ed 2005-07-12 devnull * <field name="version" val="s->version" type="U32int"/>
347 a0d146ed 2005-07-12 devnull * <field name="partition" val="s->part->name" type="AName"/>
348 a0d146ed 2005-07-12 devnull * <field name="blocksize" val="s->blocksize" type="U32int"/>
349 a0d146ed 2005-07-12 devnull * <field name="start" val="s->base" type="U64int"/>
350 a0d146ed 2005-07-12 devnull * <field name="stop" val="s->base+2*s->blocksize" type="U64int"/>
351 a0d146ed 2005-07-12 devnull * <field name="created" val="s->ctime" type="U32int"/>
352 a0d146ed 2005-07-12 devnull * <field name="modified" val="s->wtime" type="U32int"/>
353 a0d146ed 2005-07-12 devnull * <field name="sealed" val="s->sealed" type="Sealed"/>
354 a0d146ed 2005-07-12 devnull * <field name="score" val="s->score" type="Score"/>
355 a0d146ed 2005-07-12 devnull * <field name="clumps" val="s->clumps" type="U32int"/>
356 a0d146ed 2005-07-12 devnull * <field name="compressedclumps" val="s->cclumps" type="U32int"/>
357 a0d146ed 2005-07-12 devnull * <field name="data" val="s->uncsize" type="U64int"/>
358 a0d146ed 2005-07-12 devnull * <field name="compresseddata" val="s->used - s->clumps * ClumpSize" type="U64int"/>
359 a0d146ed 2005-07-12 devnull * <field name="storage" val="s->used + s->clumps * ClumpInfoSize" type="U64int"/>
360 a0d146ed 2005-07-12 devnull * </struct>
362 a0d146ed 2005-07-12 devnull struct Arena
364 a0d146ed 2005-07-12 devnull QLock lock; /* lock for arena fields, writing to disk */
365 a0d146ed 2005-07-12 devnull Part *part; /* partition in which arena lives */
366 a0d146ed 2005-07-12 devnull int blocksize; /* size of block to read or write */
367 a0d146ed 2005-07-12 devnull u64int base; /* base address on disk */
368 a0d146ed 2005-07-12 devnull u64int size; /* total space in the arena */
369 a0d146ed 2005-07-12 devnull u8int score[VtScoreSize]; /* score of the entire sealed & summed arena */
371 a0d146ed 2005-07-12 devnull int clumpmax; /* ClumpInfos per block */
372 a0d146ed 2005-07-12 devnull AState mem;
373 a0d146ed 2005-07-12 devnull int inqueue;
376 a0d146ed 2005-07-12 devnull * fields stored on disk
378 a0d146ed 2005-07-12 devnull u32int version;
379 a0d146ed 2005-07-12 devnull char name[ANameSize]; /* text label */
380 a0d146ed 2005-07-12 devnull ATailStats memstats;
381 a0d146ed 2005-07-12 devnull ATailStats diskstats;
382 a0d146ed 2005-07-12 devnull u32int ctime; /* first time a block was written */
383 a0d146ed 2005-07-12 devnull u32int wtime; /* last time a block was written */
384 a0d146ed 2005-07-12 devnull u32int clumpmagic;
386 7a400ee9 2007-09-25 rsc ArenaCIG *cig;
390 7a400ee9 2007-09-25 rsc struct ArenaCIG
392 7a400ee9 2007-09-25 rsc u64int offset; // from arena base
396 a0d146ed 2005-07-12 devnull * redundant storage of some fields at the beginning of each arena
398 a0d146ed 2005-07-12 devnull struct ArenaHead
400 a0d146ed 2005-07-12 devnull u32int version;
401 a0d146ed 2005-07-12 devnull char name[ANameSize];
402 a0d146ed 2005-07-12 devnull u32int blocksize;
403 a0d146ed 2005-07-12 devnull u64int size;
404 a0d146ed 2005-07-12 devnull u32int clumpmagic;
408 a0d146ed 2005-07-12 devnull * most interesting meta information for a clump.
409 a0d146ed 2005-07-12 devnull * stored in each clump's header and in the Arena's directory,
410 a0d146ed 2005-07-12 devnull * stored in reverse order just prior to the arena trailer
412 a0d146ed 2005-07-12 devnull struct ClumpInfo
414 a0d146ed 2005-07-12 devnull u8int type;
415 a0d146ed 2005-07-12 devnull u16int size; /* size of disk data, not including header */
416 a0d146ed 2005-07-12 devnull u16int uncsize; /* size of uncompressed data */
417 a0d146ed 2005-07-12 devnull u8int score[VtScoreSize]; /* score of the uncompressed data only */
421 a0d146ed 2005-07-12 devnull * header for an immutable clump of data
423 a0d146ed 2005-07-12 devnull struct Clump
425 a0d146ed 2005-07-12 devnull ClumpInfo info;
426 a0d146ed 2005-07-12 devnull u8int encoding;
427 a0d146ed 2005-07-12 devnull u32int creator; /* initial client which wrote the block */
428 a0d146ed 2005-07-12 devnull u32int time; /* creation at gmt seconds since 1/1/1970 */
432 a0d146ed 2005-07-12 devnull * index of all clumps according to their score
433 a0d146ed 2005-07-12 devnull * this is just a wrapper to tie together the index sections
434 a0d146ed 2005-07-12 devnull * <struct name="Index" type="Index *">
435 a0d146ed 2005-07-12 devnull * <field name="name" val="s->name" type="AName"/>
436 a0d146ed 2005-07-12 devnull * <field name="version" val="s->version" type="U32int"/>
437 a0d146ed 2005-07-12 devnull * <field name="blocksize" val="s->blocksize" type="U32int"/>
438 a0d146ed 2005-07-12 devnull * <field name="tabsize" val="s->tabsize" type="U32int"/>
439 a0d146ed 2005-07-12 devnull * <field name="buckets" val="s->buckets" type="U32int"/>
440 a0d146ed 2005-07-12 devnull * <field name="buckdiv" val="s->div" type="U32int"/>
441 a0d146ed 2005-07-12 devnull * <field name="bitblocks" val="s->div" type="U32int"/>
442 a0d146ed 2005-07-12 devnull * <field name="maxdepth" val="s->div" type="U32int"/>
443 a0d146ed 2005-07-12 devnull * <field name="bitkeylog" val="s->div" type="U32int"/>
444 a0d146ed 2005-07-12 devnull * <field name="bitkeymask" val="s->div" type="U32int"/>
445 a0d146ed 2005-07-12 devnull * <array name="sect" val="&s->smap[i]" elems="s->nsects" type="Amap"/>
446 a0d146ed 2005-07-12 devnull * <array name="amap" val="&s->amap[i]" elems="s->narenas" type="Amap"/>
447 a0d146ed 2005-07-12 devnull * <array name="arena" val="s->arenas[i]" elems="s->narenas" type="Arena"/>
448 a0d146ed 2005-07-12 devnull * </struct>
449 a0d146ed 2005-07-12 devnull * <struct name="Amap" type="AMap *">
450 a0d146ed 2005-07-12 devnull * <field name="name" val="s->name" type="AName"/>
451 a0d146ed 2005-07-12 devnull * <field name="start" val="s->start" type="U64int"/>
452 a0d146ed 2005-07-12 devnull * <field name="stop" val="s->stop" type="U64int"/>
453 a0d146ed 2005-07-12 devnull * </struct>
455 a0d146ed 2005-07-12 devnull struct Index
457 a0d146ed 2005-07-12 devnull u32int div; /* divisor for mapping score to bucket */
458 a0d146ed 2005-07-12 devnull u32int buckets; /* last bucket used in disk hash table */
459 a0d146ed 2005-07-12 devnull u32int blocksize;
460 a0d146ed 2005-07-12 devnull u32int tabsize; /* max. bytes in index config */
462 a0d146ed 2005-07-12 devnull int mapalloc; /* first arena to check when adding a lump */
463 a0d146ed 2005-07-12 devnull Arena **arenas; /* arenas in the mapping */
464 a0d146ed 2005-07-12 devnull ISect **sects; /* sections which hold the buckets */
465 a0d146ed 2005-07-12 devnull Bloom *bloom; /* bloom filter */
468 fa325e9b 2020-01-10 cross * fields stored in config file
470 a0d146ed 2005-07-12 devnull u32int version;
471 a0d146ed 2005-07-12 devnull char name[ANameSize]; /* text label */
472 a0d146ed 2005-07-12 devnull int nsects;
473 a0d146ed 2005-07-12 devnull AMap *smap; /* mapping of buckets to index sections */
474 a0d146ed 2005-07-12 devnull int narenas;
475 a0d146ed 2005-07-12 devnull AMap *amap; /* mapping from index addesses to arenas */
477 45ac814c 2007-10-29 rsc QLock writing;
481 a0d146ed 2005-07-12 devnull * one part of the bucket storage for an index.
482 a0d146ed 2005-07-12 devnull * the index blocks are sequentially allocated
483 a0d146ed 2005-07-12 devnull * across all of the sections.
485 a0d146ed 2005-07-12 devnull struct ISect
487 a0d146ed 2005-07-12 devnull Part *part;
488 a0d146ed 2005-07-12 devnull int blocklog; /* log2(blocksize) */
489 a0d146ed 2005-07-12 devnull int buckmax; /* max. entries in a index bucket */
490 a0d146ed 2005-07-12 devnull u32int tabbase; /* base address of index config table on disk */
491 a0d146ed 2005-07-12 devnull u32int tabsize; /* max. bytes in index config */
492 a0d146ed 2005-07-12 devnull Channel *writechan;
493 a0d146ed 2005-07-12 devnull Channel *writedonechan;
494 28b49df3 2006-07-18 devnull void *ig; /* used by buildindex only */
498 a0d146ed 2005-07-12 devnull * fields stored on disk
500 a0d146ed 2005-07-12 devnull u32int version;
501 a0d146ed 2005-07-12 devnull u32int bucketmagic;
502 a0d146ed 2005-07-12 devnull char name[ANameSize]; /* text label */
503 a0d146ed 2005-07-12 devnull char index[ANameSize]; /* index owning the section */
504 a0d146ed 2005-07-12 devnull u32int blocksize; /* size of hash buckets in index */
505 a0d146ed 2005-07-12 devnull u32int blockbase; /* address of start of on disk index table */
506 a0d146ed 2005-07-12 devnull u32int blocks; /* total blocks on disk; some may be unused */
507 a0d146ed 2005-07-12 devnull u32int start; /* first bucket in this section */
508 a0d146ed 2005-07-12 devnull u32int stop; /* limit of buckets in this section */
512 a0d146ed 2005-07-12 devnull * externally interesting part of an IEntry
514 a0d146ed 2005-07-12 devnull struct IAddr
516 a0d146ed 2005-07-12 devnull u64int addr;
517 a0d146ed 2005-07-12 devnull u16int size; /* uncompressed size */
518 a0d146ed 2005-07-12 devnull u8int type; /* type of block */
519 a0d146ed 2005-07-12 devnull u8int blocks; /* arena io quanta for Clump + data */
523 a0d146ed 2005-07-12 devnull * entries in the index
524 a0d146ed 2005-07-12 devnull * kept in IBuckets in the disk index table,
525 a0d146ed 2005-07-12 devnull * cached in the memory ICache.
527 a0d146ed 2005-07-12 devnull struct IEntry
529 7a400ee9 2007-09-25 rsc /* on disk data - 32 bytes*/
530 7a400ee9 2007-09-25 rsc u8int score[VtScoreSize];
533 7a400ee9 2007-09-25 rsc IEntry *nexthash;
534 7a400ee9 2007-09-25 rsc IEntry *nextdirty;
535 7a400ee9 2007-09-25 rsc IEntry *next;
536 7a400ee9 2007-09-25 rsc IEntry *prev;
537 7a400ee9 2007-09-25 rsc u8int state;
540 7a400ee9 2007-09-25 rsc IEClean = 0,
541 7a400ee9 2007-09-25 rsc IEDirty = 1,
542 7a400ee9 2007-09-25 rsc IESummary = 2,
546 a0d146ed 2005-07-12 devnull * buckets in the on disk index table
548 a0d146ed 2005-07-12 devnull struct IBucket
550 a0d146ed 2005-07-12 devnull u16int n; /* number of active indices */
551 a0d146ed 2005-07-12 devnull u32int buck; /* used by buildindex/checkindex only */
552 a0d146ed 2005-07-12 devnull u8int *data;
556 a0d146ed 2005-07-12 devnull * temporary buffers used by individual threads
558 a0d146ed 2005-07-12 devnull struct ZBlock
560 a0d146ed 2005-07-12 devnull u32int len;
561 a0d146ed 2005-07-12 devnull u32int _size;
562 a0d146ed 2005-07-12 devnull u8int *data;
563 a0d146ed 2005-07-12 devnull u8int *free;
567 a0d146ed 2005-07-12 devnull * simple input buffer for a '\0' terminated text file
569 a0d146ed 2005-07-12 devnull struct IFile
571 a0d146ed 2005-07-12 devnull char *name; /* name of the file */
572 a0d146ed 2005-07-12 devnull ZBlock *b; /* entire contents of file */
573 a0d146ed 2005-07-12 devnull u32int pos; /* current position in the file */
576 a0d146ed 2005-07-12 devnull struct Statdesc
578 a0d146ed 2005-07-12 devnull char *name;
579 a0d146ed 2005-07-12 devnull ulong max;
582 a0d146ed 2005-07-12 devnull /* keep in sync with stats.c:/statdesc and httpd.c:/graphname*/
585 a0d146ed 2005-07-12 devnull StatRpcTotal,
586 a0d146ed 2005-07-12 devnull StatRpcRead,
587 a0d146ed 2005-07-12 devnull StatRpcReadOk,
588 a0d146ed 2005-07-12 devnull StatRpcReadFail,
589 a0d146ed 2005-07-12 devnull StatRpcReadBytes,
590 a0d146ed 2005-07-12 devnull StatRpcReadTime,
591 a0d146ed 2005-07-12 devnull StatRpcReadCached,
592 a0d146ed 2005-07-12 devnull StatRpcReadCachedTime,
593 a0d146ed 2005-07-12 devnull StatRpcReadUncached,
594 a0d146ed 2005-07-12 devnull StatRpcReadUncachedTime,
595 a0d146ed 2005-07-12 devnull StatRpcWrite,
596 a0d146ed 2005-07-12 devnull StatRpcWriteNew,
597 a0d146ed 2005-07-12 devnull StatRpcWriteOld,
598 a0d146ed 2005-07-12 devnull StatRpcWriteFail,
599 a0d146ed 2005-07-12 devnull StatRpcWriteBytes,
600 a0d146ed 2005-07-12 devnull StatRpcWriteTime,
601 a0d146ed 2005-07-12 devnull StatRpcWriteNewTime,
602 a0d146ed 2005-07-12 devnull StatRpcWriteOldTime,
604 a0d146ed 2005-07-12 devnull StatLcacheHit,
605 a0d146ed 2005-07-12 devnull StatLcacheMiss,
606 a0d146ed 2005-07-12 devnull StatLcacheRead,
607 a0d146ed 2005-07-12 devnull StatLcacheWrite,
608 a0d146ed 2005-07-12 devnull StatLcacheSize,
609 a0d146ed 2005-07-12 devnull StatLcacheStall,
610 a0d146ed 2005-07-12 devnull StatLcacheReadTime,
612 a0d146ed 2005-07-12 devnull StatDcacheHit,
613 a0d146ed 2005-07-12 devnull StatDcacheMiss,
614 a0d146ed 2005-07-12 devnull StatDcacheLookup,
615 a0d146ed 2005-07-12 devnull StatDcacheRead,
616 a0d146ed 2005-07-12 devnull StatDcacheWrite,
617 a0d146ed 2005-07-12 devnull StatDcacheDirty,
618 a0d146ed 2005-07-12 devnull StatDcacheSize,
619 a0d146ed 2005-07-12 devnull StatDcacheFlush,
620 a0d146ed 2005-07-12 devnull StatDcacheStall,
621 a0d146ed 2005-07-12 devnull StatDcacheLookupTime,
623 a0d146ed 2005-07-12 devnull StatDblockStall,
624 a0d146ed 2005-07-12 devnull StatLumpStall,
626 a0d146ed 2005-07-12 devnull StatIcacheHit,
627 a0d146ed 2005-07-12 devnull StatIcacheMiss,
628 a0d146ed 2005-07-12 devnull StatIcacheRead,
629 a0d146ed 2005-07-12 devnull StatIcacheWrite,
630 a0d146ed 2005-07-12 devnull StatIcacheFill,
631 a0d146ed 2005-07-12 devnull StatIcachePrefetch,
632 a0d146ed 2005-07-12 devnull StatIcacheDirty,
633 a0d146ed 2005-07-12 devnull StatIcacheSize,
634 a0d146ed 2005-07-12 devnull StatIcacheFlush,
635 a0d146ed 2005-07-12 devnull StatIcacheStall,
636 a0d146ed 2005-07-12 devnull StatIcacheReadTime,
637 7a400ee9 2007-09-25 rsc StatIcacheLookup,
638 7a400ee9 2007-09-25 rsc StatScacheHit,
639 7a400ee9 2007-09-25 rsc StatScachePrefetch,
641 a0d146ed 2005-07-12 devnull StatBloomHit,
642 a0d146ed 2005-07-12 devnull StatBloomMiss,
643 a0d146ed 2005-07-12 devnull StatBloomFalseMiss,
644 a0d146ed 2005-07-12 devnull StatBloomLookup,
645 a0d146ed 2005-07-12 devnull StatBloomOnes,
646 a0d146ed 2005-07-12 devnull StatBloomBits,
648 a0d146ed 2005-07-12 devnull StatApartRead,
649 a0d146ed 2005-07-12 devnull StatApartReadBytes,
650 a0d146ed 2005-07-12 devnull StatApartWrite,
651 a0d146ed 2005-07-12 devnull StatApartWriteBytes,
653 a0d146ed 2005-07-12 devnull StatIsectRead,
654 a0d146ed 2005-07-12 devnull StatIsectReadBytes,
655 a0d146ed 2005-07-12 devnull StatIsectWrite,
656 a0d146ed 2005-07-12 devnull StatIsectWriteBytes,
658 a0d146ed 2005-07-12 devnull StatSumRead,
659 a0d146ed 2005-07-12 devnull StatSumReadBytes,
661 7a400ee9 2007-09-25 rsc StatCigLoad,
662 7a400ee9 2007-09-25 rsc StatCigLoadTime,
667 a0d146ed 2005-07-12 devnull extern Statdesc statdesc[NStat];
670 a0d146ed 2005-07-12 devnull * statistics about the operation of the server
671 a0d146ed 2005-07-12 devnull * mainly for performance monitoring and profiling.
673 a0d146ed 2005-07-12 devnull struct Stats
675 a0d146ed 2005-07-12 devnull ulong now;
676 a0d146ed 2005-07-12 devnull ulong n[NStat];
679 a0d146ed 2005-07-12 devnull struct Statbin
681 a0d146ed 2005-07-12 devnull uint nsamp;
682 a0d146ed 2005-07-12 devnull uint min;
683 a0d146ed 2005-07-12 devnull uint max;
684 a0d146ed 2005-07-12 devnull uint avg;
687 a0d146ed 2005-07-12 devnull struct Graph
689 a0d146ed 2005-07-12 devnull long (*fn)(Stats*, Stats*, void*);
690 a0d146ed 2005-07-12 devnull void *arg;
691 a0d146ed 2005-07-12 devnull long t0;
692 a0d146ed 2005-07-12 devnull long t1;
693 a0d146ed 2005-07-12 devnull long min;
694 a0d146ed 2005-07-12 devnull long max;
695 a0d146ed 2005-07-12 devnull long wid;
696 a0d146ed 2005-07-12 devnull long ht;
697 a0d146ed 2005-07-12 devnull int fill;
701 a0d146ed 2005-07-12 devnull * for kicking background processes that run one round after another after another
703 a0d146ed 2005-07-12 devnull struct Round
705 a0d146ed 2005-07-12 devnull QLock lock;
706 a0d146ed 2005-07-12 devnull Rendez start;
707 a0d146ed 2005-07-12 devnull Rendez finish;
708 a0d146ed 2005-07-12 devnull Rendez delaywait;
709 a0d146ed 2005-07-12 devnull int delaytime;
710 a0d146ed 2005-07-12 devnull int delaykick;
711 a0d146ed 2005-07-12 devnull char* name;
712 a0d146ed 2005-07-12 devnull int last;
713 a0d146ed 2005-07-12 devnull int current;
714 a0d146ed 2005-07-12 devnull int next;
715 a0d146ed 2005-07-12 devnull int doanother;
719 a0d146ed 2005-07-12 devnull * Bloom filter of stored block hashes
721 a0d146ed 2005-07-12 devnull struct Bloom
723 a0d146ed 2005-07-12 devnull RWLock lk; /* protects nhash, nbits, tab, mb */
724 a0d146ed 2005-07-12 devnull QLock mod; /* one marker at a time, protects nb */
725 a0d146ed 2005-07-12 devnull int nhash;
726 a0d146ed 2005-07-12 devnull ulong size; /* bytes in tab */
727 27d28098 2007-04-21 devnull ulong bitmask; /* to produce bit index */
728 a0d146ed 2005-07-12 devnull u8int *data;
729 a0d146ed 2005-07-12 devnull Part *part;
730 a0d146ed 2005-07-12 devnull Channel *writechan;
731 a0d146ed 2005-07-12 devnull Channel *writedonechan;
734 a0d146ed 2005-07-12 devnull extern Index *mainindex;
735 a0d146ed 2005-07-12 devnull extern u32int maxblocksize; /* max. block size used by any partition */
736 a0d146ed 2005-07-12 devnull extern int paranoid; /* should verify hashes on disk read */
737 a0d146ed 2005-07-12 devnull extern int queuewrites; /* put all lump writes on a queue and finish later */
738 a0d146ed 2005-07-12 devnull extern int readonly; /* only allowed to read the disk data */
739 a0d146ed 2005-07-12 devnull extern Stats stats;
740 a0d146ed 2005-07-12 devnull extern u8int zeroscore[VtScoreSize];
741 a0d146ed 2005-07-12 devnull extern int compressblocks;
742 a0d146ed 2005-07-12 devnull extern int writestodevnull; /* dangerous - for performance debugging */
743 e7e953b3 2012-04-22 rsc extern int bootstrap; /* writes but does not index - cannot read */
744 a0d146ed 2005-07-12 devnull extern int collectstats;
745 a0d146ed 2005-07-12 devnull extern QLock memdrawlock;
746 a0d146ed 2005-07-12 devnull extern int icachesleeptime;
747 28b49df3 2006-07-18 devnull extern int minicachesleeptime;
748 a0d146ed 2005-07-12 devnull extern int arenasumsleeptime;
749 28b49df3 2006-07-18 devnull extern int manualscheduling;
750 28b49df3 2006-07-18 devnull extern int l0quantum;
751 28b49df3 2006-07-18 devnull extern int l1quantum;
752 28b49df3 2006-07-18 devnull extern int ignorebloom;
753 28b49df3 2006-07-18 devnull extern int icacheprefetch;
754 28b49df3 2006-07-18 devnull extern int syncwrites;
755 f5a8ea6f 2011-06-02 rsc extern int debugarena; /* print in arena error msgs; -1==unknown */
757 28b49df3 2006-07-18 devnull extern Stats *stathist;
758 28b49df3 2006-07-18 devnull extern int nstathist;
759 28b49df3 2006-07-18 devnull extern ulong stattime;
761 a0d146ed 2005-07-12 devnull #ifndef PLAN9PORT
762 a0d146ed 2005-07-12 devnull #pragma varargck type "V" uchar*
763 a0d146ed 2005-07-12 devnull #define ODIRECT 0