Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "stdinc.h"
#include "dat.h"
#include "fns.h"

int     count[VtMaxLumpSize][VtMaxType];
Config conf;

enum
{
        ClumpChunks     = 32*1024
};

static int
readarenainfo(Arena *arena)
{
        ClumpInfo *ci, *cis;
        u32int clump;
        int i, n, ok;

        if(arena->memstats.clumps)
                fprint(2, "reading directory for arena=%s with %d entries\n", arena->name, arena->memstats.clumps);

        cis = MKN(ClumpInfo, ClumpChunks);
        ok = 0;
        for(clump = 0; clump < arena->memstats.clumps; clump += n){
                n = ClumpChunks;

                if(n > arena->memstats.clumps - clump)
                        n = arena->memstats.clumps - clump;

                if((i=readclumpinfos(arena, clump, cis, n)) != n){
                        seterr(EOk, "arena directory read failed %d not %d: %r", i, n);
                        ok = -1;
                        break;
                }

                for(i = 0; i < n; i++){
                        ci = &cis[i];
                        if(ci->type >= VtMaxType || ci->uncsize >= VtMaxLumpSize) {
                                fprint(2, "bad clump: %d: type = %d: size = %d\n", clump+i, ci->type, ci->uncsize);
                                continue;
                        }
                        count[ci->uncsize][ci->type]++;
                }
        }
        free(cis);
        if(ok < 0)
                return TWID32;
        return clump;
}

static void
clumpstats(Index *ix)
{
        int ok;
        ulong clumps, n;
        int i, j, t;

        ok = 0;
        clumps = 0;
        for(i = 0; i < ix->narenas; i++){
                n = readarenainfo(ix->arenas[i]);
                if(n == TWID32){
                        ok = -1;
                        break;
                }
                clumps += n;
        }

        if(ok < 0)
                return;

        print("clumps = %ld\n", clumps);
        for(i=0; i<VtMaxLumpSize; i++) {
                t = 0;
                for(j=0; j<VtMaxType; j++)
                        t += count[i][j];
                if(t == 0)
                        continue;
                print("%d\t%d", i, t);
                for(j=0; j<VtMaxType; j++)
                        print("\t%d", count[i][j]);
                print("\n");
        }
}


void
usage(void)
{
        fprint(2, "usage: clumpstats [-B blockcachesize] config\n");
        threadexitsall(0);
}

void
threadmain(int argc, char *argv[])
{
        u32int bcmem;

        bcmem = 0;

        ARGBEGIN{
        case 'B':
                bcmem = unittoull(ARGF());
                break;
        default:
                usage();
                break;
        }ARGEND

        readonly = 1;

        if(argc != 1)
                usage();

        if(initventi(argv[0], &conf) < 0)
                sysfatal("can't init venti: %r");

        if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
                bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
        if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
        initdcache(bcmem);

        clumpstats(mainindex);
        
        threadexitsall(0);
}