Blob


1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
5 uchar buf[64*1024];
7 void
8 usage(void)
9 {
10 fprint(2, "usage: printarenapart arenafile [offset]\n");
11 threadexitsall("usage");
12 }
14 static void
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;
23 printarena(2, arena);
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\n",
30 offset, e-a);
31 aa = offset;
32 } else
33 aa = 0;
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 }
66 void
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];
78 readonly = 1; /* for part.c */
79 ARGBEGIN{
80 default:
81 usage();
82 break;
83 }ARGEND
85 switch(argc) {
86 default:
87 usage();
88 case 1:
89 file = argv[0];
90 }
92 ventifmtinstall();
93 statsinit();
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);
101 if(unpackarenapart(&ap, buf) < 0)
102 sysfatal("corrupted arena part header: %r");
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;
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;
114 partblocksize(part, ap.blocksize);
115 initdcache(8 * MaxDiskBlock);
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;
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;
131 if(unpackarenahead(&head, buf) < 0){
132 fprint(2, "%s: unpackarenahead: %r\n", argv0);
133 continue;
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;
139 if(unpackarena(&tail, buf) < 0){
140 fprint(2, "%s: unpackarena: %r\n", argv0);
141 continue;
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);
154 threadexitsall(0);