/* * write a clump to an available arena in the index * and return the address of the clump within the index. ZZZ question: should this distinguish between an arena filling up and real errors writing the clump? */ u64int writeiclump(Index *ix, Clump *c, u8int *clbuf) { u64int a; int i; IAddr ia; AState as; trace(TraceLump, "writeiclump enter"); qlock(&ix->writing); for(i = ix->mapalloc; i < ix->narenas; i++){ a = writeaclump(ix->arenas[i], c, clbuf); if(a != TWID64){ ix->mapalloc = i; ia.addr = ix->amap[i].start + a; ia.type = c->info.type; ia.size = c->info.uncsize; ia.blocks = (c->info.size + ClumpSize + (1<<ABlockLog) - 1) >> ABlockLog; as.arena = ix->arenas[i]; as.aa = ia.addr; as.stats = as.arena->memstats; insertscore(c->info.score, &ia, IEDirty, &as); qunlock(&ix->writing); trace(TraceLump, "writeiclump exit"); return ia.addr; } }
static int syncarenaindex(Arena *arena, uint64_t a0) { int ok; uint32_t clump; uint64_t 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 lookupscore(u8int score[VtScoreSize], int type, IAddr *ia) { int ms, ret; IEntry d; if(icachelookup(score, type, ia) >= 0){ addstat(StatIcacheRead, 1); return 0; } ms = msec(); addstat(StatIcacheFill, 1); if(loadientry(mainindex, score, type, &d) < 0) ret = -1; else{ ret = 0; insertscore(score, &d.ia, IEClean, nil); *ia = d.ia; } addstat2(StatIcacheRead, 1, StatIcacheReadTime, msec() - ms); return ret; }