1 #include <ccan/tdb2/tdb.c>
2 #include <ccan/tdb2/free.c>
3 #include <ccan/tdb2/lock.c>
4 #include <ccan/tdb2/io.c>
5 #include <ccan/tdb2/check.c>
6 #include <ccan/tap/tap.h>
9 /* Release lock to check db. */
10 static void check(struct tdb_context *tdb)
12 tdb_allrecord_unlock(tdb, F_WRLCK);
13 ok1(tdb_check(tdb, NULL, NULL) == 0);
14 ok1(tdb_allrecord_lock(tdb, F_WRLCK, TDB_LOCK_WAIT, false) == 0);
17 int main(int argc, char *argv[])
21 uint64_t val, buckets;
22 struct tdb_context *tdb;
23 int flags[] = { TDB_INTERNAL, TDB_DEFAULT,
24 TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT };
26 plan_tests(sizeof(flags) / sizeof(flags[0]) * 40 + 1);
28 /* First, lower level expansion tests. */
29 for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
30 tdb = tdb_open("/tmp/run-new_database.tdb", flags[i],
31 O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
32 tdb->log = tap_log_fn;
37 ok1(tdb_allrecord_lock(tdb, F_WRLCK, TDB_LOCK_WAIT, false)
40 /* Expanding file is pretty easy. */
41 off = expand_to_fill_zones(tdb);
42 ok1(off > 0 && off != TDB_OFF_ERR);
45 /* Second expand should do nothing. */
46 ok1(expand_to_fill_zones(tdb) == 0);
49 /* Now, try adding a zone. */
50 val = tdb->header.v.num_zones + 1;
51 ok1(update_zones(tdb, val,
52 tdb->header.v.zone_bits,
53 tdb->header.v.free_buckets,
54 1ULL << tdb->header.v.zone_bits) == 0);
55 ok1(tdb->header.v.num_zones == val);
58 /* Now, try doubling zone size. */
59 val = tdb->header.v.zone_bits + 1;
60 ok1(update_zones(tdb, tdb->header.v.num_zones,
62 tdb->header.v.free_buckets,
64 ok1(tdb->header.v.zone_bits == val);
67 /* Now, try adding a zone, and a bucket. */
68 val = tdb->header.v.num_zones + 1;
69 buckets = tdb->header.v.free_buckets + 1;
70 ok1(update_zones(tdb, val,
71 tdb->header.v.zone_bits,
73 1ULL << tdb->header.v.zone_bits) == 0);
74 ok1(tdb->header.v.num_zones == val);
75 ok1(tdb->header.v.free_buckets == buckets);
78 /* Now, try doubling zone size, and adding a bucket. */
79 val = tdb->header.v.zone_bits + 1;
80 buckets = tdb->header.v.free_buckets + 1;
81 ok1(update_zones(tdb, tdb->header.v.num_zones,
85 ok1(tdb->header.v.zone_bits == val);
86 ok1(tdb->header.v.free_buckets == buckets);
89 /* Now, try massive zone increase. */
90 val = tdb->header.v.zone_bits + 4;
91 ok1(update_zones(tdb, tdb->header.v.num_zones,
93 tdb->header.v.free_buckets,
95 ok1(tdb->header.v.zone_bits == val);
98 tdb_allrecord_unlock(tdb, F_WRLCK);
102 /* Now using tdb_expand. */
103 for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
104 tdb = tdb_open("/tmp/run-new_database.tdb", flags[i],
105 O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
106 tdb->log = tap_log_fn;
111 /* First expand (expand file to fill zone). */
112 ok1(tdb_expand(tdb, 1, 1, false) == 0);
113 ok1(tdb->header.v.num_zones == 1);
114 ok1(tdb_check(tdb, NULL, NULL) == 0);
115 /* Little expand (extra zone). */
116 ok1(tdb_expand(tdb, 1, 1, false) == 0);
117 ok1(tdb->header.v.num_zones == 2);
118 ok1(tdb_check(tdb, NULL, NULL) == 0);
119 /* Big expand (enlarge zones) */
120 ok1(tdb_expand(tdb, 1, 4096, false) == 0);
121 ok1(tdb->header.v.num_zones == 2);
122 ok1(tdb_check(tdb, NULL, NULL) == 0);
126 ok1(tap_log_messages == 0);
127 return exit_status();