summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2010-10-25 10:38:55 +1030
committerRusty Russell <rusty@rustcorp.com.au>2010-10-26 19:18:42 +1030
commit9071df66fc6a29cc8b6cd52c91134efe7b57f007 (patch)
treebc9e13b9b37558298d5c9a1c06f53961a542a480
parentd71f8b0bc81f564b57a062561dd136c6467f57e5 (diff)
tdb2: extend test/layout to be able to place in file.
This was for lockcheck, but that didn't work very well. Seems like a useful addition nonetheless.
-rw-r--r--ccan/tdb2/test/layout.c18
-rw-r--r--ccan/tdb2/test/layout.h3
-rw-r--r--ccan/tdb2/test/run-03-coalesce.c12
3 files changed, 25 insertions, 8 deletions
diff --git a/ccan/tdb2/test/layout.c b/ccan/tdb2/test/layout.c
index ab383746..27c2d045 100644
--- a/ccan/tdb2/test/layout.c
+++ b/ccan/tdb2/test/layout.c
@@ -3,11 +3,13 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <err.h>
#include "logging.h"
-struct tdb_layout *new_tdb_layout(void)
+struct tdb_layout *new_tdb_layout(const char *filename)
{
struct tdb_layout *layout = malloc(sizeof(*layout));
+ layout->filename = filename;
layout->num_elems = 0;
layout->elem = NULL;
return layout;
@@ -302,5 +304,19 @@ struct tdb_context *tdb_layout_get(struct tdb_layout *layout)
/* Write tailer. */
((uint8_t *)tdb->map_ptr)[tdb->map_size-1] = last_zone->zone_bits;
+
+ /* 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);
+ write(fd, tdb->map_ptr, tdb->map_size);
+ close(fd);
+ tdb_close(tdb);
+ /* NOMMAP is for lockcheck. */
+ tdb = tdb_open(layout->filename, TDB_NOMMAP, O_RDWR, 0,
+ &tap_log_attr);
+ }
return tdb;
}
diff --git a/ccan/tdb2/test/layout.h b/ccan/tdb2/test/layout.h
index 25edd8b7..6cbf3d0d 100644
--- a/ccan/tdb2/test/layout.h
+++ b/ccan/tdb2/test/layout.h
@@ -2,7 +2,7 @@
#define TDB2_TEST_LAYOUT_H
#include <ccan/tdb2/private.h>
-struct tdb_layout *new_tdb_layout(void);
+struct tdb_layout *new_tdb_layout(const char *filename);
void tdb_layout_add_zone(struct tdb_layout *layout,
unsigned int zone_bits,
bool fill_prev);
@@ -61,6 +61,7 @@ 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 529b6c7b..dc97137f 100644
--- a/ccan/tdb2/test/run-03-coalesce.c
+++ b/ccan/tdb2/test/run-03-coalesce.c
@@ -37,7 +37,7 @@ int main(int argc, char *argv[])
key.dsize = 5;
/* No coalescing can be done due to EOF */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb = tdb_layout_get(layout);
len = layout->elem[1].free.len;
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
tdb_close(tdb);
/* No coalescing can be done due to used record */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb_layout_add_free(layout, 1024);
tdb_layout_add_used(layout, key, data, 6);
@@ -78,7 +78,7 @@ int main(int argc, char *argv[])
tdb_close(tdb);
/* Coalescing can be done due to two free records, then EOF */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb_layout_add_free(layout, 1024);
tdb = tdb_layout_get(layout);
@@ -101,7 +101,7 @@ int main(int argc, char *argv[])
tdb_close(tdb);
/* Coalescing can be done due to two free records, then data */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb_layout_add_free(layout, 1024);
tdb_layout_add_free(layout, 512);
@@ -125,7 +125,7 @@ int main(int argc, char *argv[])
tdb_close(tdb);
/* Coalescing can be done due to three free records, then EOF */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb_layout_add_free(layout, 1024);
tdb_layout_add_free(layout, 512);
@@ -151,7 +151,7 @@ int main(int argc, char *argv[])
tdb_close(tdb);
/* Coalescing across two zones isn't possible. */
- layout = new_tdb_layout();
+ layout = new_tdb_layout(NULL);
tdb_layout_add_zone(layout, zone_bits, false);
tdb_layout_add_zone(layout, zone_bits, true);
tdb = tdb_layout_get(layout);