xref: /plan9/sys/src/cmd/venti/srv/printarenapart.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
4 
5 uchar buf[64*1024];
6 
7 void
usage(void)8 usage(void)
9 {
10 	fprint(2, "usage: printarenapart arenafile [offset]\n");
11 	threadexitsall("usage");
12 }
13 
14 static void
rdarena(Arena * arena,u64int offset)15 rdarena(Arena *arena, u64int offset)
16 {
17 	u64int a, aa, e;
18 	u32int magic;
19 	Clump cl;
20 	uchar score[VtScoreSize];
21 	ZBlock *lump;
22 
23 	printarena(2, arena);
24 
25 	a = arena->base;
26 	e = arena->base + arena->size;
27 	if(offset != ~(u64int)0) {
28 		if(offset >= e-a)
29 			sysfatal("bad offset %llud >= %llud",
30 				offset, e-a);
31 		aa = offset;
32 	} else
33 		aa = 0;
34 
35 	for(; aa < e; aa += ClumpSize+cl.info.size) {
36 		magic = clumpmagic(arena, aa);
37 		if(magic == ClumpFreeMagic)
38 			break;
39 		if(magic != arena->clumpmagic) {
40 			fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
41 				magic, aa);
42 			break;
43 		}
44 		lump = loadclump(arena, aa, 0, &cl, score, 0);
45 		if(lump == nil) {
46 			fprint(2, "clump %llud failed to read: %r\n", aa);
47 			break;
48 		}
49 		if(cl.info.type != VtCorruptType) {
50 			scoremem(score, lump->data, cl.info.uncsize);
51 			if(scorecmp(cl.info.score, score) != 0) {
52 				fprint(2, "clump %llud has mismatched score\n", aa);
53 				break;
54 			}
55 			if(vttypevalid(cl.info.type) < 0) {
56 				fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
57 				break;
58 			}
59 		}
60 		print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
61 		freezblock(lump);
62 	}
63 	print("end offset %llud\n", aa);
64 }
65 
66 void
threadmain(int argc,char * argv[])67 threadmain(int argc, char *argv[])
68 {
69 	char *file, *p, *name;
70 	char *table;
71 	u64int offset;
72 	Part *part;
73 	ArenaPart ap;
74 	ArenaHead head;
75 	Arena tail;
76 	char ct[40], mt[40];
77 
78 	readonly = 1;	/* for part.c */
79 	ARGBEGIN{
80 	default:
81 		usage();
82 		break;
83 	}ARGEND
84 
85 	switch(argc) {
86 	default:
87 		usage();
88 	case 1:
89 		file = argv[0];
90 	}
91 
92 	ventifmtinstall();
93 	statsinit();
94 
95 	part = initpart(file, OREAD|ODIRECT);
96 	if(part == nil)
97 		sysfatal("can't open file %s: %r", file);
98 	if(readpart(part, PartBlank, buf, sizeof buf) < 0)
99 		sysfatal("can't read file %s: %r", file);
100 
101 	if(unpackarenapart(&ap, buf) < 0)
102 		sysfatal("corrupted arena part header: %r");
103 
104 	print("# arena part version=%d blocksize=%d arenabase=%d\n",
105 		ap.version, ap.blocksize, ap.arenabase);
106 	ap.tabbase = (PartBlank+HeadSize+ap.blocksize-1)&~(ap.blocksize-1);
107 	ap.tabsize = ap.arenabase - ap.tabbase;
108 
109 	table = malloc(ap.tabsize+1);
110 	if(readpart(part, ap.tabbase, (uchar*)table, ap.tabsize) < 0)
111 		sysfatal("read %s: %r", file);
112 	table[ap.tabsize] = 0;
113 
114 	partblocksize(part, ap.blocksize);
115 	initdcache(8 * MaxDiskBlock);
116 
117 	for(p=table; p && *p; p=strchr(p, '\n')){
118 		if(*p == '\n')
119 			p++;
120 		name = p;
121 		p = strpbrk(p, " \t");
122 		if(p == nil){
123 			fprint(2, "bad line: %s\n", name);
124 			break;
125 		}
126 		offset = strtoull(p, nil, 0);
127 		if(readpart(part, offset, buf, sizeof buf) < 0){
128 			fprint(2, "%s: read %s: %r\n", argv0, file);
129 			continue;
130 		}
131 		if(unpackarenahead(&head, buf) < 0){
132 			fprint(2, "%s: unpackarenahead: %r\n", argv0);
133 			continue;
134 		}
135 		if(readpart(part, offset+head.size-head.blocksize, buf, head.blocksize) < 0){
136 			fprint(2, "%s: read %s: %r\n", argv0, file);
137 			continue;
138 		}
139 		if(unpackarena(&tail, buf) < 0){
140 			fprint(2, "%s: unpackarena: %r\n", argv0);
141 			continue;
142 		}
143 		print("arena %s %lld clumps=%,d cclumps=%,d used=%,lld uncsize=%,lld%s\n",
144 			tail.name, offset,
145 			tail.diskstats.clumps, tail.diskstats.cclumps,
146 			tail.diskstats.used, tail.diskstats.uncsize,
147 			tail.diskstats.sealed ? " sealed" : "");
148 		strcpy(ct, ctime(tail.ctime));
149 		ct[28] = 0;
150 		strcpy(mt, ctime(tail.wtime));
151 		mt[28] = 0;
152 		print("\tctime=%s\n\tmtime=%s\n", ct, mt);
153 	}
154 	threadexitsall(0);
155 }
156