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 f5a8ea6f 2011-06-02 rsc Unspecified = TWID32,
58 a0d146ed 2005-07-12 devnull
59 a0d146ed 2005-07-12 devnull /*
60 a0d146ed 2005-07-12 devnull * return codes from syncarena
61 a0d146ed 2005-07-12 devnull */
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 */
67 a0d146ed 2005-07-12 devnull
68 a0d146ed 2005-07-12 devnull /*
69 a0d146ed 2005-07-12 devnull * error severity
70 a0d146ed 2005-07-12 devnull */
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 */
79 a0d146ed 2005-07-12 devnull EMax,
80 a0d146ed 2005-07-12 devnull
81 a0d146ed 2005-07-12 devnull /*
82 a0d146ed 2005-07-12 devnull * internal disk formats for the venti archival storage system
83 a0d146ed 2005-07-12 devnull */
84 a0d146ed 2005-07-12 devnull /*
85 a0d146ed 2005-07-12 devnull * magic numbers on disk
86 a0d146ed 2005-07-12 devnull */
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 */
89 a0d146ed 2005-07-12 devnull
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 */
93 fa325e9b 2020-01-10 cross
94 28b49df3 2006-07-18 devnull BloomMagic = 0xb1004eadU, /* bloom filter header */
95 a0d146ed 2005-07-12 devnull BloomMaxHash = 32,
96 a0d146ed 2005-07-12 devnull
97 28b49df3 2006-07-18 devnull ISectMagic = 0xd15c5ec7U, /* index header */
98 a0d146ed 2005-07-12 devnull
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,
106 a0d146ed 2005-07-12 devnull
107 a0d146ed 2005-07-12 devnull /*
108 a0d146ed 2005-07-12 devnull * encodings of clumps on disk
109 a0d146ed 2005-07-12 devnull */
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,
114 a0d146ed 2005-07-12 devnull
115 a0d146ed 2005-07-12 devnull /*
116 a0d146ed 2005-07-12 devnull * sizes in bytes on disk
117 a0d146ed 2005-07-12 devnull */
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,
122 a0d146ed 2005-07-12 devnull
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 */
136 a0d146ed 2005-07-12 devnull /*
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.
141 a0d146ed 2005-07-12 devnull */
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,
146 a0d146ed 2005-07-12 devnull
147 a0d146ed 2005-07-12 devnull MaxClumpBlocks = (VtMaxLumpSize + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog,
148 fa325e9b 2020-01-10 cross
149 28b49df3 2006-07-18 devnull IcacheFrac = 1000000, /* denominator */
150 a0d146ed 2005-07-12 devnull
151 28b49df3 2006-07-18 devnull SleepForever = 1000000000, /* magic value for sleep time */
152 a0d146ed 2005-07-12 devnull /*
153 a0d146ed 2005-07-12 devnull * dirty flags - order controls disk write order
154 a0d146ed 2005-07-12 devnull */
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,
159 fa325e9b 2020-01-10 cross
160 7a400ee9 2007-09-25 rsc ArenaCIGSize = 10*1024, // about 0.5 MB worth of IEntry.
161 a0d146ed 2005-07-12 devnull
162 a0d146ed 2005-07-12 devnull VentiZZZZZZZZ
163 a0d146ed 2005-07-12 devnull };
164 a0d146ed 2005-07-12 devnull
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[];
172 a0d146ed 2005-07-12 devnull
173 a0d146ed 2005-07-12 devnull /*
174 a0d146ed 2005-07-12 devnull * results of parsing and initializing a config file
175 a0d146ed 2005-07-12 devnull */
176 a0d146ed 2005-07-12 devnull struct Config
177 a0d146ed 2005-07-12 devnull {
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;
191 a0d146ed 2005-07-12 devnull };
192 a0d146ed 2005-07-12 devnull
193 a0d146ed 2005-07-12 devnull /*
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.
198 a0d146ed 2005-07-12 devnull */
199 a0d146ed 2005-07-12 devnull struct Part
200 a0d146ed 2005-07-12 devnull {
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*) */
210 a0d146ed 2005-07-12 devnull };
211 a0d146ed 2005-07-12 devnull
212 a0d146ed 2005-07-12 devnull /*
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
216 a0d146ed 2005-07-12 devnull */
217 a0d146ed 2005-07-12 devnull struct DBlock
218 a0d146ed 2005-07-12 devnull {
219 a0d146ed 2005-07-12 devnull u8int *data;
220 a0d146ed 2005-07-12 devnull
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! */
236 a0d146ed 2005-07-12 devnull };
237 a0d146ed 2005-07-12 devnull
238 a0d146ed 2005-07-12 devnull /*
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
243 a0d146ed 2005-07-12 devnull */
244 a0d146ed 2005-07-12 devnull struct Lump
245 a0d146ed 2005-07-12 devnull {
246 a0d146ed 2005-07-12 devnull Packet *data;
247 a0d146ed 2005-07-12 devnull
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 */
259 a0d146ed 2005-07-12 devnull };
260 a0d146ed 2005-07-12 devnull
261 a0d146ed 2005-07-12 devnull /*
262 a0d146ed 2005-07-12 devnull * mapping between names and address ranges
263 a0d146ed 2005-07-12 devnull */
264 a0d146ed 2005-07-12 devnull struct AMap
265 a0d146ed 2005-07-12 devnull {
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];
269 a0d146ed 2005-07-12 devnull };
270 a0d146ed 2005-07-12 devnull
271 a0d146ed 2005-07-12 devnull /*
272 a0d146ed 2005-07-12 devnull * an AMap along with a length
273 a0d146ed 2005-07-12 devnull */
274 a0d146ed 2005-07-12 devnull struct AMapN
275 a0d146ed 2005-07-12 devnull {
276 a0d146ed 2005-07-12 devnull int n;
277 a0d146ed 2005-07-12 devnull AMap *map;
278 a0d146ed 2005-07-12 devnull };
279 a0d146ed 2005-07-12 devnull
280 a0d146ed 2005-07-12 devnull /*
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
284 a0d146ed 2005-07-12 devnull */
285 a0d146ed 2005-07-12 devnull struct ArenaPart
286 a0d146ed 2005-07-12 devnull {
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 */
292 a0d146ed 2005-07-12 devnull
293 a0d146ed 2005-07-12 devnull /*
294 a0d146ed 2005-07-12 devnull * fields stored on disk
295 a0d146ed 2005-07-12 devnull */
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 */
299 a0d146ed 2005-07-12 devnull
300 a0d146ed 2005-07-12 devnull /*
301 a0d146ed 2005-07-12 devnull * stored in the arena mapping table on disk
302 a0d146ed 2005-07-12 devnull */
303 a0d146ed 2005-07-12 devnull AMap *map;
304 a0d146ed 2005-07-12 devnull int narenas;
305 a0d146ed 2005-07-12 devnull };
306 a0d146ed 2005-07-12 devnull
307 a0d146ed 2005-07-12 devnull /*
308 a0d146ed 2005-07-12 devnull * info about one block in the clump info cache
309 a0d146ed 2005-07-12 devnull */
310 a0d146ed 2005-07-12 devnull struct CIBlock
311 a0d146ed 2005-07-12 devnull {
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;
315 a0d146ed 2005-07-12 devnull };
316 a0d146ed 2005-07-12 devnull
317 a0d146ed 2005-07-12 devnull /*
318 fa325e9b 2020-01-10 cross * Statistics kept in the tail.
319 a0d146ed 2005-07-12 devnull */
320 a0d146ed 2005-07-12 devnull struct ATailStats
321 a0d146ed 2005-07-12 devnull {
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;
327 a0d146ed 2005-07-12 devnull };
328 a0d146ed 2005-07-12 devnull
329 a0d146ed 2005-07-12 devnull /*
330 a0d146ed 2005-07-12 devnull * Arena state - represents a point in the data log
331 a0d146ed 2005-07-12 devnull */
332 a0d146ed 2005-07-12 devnull struct AState
333 a0d146ed 2005-07-12 devnull {
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;
337 a0d146ed 2005-07-12 devnull };
338 a0d146ed 2005-07-12 devnull
339 a0d146ed 2005-07-12 devnull /*
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>
361 a0d146ed 2005-07-12 devnull */
362 a0d146ed 2005-07-12 devnull struct Arena
363 a0d146ed 2005-07-12 devnull {
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 */
370 a0d146ed 2005-07-12 devnull
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;
374 a0d146ed 2005-07-12 devnull
375 a0d146ed 2005-07-12 devnull /*
376 a0d146ed 2005-07-12 devnull * fields stored on disk
377 a0d146ed 2005-07-12 devnull */
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;
385 fa325e9b 2020-01-10 cross
386 7a400ee9 2007-09-25 rsc ArenaCIG *cig;
387 7a400ee9 2007-09-25 rsc int ncig;
388 a0d146ed 2005-07-12 devnull };
389 a0d146ed 2005-07-12 devnull
390 7a400ee9 2007-09-25 rsc struct ArenaCIG
391 7a400ee9 2007-09-25 rsc {
392 7a400ee9 2007-09-25 rsc u64int offset; // from arena base
393 7a400ee9 2007-09-25 rsc };
394 7a400ee9 2007-09-25 rsc
395 a0d146ed 2005-07-12 devnull /*
396 a0d146ed 2005-07-12 devnull * redundant storage of some fields at the beginning of each arena
397 a0d146ed 2005-07-12 devnull */
398 a0d146ed 2005-07-12 devnull struct ArenaHead
399 a0d146ed 2005-07-12 devnull {
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;
405 a0d146ed 2005-07-12 devnull };
406 a0d146ed 2005-07-12 devnull
407 a0d146ed 2005-07-12 devnull /*
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
411 a0d146ed 2005-07-12 devnull */
412 a0d146ed 2005-07-12 devnull struct ClumpInfo
413 a0d146ed 2005-07-12 devnull {
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 */
418 a0d146ed 2005-07-12 devnull };
419 a0d146ed 2005-07-12 devnull
420 a0d146ed 2005-07-12 devnull /*
421 a0d146ed 2005-07-12 devnull * header for an immutable clump of data
422 a0d146ed 2005-07-12 devnull */
423 a0d146ed 2005-07-12 devnull struct Clump
424 a0d146ed 2005-07-12 devnull {
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 */
429 a0d146ed 2005-07-12 devnull };
430 a0d146ed 2005-07-12 devnull
431 a0d146ed 2005-07-12 devnull /*
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>
454 a0d146ed 2005-07-12 devnull */
455 a0d146ed 2005-07-12 devnull struct Index
456 a0d146ed 2005-07-12 devnull {
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 */
461 a0d146ed 2005-07-12 devnull
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 */
466 a0d146ed 2005-07-12 devnull
467 a0d146ed 2005-07-12 devnull /*
468 fa325e9b 2020-01-10 cross * fields stored in config file
469 a0d146ed 2005-07-12 devnull */
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 */
476 fa325e9b 2020-01-10 cross
477 45ac814c 2007-10-29 rsc QLock writing;
478 a0d146ed 2005-07-12 devnull };
479 a0d146ed 2005-07-12 devnull
480 a0d146ed 2005-07-12 devnull /*
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.
484 a0d146ed 2005-07-12 devnull */
485 a0d146ed 2005-07-12 devnull struct ISect
486 a0d146ed 2005-07-12 devnull {
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 */
495 28b49df3 2006-07-18 devnull int ng;
496 a0d146ed 2005-07-12 devnull
497 a0d146ed 2005-07-12 devnull /*
498 a0d146ed 2005-07-12 devnull * fields stored on disk
499 a0d146ed 2005-07-12 devnull */
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 */
509 a0d146ed 2005-07-12 devnull };
510 a0d146ed 2005-07-12 devnull
511 a0d146ed 2005-07-12 devnull /*
512 a0d146ed 2005-07-12 devnull * externally interesting part of an IEntry
513 a0d146ed 2005-07-12 devnull */
514 a0d146ed 2005-07-12 devnull struct IAddr
515 a0d146ed 2005-07-12 devnull {
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 */
520 a0d146ed 2005-07-12 devnull };
521 a0d146ed 2005-07-12 devnull
522 a0d146ed 2005-07-12 devnull /*
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.
526 a0d146ed 2005-07-12 devnull */
527 a0d146ed 2005-07-12 devnull struct IEntry
528 a0d146ed 2005-07-12 devnull {
529 7a400ee9 2007-09-25 rsc /* on disk data - 32 bytes*/
530 7a400ee9 2007-09-25 rsc u8int score[VtScoreSize];
531 7a400ee9 2007-09-25 rsc IAddr ia;
532 fa325e9b 2020-01-10 cross
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;
538 a0d146ed 2005-07-12 devnull };
539 7a400ee9 2007-09-25 rsc enum {
540 7a400ee9 2007-09-25 rsc IEClean = 0,
541 7a400ee9 2007-09-25 rsc IEDirty = 1,
542 7a400ee9 2007-09-25 rsc IESummary = 2,
543 7a400ee9 2007-09-25 rsc };
544 a0d146ed 2005-07-12 devnull
545 a0d146ed 2005-07-12 devnull /*
546 a0d146ed 2005-07-12 devnull * buckets in the on disk index table
547 a0d146ed 2005-07-12 devnull */
548 a0d146ed 2005-07-12 devnull struct IBucket
549 a0d146ed 2005-07-12 devnull {
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;
553 a0d146ed 2005-07-12 devnull };
554 a0d146ed 2005-07-12 devnull
555 a0d146ed 2005-07-12 devnull /*
556 a0d146ed 2005-07-12 devnull * temporary buffers used by individual threads
557 a0d146ed 2005-07-12 devnull */
558 a0d146ed 2005-07-12 devnull struct ZBlock
559 a0d146ed 2005-07-12 devnull {
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;
564 a0d146ed 2005-07-12 devnull };
565 a0d146ed 2005-07-12 devnull
566 a0d146ed 2005-07-12 devnull /*
567 a0d146ed 2005-07-12 devnull * simple input buffer for a '\0' terminated text file
568 a0d146ed 2005-07-12 devnull */
569 a0d146ed 2005-07-12 devnull struct IFile
570 a0d146ed 2005-07-12 devnull {
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 */
574 a0d146ed 2005-07-12 devnull };
575 a0d146ed 2005-07-12 devnull
576 a0d146ed 2005-07-12 devnull struct Statdesc
577 a0d146ed 2005-07-12 devnull {
578 a0d146ed 2005-07-12 devnull char *name;
579 a0d146ed 2005-07-12 devnull ulong max;
580 a0d146ed 2005-07-12 devnull };
581 a0d146ed 2005-07-12 devnull
582 a0d146ed 2005-07-12 devnull /* keep in sync with stats.c:/statdesc and httpd.c:/graphname*/
583 a0d146ed 2005-07-12 devnull enum
584 a0d146ed 2005-07-12 devnull {
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,
603 a0d146ed 2005-07-12 devnull
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,
611 a0d146ed 2005-07-12 devnull
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,
622 a0d146ed 2005-07-12 devnull
623 a0d146ed 2005-07-12 devnull StatDblockStall,
624 a0d146ed 2005-07-12 devnull StatLumpStall,
625 a0d146ed 2005-07-12 devnull
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,
640 a0d146ed 2005-07-12 devnull
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,
647 a0d146ed 2005-07-12 devnull
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,
652 a0d146ed 2005-07-12 devnull
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,
657 a0d146ed 2005-07-12 devnull
658 a0d146ed 2005-07-12 devnull StatSumRead,
659 a0d146ed 2005-07-12 devnull StatSumReadBytes,
660 fa325e9b 2020-01-10 cross
661 7a400ee9 2007-09-25 rsc StatCigLoad,
662 7a400ee9 2007-09-25 rsc StatCigLoadTime,
663 a0d146ed 2005-07-12 devnull
664 a0d146ed 2005-07-12 devnull NStat
665 a0d146ed 2005-07-12 devnull };
666 a0d146ed 2005-07-12 devnull
667 a0d146ed 2005-07-12 devnull extern Statdesc statdesc[NStat];
668 a0d146ed 2005-07-12 devnull
669 a0d146ed 2005-07-12 devnull /*
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.
672 a0d146ed 2005-07-12 devnull */
673 a0d146ed 2005-07-12 devnull struct Stats
674 a0d146ed 2005-07-12 devnull {
675 a0d146ed 2005-07-12 devnull ulong now;
676 a0d146ed 2005-07-12 devnull ulong n[NStat];
677 a0d146ed 2005-07-12 devnull };
678 a0d146ed 2005-07-12 devnull
679 a0d146ed 2005-07-12 devnull struct Statbin
680 a0d146ed 2005-07-12 devnull {
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;
685 a0d146ed 2005-07-12 devnull };
686 a0d146ed 2005-07-12 devnull
687 a0d146ed 2005-07-12 devnull struct Graph
688 a0d146ed 2005-07-12 devnull {
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;
698 a0d146ed 2005-07-12 devnull };
699 a0d146ed 2005-07-12 devnull
700 a0d146ed 2005-07-12 devnull /*
701 a0d146ed 2005-07-12 devnull * for kicking background processes that run one round after another after another
702 a0d146ed 2005-07-12 devnull */
703 a0d146ed 2005-07-12 devnull struct Round
704 a0d146ed 2005-07-12 devnull {
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;
716 a0d146ed 2005-07-12 devnull };
717 a0d146ed 2005-07-12 devnull
718 a0d146ed 2005-07-12 devnull /*
719 a0d146ed 2005-07-12 devnull * Bloom filter of stored block hashes
720 a0d146ed 2005-07-12 devnull */
721 a0d146ed 2005-07-12 devnull struct Bloom
722 a0d146ed 2005-07-12 devnull {
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;
732 a0d146ed 2005-07-12 devnull };
733 a0d146ed 2005-07-12 devnull
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 */
756 a0d146ed 2005-07-12 devnull
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;
760 28b49df3 2006-07-18 devnull
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
764 a0d146ed 2005-07-12 devnull #endif