From a0d146edd7a7de6236a0d60baafeeb59f8452aae Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 12 Jul 2005 15:23:36 +0000 Subject: return of venti --- src/cmd/venti/srv/checkarenas.c | 135 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/cmd/venti/srv/checkarenas.c (limited to 'src/cmd/venti/srv/checkarenas.c') diff --git a/src/cmd/venti/srv/checkarenas.c b/src/cmd/venti/srv/checkarenas.c new file mode 100644 index 00000000..525a634c --- /dev/null +++ b/src/cmd/venti/srv/checkarenas.c @@ -0,0 +1,135 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +static int verbose; + +static void +checkarena(Arena *arena, int scan, int fix) +{ + ATailStats old; + int err, e; + + if(verbose && arena->memstats.clumps) + printarena(2, arena); + + old = arena->memstats; + + if(scan){ + arena->memstats.used = 0; + arena->memstats.clumps = 0; + arena->memstats.cclumps = 0; + arena->memstats.uncsize = 0; + } + + err = 0; + for(;;){ + e = syncarena(arena, 0, 1000, 0, fix); + err |= e; + if(!(e & SyncHeader)) + break; + if(verbose && arena->memstats.clumps) + fprint(2, "."); + } + if(verbose && arena->memstats.clumps) + fprint(2, "\n"); + + err &= ~SyncHeader; + if(arena->memstats.used != old.used + || arena->memstats.clumps != old.clumps + || arena->memstats.cclumps != old.cclumps + || arena->memstats.uncsize != old.uncsize){ + fprint(2, "%s: incorrect arena header fields\n", arena->name); + printarena(2, arena); + err |= SyncHeader; + } + + if(!err || !fix) + return; + + fprint(2, "%s: writing fixed arena header fields\n", arena->name); + arena->diskstats = arena->memstats; + if(wbarena(arena) < 0) + fprint(2, "arena header write failed: %r\n"); + flushdcache(); +} + +void +usage(void) +{ + fprint(2, "usage: checkarenas [-afv] file [arenaname...]\n"); + threadexitsall(0); +} + +int +should(char *name, int argc, char **argv) +{ + int i; + + if(argc == 0) + return 1; + for(i=0; i 1){ + printarenapart(2, ap); + fprint(2, "\n"); + } + + initdcache(8 * MaxDiskBlock); + + for(i = 0; i < ap->narenas; i++) + if(should(ap->arenas[i]->name, argc, argv)) + checkarena(ap->arenas[i], scan, fix); + + if(verbose > 1) + printstats(); + threadexitsall(0); +} -- cgit v1.2.3