15e96a66cSDavid du Colombier #include "stdinc.h"
25e96a66cSDavid du Colombier #include <bio.h>
35e96a66cSDavid du Colombier #include "dat.h"
45e96a66cSDavid du Colombier #include "fns.h"
55e96a66cSDavid du Colombier #include "error.h"
65e96a66cSDavid du Colombier
75e96a66cSDavid du Colombier int num = 100;
85e96a66cSDavid du Colombier int length = 20*1024;
95e96a66cSDavid du Colombier int block= 1024;
105e96a66cSDavid du Colombier int bush = 4;
115e96a66cSDavid du Colombier int iter = 100;
125e96a66cSDavid du Colombier Biobuf *bout;
135e96a66cSDavid du Colombier int maxdepth;
145e96a66cSDavid du Colombier
155e96a66cSDavid du Colombier Source *mkroot(Cache*);
165e96a66cSDavid du Colombier void new(Source*, int trace, int);
175e96a66cSDavid du Colombier int delete(Source*);
185e96a66cSDavid du Colombier int count(Source *s, int);
195e96a66cSDavid du Colombier void stats(Source *s);
205e96a66cSDavid du Colombier void dump(Source *s, int ident, ulong entry);
215e96a66cSDavid du Colombier static void bench(Source *r);
225e96a66cSDavid du Colombier
235e96a66cSDavid du Colombier void
main(int argc,char * argv[])245e96a66cSDavid du Colombier main(int argc, char *argv[])
255e96a66cSDavid du Colombier {
265e96a66cSDavid du Colombier int i;
275e96a66cSDavid du Colombier Fs *fs;
285e96a66cSDavid du Colombier int csize = 1000;
295e96a66cSDavid du Colombier ulong t;
305e96a66cSDavid du Colombier Source *r;
315e96a66cSDavid du Colombier
325e96a66cSDavid du Colombier ARGBEGIN{
335e96a66cSDavid du Colombier case 'i':
345e96a66cSDavid du Colombier iter = atoi(ARGF());
355e96a66cSDavid du Colombier break;
365e96a66cSDavid du Colombier case 'n':
375e96a66cSDavid du Colombier num = atoi(ARGF());
385e96a66cSDavid du Colombier break;
395e96a66cSDavid du Colombier case 'l':
405e96a66cSDavid du Colombier length = atoi(ARGF());
415e96a66cSDavid du Colombier break;
425e96a66cSDavid du Colombier case 'b':
435e96a66cSDavid du Colombier block = atoi(ARGF());
445e96a66cSDavid du Colombier break;
455e96a66cSDavid du Colombier case 'u':
465e96a66cSDavid du Colombier bush = atoi(ARGF());
475e96a66cSDavid du Colombier break;
485e96a66cSDavid du Colombier case 'c':
495e96a66cSDavid du Colombier csize = atoi(ARGF());
505e96a66cSDavid du Colombier break;
515e96a66cSDavid du Colombier }ARGEND;
525e96a66cSDavid du Colombier
535e96a66cSDavid du Colombier vtAttach();
545e96a66cSDavid du Colombier
555e96a66cSDavid du Colombier bout = vtMemAllocZ(sizeof(Biobuf));
565e96a66cSDavid du Colombier Binit(bout, 1, OWRITE);
575e96a66cSDavid du Colombier
585e96a66cSDavid du Colombier fmtinstall('V', vtScoreFmt);
595e96a66cSDavid du Colombier fmtinstall('R', vtErrFmt);
605e96a66cSDavid du Colombier
615e96a66cSDavid du Colombier fs = fsOpen(argv[0], nil, csize, OReadWrite);
625e96a66cSDavid du Colombier if(fs == nil)
635e96a66cSDavid du Colombier sysfatal("could not open fs: %r");
645e96a66cSDavid du Colombier
655e96a66cSDavid du Colombier t = time(0);
665e96a66cSDavid du Colombier
675e96a66cSDavid du Colombier srand(0);
685e96a66cSDavid du Colombier
695e96a66cSDavid du Colombier r = fs->source;
705e96a66cSDavid du Colombier dump(r, 0, 0);
715e96a66cSDavid du Colombier
725e96a66cSDavid du Colombier fprint(2, "count = %d\n", count(r, 1));
735e96a66cSDavid du Colombier for(i=0; i<num; i++)
745e96a66cSDavid du Colombier new(r, 0, 0);
755e96a66cSDavid du Colombier
765e96a66cSDavid du Colombier for(i=0; i<iter; i++){
775e96a66cSDavid du Colombier if(i % 10000 == 0)
785e96a66cSDavid du Colombier stats(r);
795e96a66cSDavid du Colombier new(r, 0, 0);
805e96a66cSDavid du Colombier delete(r);
815e96a66cSDavid du Colombier }
825e96a66cSDavid du Colombier
835e96a66cSDavid du Colombier // dump(r, 0, 0);
845e96a66cSDavid du Colombier
855e96a66cSDavid du Colombier fprint(2, "count = %d\n", count(r, 1));
865e96a66cSDavid du Colombier // cacheCheck(c);
875e96a66cSDavid du Colombier
885e96a66cSDavid du Colombier fprint(2, "deleting\n");
895e96a66cSDavid du Colombier for(i=0; i<num; i++)
905e96a66cSDavid du Colombier delete(r);
915e96a66cSDavid du Colombier // dump(r, 0, 0);
925e96a66cSDavid du Colombier
935e96a66cSDavid du Colombier fprint(2, "count = %d\n", count(r, 1));
945e96a66cSDavid du Colombier fprint(2, "total time = %ld\n", time(0)-t);
955e96a66cSDavid du Colombier
965e96a66cSDavid du Colombier fsClose(fs);
975e96a66cSDavid du Colombier vtDetach();
985e96a66cSDavid du Colombier exits(0);
995e96a66cSDavid du Colombier }
1005e96a66cSDavid du Colombier
1015e96a66cSDavid du Colombier static void
bench(Source * r)1025e96a66cSDavid du Colombier bench(Source *r)
1035e96a66cSDavid du Colombier {
1045e96a66cSDavid du Colombier vlong t;
1055e96a66cSDavid du Colombier Entry e;
1065e96a66cSDavid du Colombier int i;
1075e96a66cSDavid du Colombier
1085e96a66cSDavid du Colombier t = nsec();
1095e96a66cSDavid du Colombier
1105e96a66cSDavid du Colombier for(i=0; i<1000000; i++)
1115e96a66cSDavid du Colombier sourceGetEntry(r, &e);
1125e96a66cSDavid du Colombier
1135e96a66cSDavid du Colombier fprint(2, "%f\n", 1e-9*(nsec() - t));
1145e96a66cSDavid du Colombier }
1155e96a66cSDavid du Colombier
1165e96a66cSDavid du Colombier void
new(Source * s,int trace,int depth)1175e96a66cSDavid du Colombier new(Source *s, int trace, int depth)
1185e96a66cSDavid du Colombier {
1195e96a66cSDavid du Colombier int i, n;
1205e96a66cSDavid du Colombier Source *ss;
1215e96a66cSDavid du Colombier Entry e;
1225e96a66cSDavid du Colombier
1235e96a66cSDavid du Colombier if(depth > maxdepth)
1245e96a66cSDavid du Colombier maxdepth = depth;
1255e96a66cSDavid du Colombier
1265e96a66cSDavid du Colombier Bflush(bout);
1275e96a66cSDavid du Colombier
1285e96a66cSDavid du Colombier n = sourceGetDirSize(s);
1295e96a66cSDavid du Colombier for(i=0; i<n; i++){
1305e96a66cSDavid du Colombier ss = sourceOpen(s, nrand(n), OReadWrite);
1315e96a66cSDavid du Colombier if(ss == nil || !sourceGetEntry(ss, &e))
1325e96a66cSDavid du Colombier continue;
1335e96a66cSDavid du Colombier if((e.flags & VtEntryDir) && frand() < 1./bush){
1345e96a66cSDavid du Colombier if(trace){
1355e96a66cSDavid du Colombier int j;
1365e96a66cSDavid du Colombier for(j=0; j<trace; j++)
1375e96a66cSDavid du Colombier Bprint(bout, " ");
1385e96a66cSDavid du Colombier Bprint(bout, "decend %d\n", i);
1395e96a66cSDavid du Colombier }
1405e96a66cSDavid du Colombier new(ss, trace?trace+1:0, depth+1);
1415e96a66cSDavid du Colombier sourceClose(ss);
1425e96a66cSDavid du Colombier return;
1435e96a66cSDavid du Colombier }
1445e96a66cSDavid du Colombier sourceClose(ss);
1455e96a66cSDavid du Colombier }
1465e96a66cSDavid du Colombier ss = sourceCreate(s, s->dsize, 1+frand()>.5, 0);
1475e96a66cSDavid du Colombier if(ss == nil){
1485e96a66cSDavid du Colombier Bprint(bout, "could not create directory: %R\n");
1495e96a66cSDavid du Colombier return;
1505e96a66cSDavid du Colombier }
1515e96a66cSDavid du Colombier if(trace){
1525e96a66cSDavid du Colombier int j;
1535e96a66cSDavid du Colombier for(j=1; j<trace; j++)
1545e96a66cSDavid du Colombier Bprint(bout, " ");
1555e96a66cSDavid du Colombier Bprint(bout, "create %d\n", ss->offset);
1565e96a66cSDavid du Colombier }
1575e96a66cSDavid du Colombier sourceClose(ss);
1585e96a66cSDavid du Colombier }
1595e96a66cSDavid du Colombier
1605e96a66cSDavid du Colombier int
delete(Source * s)1615e96a66cSDavid du Colombier delete(Source *s)
1625e96a66cSDavid du Colombier {
1635e96a66cSDavid du Colombier int i, n;
1645e96a66cSDavid du Colombier Source *ss;
1655e96a66cSDavid du Colombier
1665e96a66cSDavid du Colombier n = sourceGetDirSize(s);
1675e96a66cSDavid du Colombier /* check if empty */
1685e96a66cSDavid du Colombier for(i=0; i<n; i++){
1695e96a66cSDavid du Colombier ss = sourceOpen(s, i, OReadWrite);
1705e96a66cSDavid du Colombier if(ss != nil){
1715e96a66cSDavid du Colombier sourceClose(ss);
1725e96a66cSDavid du Colombier break;
1735e96a66cSDavid du Colombier }
1745e96a66cSDavid du Colombier }
1755e96a66cSDavid du Colombier if(i == n)
1765e96a66cSDavid du Colombier return 0;
1775e96a66cSDavid du Colombier
1785e96a66cSDavid du Colombier for(;;){
1795e96a66cSDavid du Colombier ss = sourceOpen(s, nrand(n), OReadWrite);
1805e96a66cSDavid du Colombier if(ss == nil)
1815e96a66cSDavid du Colombier continue;
1825e96a66cSDavid du Colombier if(s->dir && delete(ss)){
1835e96a66cSDavid du Colombier sourceClose(ss);
1845e96a66cSDavid du Colombier return 1;
1855e96a66cSDavid du Colombier }
1865e96a66cSDavid du Colombier if(1)
1875e96a66cSDavid du Colombier break;
1885e96a66cSDavid du Colombier sourceClose(ss);
1895e96a66cSDavid du Colombier }
1905e96a66cSDavid du Colombier
1915e96a66cSDavid du Colombier
1925e96a66cSDavid du Colombier sourceRemove(ss);
1935e96a66cSDavid du Colombier return 1;
1945e96a66cSDavid du Colombier }
1955e96a66cSDavid du Colombier
1965e96a66cSDavid du Colombier void
dump(Source * s,int ident,ulong entry)1975e96a66cSDavid du Colombier dump(Source *s, int ident, ulong entry)
1985e96a66cSDavid du Colombier {
1995e96a66cSDavid du Colombier ulong i, n;
2005e96a66cSDavid du Colombier Source *ss;
2015e96a66cSDavid du Colombier Entry e;
2025e96a66cSDavid du Colombier
2035e96a66cSDavid du Colombier for(i=0; i<ident; i++)
2045e96a66cSDavid du Colombier Bprint(bout, " ");
2055e96a66cSDavid du Colombier
2065e96a66cSDavid du Colombier if(!sourceGetEntry(s, &e)){
2075e96a66cSDavid du Colombier fprint(2, "sourceGetEntry failed: %r\n");
2085e96a66cSDavid du Colombier return;
2095e96a66cSDavid du Colombier }
2105e96a66cSDavid du Colombier
211*0c6300e7SDavid du Colombier Bprint(bout, "%4lud: gen %4ud depth %d tag=%x score=%V",
212*0c6300e7SDavid du Colombier entry, e.gen, e.depth, e.tag, e.score);
2135e96a66cSDavid du Colombier if(!s->dir){
2145e96a66cSDavid du Colombier Bprint(bout, " data size: %llud\n", e.size);
2155e96a66cSDavid du Colombier return;
2165e96a66cSDavid du Colombier }
2175e96a66cSDavid du Colombier n = sourceGetDirSize(s);
2185e96a66cSDavid du Colombier Bprint(bout, " dir size: %lud\n", n);
2195e96a66cSDavid du Colombier for(i=0; i<n; i++){
2205e96a66cSDavid du Colombier ss = sourceOpen(s, i, 1);
2215e96a66cSDavid du Colombier if(ss == nil)
2225e96a66cSDavid du Colombier continue;
2235e96a66cSDavid du Colombier dump(ss, ident+1, i);
2245e96a66cSDavid du Colombier sourceClose(ss);
2255e96a66cSDavid du Colombier }
2265e96a66cSDavid du Colombier return;
2275e96a66cSDavid du Colombier }
2285e96a66cSDavid du Colombier
2295e96a66cSDavid du Colombier int
count(Source * s,int rec)2305e96a66cSDavid du Colombier count(Source *s, int rec)
2315e96a66cSDavid du Colombier {
2325e96a66cSDavid du Colombier ulong i, n;
2335e96a66cSDavid du Colombier int c;
2345e96a66cSDavid du Colombier Source *ss;
2355e96a66cSDavid du Colombier
2365e96a66cSDavid du Colombier n = sourceGetDirSize(s);
2375e96a66cSDavid du Colombier c = 0;
2385e96a66cSDavid du Colombier for(i=0; i<n; i++){
2395e96a66cSDavid du Colombier ss = sourceOpen(s, i, OReadOnly);
2405e96a66cSDavid du Colombier if(ss == nil)
2415e96a66cSDavid du Colombier continue;
2425e96a66cSDavid du Colombier if(rec)
2435e96a66cSDavid du Colombier c += count(ss, rec);
2445e96a66cSDavid du Colombier c++;
2455e96a66cSDavid du Colombier sourceClose(ss);
2465e96a66cSDavid du Colombier }
2475e96a66cSDavid du Colombier return c;
2485e96a66cSDavid du Colombier }
2495e96a66cSDavid du Colombier
2505e96a66cSDavid du Colombier void
stats(Source * s)2515e96a66cSDavid du Colombier stats(Source *s)
2525e96a66cSDavid du Colombier {
2535e96a66cSDavid du Colombier int n, i, c, cc, max;
2545e96a66cSDavid du Colombier Source *ss;
2555e96a66cSDavid du Colombier
2565e96a66cSDavid du Colombier cc = 0;
2575e96a66cSDavid du Colombier max = 0;
2585e96a66cSDavid du Colombier n = sourceGetDirSize(s);
2595e96a66cSDavid du Colombier for(i=0; i<n; i++){
2605e96a66cSDavid du Colombier ss = sourceOpen(s, i, 1);
2615e96a66cSDavid du Colombier if(ss == nil)
2625e96a66cSDavid du Colombier continue;
2635e96a66cSDavid du Colombier cc++;
2645e96a66cSDavid du Colombier c = count(ss, 1);
2655e96a66cSDavid du Colombier if(c > max)
2665e96a66cSDavid du Colombier max = c;
2675e96a66cSDavid du Colombier sourceClose(ss);
2685e96a66cSDavid du Colombier }
2695e96a66cSDavid du Colombier fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);
2705e96a66cSDavid du Colombier }
271