7 * writes a lump to disk
8 * returns the address in amap of the clump
11 storeclump(Index *ix, ZBlock *zb, u8int *sc, int type, u32int creator, IAddr *ia)
16 u8int bh[VtScoreSize];
19 if(0)print("storeclump %08x %p\n", mainindex->arenas[0], &cl);
21 if(size > VtMaxLumpSize){
22 seterr(EStrange, "lump too large");
25 if(vttypevalid(type) < 0){
26 seterr(EStrange, "invalid lump type");
31 scoremem(bh, zb->data, size);
32 if(scorecmp(sc, bh) != 0){
33 seterr(ECorrupt, "storing clump: corrupted; expected=%V got=%V, size=%d", sc, bh, size);
38 cb = alloczblock(size + ClumpSize, 0);
43 cl.info.uncsize = size;
46 scorecp(cl.info.score, sc);
48 if(0)print("whackblock %08x %p\n", mainindex->arenas[0], &cl);
49 dsize=0; // dsize = whackblock(&cb->data[ClumpSize], zb->data, size);
50 if(0)print("whackedblock %08x %p\n", mainindex->arenas[0], &cl);
51 if(dsize > 0 && dsize < size){
52 cl.encoding = ClumpECompress;
54 cl.encoding = ClumpENone;
56 memmove(&cb->data[ClumpSize], zb->data, size);
60 a = writeiclump(ix, &cl, cb->data);
68 stats.clumpbwrites += size;
69 stats.clumpbcomp += dsize;
75 ia->blocks = (dsize + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
81 clumpmagic(Arena *arena, u64int aa)
85 if(readarena(arena, aa, buf, U32Size) < 0)
87 return unpackmagic(buf);
91 * fetch a block based at addr.
92 * score is filled in with the block's score.
93 * blocks is roughly the length of the clump on disk;
94 * if zero, the length is unknown.
97 loadclump(Arena *arena, u64int aa, int blocks, Clump *cl, u8int *score, int verify)
101 u8int bh[VtScoreSize], *buf;
107 qunlock(&stats.lock);
112 cb = alloczblock(blocks << ABlockLog, 0);
115 n = readarena(arena, aa, cb->data, blocks << ABlockLog);
118 seterr(ECorrupt, "loadclump read less than a header");
122 if(unpackclump(cl, cb->data) < 0){
127 if(n < cl->info.size){
130 cb = alloczblock(n, 0);
133 if(readarena(arena, aa + ClumpSize, cb->data, n) != n){
134 seterr(ECorrupt, "loadclump read too little data");
140 buf = cb->data + ClumpSize;
142 scorecp(score, cl->info.score);
144 zb = alloczblock(cl->info.uncsize, 0);
149 switch(cl->encoding){
152 nunc = unwhack(&uw, zb->data, cl->info.uncsize, buf, cl->info.size);
153 if(nunc != cl->info.uncsize){
155 seterr(ECorrupt, "decompression failed: %s", uw.err);
157 seterr(ECorrupt, "decompression gave partial block: %d/%d\n", nunc, cl->info.uncsize);
164 if(cl->info.size != cl->info.uncsize){
165 seterr(ECorrupt, "loading clump: bad uncompressed size for uncompressed block");
170 memmove(zb->data, buf, cl->info.uncsize);
173 seterr(ECorrupt, "unknown encoding in loadlump");
181 scoremem(bh, zb->data, cl->info.uncsize);
182 if(scorecmp(cl->info.score, bh) != 0){
183 seterr(ECorrupt, "loading clump: corrupted; expected=%V got=%V", cl->info.score, bh);
187 if(vttypevalid(cl->info.type) < 0){
188 seterr(ECorrupt, "loading lump: invalid lump type %d", cl->info.type);
195 stats.clumpbreads += cl->info.size;
196 stats.clumpbuncomp += cl->info.uncsize;
197 qunlock(&stats.lock);