Browse Source

Fix bug where we used old clear_if_first when doing I/O in open.
Add more logging.

Rusty Russell 16 years ago
parent
commit
9d045ca09a
1 changed files with 23 additions and 4 deletions
  1. 23 4
      ccan/tdb/test/run-open-during-transaction.c

+ 23 - 4
ccan/tdb/test/run-open-during-transaction.c

@@ -41,6 +41,20 @@ static bool clear_if_first;
 #undef fcntl
 #undef fcntl
 #undef ftruncate
 #undef ftruncate
 
 
+static void taplog(struct tdb_context *tdb,
+		   enum tdb_debug_level level,
+		   const char *fmt, ...)
+{
+	va_list ap;
+	char line[200];
+
+	va_start(ap, fmt);
+	vsprintf(line, fmt, ap);
+	va_end(ap);
+
+	diag("%s", line);
+}
+
 static void save_file_contents(int fd)
 static void save_file_contents(int fd)
 {
 {
 	struct stat st;
 	struct stat st;
@@ -195,6 +209,7 @@ static int ftruncate_check(int fd, off_t length)
 
 
 int main(int argc, char *argv[])
 int main(int argc, char *argv[])
 {
 {
+	struct tdb_logging_context logctx = { taplog, NULL };
 	const int flags[] = { TDB_DEFAULT,
 	const int flags[] = { TDB_DEFAULT,
 			      TDB_CLEAR_IF_FIRST,
 			      TDB_CLEAR_IF_FIRST,
 			      TDB_NOMMAP, 
 			      TDB_NOMMAP, 
@@ -213,11 +228,15 @@ int main(int argc, char *argv[])
 	nice(15);
 	nice(15);
 
 
 	for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++) {
 	for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++) {
+		clear_if_first = (flags[i] & TDB_CLEAR_IF_FIRST);
+		diag("Test with %s and %s\n",
+		     clear_if_first ? "CLEAR" : "DEFAULT",
+		     (flags[i] & TDB_NOMMAP) ? "no mmap" : "mmap");
 		unlink(TEST_DBNAME);
 		unlink(TEST_DBNAME);
-		tdb = tdb_open(TEST_DBNAME, 1024, flags[i],
-			       O_CREAT|O_TRUNC|O_RDWR, 0600);
+		tdb = tdb_open_ex(TEST_DBNAME, 1024, flags[i],
+				  O_CREAT|O_TRUNC|O_RDWR, 0600,
+				  &logctx, NULL);
 		ok1(tdb);
 		ok1(tdb);
-		clear_if_first = (flags[i] & TDB_CLEAR_IF_FIRST);
 
 
 		ok1(tdb_transaction_start(tdb) == 0);
 		ok1(tdb_transaction_start(tdb) == 0);
 		in_transaction = true;
 		in_transaction = true;
@@ -230,7 +249,7 @@ int main(int argc, char *argv[])
 		ok1(tdb_transaction_commit(tdb) == 0);
 		ok1(tdb_transaction_commit(tdb) == 0);
 		if (agent_pending)
 		if (agent_pending)
 			check_for_agent(tdb->fd, true);
 			check_for_agent(tdb->fd, true);
-		ok(errors == 0, "We had %u errors", errors);
+		ok(errors == 0, "We had %u unexpected changes", errors);
 
 
 		tdb_close(tdb);
 		tdb_close(tdb);
 	}
 	}