94 lines
1.9 KiB
C
94 lines
1.9 KiB
C
![]() |
#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;
|
||
|
}
|