svn commit: samba r10468 - in branches/SAMBA_4_0/source/lib/tdb: common tools

tridge at samba.org tridge at samba.org
Sat Sep 24 06:49:29 GMT 2005


Author: tridge
Date: 2005-09-24 06:49:28 +0000 (Sat, 24 Sep 2005)
New Revision: 10468

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10468

Log:

- terminate tdbtorture quickly when an error is detected

- more workarounds for aix not handling malloc of size 0


Modified:
   branches/SAMBA_4_0/source/lib/tdb/common/io.c
   branches/SAMBA_4_0/source/lib/tdb/common/transaction.c
   branches/SAMBA_4_0/source/lib/tdb/tools/tdbtorture.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/tdb/common/io.c
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/common/io.c	2005-09-24 05:02:02 UTC (rev 10467)
+++ branches/SAMBA_4_0/source/lib/tdb/common/io.c	2005-09-24 06:49:28 UTC (rev 10468)
@@ -97,6 +97,10 @@
 static int tdb_write(struct tdb_context *tdb, tdb_off_t off, 
 		     const void *buf, tdb_len_t len)
 {
+	if (len == 0) {
+		return 0;
+	}
+
 	if (tdb->read_only || tdb->traverse_read) {
 		tdb->ecode = TDB_ERR_RDONLY;
 		return -1;

Modified: branches/SAMBA_4_0/source/lib/tdb/common/transaction.c
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/common/transaction.c	2005-09-24 05:02:02 UTC (rev 10467)
+++ branches/SAMBA_4_0/source/lib/tdb/common/transaction.c	2005-09-24 06:49:28 UTC (rev 10468)
@@ -196,6 +196,10 @@
 			     const void *buf, tdb_len_t len)
 {
 	struct tdb_transaction_el *el;
+
+	if (len == 0) {
+		return 0;
+	}
 	
 	/* if the write is to a hash head, then update the transaction
 	   hash heads */

Modified: branches/SAMBA_4_0/source/lib/tdb/tools/tdbtorture.c
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/tools/tdbtorture.c	2005-09-24 05:02:02 UTC (rev 10467)
+++ branches/SAMBA_4_0/source/lib/tdb/tools/tdbtorture.c	2005-09-24 06:49:28 UTC (rev 10468)
@@ -50,7 +50,7 @@
 
 static struct tdb_context *db;
 static int in_transaction;
-static int log_count;
+static int error_count;
 
 #ifdef PRINTF_ATTRIBUTE
 static void tdb_log(struct tdb_context *tdb, int level, const char *format, ...) PRINTF_ATTRIBUTE(3,4);
@@ -59,7 +59,7 @@
 {
 	va_list ap;
     
-	log_count++;
+	error_count++;
 
 	va_start(ap, format);
 	vfprintf(stdout, format, ap);
@@ -78,7 +78,7 @@
 static void fatal(const char *why)
 {
 	perror(why);
-	exit(1);
+	error_count++;
 }
 
 static char *randbuf(int len)
@@ -283,37 +283,55 @@
 	srand(seed + i);
 	srandom(seed + i);
 
-	for (i=0;i<num_loops;i++) {
+	for (i=0;i<num_loops && error_count == 0;i++) {
 		addrec_db();
 	}
 
-	tdb_traverse_read(db, NULL, NULL);
-	tdb_traverse(db, traverse_fn, NULL);
-	tdb_traverse(db, traverse_fn, NULL);
+	if (error_count == 0) {
+		tdb_traverse_read(db, NULL, NULL);
+		tdb_traverse(db, traverse_fn, NULL);
+		tdb_traverse(db, traverse_fn, NULL);
+	}
 
 	tdb_close(db);
 
-	if (getpid() == pids[0]) {
-		for (i=0;i<num_procs-1;i++) {
-			int status;
-			if (waitpid(pids[i+1], &status, 0) != pids[i+1]) {
-				printf("failed to wait for %d\n",
-				       (int)pids[i+1]);
-				exit(1);
+	if (getpid() != pids[0]) {
+		return error_count;
+	}
+
+	for (i=1;i<num_procs;i++) {
+		int status, j;
+		pid_t pid;
+		if (error_count != 0) {
+			/* try and stop the test on any failure */
+			for (j=1;j<num_procs;j++) {
+				if (pids[j] != 0) {
+					kill(pids[j], SIGTERM);
+				}
 			}
-			if (WEXITSTATUS(status) != 0) {
-				printf("child %d exited with status %d\n",
-				       (int)pids[i+1], WEXITSTATUS(status));
-				exit(1);
-			}
 		}
-		if (log_count == 0) {
-			printf("OK\n");
+		pid = waitpid(-1, &status, 0);
+		if (pid == -1) {
+			perror("failed to wait for child\n");
+			exit(1);
 		}
+		for (j=1;j<num_procs;j++) {
+			if (pids[j] == pid) break;
+		}
+		if (j == num_procs) {
+			printf("unknown child %d exited!?\n", pid);
+			exit(1);
+		}
+		if (WEXITSTATUS(status) != 0) {
+			printf("child %d exited with status %d\n",
+			       (int)pid, WEXITSTATUS(status));
+			error_count++;
+		}
+		pids[j] = 0;
 	}
 
-	if (log_count != 0) {
-		exit(1);
+	if (error_count == 0) {
+		printf("OK\n");
 	}
 
 	return 0;



More information about the samba-cvs mailing list