syncindex0.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. static int
  5. syncarenaindex(Arena *arena, u64int a0)
  6. {
  7. int ok;
  8. u32int clump;
  9. u64int a;
  10. ClumpInfo ci;
  11. IAddr ia;
  12. AState as;
  13. if(arena->diskstats.clumps == arena->memstats.clumps)
  14. return 0;
  15. memset(&as, 0, sizeof as);
  16. as.arena = arena;
  17. as.stats = arena->diskstats;
  18. ok = 0;
  19. a = a0 + arena->diskstats.used;
  20. for(clump=arena->diskstats.clumps; clump < arena->memstats.clumps; clump++){
  21. if(readclumpinfo(arena, clump, &ci) < 0){
  22. fprint(2, "%s: clump %d: cannot read clumpinfo\n",
  23. arena->name, clump);
  24. ok = -1;
  25. break;
  26. }
  27. ia.type = ci.type;
  28. ia.size = ci.uncsize;
  29. ia.addr = a;
  30. ia.blocks = (ClumpSize + ci.size + (1 << ABlockLog) - 1) >> ABlockLog;
  31. a += ClumpSize + ci.size;
  32. as.stats.used += ClumpSize + ci.size;
  33. as.stats.uncsize += ia.size;
  34. as.stats.clumps++;
  35. if(ci.uncsize > ci.size)
  36. as.stats.cclumps++;
  37. as.aa = a;
  38. insertscore(ci.score, &ia, IEDirty, &as);
  39. }
  40. flushdcache();
  41. return ok;
  42. }
  43. int
  44. syncindex(Index *ix)
  45. {
  46. Arena *arena;
  47. int i, e, e1, ok;
  48. ok = 0;
  49. for(i = 0; i < ix->narenas; i++){
  50. trace(TraceProc, "syncindex start %d", i);
  51. arena = ix->arenas[i];
  52. e = syncarena(arena, TWID32, 1, 1);
  53. e1 = e;
  54. e1 &= ~(SyncHeader|SyncCIZero|SyncCIErr);
  55. if(e & SyncHeader)
  56. fprint(2, "arena %s: header is out-of-date\n", arena->name);
  57. if(e1){
  58. fprint(2, "arena %s: %x\n", arena->name, e1);
  59. ok = -1;
  60. continue;
  61. }
  62. flushdcache();
  63. if(arena->memstats.clumps == arena->diskstats.clumps)
  64. continue;
  65. fprint(2, "%T %s: indexing %d clumps...\n",
  66. arena->name,
  67. arena->memstats.clumps - arena->diskstats.clumps);
  68. if(syncarenaindex(arena, ix->amap[i].start) < 0){
  69. fprint(2, "arena %s: syncarenaindex: %r\n", arena->name);
  70. ok = -1;
  71. continue;
  72. }
  73. if(wbarena(arena) < 0){
  74. fprint(2, "arena %s: wbarena: %r\n", arena->name);
  75. ok = -1;
  76. continue;
  77. }
  78. flushdcache();
  79. delaykickicache();
  80. }
  81. return ok;
  82. }