1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
2 6f4d00ee 2013-09-23 0intro #include <bio.h>
3 6f4d00ee 2013-09-23 0intro #include "dat.h"
4 6f4d00ee 2013-09-23 0intro #include "fns.h"
5 6f4d00ee 2013-09-23 0intro #include "error.h"
7 6f4d00ee 2013-09-23 0intro int num = 100;
8 6f4d00ee 2013-09-23 0intro int length = 20*1024;
9 6f4d00ee 2013-09-23 0intro int block= 1024;
10 6f4d00ee 2013-09-23 0intro int bush = 4;
11 6f4d00ee 2013-09-23 0intro int iter = 100;
12 6f4d00ee 2013-09-23 0intro Biobuf *bout;
13 6f4d00ee 2013-09-23 0intro int maxdepth;
15 6f4d00ee 2013-09-23 0intro Source *mkroot(Cache*);
16 6f4d00ee 2013-09-23 0intro void new(Source*, int trace, int);
17 6f4d00ee 2013-09-23 0intro int delete(Source*);
18 6f4d00ee 2013-09-23 0intro int count(Source *s, int);
19 6f4d00ee 2013-09-23 0intro void stats(Source *s);
20 6f4d00ee 2013-09-23 0intro void dump(Source *s, int ident, ulong entry);
21 6f4d00ee 2013-09-23 0intro static void bench(Source *r);
24 6f4d00ee 2013-09-23 0intro main(int argc, char *argv[])
28 6f4d00ee 2013-09-23 0intro int csize = 1000;
30 6f4d00ee 2013-09-23 0intro Source *r;
34 6f4d00ee 2013-09-23 0intro iter = atoi(ARGF());
37 6f4d00ee 2013-09-23 0intro num = atoi(ARGF());
40 6f4d00ee 2013-09-23 0intro length = atoi(ARGF());
43 6f4d00ee 2013-09-23 0intro block = atoi(ARGF());
46 6f4d00ee 2013-09-23 0intro bush = atoi(ARGF());
49 6f4d00ee 2013-09-23 0intro csize = atoi(ARGF());
53 6f4d00ee 2013-09-23 0intro vtAttach();
55 6f4d00ee 2013-09-23 0intro bout = vtMemAllocZ(sizeof(Biobuf));
56 6f4d00ee 2013-09-23 0intro Binit(bout, 1, OWRITE);
58 6f4d00ee 2013-09-23 0intro fmtinstall('V', vtScoreFmt);
59 6f4d00ee 2013-09-23 0intro fmtinstall('R', vtErrFmt);
61 6f4d00ee 2013-09-23 0intro fs = fsOpen(argv[0], nil, csize, OReadWrite);
62 6f4d00ee 2013-09-23 0intro if(fs == nil)
63 6f4d00ee 2013-09-23 0intro sysfatal("could not open fs: %r");
65 6f4d00ee 2013-09-23 0intro t = time(0);
69 6f4d00ee 2013-09-23 0intro r = fs->source;
70 6f4d00ee 2013-09-23 0intro dump(r, 0, 0);
72 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d\n", count(r, 1));
73 6f4d00ee 2013-09-23 0intro for(i=0; i<num; i++)
74 6f4d00ee 2013-09-23 0intro new(r, 0, 0);
76 6f4d00ee 2013-09-23 0intro for(i=0; i<iter; i++){
77 6f4d00ee 2013-09-23 0intro if(i % 10000 == 0)
79 6f4d00ee 2013-09-23 0intro new(r, 0, 0);
80 6f4d00ee 2013-09-23 0intro delete(r);
83 6f4d00ee 2013-09-23 0intro // dump(r, 0, 0);
85 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d\n", count(r, 1));
86 6f4d00ee 2013-09-23 0intro // cacheCheck(c);
88 6f4d00ee 2013-09-23 0intro fprint(2, "deleting\n");
89 6f4d00ee 2013-09-23 0intro for(i=0; i<num; i++)
90 6f4d00ee 2013-09-23 0intro delete(r);
91 6f4d00ee 2013-09-23 0intro // dump(r, 0, 0);
93 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d\n", count(r, 1));
94 6f4d00ee 2013-09-23 0intro fprint(2, "total time = %ld\n", time(0)-t);
96 6f4d00ee 2013-09-23 0intro fsClose(fs);
97 6f4d00ee 2013-09-23 0intro vtDetach();
101 6f4d00ee 2013-09-23 0intro static void
102 6f4d00ee 2013-09-23 0intro bench(Source *r)
108 6f4d00ee 2013-09-23 0intro t = nsec();
110 6f4d00ee 2013-09-23 0intro for(i=0; i<1000000; i++)
111 6f4d00ee 2013-09-23 0intro sourceGetEntry(r, &e);
113 6f4d00ee 2013-09-23 0intro fprint(2, "%f\n", 1e-9*(nsec() - t));
117 6f4d00ee 2013-09-23 0intro new(Source *s, int trace, int depth)
119 6f4d00ee 2013-09-23 0intro int i, n;
120 6f4d00ee 2013-09-23 0intro Source *ss;
123 6f4d00ee 2013-09-23 0intro if(depth > maxdepth)
124 6f4d00ee 2013-09-23 0intro maxdepth = depth;
126 6f4d00ee 2013-09-23 0intro Bflush(bout);
128 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
129 6f4d00ee 2013-09-23 0intro for(i=0; i<n; i++){
130 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, nrand(n), OReadWrite);
131 6f4d00ee 2013-09-23 0intro if(ss == nil || !sourceGetEntry(ss, &e))
132 6f4d00ee 2013-09-23 0intro continue;
133 6f4d00ee 2013-09-23 0intro if((e.flags & VtEntryDir) && frand() < 1./bush){
134 6f4d00ee 2013-09-23 0intro if(trace){
136 6f4d00ee 2013-09-23 0intro for(j=0; j<trace; j++)
137 6f4d00ee 2013-09-23 0intro Bprint(bout, " ");
138 6f4d00ee 2013-09-23 0intro Bprint(bout, "decend %d\n", i);
140 6f4d00ee 2013-09-23 0intro new(ss, trace?trace+1:0, depth+1);
141 6f4d00ee 2013-09-23 0intro sourceClose(ss);
144 6f4d00ee 2013-09-23 0intro sourceClose(ss);
146 6f4d00ee 2013-09-23 0intro ss = sourceCreate(s, s->dsize, 1+frand()>.5, 0);
147 6f4d00ee 2013-09-23 0intro if(ss == nil){
148 6f4d00ee 2013-09-23 0intro Bprint(bout, "could not create directory: %R\n");
151 6f4d00ee 2013-09-23 0intro if(trace){
153 6f4d00ee 2013-09-23 0intro for(j=1; j<trace; j++)
154 6f4d00ee 2013-09-23 0intro Bprint(bout, " ");
155 6f4d00ee 2013-09-23 0intro Bprint(bout, "create %d\n", ss->offset);
157 6f4d00ee 2013-09-23 0intro sourceClose(ss);
161 6f4d00ee 2013-09-23 0intro delete(Source *s)
163 6f4d00ee 2013-09-23 0intro int i, n;
164 6f4d00ee 2013-09-23 0intro Source *ss;
166 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
167 6f4d00ee 2013-09-23 0intro /* check if empty */
168 6f4d00ee 2013-09-23 0intro for(i=0; i<n; i++){
169 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, i, OReadWrite);
170 6f4d00ee 2013-09-23 0intro if(ss != nil){
171 6f4d00ee 2013-09-23 0intro sourceClose(ss);
175 6f4d00ee 2013-09-23 0intro if(i == n)
176 6f4d00ee 2013-09-23 0intro return 0;
179 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, nrand(n), OReadWrite);
180 6f4d00ee 2013-09-23 0intro if(ss == nil)
181 6f4d00ee 2013-09-23 0intro continue;
182 6f4d00ee 2013-09-23 0intro if(s->dir && delete(ss)){
183 6f4d00ee 2013-09-23 0intro sourceClose(ss);
184 6f4d00ee 2013-09-23 0intro return 1;
188 6f4d00ee 2013-09-23 0intro sourceClose(ss);
192 6f4d00ee 2013-09-23 0intro sourceRemove(ss);
193 6f4d00ee 2013-09-23 0intro return 1;
197 6f4d00ee 2013-09-23 0intro dump(Source *s, int ident, ulong entry)
199 6f4d00ee 2013-09-23 0intro ulong i, n;
200 6f4d00ee 2013-09-23 0intro Source *ss;
203 6f4d00ee 2013-09-23 0intro for(i=0; i<ident; i++)
204 6f4d00ee 2013-09-23 0intro Bprint(bout, " ");
206 6f4d00ee 2013-09-23 0intro if(!sourceGetEntry(s, &e)){
207 6f4d00ee 2013-09-23 0intro fprint(2, "sourceGetEntry failed: %r\n");
211 6f4d00ee 2013-09-23 0intro Bprint(bout, "%4lud: gen %4ud depth %d tag=%x score=%V",
212 6f4d00ee 2013-09-23 0intro entry, e.gen, e.depth, e.tag, e.score);
213 6f4d00ee 2013-09-23 0intro if(!s->dir){
214 6f4d00ee 2013-09-23 0intro Bprint(bout, " data size: %llud\n", e.size);
217 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
218 6f4d00ee 2013-09-23 0intro Bprint(bout, " dir size: %lud\n", n);
219 6f4d00ee 2013-09-23 0intro for(i=0; i<n; i++){
220 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, i, 1);
221 6f4d00ee 2013-09-23 0intro if(ss == nil)
222 6f4d00ee 2013-09-23 0intro continue;
223 6f4d00ee 2013-09-23 0intro dump(ss, ident+1, i);
224 6f4d00ee 2013-09-23 0intro sourceClose(ss);
230 6f4d00ee 2013-09-23 0intro count(Source *s, int rec)
232 6f4d00ee 2013-09-23 0intro ulong i, n;
234 6f4d00ee 2013-09-23 0intro Source *ss;
236 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
238 6f4d00ee 2013-09-23 0intro for(i=0; i<n; i++){
239 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, i, OReadOnly);
240 6f4d00ee 2013-09-23 0intro if(ss == nil)
241 6f4d00ee 2013-09-23 0intro continue;
243 6f4d00ee 2013-09-23 0intro c += count(ss, rec);
245 6f4d00ee 2013-09-23 0intro sourceClose(ss);
247 6f4d00ee 2013-09-23 0intro return c;
251 6f4d00ee 2013-09-23 0intro stats(Source *s)
253 6f4d00ee 2013-09-23 0intro int n, i, c, cc, max;
254 6f4d00ee 2013-09-23 0intro Source *ss;
258 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
259 6f4d00ee 2013-09-23 0intro for(i=0; i<n; i++){
260 6f4d00ee 2013-09-23 0intro ss = sourceOpen(s, i, 1);
261 6f4d00ee 2013-09-23 0intro if(ss == nil)
262 6f4d00ee 2013-09-23 0intro continue;
264 6f4d00ee 2013-09-23 0intro c = count(ss, 1);
265 6f4d00ee 2013-09-23 0intro if(c > max)
267 6f4d00ee 2013-09-23 0intro sourceClose(ss);
269 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);