xref: /plan9/sys/src/cmd/venti/srv/syncindex0.c (revision f9e1cf08d3be51592e03e639fc848a68dc31a55e)
1368c31abSDavid du Colombier #include "stdinc.h"
2368c31abSDavid du Colombier #include "dat.h"
3368c31abSDavid du Colombier #include "fns.h"
4368c31abSDavid du Colombier 
5*f9e1cf08SDavid du Colombier static int
syncarenaindex(Arena * arena,u64int a0)6*f9e1cf08SDavid du Colombier syncarenaindex(Arena *arena, u64int a0)
7368c31abSDavid du Colombier {
8*f9e1cf08SDavid du Colombier 	int ok;
9*f9e1cf08SDavid du Colombier 	u32int clump;
10*f9e1cf08SDavid du Colombier 	u64int a;
11*f9e1cf08SDavid du Colombier 	ClumpInfo ci;
12368c31abSDavid du Colombier 	IAddr ia;
13*f9e1cf08SDavid du Colombier 	AState as;
14368c31abSDavid du Colombier 
15*f9e1cf08SDavid du Colombier 	if(arena->diskstats.clumps == arena->memstats.clumps)
16*f9e1cf08SDavid du Colombier 		return 0;
17368c31abSDavid du Colombier 
18*f9e1cf08SDavid du Colombier 	memset(&as, 0, sizeof as);
19*f9e1cf08SDavid du Colombier 	as.arena = arena;
20*f9e1cf08SDavid du Colombier 	as.stats = arena->diskstats;
21*f9e1cf08SDavid du Colombier 
22368c31abSDavid du Colombier 	ok = 0;
23*f9e1cf08SDavid du Colombier 	a = a0 + arena->diskstats.used;
24*f9e1cf08SDavid du Colombier 	for(clump=arena->diskstats.clumps; clump < arena->memstats.clumps; clump++){
25*f9e1cf08SDavid du Colombier 		if(readclumpinfo(arena, clump, &ci) < 0){
26*f9e1cf08SDavid du Colombier 			fprint(2, "%s: clump %d: cannot read clumpinfo\n",
27*f9e1cf08SDavid du Colombier 				arena->name, clump);
28368c31abSDavid du Colombier 			ok = -1;
29368c31abSDavid du Colombier 			break;
30368c31abSDavid du Colombier 		}
31368c31abSDavid du Colombier 
32*f9e1cf08SDavid du Colombier 		ia.type = ci.type;
33*f9e1cf08SDavid du Colombier 		ia.size = ci.uncsize;
34*f9e1cf08SDavid du Colombier 		ia.addr = a;
35*f9e1cf08SDavid du Colombier 		ia.blocks = (ClumpSize + ci.size + (1 << ABlockLog) - 1) >> ABlockLog;
36*f9e1cf08SDavid du Colombier 		a += ClumpSize + ci.size;
37368c31abSDavid du Colombier 
38*f9e1cf08SDavid du Colombier 		as.stats.used += ClumpSize + ci.size;
39*f9e1cf08SDavid du Colombier 		as.stats.uncsize += ia.size;
40*f9e1cf08SDavid du Colombier 		as.stats.clumps++;
41*f9e1cf08SDavid du Colombier 		if(ci.uncsize > ci.size)
42*f9e1cf08SDavid du Colombier 			as.stats.cclumps++;
43*f9e1cf08SDavid du Colombier 		as.aa = a;
44*f9e1cf08SDavid du Colombier 		insertscore(ci.score, &ia, IEDirty, &as);
45368c31abSDavid du Colombier 	}
46368c31abSDavid du Colombier 	flushdcache();
47368c31abSDavid du Colombier 	return ok;
48368c31abSDavid du Colombier }
49368c31abSDavid du Colombier 
50368c31abSDavid du Colombier int
syncindex(Index * ix)51*f9e1cf08SDavid du Colombier syncindex(Index *ix)
52368c31abSDavid du Colombier {
53368c31abSDavid du Colombier 	Arena *arena;
54*f9e1cf08SDavid du Colombier 	int i, e, e1, ok;
55368c31abSDavid du Colombier 
56368c31abSDavid du Colombier 	ok = 0;
57368c31abSDavid du Colombier 	for(i = 0; i < ix->narenas; i++){
58368c31abSDavid du Colombier 		trace(TraceProc, "syncindex start %d", i);
59368c31abSDavid du Colombier 		arena = ix->arenas[i];
60*f9e1cf08SDavid du Colombier 		e = syncarena(arena, TWID32, 1, 1);
61368c31abSDavid du Colombier 		e1 = e;
62368c31abSDavid du Colombier 		e1 &= ~(SyncHeader|SyncCIZero|SyncCIErr);
63*f9e1cf08SDavid du Colombier 		if(e & SyncHeader)
64368c31abSDavid du Colombier 			fprint(2, "arena %s: header is out-of-date\n", arena->name);
65*f9e1cf08SDavid du Colombier 		if(e1){
66*f9e1cf08SDavid du Colombier 			fprint(2, "arena %s: %x\n", arena->name, e1);
67368c31abSDavid du Colombier 			ok = -1;
68*f9e1cf08SDavid du Colombier 			continue;
69*f9e1cf08SDavid du Colombier 		}
70*f9e1cf08SDavid du Colombier 		flushdcache();
71368c31abSDavid du Colombier 
72*f9e1cf08SDavid du Colombier 		if(arena->memstats.clumps == arena->diskstats.clumps)
73*f9e1cf08SDavid du Colombier 			continue;
74*f9e1cf08SDavid du Colombier 
75*f9e1cf08SDavid du Colombier 		fprint(2, "%T %s: indexing %d clumps...\n",
76*f9e1cf08SDavid du Colombier 			arena->name,
77*f9e1cf08SDavid du Colombier 			arena->memstats.clumps - arena->diskstats.clumps);
78*f9e1cf08SDavid du Colombier 
79*f9e1cf08SDavid du Colombier 		if(syncarenaindex(arena, ix->amap[i].start) < 0){
80*f9e1cf08SDavid du Colombier 			fprint(2, "arena %s: syncarenaindex: %r\n", arena->name);
81*f9e1cf08SDavid du Colombier 			ok = -1;
82*f9e1cf08SDavid du Colombier 			continue;
83368c31abSDavid du Colombier 		}
84*f9e1cf08SDavid du Colombier 		if(wbarena(arena) < 0){
85*f9e1cf08SDavid du Colombier 			fprint(2, "arena %s: wbarena: %r\n", arena->name);
86*f9e1cf08SDavid du Colombier 			ok = -1;
87*f9e1cf08SDavid du Colombier 			continue;
88368c31abSDavid du Colombier 		}
89368c31abSDavid du Colombier 		flushdcache();
90*f9e1cf08SDavid du Colombier 		delaykickicache();
91368c31abSDavid du Colombier 	}
92368c31abSDavid du Colombier 	return ok;
93368c31abSDavid du Colombier }
94