Пример #1
0
/*
 * 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;
		}
	}
Пример #2
0
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;
}
Пример #3
0
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;
}