From: Rusty Russell Date: Wed, 30 Nov 2011 00:42:22 +0000 (+1030) Subject: tdb2: provide tdb_layout_write() rather than implying it by new_tdb_layout arg. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=79d603a5f73dfbb655d8d08f67eecb5f2da542d5 tdb2: provide tdb_layout_write() rather than implying it by new_tdb_layout arg. Neater API. --- diff --git a/ccan/tdb2/test/layout.c b/ccan/tdb2/test/layout.c index 38f79bfc..50b3cbe7 100644 --- a/ccan/tdb2/test/layout.c +++ b/ccan/tdb2/test/layout.c @@ -6,10 +6,9 @@ #include #include "logging.h" -struct tdb_layout *new_tdb_layout(const char *filename) +struct tdb_layout *new_tdb_layout(void) { struct tdb_layout *layout = malloc(sizeof(*layout)); - layout->filename = filename; layout->num_elems = 0; layout->elem = NULL; return layout; @@ -314,26 +313,25 @@ struct tdb_context *tdb_layout_get(struct tdb_layout *layout, } tdb->tdb2.ftable_off = find_ftable(layout, 0)->base.off; - - /* Get physical if they asked for it. */ - if (layout->filename) { - int fd = open(layout->filename, O_WRONLY|O_TRUNC|O_CREAT, - 0600); - if (fd < 0) - err(1, "opening %s for writing", layout->filename); - if (write(fd, tdb->file->map_ptr, tdb->file->map_size) - != tdb->file->map_size) - err(1, "writing %s", layout->filename); - close(fd); - tdb_close(tdb); - /* NOMMAP is for lockcheck. */ - tdb = tdb_open(layout->filename, TDB_NOMMAP, O_RDWR, 0, - &tap_log_attr); - } - return tdb; } +void tdb_layout_write(struct tdb_layout *layout, union tdb_attribute *attr, + const char *filename) +{ + struct tdb_context *tdb = tdb_layout_get(layout, attr); + int fd; + + fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0600); + if (fd < 0) + err(1, "opening %s for writing", filename); + if (write(fd, tdb->file->map_ptr, tdb->file->map_size) + != tdb->file->map_size) + err(1, "writing %s", filename); + close(fd); + tdb_close(tdb); +} + void tdb_layout_free(struct tdb_layout *layout) { unsigned int i; diff --git a/ccan/tdb2/test/layout.h b/ccan/tdb2/test/layout.h index 96ecb683..66491137 100644 --- a/ccan/tdb2/test/layout.h +++ b/ccan/tdb2/test/layout.h @@ -2,7 +2,7 @@ #define TDB2_TEST_LAYOUT_H #include -struct tdb_layout *new_tdb_layout(const char *filename); +struct tdb_layout *new_tdb_layout(void); void tdb_layout_add_freetable(struct tdb_layout *layout); void tdb_layout_add_free(struct tdb_layout *layout, tdb_len_t len, unsigned ftable); @@ -17,6 +17,9 @@ void tdb_layout_add_hashtable(struct tdb_layout *layout, #endif struct tdb_context *tdb_layout_get(struct tdb_layout *layout, union tdb_attribute *attr); +void tdb_layout_write(struct tdb_layout *layout, union tdb_attribute *attr, + const char *filename); + void tdb_layout_free(struct tdb_layout *layout); enum layout_type { @@ -62,7 +65,6 @@ union tdb_layout_elem { }; struct tdb_layout { - const char *filename; unsigned int num_elems; union tdb_layout_elem *elem; }; diff --git a/ccan/tdb2/test/run-03-coalesce.c b/ccan/tdb2/test/run-03-coalesce.c index 93b81728..c64b2bc5 100644 --- a/ccan/tdb2/test/run-03-coalesce.c +++ b/ccan/tdb2/test/run-03-coalesce.c @@ -32,11 +32,14 @@ int main(int argc, char *argv[]) key = tdb_mkdata("hello", 5); /* No coalescing can be done due to EOF */ - layout = new_tdb_layout("run-03-coalesce.tdb"); + layout = new_tdb_layout(); tdb_layout_add_freetable(layout); len = 1024; tdb_layout_add_free(layout, len, 0); - tdb = tdb_layout_get(layout, &tap_log_attr); + tdb_layout_write(layout, &tap_log_attr, "run-03-coalesce.tdb"); + /* NOMMAP is for lockcheck. */ + tdb = tdb_open("run-03-coalesce.tdb", TDB_NOMMAP, O_RDWR, 0, + &tap_log_attr); ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(free_record_length(tdb, layout->elem[1].base.off) == len); @@ -55,11 +58,14 @@ int main(int argc, char *argv[]) tdb_layout_free(layout); /* No coalescing can be done due to used record */ - layout = new_tdb_layout("run-03-coalesce.tdb"); + layout = new_tdb_layout(); 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, &tap_log_attr); + tdb_layout_write(layout, &tap_log_attr, "run-03-coalesce.tdb"); + /* NOMMAP is for lockcheck. */ + tdb = tdb_open("run-03-coalesce.tdb", TDB_NOMMAP, O_RDWR, 0, + &tap_log_attr); ok1(free_record_length(tdb, layout->elem[1].base.off) == 1024); ok1(tdb_check(tdb, NULL, NULL) == 0); @@ -78,11 +84,14 @@ int main(int argc, char *argv[]) tdb_layout_free(layout); /* Coalescing can be done due to two free records, then EOF */ - layout = new_tdb_layout("run-03-coalesce.tdb"); + layout = new_tdb_layout(); tdb_layout_add_freetable(layout); tdb_layout_add_free(layout, 1024, 0); tdb_layout_add_free(layout, 2048, 0); - tdb = tdb_layout_get(layout, &tap_log_attr); + tdb_layout_write(layout, &tap_log_attr, "run-03-coalesce.tdb"); + /* NOMMAP is for lockcheck. */ + tdb = tdb_open("run-03-coalesce.tdb", TDB_NOMMAP, O_RDWR, 0, + &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); @@ -104,12 +113,15 @@ int main(int argc, char *argv[]) tdb_layout_free(layout); /* Coalescing can be done due to two free records, then data */ - layout = new_tdb_layout("run-03-coalesce.tdb"); + layout = new_tdb_layout(); tdb_layout_add_freetable(layout); 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, &tap_log_attr); + tdb_layout_write(layout, &tap_log_attr, "run-03-coalesce.tdb"); + /* NOMMAP is for lockcheck. */ + tdb = tdb_open("run-03-coalesce.tdb", TDB_NOMMAP, O_RDWR, 0, + &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); @@ -130,12 +142,15 @@ int main(int argc, char *argv[]) tdb_layout_free(layout); /* Coalescing can be done due to three free records, then EOF */ - layout = new_tdb_layout("run-03-coalesce.tdb"); + layout = new_tdb_layout(); tdb_layout_add_freetable(layout); 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, &tap_log_attr); + tdb_layout_write(layout, &tap_log_attr, "run-03-coalesce.tdb"); + /* NOMMAP is for lockcheck. */ + tdb = tdb_open("run-03-coalesce.tdb", TDB_NOMMAP, O_RDWR, 0, + &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 dae90e23..10eaf41d 100644 --- a/ccan/tdb2/test/run-50-multiple-freelists.c +++ b/ccan/tdb2/test/run-50-multiple-freelists.c @@ -21,7 +21,7 @@ int main(int argc, char *argv[]) data = tdb_mkdata("world", 5); /* Create a TDB with three free tables. */ - layout = new_tdb_layout(NULL); + layout = new_tdb_layout(); tdb_layout_add_freetable(layout); tdb_layout_add_freetable(layout); tdb_layout_add_freetable(layout);