tdb2: fix intermittant failure in run-50-multiple-freelists-fail.c
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 5 Dec 2011 06:33:19 +0000 (17:03 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 5 Dec 2011 06:33:19 +0000 (17:03 +1030)
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.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
(Imported from CCAN commit 60a487d57979e4364e70c837079f3cf083ddc9c7)

lib/tdb2/test/layout.c
lib/tdb2/test/layout.h
lib/tdb2/test/run-03-coalesce.c
lib/tdb2/test/run-50-multiple-freelists.c

index 4f66e0935fc42e3bbb50c7768209057d2f9f2646..95cca6a81026ed07375ccb40d03cdabd5327608d 100644 (file)
@@ -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. */
index 6e2e6657a70451050db62ee2879657e6e8cb9f8b..96ecb683b8427e4aeaeaba30d21ccaab65021214 100644 (file)
@@ -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 {
index 538613ba0aa4fba26ff08d7a1b4b80307a3fe6f6..93b817284467c03361859065d8016bc6206899b9 100644 (file)
@@ -36,7 +36,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);
 
@@ -59,7 +59,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);
 
@@ -82,7 +82,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);
@@ -109,7 +109,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);
@@ -135,7 +135,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);
index 81c52e76c0e45fa9623b1a8430f671acc940ad97..dae90e239879eb1e34867fcd6e3dd572aefde21c 100644 (file)
@@ -9,6 +9,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);
@@ -29,7 +35,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,