Commit 60a487d5 authored by Rusty Russell's avatar Rusty Russell

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.
parent d1a87961
...@@ -206,7 +206,7 @@ static void add_to_hashtable(struct tdb_context *tdb, ...@@ -206,7 +206,7 @@ static void add_to_hashtable(struct tdb_context *tdb,
b_off = hbucket_off(group_start, bucket); b_off = hbucket_off(group_start, bucket);
if (tdb_read_off(tdb, b_off) == 0) { if (tdb_read_off(tdb, b_off) == 0) {
tdb_write_off(tdb, b_off, tdb_write_off(tdb, b_off,
encode_offset(eoff, bucket, h)); encode_offset(eoff, in_group, h));
return; return;
} }
} }
...@@ -228,7 +228,8 @@ static struct tle_freetable *find_ftable(struct tdb_layout *layout, unsigned num ...@@ -228,7 +228,8 @@ static struct tle_freetable *find_ftable(struct tdb_layout *layout, unsigned num
} }
/* FIXME: Support TDB_CONVERT */ /* 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; unsigned int i;
tdb_off_t off, len, last_ftable; tdb_off_t off, len, last_ftable;
...@@ -264,7 +265,7 @@ struct tdb_context *tdb_layout_get(struct tdb_layout *layout) ...@@ -264,7 +265,7 @@ struct tdb_context *tdb_layout_get(struct tdb_layout *layout)
/* Fill with some weird pattern. */ /* Fill with some weird pattern. */
memset(mem, 0x99, off); memset(mem, 0x99, off);
/* Now populate our header, cribbing from a real TDB header. */ /* 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)); memcpy(mem, tdb->file->map_ptr, sizeof(struct tdb_header));
/* Mug the tdb we have to make it use this. */ /* Mug the tdb we have to make it use this. */
......
...@@ -15,7 +15,8 @@ void tdb_layout_add_hashtable(struct tdb_layout *layout, ...@@ -15,7 +15,8 @@ void tdb_layout_add_hashtable(struct tdb_layout *layout,
unsigned int bucket, unsigned int bucket,
tdb_len_t extra); tdb_len_t extra);
#endif #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); void tdb_layout_free(struct tdb_layout *layout);
enum layout_type { enum layout_type {
......
...@@ -43,7 +43,7 @@ int main(int argc, char *argv[]) ...@@ -43,7 +43,7 @@ int main(int argc, char *argv[])
tdb_layout_add_freetable(layout); tdb_layout_add_freetable(layout);
len = 1024; len = 1024;
tdb_layout_add_free(layout, len, 0); 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(tdb_check(tdb, NULL, NULL) == 0);
ok1(free_record_length(tdb, layout->elem[1].base.off) == len); ok1(free_record_length(tdb, layout->elem[1].base.off) == len);
...@@ -66,7 +66,7 @@ int main(int argc, char *argv[]) ...@@ -66,7 +66,7 @@ int main(int argc, char *argv[])
tdb_layout_add_freetable(layout); tdb_layout_add_freetable(layout);
tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 1024, 0);
tdb_layout_add_used(layout, key, data, 6); 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[1].base.off) == 1024);
ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(tdb_check(tdb, NULL, NULL) == 0);
...@@ -89,7 +89,7 @@ int main(int argc, char *argv[]) ...@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
tdb_layout_add_freetable(layout); tdb_layout_add_freetable(layout);
tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 1024, 0);
tdb_layout_add_free(layout, 2048, 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[1].base.off) == 1024);
ok1(free_record_length(tdb, layout->elem[2].base.off) == 2048); ok1(free_record_length(tdb, layout->elem[2].base.off) == 2048);
ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(tdb_check(tdb, NULL, NULL) == 0);
...@@ -116,7 +116,7 @@ int main(int argc, char *argv[]) ...@@ -116,7 +116,7 @@ int main(int argc, char *argv[])
tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 1024, 0);
tdb_layout_add_free(layout, 512, 0); tdb_layout_add_free(layout, 512, 0);
tdb_layout_add_used(layout, key, data, 6); 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[1].base.off) == 1024);
ok1(free_record_length(tdb, layout->elem[2].base.off) == 512); ok1(free_record_length(tdb, layout->elem[2].base.off) == 512);
ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(tdb_check(tdb, NULL, NULL) == 0);
...@@ -142,7 +142,7 @@ int main(int argc, char *argv[]) ...@@ -142,7 +142,7 @@ int main(int argc, char *argv[])
tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 1024, 0);
tdb_layout_add_free(layout, 512, 0); tdb_layout_add_free(layout, 512, 0);
tdb_layout_add_free(layout, 256, 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[1].base.off) == 1024);
ok1(free_record_length(tdb, layout->elem[2].base.off) == 512); ok1(free_record_length(tdb, layout->elem[2].base.off) == 512);
ok1(free_record_length(tdb, layout->elem[3].base.off) == 256); ok1(free_record_length(tdb, layout->elem[3].base.off) == 256);
......
...@@ -16,6 +16,12 @@ int main(int argc, char *argv[]) ...@@ -16,6 +16,12 @@ int main(int argc, char *argv[])
struct tdb_context *tdb; struct tdb_context *tdb;
struct tdb_layout *layout; struct tdb_layout *layout;
TDB_DATA key, data; 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); plan_tests(11);
key = tdb_mkdata("Hello", 5); key = tdb_mkdata("Hello", 5);
...@@ -36,7 +42,7 @@ int main(int argc, char *argv[]) ...@@ -36,7 +42,7 @@ int main(int argc, char *argv[])
key.dsize--; key.dsize--;
tdb_layout_add_used(layout, key, data, 8); tdb_layout_add_used(layout, key, data, 8);
tdb_layout_add_free(layout, 40, 0); 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); ok1(tdb_check(tdb, NULL, NULL) == 0);
off = get_free(tdb, 0, 80 - sizeof(struct tdb_used_record), 0, off = get_free(tdb, 0, 80 - sizeof(struct tdb_used_record), 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment