tdb2: unify tdb1_get_seqnum/tdb1_increment_seqnum into tdb_get_seqnum/tdb_inc_seqnum
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 06:01:07 +0000 (15:31 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 06:01:07 +0000 (15:31 +0930)
Switch on the TDB_VERSION1 flag.

ccan/tdb2/io.c
ccan/tdb2/private.h
ccan/tdb2/tdb.c
ccan/tdb2/tdb1.h
ccan/tdb2/test/run-tdb1-seqnum-wrap.c [new file with mode: 0644]

index 6f92a809ba9edf1609a00abba78ccf37156107f4..3648505f12c37d688337e86ae70883558d7e01e5 100644 (file)
@@ -584,6 +584,11 @@ void tdb_inc_seqnum(struct tdb_context *tdb)
 {
        tdb_off_t seq;
 
+       if (tdb->flags & TDB_VERSION1) {
+               tdb1_increment_seqnum_nonblock(tdb);
+               return;
+       }
+
        if (likely(!(tdb->flags & TDB_CONVERT))) {
                int64_t *direct;
 
index 3af1b1d0db1bed8a6b8665ce0ded865e90c43d0c..2d4970fdc61c7ebc20760a6187b3de6f873d0b84 100644 (file)
@@ -679,6 +679,8 @@ enum TDB_ERROR tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
                                                          TDB_DATA data,
                                                          void *private_data),
                                 void *private_data);
+void tdb1_increment_seqnum_nonblock(struct tdb_context *tdb);
+int tdb1_get_seqnum(struct tdb_context *tdb);
 
 /* tdb1_transaction.c: */
 int tdb1_transaction_start(struct tdb_context *tdb);
index a3897831068dd99f5d0d67a12824d4a5cba6397b..c6bd8072ea9c4b18d55ee7b1ca5c4e64e550805d 100644 (file)
@@ -563,7 +563,20 @@ const char *tdb_name(const struct tdb_context *tdb)
 
 int64_t tdb_get_seqnum(struct tdb_context *tdb)
 {
-       tdb_off_t off = tdb_read_off(tdb, offsetof(struct tdb_header, seqnum));
+       tdb_off_t off;
+
+       if (tdb->flags & TDB_VERSION1) {
+               tdb1_off_t val;
+               tdb->last_error = TDB_SUCCESS;
+               val = tdb1_get_seqnum(tdb);
+
+               if (tdb->last_error != TDB_SUCCESS)
+                       return tdb->last_error;
+               else
+                       return val;
+       }
+
+       off = tdb_read_off(tdb, offsetof(struct tdb_header, seqnum));
        if (TDB_OFF_IS_ERR(off))
                tdb->last_error = off;
        else
index 59c2dd0d1dd591bec45bdc9968fe1feecc573351..90cd7fa14abb9058629e22037ac676bc983609ac 100644 (file)
 
 void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
 
-int tdb1_get_seqnum(struct tdb_context *tdb);
-
-void tdb1_increment_seqnum_nonblock(struct tdb_context *tdb);
-
 uint64_t tdb1_incompatible_hash(const void *key, size_t len, uint64_t seed, void *);
 
 /* @} ******************************************************************/
diff --git a/ccan/tdb2/test/run-tdb1-seqnum-wrap.c b/ccan/tdb2/test/run-tdb1-seqnum-wrap.c
new file mode 100644 (file)
index 0000000..c3eb278
--- /dev/null
@@ -0,0 +1,39 @@
+#include "tdb2-source.h"
+#include <ccan/tap/tap.h>
+#include <stdlib.h>
+#include <err.h>
+#include "logging.h"
+
+int main(int argc, char *argv[])
+{
+       struct tdb_context *tdb;
+       unsigned int i;
+       struct tdb1_header hdr;
+       struct tdb_data key = { (unsigned char *)&hdr, sizeof(hdr) };
+       struct tdb_data data = { (unsigned char *)&hdr, sizeof(hdr) };
+       int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
+                       TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT };
+
+       plan_tests(sizeof(flags) / sizeof(flags[0]) * 7);
+       for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
+               tdb = tdb_open("run-tdb1-seqnum-wrap.tdb1",
+                              flags[i]|TDB_VERSION1|TDB_SEQNUM,
+                              O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
+               ok1(tdb);
+               if (!tdb)
+                       break;
+               ok1(pread(tdb->file->fd, &hdr, sizeof(hdr), 0) == sizeof(hdr));
+               hdr.sequence_number = 0xFFFFFFFF;
+               ok1(pwrite(tdb->file->fd, &hdr, sizeof(hdr), 0) == sizeof(hdr));
+
+               /* Must not be negative: that would mean an error! */
+               ok1(tdb_get_seqnum(tdb) == 0xFFFFFFFF);
+
+               ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
+               ok1(tdb_get_seqnum(tdb) == 0);
+               tdb_close(tdb);
+               ok1(tap_log_messages == 0);
+       }
+
+       return exit_status();
+}