Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull enum
6 a0d146ed 2005-07-12 devnull {
7 a0d146ed 2005-07-12 devnull ClumpChunks = 32*1024
8 a0d146ed 2005-07-12 devnull };
9 a0d146ed 2005-07-12 devnull
10 a0d146ed 2005-07-12 devnull static int missing, wrong;
11 a0d146ed 2005-07-12 devnull
12 a0d146ed 2005-07-12 devnull /*
13 a0d146ed 2005-07-12 devnull * shell sort is plenty good enough
14 a0d146ed 2005-07-12 devnull * because we're going to do a bunch of disk i/o's
15 a0d146ed 2005-07-12 devnull */
16 a0d146ed 2005-07-12 devnull static void
17 a0d146ed 2005-07-12 devnull sortclumpinfo(ClumpInfo *ci, int *s, int n)
18 a0d146ed 2005-07-12 devnull {
19 a0d146ed 2005-07-12 devnull int i, j, m, t;
20 a0d146ed 2005-07-12 devnull
21 a0d146ed 2005-07-12 devnull for(m = (n + 3) / 5; m > 0; m = (m + 1) / 3){
22 a0d146ed 2005-07-12 devnull for(i = n - m; i-- > 0;){
23 a0d146ed 2005-07-12 devnull for(j = i + m; j < n; j += m){
24 a0d146ed 2005-07-12 devnull if(memcmp(ci[s[j - m]].score, ci[s[j]].score, VtScoreSize) <= 0)
25 a0d146ed 2005-07-12 devnull break;
26 a0d146ed 2005-07-12 devnull t = s[j];
27 a0d146ed 2005-07-12 devnull s[j] = s[j - m];
28 a0d146ed 2005-07-12 devnull s[j - m] = t;
29 a0d146ed 2005-07-12 devnull }
30 a0d146ed 2005-07-12 devnull }
31 a0d146ed 2005-07-12 devnull }
32 a0d146ed 2005-07-12 devnull }
33 a0d146ed 2005-07-12 devnull
34 a0d146ed 2005-07-12 devnull int
35 a0d146ed 2005-07-12 devnull syncarenaindex(Index *ix, Arena *arena, u32int clump, u64int a, int fix, int *pflush, int check)
36 a0d146ed 2005-07-12 devnull {
37 a0d146ed 2005-07-12 devnull Packet *pack;
38 a0d146ed 2005-07-12 devnull IEntry ie;
39 a0d146ed 2005-07-12 devnull IAddr ia;
40 a0d146ed 2005-07-12 devnull ClumpInfo *ci, *cis;
41 a0d146ed 2005-07-12 devnull u64int *addrs;
42 a0d146ed 2005-07-12 devnull int i, n, ok, *s, flush;
43 a0d146ed 2005-07-12 devnull
44 a0d146ed 2005-07-12 devnull trace(TraceProc, "syncarenaindex enter");
45 a0d146ed 2005-07-12 devnull
46 a0d146ed 2005-07-12 devnull flush = 0;
47 a0d146ed 2005-07-12 devnull cis = MKN(ClumpInfo, ClumpChunks);
48 a0d146ed 2005-07-12 devnull addrs = MKN(u64int, ClumpChunks);
49 a0d146ed 2005-07-12 devnull s = MKN(int, ClumpChunks);
50 a0d146ed 2005-07-12 devnull ok = 0;
51 a0d146ed 2005-07-12 devnull for(; clump < arena->memstats.clumps; clump += n){
52 a0d146ed 2005-07-12 devnull n = ClumpChunks;
53 a0d146ed 2005-07-12 devnull if(n > arena->memstats.clumps - clump)
54 a0d146ed 2005-07-12 devnull n = arena->memstats.clumps - clump;
55 a0d146ed 2005-07-12 devnull n = readclumpinfos(arena, clump, cis, n);
56 a0d146ed 2005-07-12 devnull if(n <= 0){
57 a0d146ed 2005-07-12 devnull fprint(2, "arena directory read failed\n");
58 a0d146ed 2005-07-12 devnull ok = -1;
59 a0d146ed 2005-07-12 devnull break;
60 a0d146ed 2005-07-12 devnull }
61 a0d146ed 2005-07-12 devnull
62 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++){
63 a0d146ed 2005-07-12 devnull addrs[i] = a;
64 a0d146ed 2005-07-12 devnull a += cis[i].size + ClumpSize;
65 a0d146ed 2005-07-12 devnull s[i] = i;
66 a0d146ed 2005-07-12 devnull }
67 a0d146ed 2005-07-12 devnull
68 a0d146ed 2005-07-12 devnull sortclumpinfo(cis, s, n);
69 a0d146ed 2005-07-12 devnull
70 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++){
71 a0d146ed 2005-07-12 devnull ci = &cis[s[i]];
72 a0d146ed 2005-07-12 devnull ia.type = ci->type;
73 a0d146ed 2005-07-12 devnull ia.size = ci->uncsize;
74 a0d146ed 2005-07-12 devnull ia.addr = addrs[s[i]];
75 a0d146ed 2005-07-12 devnull ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
76 a0d146ed 2005-07-12 devnull
77 a0d146ed 2005-07-12 devnull if(!check)
78 a0d146ed 2005-07-12 devnull goto Add;
79 a0d146ed 2005-07-12 devnull if(loadientry(ix, ci->score, ci->type, &ie) < 0){
80 a0d146ed 2005-07-12 devnull trace(TraceProc, "syncarenaindex missing block %V.%d", ci->score, ci->type);
81 a0d146ed 2005-07-12 devnull missing++;
82 a0d146ed 2005-07-12 devnull if(0) fprint(2, "missing block type=%d score=%V\n", ci->type, ci->score);
83 a0d146ed 2005-07-12 devnull }else if(iaddrcmp(&ia, &ie.ia) != 0){
84 a0d146ed 2005-07-12 devnull trace(TraceProc, "syncarenaindex mismatched entry");
85 a0d146ed 2005-07-12 devnull fprint(2, "\nmismatched index entry and clump at %d\n", clump + i);
86 a0d146ed 2005-07-12 devnull fprint(2, "\tclump: type=%d size=%d blocks=%d addr=%lld\n", ia.type, ia.size, ia.blocks, ia.addr);
87 a0d146ed 2005-07-12 devnull fprint(2, "\tindex: type=%d size=%d block=%d addr=%lld\n", ie.ia.type, ie.ia.size, ie.ia.blocks, ie.ia.addr);
88 a0d146ed 2005-07-12 devnull pack = readlump(ie.score, ie.ia.type, ie.ia.size, nil);
89 a0d146ed 2005-07-12 devnull packetfree(pack);
90 a0d146ed 2005-07-12 devnull if(pack != nil){
91 a0d146ed 2005-07-12 devnull fprint(2, "duplicated lump\n");
92 a0d146ed 2005-07-12 devnull continue;
93 a0d146ed 2005-07-12 devnull }
94 a0d146ed 2005-07-12 devnull wrong++;
95 a0d146ed 2005-07-12 devnull }else
96 a0d146ed 2005-07-12 devnull continue;
97 a0d146ed 2005-07-12 devnull Add:
98 a0d146ed 2005-07-12 devnull if(!fix){
99 a0d146ed 2005-07-12 devnull ok = -1;
100 a0d146ed 2005-07-12 devnull continue;
101 a0d146ed 2005-07-12 devnull }
102 a0d146ed 2005-07-12 devnull flush = 1;
103 a0d146ed 2005-07-12 devnull trace(TraceProc, "syncarenaindex insert %V", ci->score);
104 a0d146ed 2005-07-12 devnull insertscore(ci->score, &ia, 1);
105 a0d146ed 2005-07-12 devnull }
106 a0d146ed 2005-07-12 devnull
107 a0d146ed 2005-07-12 devnull if(0 && clump / 1000 != (clump + n) / 1000)
108 a0d146ed 2005-07-12 devnull fprint(2, ".");
109 a0d146ed 2005-07-12 devnull }
110 a0d146ed 2005-07-12 devnull free(cis);
111 a0d146ed 2005-07-12 devnull free(addrs);
112 a0d146ed 2005-07-12 devnull free(s);
113 a0d146ed 2005-07-12 devnull if(flush){
114 a0d146ed 2005-07-12 devnull flushdcache();
115 a0d146ed 2005-07-12 devnull *pflush = 1;
116 a0d146ed 2005-07-12 devnull }
117 a0d146ed 2005-07-12 devnull return ok;
118 a0d146ed 2005-07-12 devnull }
119 a0d146ed 2005-07-12 devnull
120 a0d146ed 2005-07-12 devnull int
121 a0d146ed 2005-07-12 devnull syncindex(Index *ix, int fix, int mustflush, int check)
122 a0d146ed 2005-07-12 devnull {
123 a0d146ed 2005-07-12 devnull Arena *arena;
124 a0d146ed 2005-07-12 devnull u64int a;
125 a0d146ed 2005-07-12 devnull u32int clump;
126 a0d146ed 2005-07-12 devnull int i, e, e1, ok, ok1, flush;
127 a0d146ed 2005-07-12 devnull
128 a0d146ed 2005-07-12 devnull ok = 0;
129 a0d146ed 2005-07-12 devnull flush = 0;
130 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->narenas; i++){
131 a0d146ed 2005-07-12 devnull trace(TraceProc, "syncindex start %d", i);
132 a0d146ed 2005-07-12 devnull arena = ix->arenas[i];
133 a0d146ed 2005-07-12 devnull clump = arena->memstats.clumps;
134 a0d146ed 2005-07-12 devnull a = arena->memstats.used;
135 a0d146ed 2005-07-12 devnull e = syncarena(arena, ix->amap[i].start, TWID32, fix, fix);
136 a0d146ed 2005-07-12 devnull e1 = e;
137 a0d146ed 2005-07-12 devnull if(fix)
138 a0d146ed 2005-07-12 devnull e1 &= ~(SyncHeader|SyncCIZero|SyncCIErr);
139 a0d146ed 2005-07-12 devnull if(e1 == SyncHeader)
140 a0d146ed 2005-07-12 devnull fprint(2, "arena %s: header is out-of-date\n", arena->name);
141 a0d146ed 2005-07-12 devnull if(e1)
142 a0d146ed 2005-07-12 devnull ok = -1;
143 a0d146ed 2005-07-12 devnull else{
144 a0d146ed 2005-07-12 devnull ok1 = syncarenaindex(ix, arena, clump, a + ix->amap[i].start, fix, &flush, check);
145 a0d146ed 2005-07-12 devnull if(ok1 < 0)
146 a0d146ed 2005-07-12 devnull fprint(2, "syncarenaindex: %r\n");
147 a0d146ed 2005-07-12 devnull if(fix && ok1==0 && (e & SyncHeader) && wbarena(arena) < 0)
148 a0d146ed 2005-07-12 devnull fprint(2, "arena=%s header write failed: %r\n", arena->name);
149 a0d146ed 2005-07-12 devnull ok |= ok1;
150 a0d146ed 2005-07-12 devnull }
151 a0d146ed 2005-07-12 devnull }
152 a0d146ed 2005-07-12 devnull if(missing || wrong)
153 a0d146ed 2005-07-12 devnull fprint(2, "syncindex: %d missing entries, %d wrong entries (flush=%d)\n", missing, wrong, flush);
154 a0d146ed 2005-07-12 devnull if(fix && wbindex(ix) < 0){
155 a0d146ed 2005-07-12 devnull fprint(2, "can't write back index header for %s: %r\n", ix->name);
156 a0d146ed 2005-07-12 devnull return -1;
157 a0d146ed 2005-07-12 devnull }
158 a0d146ed 2005-07-12 devnull if(fix && flush){
159 a0d146ed 2005-07-12 devnull flushdcache();
160 a0d146ed 2005-07-12 devnull if(mustflush){
161 a0d146ed 2005-07-12 devnull flushicache();
162 a0d146ed 2005-07-12 devnull flushdcache();
163 a0d146ed 2005-07-12 devnull }else
164 a0d146ed 2005-07-12 devnull kickicache();
165 a0d146ed 2005-07-12 devnull }
166 a0d146ed 2005-07-12 devnull return ok;
167 a0d146ed 2005-07-12 devnull }