Browse Source

tdb2: unify tdb1_get_seqnum/tdb1_increment_seqnum into tdb_get_seqnum/tdb_inc_seqnum

Switch on the TDB_VERSION1 flag.
Rusty Russell 14 years ago
parent
commit
57359c26e9
5 changed files with 60 additions and 5 deletions
  1. 5 0
      ccan/tdb2/io.c
  2. 2 0
      ccan/tdb2/private.h
  3. 14 1
      ccan/tdb2/tdb.c
  4. 0 4
      ccan/tdb2/tdb1.h
  5. 39 0
      ccan/tdb2/test/run-tdb1-seqnum-wrap.c

+ 5 - 0
ccan/tdb2/io.c

@@ -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;
 

+ 2 - 0
ccan/tdb2/private.h

@@ -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);

+ 14 - 1
ccan/tdb2/tdb.c

@@ -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

+ 0 - 4
ccan/tdb2/tdb1.h

@@ -38,10 +38,6 @@
 
 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 *);
 
 /* @} ******************************************************************/

+ 39 - 0
ccan/tdb2/test/run-tdb1-seqnum-wrap.c

@@ -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();
+}