Whamcloud - gitweb
b=11564
[fs/lustre-release.git] / lustre / tests / createmany.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  */
4
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <time.h>
9 #include <errno.h>
10 #include <string.h>
11 #include <fcntl.h>
12 #include <unistd.h>
13 #include <stdlib.h>
14
15 void usage(char *prog)
16 {
17         printf("usage: %s {-o|-m|-d|-l<tgt>} filenamefmt count\n", prog);
18         printf("       %s {-o|-m|-d|-l<tgt>} filenamefmt -seconds\n", prog);
19         printf("       %s {-o|-m|-d|-l<tgt>} filenamefmt start count\n", prog);
20 }
21
22 int main(int argc, char ** argv)
23 {
24         int i, rc = 0, do_open = 0, do_link = 0, do_mkdir = 0;
25         char format[4096], *fmt, *tgt = NULL;
26         char filename[4096];
27         long start, last, end;
28         long begin = 0, count;
29
30         if (argc < 4 || argc > 5) {
31                 usage(argv[0]);
32                 return 1;
33         }
34
35         if (strcmp(argv[1], "-d") == 0) {
36                 do_mkdir = 1;
37         } else if (strcmp(argv[1], "-o") == 0) {
38                 do_open = 1;
39         } else if (strncmp(argv[1], "-l", 2) == 0 && argv[1][2]) {
40                 tgt = argv[1] + 2;
41                 do_link = 1;
42         } else if (strcmp(argv[1], "-m") != 0) {
43                 usage(argv[0]);
44                 return 1;
45         }
46
47         if (strlen(argv[2]) > 4080) {
48                 printf("name too long\n");
49                 return 1;
50         }
51
52         start = last = time(0);
53
54         if (argc == 4) {
55                 end = strtol(argv[3], NULL, 0);
56         } else {
57                 begin = strtol(argv[3], NULL, 0);
58                 end = strtol(argv[4], NULL, 0);
59         }
60
61         if (end > 0) {
62                 count = end;
63                 end = -1UL >> 1;
64         } else {
65                 end = start - end;
66                 count = -1UL >> 1;
67         }
68
69         if (strchr(argv[2], '%'))
70                 fmt = argv[2];
71         else {
72                 sprintf(format, "%s%%d", argv[2]);
73                 fmt = format;
74         }
75         for (i = 0; i < count && time(0) < end; i++, begin++) {
76                 sprintf(filename, fmt, begin);
77                 if (do_open) {
78                         int fd = open(filename, O_CREAT|O_RDWR, 0644);
79                         if (fd < 0) {
80                                 printf("open(%s) error: %s\n", filename,
81                                        strerror(errno));
82                                 rc = errno;
83                                 break;
84                         }
85                         close(fd);
86                 } else if (do_link) {
87                         rc = link(tgt, filename);
88                         if (rc) {
89                                 printf("link(%s, %s) error: %s\n",
90                                        tgt, filename, strerror(errno));
91                                 rc = errno;
92                                 break;
93                         }
94                 } else if (do_mkdir) {
95                         rc = mkdir(filename, 0755);
96                         if (rc) {
97                                 printf("mkdir(%s) error: %s\n",
98                                        filename, strerror(errno));
99                                 rc = errno;
100                                 break;
101                         }
102                 } else {
103                         rc = mknod(filename, S_IFREG| 0444, 0);
104                         if (rc) {
105                                 printf("mknod(%s) error: %s\n",
106                                        filename, strerror(errno));
107                                 rc = errno;
108                                 break;
109                         }
110                 }
111                 if ((i % 10000) == 0) {
112                         printf(" - created %d (time %ld total %ld last %ld)\n",
113                                i, time(0), time(0) - start, time(0) - last);
114                         last = time(0);
115                 }
116         }
117         printf("total: %d creates in %ld seconds: %f creates/second\n", i,
118                time(0) - start, ((float)i / (time(0) - start)));
119
120         return rc;
121 }