X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fcreatemany.c;h=1e6ff1f5279320c56e8c57b6d66fb125bd722ebf;hb=16dcdf3b09ee15eb8bd5b43cbe413dff72bf3bca;hp=27ba3f7bf4db6624e9743f144f8f95cea729683c;hpb=cfeaa0cbd24e7ed5c863d7a8276aafe63dec351e;p=fs%2Flustre-release.git diff --git a/lustre/tests/createmany.c b/lustre/tests/createmany.c index 27ba3f7..1e6ff1f 100644 --- a/lustre/tests/createmany.c +++ b/lustre/tests/createmany.c @@ -1,38 +1,121 @@ +/* -*- 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 +void usage(char *prog) +{ + printf("usage: %s {-o|-m|-d|-l} filenamefmt count\n", prog); + printf(" %s {-o|-m|-d|-l} filenamefmt -seconds\n", prog); + printf(" %s {-o|-m|-d|-l} filenamefmt start count\n", prog); +} + int main(int argc, char ** argv) { - int i, rc, count; + int i, rc = 0, do_open = 0, do_link = 0, do_mkdir = 0; + char format[4096], *fmt, *tgt = NULL; char filename[4096]; + long start, last, end; + long begin = 0, count; - if (argc < 3) { - printf("Usage %s filenamebase count\n", argv[0]); + if (argc < 4 || argc > 5) { + usage(argv[0]); return 1; } - if (strlen(argv[1]) > 4080) { + if (strcmp(argv[1], "-d") == 0) { + do_mkdir = 1; + } else if (strcmp(argv[1], "-o") == 0) { + do_open = 1; + } else if (strncmp(argv[1], "-l", 2) == 0 && argv[1][2]) { + tgt = argv[1] + 2; + do_link = 1; + } else if (strcmp(argv[1], "-m") != 0) { + usage(argv[0]); + return 1; + } + + if (strlen(argv[2]) > 4080) { printf("name too long\n"); return 1; } - count = strtoul(argv[2], NULL, 0); + start = last = time(0); - - for (i=0 ; i < count ; i++) { - sprintf(filename, "%s-%d", argv[1], i); - rc = mknod(filename, S_IFREG| 0444, 0); - if (rc) { - printf("mknod(%s) error: %s\n", - filename, strerror(errno)); - break; + if (argc == 4) { + end = strtol(argv[3], NULL, 0); + } else { + begin = strtol(argv[3], NULL, 0); + end = strtol(argv[4], NULL, 0); + } + + if (end > 0) { + count = end; + end = -1UL >> 1; + } else { + end = start - end; + count = -1UL >> 1; + } + + if (strchr(argv[2], '%')) + fmt = argv[2]; + else { + sprintf(format, "%s%%d", argv[2]); + fmt = format; + } + for (i = 0; i < count && time(0) < end; i++, begin++) { + sprintf(filename, fmt, begin); + if (do_open) { + int fd = open(filename, O_CREAT | O_RDWR, 0644); + if (fd < 0) { + printf("open(%s) error: %s\n", filename, + strerror(errno)); + rc = errno; + break; + } + close(fd); + } else if (do_link) { + rc = link(tgt, filename); + if (rc) { + printf("link(%s, %s) error: %s\n", + tgt, filename, strerror(errno)); + rc = errno; + break; + } + } else if (do_mkdir) { + rc = mkdir(filename, 0755); + if (rc) { + printf("mkdir(%s) error: %s\n", + filename, strerror(errno)); + rc = errno; + break; + } + } else { + rc = mknod(filename, S_IFREG | 0444, 0); + if (rc) { + printf("mknod(%s) error: %s\n", + filename, strerror(errno)); + rc = errno; + break; + } + } + if ((i % 10000) == 0) { + printf(" - created %d (time %ld total %ld last %ld)\n", + i, time(0), time(0) - start, time(0) - last); + last = time(0); } } + printf("total: %d creates in %ld seconds: %f creates/second\n", i, + time(0) - start, ((float)i / (time(0) - start))); + return rc; -} +}