diff options
author | rsc <devnull@localhost> | 2003-11-23 17:54:58 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-23 17:54:58 +0000 |
commit | 7a4ee46d253e291044bba2d0c54b818b67ac013c (patch) | |
tree | 7bdcaf69a15ecd24c057a697936b67bbde93e00b /src/cmd/venti/findscore.c | |
parent | 4fbfdd7acd4bf4fc71b1329230e05fc761907566 (diff) | |
download | plan9port-7a4ee46d253e291044bba2d0c54b818b67ac013c.tar.gz plan9port-7a4ee46d253e291044bba2d0c54b818b67ac013c.tar.bz2 plan9port-7a4ee46d253e291044bba2d0c54b818b67ac013c.zip |
Initial stab at Venti.
Diffstat (limited to 'src/cmd/venti/findscore.c')
-rw-r--r-- | src/cmd/venti/findscore.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/cmd/venti/findscore.c b/src/cmd/venti/findscore.c new file mode 100644 index 00000000..6a69dc53 --- /dev/null +++ b/src/cmd/venti/findscore.c @@ -0,0 +1,132 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +enum +{ + ClumpChunks = 32*1024 +}; + +static int verbose; + +int +clumpinfoeq(ClumpInfo *c, ClumpInfo *d) +{ + return c->type == d->type + && c->size == d->size + && c->uncsize == d->uncsize + && scorecmp(c->score, d->score)==0; +} + +/* + * synchronize the clump info directory with + * with the clumps actually stored in the arena. + * the directory should be at least as up to date + * as the arena's trailer. + * + * checks/updates at most n clumps. + * + * returns 1 if ok, -1 if an error occured, 0 if blocks were updated + */ +int +findscore(Arena *arena, uchar *score) +{ + IEntry ie; + ClumpInfo *ci, *cis; + u64int a; + u32int clump; + int i, n, found; + +//ZZZ remove fprint? + if(arena->clumps) + fprint(2, "reading directory for arena=%s with %d entries\n", arena->name, arena->clumps); + + cis = MKN(ClumpInfo, ClumpChunks); + found = 0; + a = 0; + memset(&ie, 0, sizeof(IEntry)); + for(clump = 0; clump < arena->clumps; clump += n){ + n = ClumpChunks; + if(n > arena->clumps - clump) + n = arena->clumps - clump; + if(readclumpinfos(arena, clump, cis, n) != n){ + seterr(EOk, "arena directory read failed: %r"); + break; + } + + for(i = 0; i < n; i++){ + ci = &cis[i]; + if(scorecmp(score, ci->score)==0){ + fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n", + clump + i, ci->type, ci->uncsize, ci->size, a); + found++; + } + a += ci->size + ClumpSize; + } + } + free(cis); + return found; +} + +void +usage(void) +{ + fprint(2, "usage: findscore [-v] arenafile score\n"); + threadexitsall(0); +} + +void +threadmain(int argc, char *argv[]) +{ + ArenaPart *ap; + Part *part; + char *file; + u8int score[VtScoreSize]; + int i, found; + + fmtinstall('V', vtscorefmt); + statsinit(); + + ARGBEGIN{ + case 'v': + verbose++; + break; + default: + usage(); + break; + }ARGEND + + readonly = 1; + + if(argc != 2) + usage(); + + file = argv[0]; + if(strscore(argv[1], score) < 0) + sysfatal("bad score %s\n", argv[1]); + + part = initpart(file, 0); + if(part == nil) + sysfatal("can't open partition %s: %r", file); + + ap = initarenapart(part); + if(ap == nil) + sysfatal("can't initialize arena partition in %s: %r", file); + + if(verbose > 1){ + printarenapart(2, ap); + fprint(2, "\n"); + } + + initdcache(8 * MaxDiskBlock); + + found = 0; + for(i = 0; i < ap->narenas; i++) + found += findscore(ap->arenas[i], score); + + print("found %d occurances of %V\n", found, score); + + if(verbose > 1) + printstats(); + threadexitsall(0); +} |