URI:
       tsrcload.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tsrcload.c (4180B)
       ---
            1 #include "stdinc.h"
            2 #include <bio.h>
            3 #include "dat.h"
            4 #include "fns.h"
            5 #include "error.h"
            6 
            7 int num = 100;
            8 int length = 20*1024;
            9 int block= 1024;
           10 int bush = 4;
           11 int iter = 100;
           12 Biobuf *bout;
           13 int maxdepth;
           14 
           15 Source *mkroot(Cache*);
           16 void new(Source*, int trace, int);
           17 int delete(Source*);
           18 int count(Source *s, int);
           19 void stats(Source *s);
           20 void dump(Source *s, int ident, ulong entry);
           21 static void bench(Source *r);
           22 
           23 void
           24 main(int argc, char *argv[])
           25 {
           26         int i;
           27         Fs *fs;
           28         int csize = 1000;
           29         ulong t;
           30         Source *r;
           31 
           32         ARGBEGIN{
           33         case 'i':
           34                 iter = atoi(ARGF());
           35                 break;
           36         case 'n':
           37                 num = atoi(ARGF());
           38                 break;
           39         case 'l':
           40                 length = atoi(ARGF());
           41                 break;
           42         case 'b':
           43                 block = atoi(ARGF());
           44                 break;
           45         case 'u':
           46                 bush = atoi(ARGF());
           47                 break;
           48         case 'c':
           49                 csize = atoi(ARGF());
           50                 break;
           51         }ARGEND;
           52 
           53         vtAttach();
           54 
           55         bout = vtMemAllocZ(sizeof(Biobuf));
           56         Binit(bout, 1, OWRITE);
           57 
           58         fmtinstall('V', vtScoreFmt);
           59         fmtinstall('R', vtErrFmt);
           60 
           61         fs = fsOpen(argv[0], nil, csize, OReadWrite);
           62         if(fs == nil)
           63                 sysfatal("could not open fs: %r");
           64 
           65         t = time(0);
           66 
           67         srand(0);
           68 
           69         r = fs->source;
           70         dump(r, 0, 0);
           71 
           72         fprint(2, "count = %d\n", count(r, 1));
           73         for(i=0; i<num; i++)
           74                 new(r, 0, 0);
           75 
           76         for(i=0; i<iter; i++){
           77                 if(i % 10000 == 0)
           78                         stats(r);
           79                 new(r, 0, 0);
           80                 delete(r);
           81         }
           82 
           83 //        dump(r, 0, 0);
           84 
           85         fprint(2, "count = %d\n", count(r, 1));
           86 //        cacheCheck(c);
           87 
           88         fprint(2, "deleting\n");
           89         for(i=0; i<num; i++)
           90                 delete(r);
           91 //        dump(r, 0, 0);
           92 
           93         fprint(2, "count = %d\n", count(r, 1));
           94         fprint(2, "total time = %ld\n", time(0)-t);
           95 
           96         fsClose(fs);
           97         vtDetach();
           98         exits(0);
           99 }
          100 
          101 static void
          102 bench(Source *r)
          103 {
          104         vlong t;
          105         Entry e;
          106         int i;
          107 
          108         t = nsec();
          109 
          110         for(i=0; i<1000000; i++)
          111                 sourceGetEntry(r, &e);
          112 
          113         fprint(2, "%f\n", 1e-9*(nsec() - t));
          114 }
          115 
          116 void
          117 new(Source *s, int trace, int depth)
          118 {
          119         int i, n;
          120         Source *ss;
          121         Entry e;
          122 
          123         if(depth > maxdepth)
          124                 maxdepth = depth;
          125 
          126         Bflush(bout);
          127 
          128         n = sourceGetDirSize(s);
          129         for(i=0; i<n; i++){
          130                 ss = sourceOpen(s, nrand(n), OReadWrite);
          131                 if(ss == nil || !sourceGetEntry(ss, &e))
          132                         continue;
          133                 if((e.flags & VtEntryDir) && frand() < 1./bush){
          134                         if(trace){
          135                                 int j;
          136                                 for(j=0; j<trace; j++)
          137                                         Bprint(bout, " ");
          138                                 Bprint(bout, "decend %d\n", i);
          139                         }
          140                         new(ss, trace?trace+1:0, depth+1);
          141                         sourceClose(ss);
          142                         return;
          143                 }
          144                 sourceClose(ss);
          145         }
          146         ss = sourceCreate(s, s->dsize, 1+frand()>.5, 0);
          147         if(ss == nil){
          148                 Bprint(bout, "could not create directory: %R\n");
          149                 return;
          150         }
          151         if(trace){
          152                 int j;
          153                 for(j=1; j<trace; j++)
          154                         Bprint(bout, " ");
          155                 Bprint(bout, "create %d\n", ss->offset);
          156         }
          157         sourceClose(ss);
          158 }
          159 
          160 int
          161 delete(Source *s)
          162 {
          163         int i, n;
          164         Source *ss;
          165 
          166         n = sourceGetDirSize(s);
          167         /* check if empty */
          168         for(i=0; i<n; i++){
          169                 ss = sourceOpen(s, i, OReadWrite);
          170                 if(ss != nil){
          171                         sourceClose(ss);
          172                         break;
          173                 }
          174         }
          175         if(i == n)
          176                 return 0;
          177 
          178         for(;;){
          179                 ss = sourceOpen(s, nrand(n), OReadWrite);
          180                 if(ss == nil)
          181                         continue;
          182                 if(s->dir && delete(ss)){
          183                         sourceClose(ss);
          184                         return 1;
          185                 }
          186                 if(1)
          187                         break;
          188                 sourceClose(ss);
          189         }
          190 
          191 
          192         sourceRemove(ss);
          193         return 1;
          194 }
          195 
          196 void
          197 dump(Source *s, int ident, ulong entry)
          198 {
          199         ulong i, n;
          200         Source *ss;
          201         Entry e;
          202 
          203         for(i=0; i<ident; i++)
          204                 Bprint(bout, " ");
          205 
          206         if(!sourceGetEntry(s, &e)){
          207                 fprint(2, "sourceGetEntry failed: %r\n");
          208                 return;
          209         }
          210 
          211         Bprint(bout, "%4lud: gen %4ud depth %d tag=%x score=%V",
          212                 entry, e.gen, e.depth, e.tag, e.score);
          213         if(!s->dir){
          214                 Bprint(bout, " data size: %llud\n", e.size);
          215                 return;
          216         }
          217         n = sourceGetDirSize(s);
          218         Bprint(bout, " dir size: %lud\n", n);
          219         for(i=0; i<n; i++){
          220                 ss = sourceOpen(s, i, 1);
          221                 if(ss == nil)
          222                         continue;
          223                 dump(ss, ident+1, i);
          224                 sourceClose(ss);
          225         }
          226         return;
          227 }
          228 
          229 int
          230 count(Source *s, int rec)
          231 {
          232         ulong i, n;
          233         int c;
          234         Source *ss;
          235 
          236         n = sourceGetDirSize(s);
          237         c = 0;
          238         for(i=0; i<n; i++){
          239                 ss = sourceOpen(s, i, OReadOnly);
          240                 if(ss == nil)
          241                         continue;
          242                 if(rec)
          243                         c += count(ss, rec);
          244                 c++;
          245                 sourceClose(ss);
          246         }
          247         return c;
          248 }
          249 
          250 void
          251 stats(Source *s)
          252 {
          253         int n, i, c, cc, max;
          254         Source *ss;
          255 
          256         cc = 0;
          257         max = 0;
          258         n = sourceGetDirSize(s);
          259         for(i=0; i<n; i++){
          260                 ss = sourceOpen(s, i, 1);
          261                 if(ss == nil)
          262                         continue;
          263                 cc++;
          264                 c = count(ss, 1);
          265                 if(c > max)
          266                         max = c;
          267                 sourceClose(ss);
          268         }
          269 fprint(2, "count = %d top = %d depth=%d maxcount %d\n", cc, n, maxdepth, max);
          270 }