From 6640620ba0c42196ad66f339e15f46d5ac95974d Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 7 Dec 2004 22:09:17 +0000 Subject: [PATCH] Branch b_B1_4_BUG4834 b=4834 Adding tests for MDS and OST forced failure under load to recovery-small.sh --- lustre/tests/writemany.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 lustre/tests/writemany.c diff --git a/lustre/tests/writemany.c b/lustre/tests/writemany.c new file mode 100644 index 0000000..ca09c63 --- /dev/null +++ b/lustre/tests/writemany.c @@ -0,0 +1,184 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define difftime(a, b) \ + ((double)(a)->tv_sec - (b)->tv_sec + \ + ((double)((a)->tv_usec - (b)->tv_usec) / 1000000)) + +char cmdname[512]; + +int wait_for_threads(int live_threads) +{ + int rc = 0; + + while (live_threads > 0) { + int status; + pid_t ret; + + ret = waitpid(0, &status, 0); + if (ret == 0) { + continue; + } + + if (ret < 0) { + fprintf(stderr, "%s: error: wait - %s\n", + cmdname, strerror(errno)); + if (!rc) + rc = errno; + } else { + /* + * This is a hack. We _should_ be able to use + * WIFEXITED(status) to see if there was an + * error, but it appears to be broken and it + * always returns 1 (OK). See wait(2). + */ + int err = WEXITSTATUS(status); + if (err || WIFSIGNALED(status)) + fprintf(stderr, + "%s: error: PID %d had rc=%d\n", + cmdname, ret, err); + if (!rc) + rc = err; + + live_threads--; + } + } + printf("%s done, rc = %d\n", cmdname, rc); + return rc; +} + + +int run_one_child(char *file, int thread, int seconds) +{ + struct timeval start, cur; + double diff; + char filename[1024]; + char buf[1024]; + int fd, rc = 0, rand, maxrand, len; + long nfiles = 0, nbytes = 0; + + printf("%s: running thread #%d\n", cmdname, thread); + + srandom(thread); + /* Higher thread numbers will produce bigger random files. + Thread 1 will produce only 0-len files. */ + maxrand = 1; rand = thread; + while (--rand) + maxrand *= 10; + + gettimeofday(&start, NULL); + + while(!rc) { + gettimeofday(&cur, NULL); + if (cur.tv_sec > (start.tv_sec + seconds)) + break; + + sprintf(filename, "%s-%d-%ld", file, thread, nfiles); + + fd = open(filename, O_RDWR | O_CREAT, 0666); + if (fd < 0) { + fprintf(stderr, "%s: error: open(%s): %s\n", + cmdname, filename, strerror(errno)); + rc = errno; + break; + } + + sprintf(buf, "%s %010ld %.19s.%012d\n", cmdname, + nfiles++, ctime(&cur.tv_sec), (int)cur.tv_usec); + len = strlen(buf); + + rand = random() % maxrand; + while (rand-- > 0) { + if (write(fd, buf, len) != len) { + fprintf(stderr, "%s: error: write(%s): %s\n", + cmdname, filename, strerror(errno)); + rc = errno; + break; + } + nbytes += len; + } + + if (close(fd) < 0) { + fprintf(stderr, "%s: error: close(%s): %s\n", + cmdname, filename, strerror(errno)); + rc = errno; + break; + } + if (unlink(filename) < 0) { + fprintf(stderr, "%s: error: unlink(%s): %s\n", + cmdname, filename, strerror(errno)); + rc = errno; + break; + } + } + + diff = difftime(&cur, &start); + printf("%s: %7ld files, %4ld MB in %.2fs (%7.2f files/s, %5.2f MB/s): rc = %d\n", + cmdname, nfiles, nbytes >> 20, diff, + (double)nfiles / diff, (double)nbytes/1024/1024 / diff, rc); + + return rc; +} + + + +int main(int argc, char *argv[]) +{ + unsigned long duration; + int threads = 0; + char *end; + int i, rc = 0; + + if (argc != 4) { + fprintf(stderr, + "usage: %s \n", + argv[0]); + exit(1); + } + + sprintf(cmdname, "%s", argv[0]); + + duration = strtoul(argv[2], &end, 0); + if (*end) { + fprintf(stderr, "%s: error: bad number of seconds '%s'\n", + cmdname, argv[1]); + exit(2); + } + + threads = strtoul(argv[3], &end, 0); + if (*end) { + fprintf(stderr, "%s: error: bad thread count '%s'\n", + cmdname, argv[3]); + exit(2); + } + + for (i = 1; i <= threads; i++) { + rc = fork(); + if (rc < 0) { + fprintf(stderr, "%s: error: #%d - %s\n", + cmdname, i, strerror(rc = errno)); + return (rc); + } + if (rc == 0) { + /* children */ + sprintf(cmdname, "%s-%d", argv[0], i); + return (run_one_child(argv[1], i, duration)); + } + } + /* parent process */ + printf("%s will run for %ld minutes\n", cmdname, duration/60); + return (wait_for_threads(threads)); +} -- 1.8.3.1