Commit Diff


commit - 0e263387626a2f16fcfa4d24dd72e2b5a9f01ad9
commit + 703c2d41ac5462f5d82e781b50d051a4a579416c
blob - a0d57f2e3ac3ff3e2f5fa57c2a2b0e207ad1075d
blob + 115ae883ca5d167e5c78c196482930e8e3f51735
--- src/cmd/venti/srv/wrarena.c
+++ src/cmd/venti/srv/wrarena.c
@@ -11,6 +11,7 @@ VtConn *z;
 int fast;	/* and a bit unsafe; only for benchmarking */
 int haveaoffset;
 int maxwrites = -1;
+int verbose;
 
 typedef struct ZClump ZClump;
 struct ZClump
@@ -38,6 +39,8 @@ vtsendthread(void *v)
 			break;
 		if(vtwrite(z, zcl.cl.info.score, zcl.cl.info.type, zcl.lump->data, zcl.cl.info.uncsize) < 0)
 			sysfatal("failed writing clump %llud: %r", zcl.aa);
+		if(verbose)
+			print("%V\n", zcl.cl.info.score);
 		freezblock(zcl.lump);
 	}
 	/*
@@ -57,9 +60,10 @@ vtsendthread(void *v)
 static void
 rdarena(Arena *arena, u64int offset)
 {
+	int i;
 	u64int a, aa, e;
-	u32int magic;
 	Clump cl;
+	ClumpInfo ci;
 	uchar score[VtScoreSize];
 	ZBlock *lump;
 	ZClump zcl;
@@ -71,50 +75,51 @@ rdarena(Arena *arena, u64int offset)
 	e = arena->base + arena->size;
 	if(offset != ~(u64int)0) {
 		if(offset >= e-a)
-			sysfatal("bad offset %llud >= %llud\n",
+			sysfatal("bad offset %#llx >= %#llx\n",
 				offset, e-a);
 		aa = offset;
 	} else
 		aa = 0;
 
 	if(maxwrites != 0)
-	for(; aa < e; aa += ClumpSize+cl.info.size) {
-		magic = clumpmagic(arena, aa);
-		if(magic == ClumpFreeMagic)
+	for(i=0, a=0; i<arena->memstats.clumps; i++, a+=ClumpSize+ci.size) {
+		if(readclumpinfo(arena, i, &ci) < 0)
 			break;
-		if(magic != arena->clumpmagic) {
-			if(0) fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
-				magic, aa);
-			break;
+		if(a < aa || ci.type == VtCorruptType){
+			if(ci.type == VtCorruptType)
+				fprint(2, "corrupt at %#llx: +%d\n", a, ClumpSize+ci.size);
+			continue;
 		}
-		lump = loadclump(arena, aa, 0, &cl, score, 0);
+		lump = loadclump(arena, a, 0, &cl, score, 0);
 		if(lump == nil) {
-			fprint(2, "clump %llud failed to read: %r\n", aa);
-			break;
+			fprint(2, "clump %#llx failed to read: %r\n", a);
+			continue;
 		}
 		if(!fast && cl.info.type != VtCorruptType) {
 			scoremem(score, lump->data, cl.info.uncsize);
 			if(scorecmp(cl.info.score, score) != 0) {
-				fprint(2, "clump %llud has mismatched score\n", aa);
+				fprint(2, "clump %#llx has mismatched score\n", a);
 				break;
 			}
 			if(vttypevalid(cl.info.type) < 0) {
-				fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
+				fprint(2, "clump %#llx has bad type %d\n", a, cl.info.type);
 				break;
 			}
 		}
 		if(z && cl.info.type != VtCorruptType){
 			zcl.cl = cl;
 			zcl.lump = lump;
-			zcl.aa = aa;
+			zcl.aa = a;
 			send(c, &zcl);
 		}else
 			freezblock(lump);
 		if(maxwrites>0 && --maxwrites == 0)
 			break;
 	}
+	if(a > aa)
+		aa = a;
 	if(haveaoffset)
-		print("end offset %llud\n", aa);
+		print("end offset %#llx\n", aa);
 }
 
 void
@@ -147,6 +152,9 @@ threadmain(int argc, char *argv[])
 	case 'M':
 		maxwrites = atoi(EARGF(usage()));
 		break;
+	case 'v':
+		verbose = 1;
+		break;
 	default:
 		usage();
 		break;
@@ -204,8 +212,8 @@ threadmain(int argc, char *argv[])
 		vtproc(vtsendthread, nil);
 
 	rdarena(arena, offset);
-		if(vtsync(z) < 0)
-			sysfatal("executing sync: %r");
+	if(vtsync(z) < 0)
+		sysfatal("executing sync: %r");
 
 	memset(&zerocl, 0, sizeof zerocl);
 	for(i=0; i<12; i++)