Blame


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"
6 6f4d00ee 2013-09-23 0intro
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;
14 6f4d00ee 2013-09-23 0intro
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);
22 6f4d00ee 2013-09-23 0intro
23 6f4d00ee 2013-09-23 0intro void
24 6f4d00ee 2013-09-23 0intro main(int argc, char *argv[])
25 6f4d00ee 2013-09-23 0intro {
26 6f4d00ee 2013-09-23 0intro int i;
27 6f4d00ee 2013-09-23 0intro Fs *fs;
28 6f4d00ee 2013-09-23 0intro int csize = 1000;
29 6f4d00ee 2013-09-23 0intro ulong t;
30 6f4d00ee 2013-09-23 0intro Source *r;
31 6f4d00ee 2013-09-23 0intro
32 6f4d00ee 2013-09-23 0intro ARGBEGIN{
33 6f4d00ee 2013-09-23 0intro case 'i':
34 6f4d00ee 2013-09-23 0intro iter = atoi(ARGF());
35 6f4d00ee 2013-09-23 0intro break;
36 6f4d00ee 2013-09-23 0intro case 'n':
37 6f4d00ee 2013-09-23 0intro num = atoi(ARGF());
38 6f4d00ee 2013-09-23 0intro break;
39 6f4d00ee 2013-09-23 0intro case 'l':
40 6f4d00ee 2013-09-23 0intro length = atoi(ARGF());
41 6f4d00ee 2013-09-23 0intro break;
42 fa325e9b 2020-01-10 cross case 'b':
43 6f4d00ee 2013-09-23 0intro block = atoi(ARGF());
44 6f4d00ee 2013-09-23 0intro break;
45 6f4d00ee 2013-09-23 0intro case 'u':
46 6f4d00ee 2013-09-23 0intro bush = atoi(ARGF());
47 6f4d00ee 2013-09-23 0intro break;
48 6f4d00ee 2013-09-23 0intro case 'c':
49 6f4d00ee 2013-09-23 0intro csize = atoi(ARGF());
50 6f4d00ee 2013-09-23 0intro break;
51 6f4d00ee 2013-09-23 0intro }ARGEND;
52 6f4d00ee 2013-09-23 0intro
53 6f4d00ee 2013-09-23 0intro vtAttach();
54 6f4d00ee 2013-09-23 0intro
55 6f4d00ee 2013-09-23 0intro bout = vtMemAllocZ(sizeof(Biobuf));
56 6f4d00ee 2013-09-23 0intro Binit(bout, 1, OWRITE);
57 6f4d00ee 2013-09-23 0intro
58 6f4d00ee 2013-09-23 0intro fmtinstall('V', vtScoreFmt);
59 6f4d00ee 2013-09-23 0intro fmtinstall('R', vtErrFmt);
60 6f4d00ee 2013-09-23 0intro
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");
64 6f4d00ee 2013-09-23 0intro
65 6f4d00ee 2013-09-23 0intro t = time(0);
66 6f4d00ee 2013-09-23 0intro
67 6f4d00ee 2013-09-23 0intro srand(0);
68 6f4d00ee 2013-09-23 0intro
69 6f4d00ee 2013-09-23 0intro r = fs->source;
70 6f4d00ee 2013-09-23 0intro dump(r, 0, 0);
71 6f4d00ee 2013-09-23 0intro
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);
75 6f4d00ee 2013-09-23 0intro
76 6f4d00ee 2013-09-23 0intro for(i=0; i<iter; i++){
77 6f4d00ee 2013-09-23 0intro if(i % 10000 == 0)
78 6f4d00ee 2013-09-23 0intro stats(r);
79 6f4d00ee 2013-09-23 0intro new(r, 0, 0);
80 6f4d00ee 2013-09-23 0intro delete(r);
81 6f4d00ee 2013-09-23 0intro }
82 6f4d00ee 2013-09-23 0intro
83 6f4d00ee 2013-09-23 0intro // dump(r, 0, 0);
84 6f4d00ee 2013-09-23 0intro
85 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d\n", count(r, 1));
86 6f4d00ee 2013-09-23 0intro // cacheCheck(c);
87 6f4d00ee 2013-09-23 0intro
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);
92 6f4d00ee 2013-09-23 0intro
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);
95 fa325e9b 2020-01-10 cross
96 6f4d00ee 2013-09-23 0intro fsClose(fs);
97 6f4d00ee 2013-09-23 0intro vtDetach();
98 6f4d00ee 2013-09-23 0intro exits(0);
99 6f4d00ee 2013-09-23 0intro }
100 6f4d00ee 2013-09-23 0intro
101 6f4d00ee 2013-09-23 0intro static void
102 6f4d00ee 2013-09-23 0intro bench(Source *r)
103 6f4d00ee 2013-09-23 0intro {
104 6f4d00ee 2013-09-23 0intro vlong t;
105 6f4d00ee 2013-09-23 0intro Entry e;
106 6f4d00ee 2013-09-23 0intro int i;
107 6f4d00ee 2013-09-23 0intro
108 6f4d00ee 2013-09-23 0intro t = nsec();
109 6f4d00ee 2013-09-23 0intro
110 6f4d00ee 2013-09-23 0intro for(i=0; i<1000000; i++)
111 6f4d00ee 2013-09-23 0intro sourceGetEntry(r, &e);
112 6f4d00ee 2013-09-23 0intro
113 6f4d00ee 2013-09-23 0intro fprint(2, "%f\n", 1e-9*(nsec() - t));
114 6f4d00ee 2013-09-23 0intro }
115 6f4d00ee 2013-09-23 0intro
116 6f4d00ee 2013-09-23 0intro void
117 6f4d00ee 2013-09-23 0intro new(Source *s, int trace, int depth)
118 6f4d00ee 2013-09-23 0intro {
119 6f4d00ee 2013-09-23 0intro int i, n;
120 6f4d00ee 2013-09-23 0intro Source *ss;
121 6f4d00ee 2013-09-23 0intro Entry e;
122 fa325e9b 2020-01-10 cross
123 6f4d00ee 2013-09-23 0intro if(depth > maxdepth)
124 6f4d00ee 2013-09-23 0intro maxdepth = depth;
125 6f4d00ee 2013-09-23 0intro
126 6f4d00ee 2013-09-23 0intro Bflush(bout);
127 6f4d00ee 2013-09-23 0intro
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){
135 6f4d00ee 2013-09-23 0intro int j;
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);
139 6f4d00ee 2013-09-23 0intro }
140 6f4d00ee 2013-09-23 0intro new(ss, trace?trace+1:0, depth+1);
141 6f4d00ee 2013-09-23 0intro sourceClose(ss);
142 6f4d00ee 2013-09-23 0intro return;
143 6f4d00ee 2013-09-23 0intro }
144 6f4d00ee 2013-09-23 0intro sourceClose(ss);
145 6f4d00ee 2013-09-23 0intro }
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");
149 6f4d00ee 2013-09-23 0intro return;
150 6f4d00ee 2013-09-23 0intro }
151 6f4d00ee 2013-09-23 0intro if(trace){
152 6f4d00ee 2013-09-23 0intro int j;
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);
156 6f4d00ee 2013-09-23 0intro }
157 6f4d00ee 2013-09-23 0intro sourceClose(ss);
158 6f4d00ee 2013-09-23 0intro }
159 6f4d00ee 2013-09-23 0intro
160 6f4d00ee 2013-09-23 0intro int
161 6f4d00ee 2013-09-23 0intro delete(Source *s)
162 6f4d00ee 2013-09-23 0intro {
163 6f4d00ee 2013-09-23 0intro int i, n;
164 6f4d00ee 2013-09-23 0intro Source *ss;
165 6f4d00ee 2013-09-23 0intro
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);
172 6f4d00ee 2013-09-23 0intro break;
173 6f4d00ee 2013-09-23 0intro }
174 6f4d00ee 2013-09-23 0intro }
175 6f4d00ee 2013-09-23 0intro if(i == n)
176 6f4d00ee 2013-09-23 0intro return 0;
177 fa325e9b 2020-01-10 cross
178 6f4d00ee 2013-09-23 0intro for(;;){
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;
185 6f4d00ee 2013-09-23 0intro }
186 6f4d00ee 2013-09-23 0intro if(1)
187 6f4d00ee 2013-09-23 0intro break;
188 6f4d00ee 2013-09-23 0intro sourceClose(ss);
189 6f4d00ee 2013-09-23 0intro }
190 6f4d00ee 2013-09-23 0intro
191 6f4d00ee 2013-09-23 0intro
192 6f4d00ee 2013-09-23 0intro sourceRemove(ss);
193 6f4d00ee 2013-09-23 0intro return 1;
194 6f4d00ee 2013-09-23 0intro }
195 6f4d00ee 2013-09-23 0intro
196 6f4d00ee 2013-09-23 0intro void
197 6f4d00ee 2013-09-23 0intro dump(Source *s, int ident, ulong entry)
198 6f4d00ee 2013-09-23 0intro {
199 6f4d00ee 2013-09-23 0intro ulong i, n;
200 6f4d00ee 2013-09-23 0intro Source *ss;
201 6f4d00ee 2013-09-23 0intro Entry e;
202 6f4d00ee 2013-09-23 0intro
203 6f4d00ee 2013-09-23 0intro for(i=0; i<ident; i++)
204 6f4d00ee 2013-09-23 0intro Bprint(bout, " ");
205 6f4d00ee 2013-09-23 0intro
206 6f4d00ee 2013-09-23 0intro if(!sourceGetEntry(s, &e)){
207 6f4d00ee 2013-09-23 0intro fprint(2, "sourceGetEntry failed: %r\n");
208 6f4d00ee 2013-09-23 0intro return;
209 6f4d00ee 2013-09-23 0intro }
210 6f4d00ee 2013-09-23 0intro
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);
215 6f4d00ee 2013-09-23 0intro return;
216 6f4d00ee 2013-09-23 0intro }
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);
225 6f4d00ee 2013-09-23 0intro }
226 6f4d00ee 2013-09-23 0intro return;
227 6f4d00ee 2013-09-23 0intro }
228 6f4d00ee 2013-09-23 0intro
229 6f4d00ee 2013-09-23 0intro int
230 6f4d00ee 2013-09-23 0intro count(Source *s, int rec)
231 6f4d00ee 2013-09-23 0intro {
232 6f4d00ee 2013-09-23 0intro ulong i, n;
233 6f4d00ee 2013-09-23 0intro int c;
234 6f4d00ee 2013-09-23 0intro Source *ss;
235 6f4d00ee 2013-09-23 0intro
236 6f4d00ee 2013-09-23 0intro n = sourceGetDirSize(s);
237 6f4d00ee 2013-09-23 0intro c = 0;
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;
242 6f4d00ee 2013-09-23 0intro if(rec)
243 6f4d00ee 2013-09-23 0intro c += count(ss, rec);
244 6f4d00ee 2013-09-23 0intro c++;
245 6f4d00ee 2013-09-23 0intro sourceClose(ss);
246 6f4d00ee 2013-09-23 0intro }
247 6f4d00ee 2013-09-23 0intro return c;
248 6f4d00ee 2013-09-23 0intro }
249 6f4d00ee 2013-09-23 0intro
250 6f4d00ee 2013-09-23 0intro void
251 6f4d00ee 2013-09-23 0intro stats(Source *s)
252 6f4d00ee 2013-09-23 0intro {
253 6f4d00ee 2013-09-23 0intro int n, i, c, cc, max;
254 6f4d00ee 2013-09-23 0intro Source *ss;
255 6f4d00ee 2013-09-23 0intro
256 6f4d00ee 2013-09-23 0intro cc = 0;
257 6f4d00ee 2013-09-23 0intro max = 0;
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;
263 6f4d00ee 2013-09-23 0intro cc++;
264 6f4d00ee 2013-09-23 0intro c = count(ss, 1);
265 6f4d00ee 2013-09-23 0intro if(c > max)
266 6f4d00ee 2013-09-23 0intro max = c;
267 6f4d00ee 2013-09-23 0intro sourceClose(ss);
268 6f4d00ee 2013-09-23 0intro }
269 6f4d00ee 2013-09-23 0intro fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);
270 6f4d00ee 2013-09-23 0intro }