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