aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/srv/printarenas.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-12 15:23:36 +0000
committerrsc <devnull@localhost>2005-07-12 15:23:36 +0000
commita0d146edd7a7de6236a0d60baafeeb59f8452aae (patch)
treeb55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/printarenas.c
parent88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff)
downloadplan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip
return of venti
Diffstat (limited to 'src/cmd/venti/srv/printarenas.c')
-rw-r--r--src/cmd/venti/srv/printarenas.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/printarenas.c b/src/cmd/venti/srv/printarenas.c
new file mode 100644
index 00000000..111db018
--- /dev/null
+++ b/src/cmd/venti/srv/printarenas.c
@@ -0,0 +1,113 @@
+#include "stdinc.h"
+#include "dat.h"
+#include "fns.h"
+#include <bio.h>
+
+Biobuf bout;
+
+static void
+pie(IEntry *ie)
+{
+ Bprint(&bout, "%22lld %V %3d %5d\n",
+ ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: printarenas [-B blockcachesize] config [arenaname...]\n");
+ threadexitsall(0);
+}
+
+Config conf;
+
+int
+shoulddump(char *name, int argc, char **argv)
+{
+ int i;
+
+ if(argc == 0)
+ return 1;
+ for(i=0; i<argc; i++)
+ if(strcmp(name, argv[i]) == 0)
+ return 1;
+ return 0;
+}
+
+enum
+{
+ ClumpChunks = 32*1024,
+};
+
+void
+dumparena(Arena *arena, u64int a)
+{
+ IEntry ie;
+ ClumpInfo *ci, *cis;
+ u32int clump;
+ int i, n, nskip;
+
+ cis = MKN(ClumpInfo, ClumpChunks);
+ nskip = 0;
+ memset(&ie, 0, sizeof(IEntry));
+ for(clump = 0; clump < arena->memstats.clumps; clump += n){
+ n = ClumpChunks;
+ if(n > arena->memstats.clumps - clump)
+ n = arena->memstats.clumps - clump;
+ if(readclumpinfos(arena, clump, cis, n) != n){
+ fprint(2, "arena directory read failed: %r\n");
+ break;
+ }
+
+ for(i = 0; i < n; i++){
+ ci = &cis[i];
+ ie.ia.type = ci->type;
+ ie.ia.size = ci->uncsize;
+ ie.ia.addr = a;
+ a += ci->size + ClumpSize;
+ ie.ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
+ scorecp(ie.score, ci->score);
+ pie(&ie);
+ }
+ }
+ free(cis);
+}
+
+void
+threadmain(int argc, char *argv[])
+{
+ int i;
+ Index *ix;
+ u32int bcmem;
+
+ bcmem = 0;
+ ARGBEGIN{
+ case 'B':
+ bcmem = unittoull(ARGF());
+ break;
+ default:
+ usage();
+ break;
+ }ARGEND
+
+ if(argc < 1)
+ usage();
+
+ ventifmtinstall();
+
+ 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);
+
+ Binit(&bout, 1, OWRITE);
+ ix = mainindex;
+ for(i=0; i<ix->narenas; i++)
+ if(shoulddump(ix->arenas[i]->name, argc-1, argv+1))
+ dumparena(ix->arenas[i], ix->amap[i].start);
+ Bterm(&bout);
+ threadexitsall(0);
+}