diff options
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/tdb/common/io.c | 4 | ||||
-rw-r--r-- | source4/lib/tdb/common/transaction.c | 4 | ||||
-rw-r--r-- | source4/lib/tdb/tools/tdbtorture.c | 64 |
3 files changed, 49 insertions, 23 deletions
diff --git a/source4/lib/tdb/common/io.c b/source4/lib/tdb/common/io.c index e9d4e87ac8..355f76962f 100644 --- a/source4/lib/tdb/common/io.c +++ b/source4/lib/tdb/common/io.c @@ -97,6 +97,10 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, int probe) 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; diff --git a/source4/lib/tdb/common/transaction.c b/source4/lib/tdb/common/transaction.c index a01f8307e9..73c0587a40 100644 --- a/source4/lib/tdb/common/transaction.c +++ b/source4/lib/tdb/common/transaction.c @@ -196,6 +196,10 @@ static int transaction_write(struct tdb_context *tdb, tdb_off_t off, 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 */ diff --git a/source4/lib/tdb/tools/tdbtorture.c b/source4/lib/tdb/tools/tdbtorture.c index 3fc395ba98..eded561106 100644 --- a/source4/lib/tdb/tools/tdbtorture.c +++ b/source4/lib/tdb/tools/tdbtorture.c @@ -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 @@ static void tdb_log(struct tdb_context *tdb, int level, const char *format, ...) { va_list ap; - log_count++; + error_count++; va_start(ap, format); vfprintf(stdout, format, ap); @@ -78,7 +78,7 @@ static void tdb_log(struct tdb_context *tdb, int level, const char *format, ...) static void fatal(const char *why) { perror(why); - exit(1); + error_count++; } static char *randbuf(int len) @@ -283,37 +283,55 @@ static void usage(void) 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 (WEXITSTATUS(status) != 0) { - printf("child %d exited with status %d\n", - (int)pids[i+1], WEXITSTATUS(status)); - 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 (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; |