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

int	count[VtMaxLumpSize][VtMaxType];

enum
{
	ClumpChunks	= 32*1024
};

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

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

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

		if(n > arena->clumps - clump)
			n = arena->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;
			}
if(ci->uncsize == 422)
print("%s: %d: %V\n", arena->name, clump+i, ci->score);
			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]) < 0)
		sysfatal("can't init venti: %r");

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

	clumpstats(mainindex);
	
	threadexitsall(0);
}
