Blame


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