1 7763a61a 2003-11-23 devnull #include "stdinc.h"
2 7763a61a 2003-11-23 devnull #include <bio.h>
3 7763a61a 2003-11-23 devnull #include "vac.h"
4 7763a61a 2003-11-23 devnull #include "dat.h"
5 7763a61a 2003-11-23 devnull #include "fns.h"
6 7763a61a 2003-11-23 devnull #include "error.h"
8 7763a61a 2003-11-23 devnull int num = 1000;
9 7763a61a 2003-11-23 devnull int length = 20*1024;
10 7763a61a 2003-11-23 devnull int block= 1024;
11 7763a61a 2003-11-23 devnull int bush = 4;
12 7763a61a 2003-11-23 devnull int iter = 10000;
13 7763a61a 2003-11-23 devnull Biobuf *bout;
14 7763a61a 2003-11-23 devnull int maxdepth;
16 7763a61a 2003-11-23 devnull Source *mkroot(Cache*);
17 7763a61a 2003-11-23 devnull void new(Source*, int trace, int);
18 7763a61a 2003-11-23 devnull int delete(Source*);
19 7763a61a 2003-11-23 devnull void dump(Source*, int indent, ulong nentry);
20 7763a61a 2003-11-23 devnull void dumpone(Source *s);
21 7763a61a 2003-11-23 devnull int count(Source *s, int);
22 7763a61a 2003-11-23 devnull void stats(Source *s);
25 7763a61a 2003-11-23 devnull main(int argc, char *argv[])
28 7763a61a 2003-11-23 devnull Cache *c;
29 7763a61a 2003-11-23 devnull char *host = nil;
30 7763a61a 2003-11-23 devnull VtSession *z;
31 7763a61a 2003-11-23 devnull int csize = 10000;
32 7763a61a 2003-11-23 devnull Source *r;
35 7763a61a 2003-11-23 devnull t = time(0);
36 7763a61a 2003-11-23 devnull fprint(1, "time = %lud\n", t);
38 7763a61a 2003-11-23 devnull srand(t);
40 7763a61a 2003-11-23 devnull ARGBEGIN{
41 7763a61a 2003-11-23 devnull case 'i':
42 7763a61a 2003-11-23 devnull iter = atoi(ARGF());
44 7763a61a 2003-11-23 devnull case 'n':
45 7763a61a 2003-11-23 devnull num = atoi(ARGF());
47 7763a61a 2003-11-23 devnull case 'l':
48 7763a61a 2003-11-23 devnull length = atoi(ARGF());
50 7763a61a 2003-11-23 devnull case 'b':
51 7763a61a 2003-11-23 devnull block = atoi(ARGF());
53 7763a61a 2003-11-23 devnull case 'h':
54 7763a61a 2003-11-23 devnull host = ARGF();
56 7763a61a 2003-11-23 devnull case 'u':
57 7763a61a 2003-11-23 devnull bush = atoi(ARGF());
59 7763a61a 2003-11-23 devnull case 'c':
60 7763a61a 2003-11-23 devnull csize = atoi(ARGF());
64 7763a61a 2003-11-23 devnull vtAttach();
66 7763a61a 2003-11-23 devnull bout = vtMemAllocZ(sizeof(Biobuf));
67 7763a61a 2003-11-23 devnull Binit(bout, 1, OWRITE);
69 7763a61a 2003-11-23 devnull fmtinstall('V', vtScoreFmt);
70 7763a61a 2003-11-23 devnull fmtinstall('R', vtErrFmt);
72 7763a61a 2003-11-23 devnull z = vtDial(host);
73 7763a61a 2003-11-23 devnull if(z == nil)
74 7763a61a 2003-11-23 devnull vtFatal("could not connect to server: %s", vtGetError());
76 7763a61a 2003-11-23 devnull if(!vtConnect(z, 0))
77 7763a61a 2003-11-23 devnull sysfatal("vtConnect: %r");
79 7763a61a 2003-11-23 devnull c = cacheAlloc(z, block, csize);
80 7763a61a 2003-11-23 devnull r = mkroot(c);
81 7763a61a 2003-11-23 devnull for(i=0; i<num; i++)
82 7763a61a 2003-11-23 devnull new(r, 0, 0);
84 7763a61a 2003-11-23 devnull for(i=0; i<iter; i++) {
85 7763a61a 2003-11-23 devnull if(i % 10000 == 0)
86 7763a61a 2003-11-23 devnull stats(r);
87 7763a61a 2003-11-23 devnull new(r, 0, 0);
88 7763a61a 2003-11-23 devnull delete(r);
91 7763a61a 2003-11-23 devnull fprint(2, "count = %d top = %lud\n", count(r, 0), sourceGetDirSize(r));
92 7763a61a 2003-11-23 devnull // cacheCheck(c);
93 7763a61a 2003-11-23 devnull fprint(2, "deleting\n");
94 7763a61a 2003-11-23 devnull for(i=0; i<num; i++)
95 7763a61a 2003-11-23 devnull delete(r);
97 7763a61a 2003-11-23 devnull // dump(r, 0, 0);
99 7763a61a 2003-11-23 devnull lumpDecRef(r->lump, 0);
100 7763a61a 2003-11-23 devnull sourceRemove(r);
101 7763a61a 2003-11-23 devnull cacheCheck(c);
103 7763a61a 2003-11-23 devnull vtClose(z);
104 7763a61a 2003-11-23 devnull vtDetach();
106 7763a61a 2003-11-23 devnull exits(0);
110 7763a61a 2003-11-23 devnull Source *
111 7763a61a 2003-11-23 devnull mkroot(Cache *c)
113 7763a61a 2003-11-23 devnull Lump *u;
114 7763a61a 2003-11-23 devnull VtEntry *dir;
115 7763a61a 2003-11-23 devnull Source *r;
117 7763a61a 2003-11-23 devnull u = cacheAllocLump(c, VtDirType, cacheGetBlockSize(c), 1);
118 7763a61a 2003-11-23 devnull dir = (VtEntry*)u->data;
119 7763a61a 2003-11-23 devnull vtPutUint16(dir->psize, cacheGetBlockSize(c));
120 7763a61a 2003-11-23 devnull vtPutUint16(dir->dsize, cacheGetBlockSize(c));
121 7763a61a 2003-11-23 devnull dir->flag = VtEntryActive|VtEntryDir;
122 7763a61a 2003-11-23 devnull memmove(dir->score, vtZeroScore, VtScoreSize);
124 7763a61a 2003-11-23 devnull r = sourceAlloc(c, u, 0, 0);
125 7763a61a 2003-11-23 devnull vtUnlock(u->lk);
126 7763a61a 2003-11-23 devnull if(r == nil)
127 7763a61a 2003-11-23 devnull sysfatal("could not create root source: %R");
128 7763a61a 2003-11-23 devnull return r;
132 7763a61a 2003-11-23 devnull new(Source *s, int trace, int depth)
134 7763a61a 2003-11-23 devnull int i, n;
135 7763a61a 2003-11-23 devnull Source *ss;
137 7763a61a 2003-11-23 devnull if(depth > maxdepth)
138 7763a61a 2003-11-23 devnull maxdepth = depth;
140 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
141 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
142 7763a61a 2003-11-23 devnull ss = sourceOpen(s, nrand(n), 0);
143 7763a61a 2003-11-23 devnull if(ss == nil)
144 7763a61a 2003-11-23 devnull continue;
145 7763a61a 2003-11-23 devnull if(ss->dir && frand() < 1./bush) {
146 7763a61a 2003-11-23 devnull if(trace) {
148 7763a61a 2003-11-23 devnull for(j=0; j<trace; j++)
149 7763a61a 2003-11-23 devnull Bprint(bout, " ");
150 7763a61a 2003-11-23 devnull Bprint(bout, "decend %d\n", i);
152 7763a61a 2003-11-23 devnull new(ss, trace?trace+1:0, depth+1);
153 7763a61a 2003-11-23 devnull sourceFree(ss);
156 7763a61a 2003-11-23 devnull sourceFree(ss);
158 7763a61a 2003-11-23 devnull ss = sourceCreate(s, s->psize, s->dsize, 1+frand()>.5, 0);
159 7763a61a 2003-11-23 devnull if(ss == nil)
160 7763a61a 2003-11-23 devnull fprint(2, "could not create directory: %R\n");
161 7763a61a 2003-11-23 devnull if(trace) {
163 7763a61a 2003-11-23 devnull for(j=1; j<trace; j++)
164 7763a61a 2003-11-23 devnull Bprint(bout, " ");
165 7763a61a 2003-11-23 devnull Bprint(bout, "create %d %V\n", ss->entry, ss->lump->score);
167 7763a61a 2003-11-23 devnull sourceFree(ss);
171 7763a61a 2003-11-23 devnull delete(Source *s)
173 7763a61a 2003-11-23 devnull int i, n;
174 7763a61a 2003-11-23 devnull Source *ss;
176 7763a61a 2003-11-23 devnull assert(s->dir);
178 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
179 7763a61a 2003-11-23 devnull /* check if empty */
180 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
181 7763a61a 2003-11-23 devnull ss = sourceOpen(s, i, 1);
182 7763a61a 2003-11-23 devnull if(ss != nil) {
183 7763a61a 2003-11-23 devnull sourceFree(ss);
187 7763a61a 2003-11-23 devnull if(i == n)
188 7763a61a 2003-11-23 devnull return 0;
190 7763a61a 2003-11-23 devnull for(;;) {
191 7763a61a 2003-11-23 devnull ss = sourceOpen(s, nrand(n), 0);
192 7763a61a 2003-11-23 devnull if(ss == nil)
193 7763a61a 2003-11-23 devnull continue;
194 7763a61a 2003-11-23 devnull if(ss->dir && delete(ss)) {
195 7763a61a 2003-11-23 devnull sourceFree(ss);
196 7763a61a 2003-11-23 devnull return 1;
200 7763a61a 2003-11-23 devnull sourceFree(ss);
204 7763a61a 2003-11-23 devnull sourceRemove(ss);
205 7763a61a 2003-11-23 devnull return 1;
209 7763a61a 2003-11-23 devnull dumpone(Source *s)
211 7763a61a 2003-11-23 devnull ulong i, n;
212 7763a61a 2003-11-23 devnull Source *ss;
214 7763a61a 2003-11-23 devnull Bprint(bout, "gen %4lud depth %d %V", s->gen, s->depth, s->lump->score);
215 7763a61a 2003-11-23 devnull if(!s->dir) {
216 7763a61a 2003-11-23 devnull Bprint(bout, " data size: %llud\n", s->size);
219 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
220 7763a61a 2003-11-23 devnull Bprint(bout, " dir size: %lud\n", n);
221 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
222 7763a61a 2003-11-23 devnull ss = sourceOpen(s, i, 1);
223 7763a61a 2003-11-23 devnull if(ss == nil) {
224 7763a61a 2003-11-23 devnull fprint(2, "%lud: %R\n", i);
225 7763a61a 2003-11-23 devnull continue;
227 7763a61a 2003-11-23 devnull Bprint(bout, "\t%lud %d %llud %V\n", i, ss->dir, ss->size, ss->lump->score);
228 7763a61a 2003-11-23 devnull sourceFree(ss);
235 7763a61a 2003-11-23 devnull dump(Source *s, int ident, ulong entry)
237 7763a61a 2003-11-23 devnull ulong i, n;
238 7763a61a 2003-11-23 devnull Source *ss;
240 7763a61a 2003-11-23 devnull for(i=0; i<ident; i++)
241 7763a61a 2003-11-23 devnull Bprint(bout, " ");
242 7763a61a 2003-11-23 devnull Bprint(bout, "%4lud: gen %4lud depth %d", entry, s->gen, s->depth);
243 7763a61a 2003-11-23 devnull if(!s->dir) {
244 7763a61a 2003-11-23 devnull Bprint(bout, " data size: %llud\n", s->size);
247 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
248 7763a61a 2003-11-23 devnull Bprint(bout, " dir size: %lud\n", n);
249 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
250 7763a61a 2003-11-23 devnull ss = sourceOpen(s, i, 1);
251 7763a61a 2003-11-23 devnull if(ss == nil)
252 7763a61a 2003-11-23 devnull continue;
253 7763a61a 2003-11-23 devnull dump(ss, ident+1, i);
254 7763a61a 2003-11-23 devnull sourceFree(ss);
260 7763a61a 2003-11-23 devnull count(Source *s, int rec)
262 7763a61a 2003-11-23 devnull ulong i, n;
264 7763a61a 2003-11-23 devnull Source *ss;
266 7763a61a 2003-11-23 devnull if(!s->dir)
267 7763a61a 2003-11-23 devnull return 0;
268 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
270 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
271 7763a61a 2003-11-23 devnull ss = sourceOpen(s, i, 1);
272 7763a61a 2003-11-23 devnull if(ss == nil)
273 7763a61a 2003-11-23 devnull continue;
275 7763a61a 2003-11-23 devnull c += count(ss, rec);
277 7763a61a 2003-11-23 devnull sourceFree(ss);
279 7763a61a 2003-11-23 devnull return c;
283 7763a61a 2003-11-23 devnull stats(Source *s)
285 7763a61a 2003-11-23 devnull int n, i, c, cc, max;
286 7763a61a 2003-11-23 devnull Source *ss;
289 7763a61a 2003-11-23 devnull max = 0;
290 7763a61a 2003-11-23 devnull n = sourceGetDirSize(s);
291 7763a61a 2003-11-23 devnull for(i=0; i<n; i++) {
292 7763a61a 2003-11-23 devnull ss = sourceOpen(s, i, 1);
293 7763a61a 2003-11-23 devnull if(ss == nil)
294 7763a61a 2003-11-23 devnull continue;
296 7763a61a 2003-11-23 devnull c = count(ss, 1);
297 7763a61a 2003-11-23 devnull if(c > max)
298 7763a61a 2003-11-23 devnull max = c;
299 7763a61a 2003-11-23 devnull sourceFree(ss);
301 7763a61a 2003-11-23 devnull fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);