printarenapart.c 3.5 KB

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