/* * read in all of the arena's clump directory, * convert to IEntry format, and bucket sort based * on the first few bits. */ static uint32_t readarenainfo(IEBucks *ib, Arena *arena, uint64_t a, Bloom *b) { IEntry ie; ClumpInfo *ci, *cis; uint32_t clump; int i, n, ok, nskip; if(arena->memstats.clumps) fprint(2, "\tarena %s: %d entries\n", arena->name, arena->memstats.clumps); else fprint(2, "[%s] ", arena->name); cis = MKN(ClumpInfo, ClumpChunks); ok = 0; nskip = 0; memset(&ie, 0, sizeof(IEntry)); for(clump = 0; clump < arena->memstats.clumps; clump += n){ n = ClumpChunks; if(n > arena->memstats.clumps - clump) n = arena->memstats.clumps - clump; if(readclumpinfos(arena, clump, cis, n) != n){ seterr(EOk, "arena directory read failed: %r"); ok = -1; break; } for(i = 0; i < n; i++){ ci = &cis[i]; ie.ia.type = ci->type; ie.ia.size = ci->uncsize; ie.ia.addr = a; a += ci->size + ClumpSize; ie.ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog; scorecp(ie.score, ci->score); if(ci->type == VtCorruptType){ if(0) print("! %V %22lld %3d %5d %3d\n", ie.score, ie.ia.addr, ie.ia.type, ie.ia.size, ie.ia.blocks); nskip++; }else sprayientry(ib, &ie); markbloomfilter(b, ie.score); } } free(cis); if(ok < 0) return TWID32; return clump - nskip; }
int insertscore(u8int score[VtScoreSize], IAddr *ia, int state, AState *as) { ISum *toload; qlock(&icache.lock); icacheinsert(score, ia, state); if(state == IEClean) toload = scachemiss(ia->addr); else{ assert(state == IEDirty); toload = nil; if(as == nil) fprint(2, "%T insertscore IEDirty without as; called from %#p\n", getcallerpc(&score)); else{ if(icache.as.aa > as->aa) fprint(2, "%T insertscore: aa moving backward: %#llux -> %#llux\n", icache.as.aa, as->aa); icache.as = *as; } } qunlock(&icache.lock); if(toload){ scacheload(toload); qunlock(&toload->lock); } if(icache.ndirty >= icache.maxdirty) kickicache(); /* * It's okay not to do this under icache.lock. * Calling insertscore only happens when we hold * the lump, meaning any searches for this block * will hit in the lump cache until after we return. */ if(state == IEDirty) markbloomfilter(mainindex->bloom, score); return 0; }