Blame


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"
7 7763a61a 2003-11-23 devnull
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;
15 7763a61a 2003-11-23 devnull
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);
23 7763a61a 2003-11-23 devnull
24 7763a61a 2003-11-23 devnull void
25 7763a61a 2003-11-23 devnull main(int argc, char *argv[])
26 7763a61a 2003-11-23 devnull {
27 7763a61a 2003-11-23 devnull int i;
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;
33 7763a61a 2003-11-23 devnull ulong t;
34 7763a61a 2003-11-23 devnull
35 7763a61a 2003-11-23 devnull t = time(0);
36 7763a61a 2003-11-23 devnull fprint(1, "time = %lud\n", t);
37 7763a61a 2003-11-23 devnull
38 7763a61a 2003-11-23 devnull srand(t);
39 7763a61a 2003-11-23 devnull
40 7763a61a 2003-11-23 devnull ARGBEGIN{
41 7763a61a 2003-11-23 devnull case 'i':
42 7763a61a 2003-11-23 devnull iter = atoi(ARGF());
43 7763a61a 2003-11-23 devnull break;
44 7763a61a 2003-11-23 devnull case 'n':
45 7763a61a 2003-11-23 devnull num = atoi(ARGF());
46 7763a61a 2003-11-23 devnull break;
47 7763a61a 2003-11-23 devnull case 'l':
48 7763a61a 2003-11-23 devnull length = atoi(ARGF());
49 7763a61a 2003-11-23 devnull break;
50 7763a61a 2003-11-23 devnull case 'b':
51 7763a61a 2003-11-23 devnull block = atoi(ARGF());
52 7763a61a 2003-11-23 devnull break;
53 7763a61a 2003-11-23 devnull case 'h':
54 7763a61a 2003-11-23 devnull host = ARGF();
55 7763a61a 2003-11-23 devnull break;
56 7763a61a 2003-11-23 devnull case 'u':
57 7763a61a 2003-11-23 devnull bush = atoi(ARGF());
58 7763a61a 2003-11-23 devnull break;
59 7763a61a 2003-11-23 devnull case 'c':
60 7763a61a 2003-11-23 devnull csize = atoi(ARGF());
61 7763a61a 2003-11-23 devnull break;
62 7763a61a 2003-11-23 devnull }ARGEND;
63 7763a61a 2003-11-23 devnull
64 7763a61a 2003-11-23 devnull vtAttach();
65 7763a61a 2003-11-23 devnull
66 7763a61a 2003-11-23 devnull bout = vtMemAllocZ(sizeof(Biobuf));
67 7763a61a 2003-11-23 devnull Binit(bout, 1, OWRITE);
68 7763a61a 2003-11-23 devnull
69 7763a61a 2003-11-23 devnull fmtinstall('V', vtScoreFmt);
70 7763a61a 2003-11-23 devnull fmtinstall('R', vtErrFmt);
71 7763a61a 2003-11-23 devnull
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());
75 7763a61a 2003-11-23 devnull
76 7763a61a 2003-11-23 devnull if(!vtConnect(z, 0))
77 7763a61a 2003-11-23 devnull sysfatal("vtConnect: %r");
78 7763a61a 2003-11-23 devnull
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);
83 7763a61a 2003-11-23 devnull
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);
89 7763a61a 2003-11-23 devnull }
90 7763a61a 2003-11-23 devnull
91 7763a61a 2003-11-23 devnull fprint(2, "count = %d top = %lud\n", count(r, 0), sourceGetDirSize(r));
92 cbeb0b26 2006-04-01 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);
96 7763a61a 2003-11-23 devnull
97 cbeb0b26 2006-04-01 devnull /* dump(r, 0, 0); */
98 7763a61a 2003-11-23 devnull
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);
102 7763a61a 2003-11-23 devnull
103 7763a61a 2003-11-23 devnull vtClose(z);
104 7763a61a 2003-11-23 devnull vtDetach();
105 7763a61a 2003-11-23 devnull
106 7763a61a 2003-11-23 devnull exits(0);
107 7763a61a 2003-11-23 devnull }
108 7763a61a 2003-11-23 devnull
109 7763a61a 2003-11-23 devnull
110 7763a61a 2003-11-23 devnull Source *
111 7763a61a 2003-11-23 devnull mkroot(Cache *c)
112 7763a61a 2003-11-23 devnull {
113 7763a61a 2003-11-23 devnull Lump *u;
114 7763a61a 2003-11-23 devnull VtEntry *dir;
115 7763a61a 2003-11-23 devnull Source *r;
116 7763a61a 2003-11-23 devnull
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);
123 7763a61a 2003-11-23 devnull
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 929fcfe0 2004-12-27 devnull sysfatal("could not create root source: %r");
128 7763a61a 2003-11-23 devnull return r;
129 7763a61a 2003-11-23 devnull }
130 7763a61a 2003-11-23 devnull
131 7763a61a 2003-11-23 devnull void
132 7763a61a 2003-11-23 devnull new(Source *s, int trace, int depth)
133 7763a61a 2003-11-23 devnull {
134 7763a61a 2003-11-23 devnull int i, n;
135 7763a61a 2003-11-23 devnull Source *ss;
136 7763a61a 2003-11-23 devnull
137 7763a61a 2003-11-23 devnull if(depth > maxdepth)
138 7763a61a 2003-11-23 devnull maxdepth = depth;
139 7763a61a 2003-11-23 devnull
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) {
147 7763a61a 2003-11-23 devnull int j;
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);
151 7763a61a 2003-11-23 devnull }
152 7763a61a 2003-11-23 devnull new(ss, trace?trace+1:0, depth+1);
153 7763a61a 2003-11-23 devnull sourceFree(ss);
154 7763a61a 2003-11-23 devnull return;
155 7763a61a 2003-11-23 devnull }
156 7763a61a 2003-11-23 devnull sourceFree(ss);
157 7763a61a 2003-11-23 devnull }
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 929fcfe0 2004-12-27 devnull fprint(2, "could not create directory: %r\n");
161 7763a61a 2003-11-23 devnull if(trace) {
162 7763a61a 2003-11-23 devnull int j;
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);
166 7763a61a 2003-11-23 devnull }
167 7763a61a 2003-11-23 devnull sourceFree(ss);
168 7763a61a 2003-11-23 devnull }
169 7763a61a 2003-11-23 devnull
170 7763a61a 2003-11-23 devnull int
171 7763a61a 2003-11-23 devnull delete(Source *s)
172 7763a61a 2003-11-23 devnull {
173 7763a61a 2003-11-23 devnull int i, n;
174 7763a61a 2003-11-23 devnull Source *ss;
175 7763a61a 2003-11-23 devnull
176 7763a61a 2003-11-23 devnull assert(s->dir);
177 7763a61a 2003-11-23 devnull
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);
184 7763a61a 2003-11-23 devnull break;
185 7763a61a 2003-11-23 devnull }
186 7763a61a 2003-11-23 devnull }
187 7763a61a 2003-11-23 devnull if(i == n)
188 7763a61a 2003-11-23 devnull return 0;
189 7763a61a 2003-11-23 devnull
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;
197 7763a61a 2003-11-23 devnull }
198 7763a61a 2003-11-23 devnull if(1)
199 7763a61a 2003-11-23 devnull break;
200 7763a61a 2003-11-23 devnull sourceFree(ss);
201 7763a61a 2003-11-23 devnull }
202 7763a61a 2003-11-23 devnull
203 7763a61a 2003-11-23 devnull
204 7763a61a 2003-11-23 devnull sourceRemove(ss);
205 7763a61a 2003-11-23 devnull return 1;
206 7763a61a 2003-11-23 devnull }
207 7763a61a 2003-11-23 devnull
208 7763a61a 2003-11-23 devnull void
209 7763a61a 2003-11-23 devnull dumpone(Source *s)
210 7763a61a 2003-11-23 devnull {
211 7763a61a 2003-11-23 devnull ulong i, n;
212 7763a61a 2003-11-23 devnull Source *ss;
213 7763a61a 2003-11-23 devnull
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);
217 7763a61a 2003-11-23 devnull return;
218 7763a61a 2003-11-23 devnull }
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 929fcfe0 2004-12-27 devnull fprint(2, "%lud: %r\n", i);
225 7763a61a 2003-11-23 devnull continue;
226 7763a61a 2003-11-23 devnull }
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);
229 7763a61a 2003-11-23 devnull }
230 7763a61a 2003-11-23 devnull return;
231 7763a61a 2003-11-23 devnull }
232 7763a61a 2003-11-23 devnull
233 7763a61a 2003-11-23 devnull
234 7763a61a 2003-11-23 devnull void
235 7763a61a 2003-11-23 devnull dump(Source *s, int ident, ulong entry)
236 7763a61a 2003-11-23 devnull {
237 7763a61a 2003-11-23 devnull ulong i, n;
238 7763a61a 2003-11-23 devnull Source *ss;
239 7763a61a 2003-11-23 devnull
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);
245 7763a61a 2003-11-23 devnull return;
246 7763a61a 2003-11-23 devnull }
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);
255 7763a61a 2003-11-23 devnull }
256 7763a61a 2003-11-23 devnull return;
257 7763a61a 2003-11-23 devnull }
258 7763a61a 2003-11-23 devnull
259 7763a61a 2003-11-23 devnull int
260 7763a61a 2003-11-23 devnull count(Source *s, int rec)
261 7763a61a 2003-11-23 devnull {
262 7763a61a 2003-11-23 devnull ulong i, n;
263 7763a61a 2003-11-23 devnull int c;
264 7763a61a 2003-11-23 devnull Source *ss;
265 7763a61a 2003-11-23 devnull
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);
269 7763a61a 2003-11-23 devnull c = 0;
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;
274 7763a61a 2003-11-23 devnull if(rec)
275 7763a61a 2003-11-23 devnull c += count(ss, rec);
276 7763a61a 2003-11-23 devnull c++;
277 7763a61a 2003-11-23 devnull sourceFree(ss);
278 7763a61a 2003-11-23 devnull }
279 7763a61a 2003-11-23 devnull return c;
280 7763a61a 2003-11-23 devnull }
281 7763a61a 2003-11-23 devnull
282 7763a61a 2003-11-23 devnull void
283 7763a61a 2003-11-23 devnull stats(Source *s)
284 7763a61a 2003-11-23 devnull {
285 7763a61a 2003-11-23 devnull int n, i, c, cc, max;
286 7763a61a 2003-11-23 devnull Source *ss;
287 7763a61a 2003-11-23 devnull
288 7763a61a 2003-11-23 devnull cc = 0;
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;
295 7763a61a 2003-11-23 devnull cc++;
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);
300 7763a61a 2003-11-23 devnull }
301 7763a61a 2003-11-23 devnull fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);
302 7763a61a 2003-11-23 devnull }