Whamcloud - gitweb
b=16098
[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  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #include <stdio.h>
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <time.h>
41 #include <errno.h>
42 #include <string.h>
43 #include <fcntl.h>
44 #include <unistd.h>
45 #include <stdlib.h>
46
47 void usage(char *prog)
48 {
49         printf("usage: %s {-o|-m|-d|-l<tgt>} filenamefmt count\n", prog);
50         printf("       %s {-o|-m|-d|-l<tgt>} filenamefmt -seconds\n", prog);
51         printf("       %s {-o|-m|-d|-l<tgt>} filenamefmt start count\n", prog);
52 }
53
54 int main(int argc, char ** argv)
55 {
56         int i, rc = 0, do_open = 0, do_link = 0, do_mkdir = 0;
57         char format[4096], *fmt, *tgt = NULL;
58         char filename[4096];
59         long start, last, end;
60         long begin = 0, count;
61
62         if (argc < 4 || argc > 5) {
63                 usage(argv[0]);
64                 return 1;
65         }
66
67         if (strcmp(argv[1], "-d") == 0) {
68                 do_mkdir = 1;
69         } else if (strcmp(argv[1], "-o") == 0) {
70                 do_open = 1;
71         } else if (strncmp(argv[1], "-l", 2) == 0 && argv[1][2]) {
72                 tgt = argv[1] + 2;
73                 do_link = 1;
74         } else if (strcmp(argv[1], "-m") != 0) {
75                 usage(argv[0]);
76                 return 1;
77         }
78
79         if (strlen(argv[2]) > 4080) {
80                 printf("name too long\n");
81                 return 1;
82         }
83
84         start = last = time(0);
85
86         if (argc == 4) {
87                 end = strtol(argv[3], NULL, 0);
88         } else {
89                 begin = strtol(argv[3], NULL, 0);
90                 end = strtol(argv[4], NULL, 0);
91         }
92
93         if (end > 0) {
94                 count = end;
95                 end = -1UL >> 1;
96         } else {
97                 end = start - end;
98                 count = -1UL >> 1;
99         }
100
101         if (strchr(argv[2], '%'))
102                 fmt = argv[2];
103         else {
104                 sprintf(format, "%s%%d", argv[2]);
105                 fmt = format;
106         }
107         for (i = 0; i < count && time(0) < end; i++, begin++) {
108                 sprintf(filename, fmt, begin);
109                 if (do_open) {
110                         int fd = open(filename, O_CREAT|O_RDWR, 0644);
111                         if (fd < 0) {
112                                 printf("open(%s) error: %s\n", filename,
113                                        strerror(errno));
114                                 rc = errno;
115                                 break;
116                         }
117                         close(fd);
118                 } else if (do_link) {
119                         rc = link(tgt, filename);
120                         if (rc) {
121                                 printf("link(%s, %s) error: %s\n",
122                                        tgt, filename, strerror(errno));
123                                 rc = errno;
124                                 break;
125                         }
126                 } else if (do_mkdir) {
127                         rc = mkdir(filename, 0755);
128                         if (rc) {
129                                 printf("mkdir(%s) error: %s\n",
130                                        filename, strerror(errno));
131                                 rc = errno;
132                                 break;
133                         }
134                 } else {
135                         rc = mknod(filename, S_IFREG| 0444, 0);
136                         if (rc) {
137                                 printf("mknod(%s) error: %s\n",
138                                        filename, strerror(errno));
139                                 rc = errno;
140                                 break;
141                         }
142                 }
143                 if ((i % 10000) == 0) {
144                         printf(" - created %d (time %ld total %ld last %ld)\n",
145                                i, time(0), time(0) - start, time(0) - last);
146                         last = time(0);
147                 }
148         }
149         printf("total: %d creates in %ld seconds: %f creates/second\n", i,
150                time(0) - start, ((float)i / (time(0) - start)));
151
152         return rc;
153 }