Blame


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