123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "stdinc.h"
- #include "dat.h"
- #include "fns.h"
- static int
- syncarenaindex(Arena *arena, u64int a0)
- {
- int ok;
- u32int clump;
- u64int a;
- ClumpInfo ci;
- IAddr ia;
- AState as;
-
- if(arena->diskstats.clumps == arena->memstats.clumps)
- return 0;
-
- memset(&as, 0, sizeof as);
- as.arena = arena;
- as.stats = arena->diskstats;
- ok = 0;
- a = a0 + arena->diskstats.used;
- for(clump=arena->diskstats.clumps; clump < arena->memstats.clumps; clump++){
- if(readclumpinfo(arena, clump, &ci) < 0){
- fprint(2, "%s: clump %d: cannot read clumpinfo\n",
- arena->name, clump);
- ok = -1;
- break;
- }
- ia.type = ci.type;
- ia.size = ci.uncsize;
- ia.addr = a;
- ia.blocks = (ClumpSize + ci.size + (1 << ABlockLog) - 1) >> ABlockLog;
- a += ClumpSize + ci.size;
- as.stats.used += ClumpSize + ci.size;
- as.stats.uncsize += ia.size;
- as.stats.clumps++;
- if(ci.uncsize > ci.size)
- as.stats.cclumps++;
- as.aa = a;
- insertscore(ci.score, &ia, IEDirty, &as);
- }
- flushdcache();
- return ok;
- }
- int
- syncindex(Index *ix)
- {
- Arena *arena;
- int i, e, e1, ok;
- ok = 0;
- for(i = 0; i < ix->narenas; i++){
- trace(TraceProc, "syncindex start %d", i);
- arena = ix->arenas[i];
- e = syncarena(arena, TWID32, 1, 1);
- e1 = e;
- e1 &= ~(SyncHeader|SyncCIZero|SyncCIErr);
- if(e & SyncHeader)
- fprint(2, "arena %s: header is out-of-date\n", arena->name);
- if(e1){
- fprint(2, "arena %s: %x\n", arena->name, e1);
- ok = -1;
- continue;
- }
- flushdcache();
-
- if(arena->memstats.clumps == arena->diskstats.clumps)
- continue;
-
- fprint(2, "%T %s: indexing %d clumps...\n",
- arena->name,
- arena->memstats.clumps - arena->diskstats.clumps);
- if(syncarenaindex(arena, ix->amap[i].start) < 0){
- fprint(2, "arena %s: syncarenaindex: %r\n", arena->name);
- ok = -1;
- continue;
- }
- if(wbarena(arena) < 0){
- fprint(2, "arena %s: wbarena: %r\n", arena->name);
- ok = -1;
- continue;
- }
- flushdcache();
- delaykickicache();
- }
- return ok;
- }
|