| #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; |
| } |