xref: /plan9/sys/src/cmd/venti/srv/printarenapart.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
1368c31abSDavid du Colombier #include "stdinc.h"
2368c31abSDavid du Colombier #include "dat.h"
3368c31abSDavid du Colombier #include "fns.h"
4368c31abSDavid du Colombier 
5368c31abSDavid du Colombier uchar buf[64*1024];
6368c31abSDavid du Colombier 
7368c31abSDavid du Colombier void
usage(void)8368c31abSDavid du Colombier usage(void)
9368c31abSDavid du Colombier {
10368c31abSDavid du Colombier 	fprint(2, "usage: printarenapart arenafile [offset]\n");
11368c31abSDavid du Colombier 	threadexitsall("usage");
12368c31abSDavid du Colombier }
13368c31abSDavid du Colombier 
14368c31abSDavid du Colombier static void
rdarena(Arena * arena,u64int offset)15368c31abSDavid du Colombier rdarena(Arena *arena, u64int offset)
16368c31abSDavid du Colombier {
17368c31abSDavid du Colombier 	u64int a, aa, e;
18368c31abSDavid du Colombier 	u32int magic;
19368c31abSDavid du Colombier 	Clump cl;
20368c31abSDavid du Colombier 	uchar score[VtScoreSize];
21368c31abSDavid du Colombier 	ZBlock *lump;
22368c31abSDavid du Colombier 
23368c31abSDavid du Colombier 	printarena(2, arena);
24368c31abSDavid du Colombier 
25368c31abSDavid du Colombier 	a = arena->base;
26368c31abSDavid du Colombier 	e = arena->base + arena->size;
27368c31abSDavid du Colombier 	if(offset != ~(u64int)0) {
28368c31abSDavid du Colombier 		if(offset >= e-a)
29*14cc0f53SDavid du Colombier 			sysfatal("bad offset %llud >= %llud",
30368c31abSDavid du Colombier 				offset, e-a);
31368c31abSDavid du Colombier 		aa = offset;
32368c31abSDavid du Colombier 	} else
33368c31abSDavid du Colombier 		aa = 0;
34368c31abSDavid du Colombier 
35368c31abSDavid du Colombier 	for(; aa < e; aa += ClumpSize+cl.info.size) {
36368c31abSDavid du Colombier 		magic = clumpmagic(arena, aa);
37368c31abSDavid du Colombier 		if(magic == ClumpFreeMagic)
38368c31abSDavid du Colombier 			break;
39368c31abSDavid du Colombier 		if(magic != arena->clumpmagic) {
40368c31abSDavid du Colombier 			fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
41368c31abSDavid du Colombier 				magic, aa);
42368c31abSDavid du Colombier 			break;
43368c31abSDavid du Colombier 		}
44368c31abSDavid du Colombier 		lump = loadclump(arena, aa, 0, &cl, score, 0);
45368c31abSDavid du Colombier 		if(lump == nil) {
46368c31abSDavid du Colombier 			fprint(2, "clump %llud failed to read: %r\n", aa);
47368c31abSDavid du Colombier 			break;
48368c31abSDavid du Colombier 		}
49368c31abSDavid du Colombier 		if(cl.info.type != VtCorruptType) {
50368c31abSDavid du Colombier 			scoremem(score, lump->data, cl.info.uncsize);
51368c31abSDavid du Colombier 			if(scorecmp(cl.info.score, score) != 0) {
52368c31abSDavid du Colombier 				fprint(2, "clump %llud has mismatched score\n", aa);
53368c31abSDavid du Colombier 				break;
54368c31abSDavid du Colombier 			}
55368c31abSDavid du Colombier 			if(vttypevalid(cl.info.type) < 0) {
56368c31abSDavid du Colombier 				fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
57368c31abSDavid du Colombier 				break;
58368c31abSDavid du Colombier 			}
59368c31abSDavid du Colombier 		}
60368c31abSDavid du Colombier 		print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
61368c31abSDavid du Colombier 		freezblock(lump);
62368c31abSDavid du Colombier 	}
63368c31abSDavid du Colombier 	print("end offset %llud\n", aa);
64368c31abSDavid du Colombier }
65368c31abSDavid du Colombier 
66368c31abSDavid du Colombier void
threadmain(int argc,char * argv[])67368c31abSDavid du Colombier threadmain(int argc, char *argv[])
68368c31abSDavid du Colombier {
69368c31abSDavid du Colombier 	char *file, *p, *name;
70368c31abSDavid du Colombier 	char *table;
71368c31abSDavid du Colombier 	u64int offset;
72368c31abSDavid du Colombier 	Part *part;
73368c31abSDavid du Colombier 	ArenaPart ap;
74368c31abSDavid du Colombier 	ArenaHead head;
75368c31abSDavid du Colombier 	Arena tail;
76368c31abSDavid du Colombier 	char ct[40], mt[40];
77368c31abSDavid du Colombier 
78368c31abSDavid du Colombier 	readonly = 1;	/* for part.c */
79368c31abSDavid du Colombier 	ARGBEGIN{
80368c31abSDavid du Colombier 	default:
81368c31abSDavid du Colombier 		usage();
82368c31abSDavid du Colombier 		break;
83368c31abSDavid du Colombier 	}ARGEND
84368c31abSDavid du Colombier 
85368c31abSDavid du Colombier 	switch(argc) {
86368c31abSDavid du Colombier 	default:
87368c31abSDavid du Colombier 		usage();
88368c31abSDavid du Colombier 	case 1:
89368c31abSDavid du Colombier 		file = argv[0];
90368c31abSDavid du Colombier 	}
91368c31abSDavid du Colombier 
92368c31abSDavid du Colombier 	ventifmtinstall();
93368c31abSDavid du Colombier 	statsinit();
94368c31abSDavid du Colombier 
95368c31abSDavid du Colombier 	part = initpart(file, OREAD|ODIRECT);
96368c31abSDavid du Colombier 	if(part == nil)
97368c31abSDavid du Colombier 		sysfatal("can't open file %s: %r", file);
98368c31abSDavid du Colombier 	if(readpart(part, PartBlank, buf, sizeof buf) < 0)
99368c31abSDavid du Colombier 		sysfatal("can't read file %s: %r", file);
100368c31abSDavid du Colombier 
101368c31abSDavid du Colombier 	if(unpackarenapart(&ap, buf) < 0)
102368c31abSDavid du Colombier 		sysfatal("corrupted arena part header: %r");
103368c31abSDavid du Colombier 
104368c31abSDavid du Colombier 	print("# arena part version=%d blocksize=%d arenabase=%d\n",
105368c31abSDavid du Colombier 		ap.version, ap.blocksize, ap.arenabase);
106368c31abSDavid du Colombier 	ap.tabbase = (PartBlank+HeadSize+ap.blocksize-1)&~(ap.blocksize-1);
107368c31abSDavid du Colombier 	ap.tabsize = ap.arenabase - ap.tabbase;
108368c31abSDavid du Colombier 
109368c31abSDavid du Colombier 	table = malloc(ap.tabsize+1);
110368c31abSDavid du Colombier 	if(readpart(part, ap.tabbase, (uchar*)table, ap.tabsize) < 0)
111368c31abSDavid du Colombier 		sysfatal("read %s: %r", file);
112368c31abSDavid du Colombier 	table[ap.tabsize] = 0;
113368c31abSDavid du Colombier 
114368c31abSDavid du Colombier 	partblocksize(part, ap.blocksize);
115368c31abSDavid du Colombier 	initdcache(8 * MaxDiskBlock);
116368c31abSDavid du Colombier 
117368c31abSDavid du Colombier 	for(p=table; p && *p; p=strchr(p, '\n')){
118368c31abSDavid du Colombier 		if(*p == '\n')
119368c31abSDavid du Colombier 			p++;
120368c31abSDavid du Colombier 		name = p;
121368c31abSDavid du Colombier 		p = strpbrk(p, " \t");
122368c31abSDavid du Colombier 		if(p == nil){
123368c31abSDavid du Colombier 			fprint(2, "bad line: %s\n", name);
124368c31abSDavid du Colombier 			break;
125368c31abSDavid du Colombier 		}
126368c31abSDavid du Colombier 		offset = strtoull(p, nil, 0);
127368c31abSDavid du Colombier 		if(readpart(part, offset, buf, sizeof buf) < 0){
128368c31abSDavid du Colombier 			fprint(2, "%s: read %s: %r\n", argv0, file);
129368c31abSDavid du Colombier 			continue;
130368c31abSDavid du Colombier 		}
131368c31abSDavid du Colombier 		if(unpackarenahead(&head, buf) < 0){
132368c31abSDavid du Colombier 			fprint(2, "%s: unpackarenahead: %r\n", argv0);
133368c31abSDavid du Colombier 			continue;
134368c31abSDavid du Colombier 		}
135368c31abSDavid du Colombier 		if(readpart(part, offset+head.size-head.blocksize, buf, head.blocksize) < 0){
136368c31abSDavid du Colombier 			fprint(2, "%s: read %s: %r\n", argv0, file);
137368c31abSDavid du Colombier 			continue;
138368c31abSDavid du Colombier 		}
139368c31abSDavid du Colombier 		if(unpackarena(&tail, buf) < 0){
140368c31abSDavid du Colombier 			fprint(2, "%s: unpackarena: %r\n", argv0);
141368c31abSDavid du Colombier 			continue;
142368c31abSDavid du Colombier 		}
143368c31abSDavid du Colombier 		print("arena %s %lld clumps=%,d cclumps=%,d used=%,lld uncsize=%,lld%s\n",
144368c31abSDavid du Colombier 			tail.name, offset,
145368c31abSDavid du Colombier 			tail.diskstats.clumps, tail.diskstats.cclumps,
146368c31abSDavid du Colombier 			tail.diskstats.used, tail.diskstats.uncsize,
147368c31abSDavid du Colombier 			tail.diskstats.sealed ? " sealed" : "");
148368c31abSDavid du Colombier 		strcpy(ct, ctime(tail.ctime));
149368c31abSDavid du Colombier 		ct[28] = 0;
150368c31abSDavid du Colombier 		strcpy(mt, ctime(tail.wtime));
151368c31abSDavid du Colombier 		mt[28] = 0;
152368c31abSDavid du Colombier 		print("\tctime=%s\n\tmtime=%s\n", ct, mt);
153368c31abSDavid du Colombier 	}
154368c31abSDavid du Colombier 	threadexitsall(0);
155368c31abSDavid du Colombier }
156