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 static int writeclumphead(Arena *arena, u64int aa, Clump *cl);
6 7a4ee46d 2003-11-23 devnull static int writeclumpmagic(Arena *arena, u64int aa, u32int magic);
7 7a4ee46d 2003-11-23 devnull
8 7a4ee46d 2003-11-23 devnull int
9 7a4ee46d 2003-11-23 devnull clumpinfocmp(ClumpInfo *c, ClumpInfo *d)
10 7a4ee46d 2003-11-23 devnull {
11 7a4ee46d 2003-11-23 devnull return c->type != d->type
12 7a4ee46d 2003-11-23 devnull || c->size != d->size
13 7a4ee46d 2003-11-23 devnull || c->uncsize != d->uncsize
14 7a4ee46d 2003-11-23 devnull || scorecmp(c->score, d->score)!=0;
15 7a4ee46d 2003-11-23 devnull }
16 7a4ee46d 2003-11-23 devnull
17 7a4ee46d 2003-11-23 devnull /*
18 7a4ee46d 2003-11-23 devnull * synchronize the clump info directory with
19 7a4ee46d 2003-11-23 devnull * with the clumps actually stored in the arena.
20 7a4ee46d 2003-11-23 devnull * the directory should be at least as up to date
21 7a4ee46d 2003-11-23 devnull * as the arena's trailer.
22 7a4ee46d 2003-11-23 devnull *
23 7a4ee46d 2003-11-23 devnull * checks/updates at most n clumps.
24 7a4ee46d 2003-11-23 devnull *
25 7a4ee46d 2003-11-23 devnull * returns 0 if ok, flags if error occurred
26 7a4ee46d 2003-11-23 devnull */
27 7a4ee46d 2003-11-23 devnull int
28 7a4ee46d 2003-11-23 devnull syncarena(Arena *arena, u32int n, int zok, int fix)
29 7a4ee46d 2003-11-23 devnull {
30 7a4ee46d 2003-11-23 devnull ZBlock *lump;
31 7a4ee46d 2003-11-23 devnull Clump cl;
32 7a4ee46d 2003-11-23 devnull ClumpInfo ci;
33 7a4ee46d 2003-11-23 devnull static ClumpInfo zci = { .type = -1 };
34 7a4ee46d 2003-11-23 devnull u8int score[VtScoreSize];
35 7a4ee46d 2003-11-23 devnull u64int uncsize, used, aa;
36 7a4ee46d 2003-11-23 devnull u32int clump, clumps, cclumps, magic;
37 7a4ee46d 2003-11-23 devnull int err, flush, broken;
38 7a4ee46d 2003-11-23 devnull
39 7a4ee46d 2003-11-23 devnull used = arena->used;
40 7a4ee46d 2003-11-23 devnull clumps = arena->clumps;
41 7a4ee46d 2003-11-23 devnull cclumps = arena->cclumps;
42 7a4ee46d 2003-11-23 devnull uncsize = arena->uncsize;
43 7a4ee46d 2003-11-23 devnull
44 7a4ee46d 2003-11-23 devnull flush = 0;
45 7a4ee46d 2003-11-23 devnull err = 0;
46 7a4ee46d 2003-11-23 devnull for(; n; n--){
47 7a4ee46d 2003-11-23 devnull aa = arena->used;
48 7a4ee46d 2003-11-23 devnull clump = arena->clumps;
49 7a4ee46d 2003-11-23 devnull magic = clumpmagic(arena, aa);
50 7a4ee46d 2003-11-23 devnull if(magic == ClumpFreeMagic)
51 7a4ee46d 2003-11-23 devnull break;
52 7a4ee46d 2003-11-23 devnull if(magic != ClumpMagic){
53 7a4ee46d 2003-11-23 devnull fprint(2, "illegal clump magic number=%#8.8ux at clump=%d\n", magic, clump);
54 7a4ee46d 2003-11-23 devnull err |= SyncDataErr;
55 7a4ee46d 2003-11-23 devnull //ZZZ write a zero here?
56 7a4ee46d 2003-11-23 devnull if(0 && fix && writeclumpmagic(arena, aa, ClumpFreeMagic) < 0){
57 7a4ee46d 2003-11-23 devnull fprint(2, "can't write corrected clump free magic: %r");
58 7a4ee46d 2003-11-23 devnull err |= SyncFixErr;
59 7a4ee46d 2003-11-23 devnull }
60 7a4ee46d 2003-11-23 devnull break;
61 7a4ee46d 2003-11-23 devnull }
62 7a4ee46d 2003-11-23 devnull arena->clumps++;
63 7a4ee46d 2003-11-23 devnull
64 7a4ee46d 2003-11-23 devnull broken = 0;
65 7a4ee46d 2003-11-23 devnull lump = loadclump(arena, aa, 0, &cl, score, 0);
66 7a4ee46d 2003-11-23 devnull if(lump == nil){
67 7a4ee46d 2003-11-23 devnull fprint(2, "clump=%d failed to read correctly: %r\n", clump);
68 7a4ee46d 2003-11-23 devnull err |= SyncDataErr;
69 7a4ee46d 2003-11-23 devnull }else if(cl.info.type != VtTypeCorrupt){
70 7a4ee46d 2003-11-23 devnull scoremem(score, lump->data, cl.info.uncsize);
71 7a4ee46d 2003-11-23 devnull if(scorecmp(cl.info.score, score) != 0){
72 7a4ee46d 2003-11-23 devnull fprint(2, "clump=%d has mismatched score\n", clump);
73 7a4ee46d 2003-11-23 devnull err |= SyncDataErr;
74 7a4ee46d 2003-11-23 devnull broken = 1;
75 7a4ee46d 2003-11-23 devnull }else if(vttypevalid(cl.info.type) < 0){
76 7a4ee46d 2003-11-23 devnull fprint(2, "clump=%d has invalid type %d", clump, cl.info.type);
77 7a4ee46d 2003-11-23 devnull err |= SyncDataErr;
78 7a4ee46d 2003-11-23 devnull broken = 1;
79 7a4ee46d 2003-11-23 devnull }
80 7a4ee46d 2003-11-23 devnull if(broken && fix){
81 7a4ee46d 2003-11-23 devnull cl.info.type = VtTypeCorrupt;
82 7a4ee46d 2003-11-23 devnull if(writeclumphead(arena, aa, &cl) < 0){
83 7a4ee46d 2003-11-23 devnull fprint(2, "can't write corrected clump header: %r");
84 7a4ee46d 2003-11-23 devnull err |= SyncFixErr;
85 7a4ee46d 2003-11-23 devnull }
86 7a4ee46d 2003-11-23 devnull }
87 7a4ee46d 2003-11-23 devnull }
88 7a4ee46d 2003-11-23 devnull freezblock(lump);
89 7a4ee46d 2003-11-23 devnull arena->used += ClumpSize + cl.info.size;
90 7a4ee46d 2003-11-23 devnull
91 7a4ee46d 2003-11-23 devnull if(!broken && readclumpinfo(arena, clump, &ci)<0){
92 7a4ee46d 2003-11-23 devnull fprint(2, "arena directory read failed\n");
93 7a4ee46d 2003-11-23 devnull broken = 1;
94 7a4ee46d 2003-11-23 devnull }else if(!broken && clumpinfocmp(&ci, &cl.info)!=0){
95 7a4ee46d 2003-11-23 devnull if(clumpinfocmp(&ci, &zci) == 0){
96 7a4ee46d 2003-11-23 devnull err |= SyncCIZero;
97 7a4ee46d 2003-11-23 devnull if(!zok)
98 7a4ee46d 2003-11-23 devnull fprint(2, "unwritten clump info for clump=%d\n", clump);
99 7a4ee46d 2003-11-23 devnull }else{
100 7a4ee46d 2003-11-23 devnull err |= SyncCIErr;
101 7a4ee46d 2003-11-23 devnull fprint(2, "bad clump info for clump=%d\n", clump);
102 7a4ee46d 2003-11-23 devnull fprint(2, "\texpected score=%V type=%d size=%d uncsize=%d\n",
103 7a4ee46d 2003-11-23 devnull cl.info.score, cl.info.type, cl.info.size, cl.info.uncsize);
104 7a4ee46d 2003-11-23 devnull fprint(2, "\tfound score=%V type=%d size=%d uncsize=%d\n",
105 7a4ee46d 2003-11-23 devnull ci.score, ci.type, ci.size, ci.uncsize);
106 7a4ee46d 2003-11-23 devnull }
107 7a4ee46d 2003-11-23 devnull broken = 1;
108 7a4ee46d 2003-11-23 devnull }
109 7a4ee46d 2003-11-23 devnull if(broken && fix){
110 7a4ee46d 2003-11-23 devnull flush = 1;
111 7a4ee46d 2003-11-23 devnull ci = cl.info;
112 7a4ee46d 2003-11-23 devnull if(writeclumpinfo(arena, clump, &ci) < 0){
113 7a4ee46d 2003-11-23 devnull fprint(2, "can't write correct clump directory: %r\n");
114 7a4ee46d 2003-11-23 devnull err |= SyncFixErr;
115 7a4ee46d 2003-11-23 devnull }
116 7a4ee46d 2003-11-23 devnull }
117 7a4ee46d 2003-11-23 devnull
118 7a4ee46d 2003-11-23 devnull arena->uncsize += cl.info.uncsize;
119 7a4ee46d 2003-11-23 devnull if(cl.info.size < cl.info.uncsize)
120 7a4ee46d 2003-11-23 devnull arena->cclumps++;
121 7a4ee46d 2003-11-23 devnull }
122 7a4ee46d 2003-11-23 devnull
123 7a4ee46d 2003-11-23 devnull if(flush){
124 7a4ee46d 2003-11-23 devnull arena->wtime = now();
125 7a4ee46d 2003-11-23 devnull if(arena->ctime == 0 && arena->clumps)
126 7a4ee46d 2003-11-23 devnull arena->ctime = arena->wtime;
127 7a4ee46d 2003-11-23 devnull if(flushciblocks(arena) < 0){
128 7a4ee46d 2003-11-23 devnull fprint(2, "can't flush arena directory cache: %r");
129 7a4ee46d 2003-11-23 devnull err |= SyncFixErr;
130 7a4ee46d 2003-11-23 devnull }
131 333c1dcc 2004-03-13 devnull flushdcache();
132 7a4ee46d 2003-11-23 devnull }
133 7a4ee46d 2003-11-23 devnull
134 7a4ee46d 2003-11-23 devnull if(used != arena->used
135 7a4ee46d 2003-11-23 devnull || clumps != arena->clumps
136 7a4ee46d 2003-11-23 devnull || cclumps != arena->cclumps
137 7a4ee46d 2003-11-23 devnull || uncsize != arena->uncsize)
138 7a4ee46d 2003-11-23 devnull err |= SyncHeader;
139 7a4ee46d 2003-11-23 devnull
140 7a4ee46d 2003-11-23 devnull return err;
141 7a4ee46d 2003-11-23 devnull }
142 7a4ee46d 2003-11-23 devnull
143 7a4ee46d 2003-11-23 devnull static int
144 7a4ee46d 2003-11-23 devnull writeclumphead(Arena *arena, u64int aa, Clump *cl)
145 7a4ee46d 2003-11-23 devnull {
146 7a4ee46d 2003-11-23 devnull ZBlock *zb;
147 7a4ee46d 2003-11-23 devnull int bad;
148 7a4ee46d 2003-11-23 devnull
149 7a4ee46d 2003-11-23 devnull zb = alloczblock(ClumpSize, 0);
150 7a4ee46d 2003-11-23 devnull if(zb == nil)
151 7a4ee46d 2003-11-23 devnull return -1;
152 7a4ee46d 2003-11-23 devnull bad = packclump(cl, zb->data)<0
153 7a4ee46d 2003-11-23 devnull || writearena(arena, aa, zb->data, ClumpSize) != ClumpSize;
154 7a4ee46d 2003-11-23 devnull freezblock(zb);
155 7a4ee46d 2003-11-23 devnull return bad ? -1 : 0;
156 7a4ee46d 2003-11-23 devnull }
157 7a4ee46d 2003-11-23 devnull
158 7a4ee46d 2003-11-23 devnull static int
159 7a4ee46d 2003-11-23 devnull writeclumpmagic(Arena *arena, u64int aa, u32int magic)
160 7a4ee46d 2003-11-23 devnull {
161 7a4ee46d 2003-11-23 devnull u8int buf[U32Size];
162 7a4ee46d 2003-11-23 devnull
163 7a4ee46d 2003-11-23 devnull packmagic(magic, buf);
164 7a4ee46d 2003-11-23 devnull return writearena(arena, aa, buf, U32Size) == U32Size;
165 7a4ee46d 2003-11-23 devnull }