From: Rusty Russell Date: Mon, 22 Aug 2011 03:17:08 +0000 (+0930) Subject: tdb2: fix intermittant failure in run-50-multiple-freelists-fail.c X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=60a487d57979e4364e70c837079f3cf083ddc9c7;ds=sidebyside tdb2: fix intermittant failure in run-50-multiple-freelists-fail.c layout.c's TDB creation functions were incorrect in case of a hash collision, causing occasional failure. Make it always use the (previously-failing) seed value, and fix it. --- diff --git a/ccan/tdb2/test/layout.c b/ccan/tdb2/test/layout.c index 6fcee6d4..2a37b51a 100644 --- a/ccan/tdb2/test/layout.c +++ b/ccan/tdb2/test/layout.c @@ -206,7 +206,7 @@ static void add_to_hashtable(struct tdb_context *tdb, b_off = hbucket_off(group_start, bucket); if (tdb_read_off(tdb, b_off) == 0) { tdb_write_off(tdb, b_off, - encode_offset(eoff, bucket, h)); + encode_offset(eoff, in_group, h)); return; } } @@ -228,7 +228,8 @@ static struct tle_freetable *find_ftable(struct tdb_layout *layout, unsigned num } /* FIXME: Support TDB_CONVERT */ -struct tdb_context *tdb_layout_get(struct tdb_layout *layout) +struct tdb_context *tdb_layout_get(struct tdb_layout *layout, + union tdb_attribute *attr) { unsigned int i; tdb_off_t off, len, last_ftable; @@ -264,7 +265,7 @@ struct tdb_context *tdb_layout_get(struct tdb_layout *layout) /* Fill with some weird pattern. */ memset(mem, 0x99, off); /* Now populate our header, cribbing from a real TDB header. */ - tdb = tdb_open(NULL, TDB_INTERNAL, O_RDWR, 0, &tap_log_attr); + tdb = tdb_open(NULL, TDB_INTERNAL, O_RDWR, 0, attr); memcpy(mem, tdb->file->map_ptr, sizeof(struct tdb_header)); /* Mug the tdb we have to make it use this. */ diff --git a/ccan/tdb2/test/layout.h b/ccan/tdb2/test/layout.h index 6e2e6657..96ecb683 100644 --- a/ccan/tdb2/test/layout.h +++ b/ccan/tdb2/test/layout.h @@ -15,7 +15,8 @@ void tdb_layout_add_hashtable(struct tdb_layout *layout, unsigned int bucket, tdb_len_t extra); #endif -struct tdb_context *tdb_layout_get(struct tdb_layout *layout); +struct tdb_context *tdb_layout_get(struct tdb_layout *layout, + union tdb_attribute *attr); void tdb_layout_free(struct tdb_layout *layout); enum layout_type { diff --git a/ccan/tdb2/test/run-03-coalesce.c b/ccan/tdb2/test/run-03-coalesce.c index 3fdd11c0..8222f06b 100644 --- a/ccan/tdb2/test/run-03-coalesce.c +++ b/ccan/tdb2/test/run-03-coalesce.c @@ -43,7 +43,7 @@ int main(int argc, char *argv[]) tdb_layout_add_freetable(layout); len = 1024; tdb_layout_add_free(layout, len, 0); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &tap_log_attr); ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(free_record_length(tdb, layout->elem[1].base.off) == len); @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) tdb_layout_add_freetable(layout); tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_used(layout, key, data, 6); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &tap_log_attr); ok1(free_record_length(tdb, layout->elem[1].base.off) == 1024); ok1(tdb_check(tdb, NULL, NULL) == 0); @@ -89,7 +89,7 @@ int main(int argc, char *argv[]) tdb_layout_add_freetable(layout); tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 2048, 0); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &tap_log_attr); ok1(free_record_length(tdb, layout->elem[1].base.off) == 1024); ok1(free_record_length(tdb, layout->elem[2].base.off) == 2048); ok1(tdb_check(tdb, NULL, NULL) == 0); @@ -116,7 +116,7 @@ int main(int argc, char *argv[]) tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 512, 0); tdb_layout_add_used(layout, key, data, 6); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &tap_log_attr); ok1(free_record_length(tdb, layout->elem[1].base.off) == 1024); ok1(free_record_length(tdb, layout->elem[2].base.off) == 512); ok1(tdb_check(tdb, NULL, NULL) == 0); @@ -142,7 +142,7 @@ int main(int argc, char *argv[]) tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 512, 0); tdb_layout_add_free(layout, 256, 0); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &tap_log_attr); ok1(free_record_length(tdb, layout->elem[1].base.off) == 1024); ok1(free_record_length(tdb, layout->elem[2].base.off) == 512); ok1(free_record_length(tdb, layout->elem[3].base.off) == 256); diff --git a/ccan/tdb2/test/run-50-multiple-freelists.c b/ccan/tdb2/test/run-50-multiple-freelists.c index 7a48c3e0..719701b1 100644 --- a/ccan/tdb2/test/run-50-multiple-freelists.c +++ b/ccan/tdb2/test/run-50-multiple-freelists.c @@ -16,6 +16,12 @@ int main(int argc, char *argv[]) struct tdb_context *tdb; struct tdb_layout *layout; TDB_DATA key, data; + union tdb_attribute seed; + + /* This seed value previously tickled a layout.c bug. */ + seed.base.attr = TDB_ATTRIBUTE_SEED; + seed.seed.seed = 0xb1142bc054d035b4ULL; + seed.base.next = &tap_log_attr; plan_tests(11); key = tdb_mkdata("Hello", 5); @@ -36,7 +42,7 @@ int main(int argc, char *argv[]) key.dsize--; tdb_layout_add_used(layout, key, data, 8); tdb_layout_add_free(layout, 40, 0); - tdb = tdb_layout_get(layout); + tdb = tdb_layout_get(layout, &seed); ok1(tdb_check(tdb, NULL, NULL) == 0); off = get_free(tdb, 0, 80 - sizeof(struct tdb_used_record), 0,