Whamcloud - gitweb
LU-15103 tests: clean up busy cifs mount
[fs/lustre-release.git] / lustre / tests / smalliomany.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2017, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  */
35
36 #include <stdio.h>
37 #include <sys/types.h>
38 #include <sys/stat.h>
39 #include <sys/time.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 #include <getopt.h>
47
48 static void usage(char *prog)
49 {
50         printf("usage: %s {-w|-a|-r} filenamefmt count seconds\n"
51                "-w : write mode\n"
52                "-a : append\n"
53                "-r : read mode\n", prog);
54         exit(EXIT_FAILURE);
55 }
56
57 int main(int argc, char **argv)
58 {
59         int do_read = 0, do_append = 0;
60         char *base, *endp;
61         long int start, last;
62         long end = ~0UL >> 1, count = ~0UL >> 1;
63         int c, i, fd, rc = 0, len, mode = 0;
64         long nbytes = 0;
65         char buf[4096];
66
67         while ((c = getopt(argc, argv, "war")) != -1) {
68                 switch (c) {
69                 case 'w':
70                         mode = O_RDWR;
71                         break;
72                 case 'a':
73                         do_append = 1;
74                         mode = O_RDWR | O_APPEND;
75                         break;
76                 case 'r':
77                         do_read = 1;
78                         mode = O_RDONLY;
79                         break;
80                 case '?':
81                         printf("Unknown option '%c'\n", optopt);
82                         usage(argv[0]);
83                 }
84         }
85
86         if (optind + 3 != argc) {
87                 fprintf(stderr,
88                         "missing filenamebase, total_files, or seconds\n");
89                 usage(argv[0]);
90         }
91
92         base = argv[optind];
93         if (strlen(base) > 4080) {
94                 fprintf(stderr, "filenamebase too long\n");
95                 exit(1);
96         }
97
98         count = strtoul(argv[optind + 1], NULL, 0);
99
100         end = strtoul(argv[optind + 2], &endp, 0);
101         if (end <= 0 && *endp != '\0') {
102                 fprintf(stderr, "%s: error: bad number of seconds '%s'\n",
103                         argv[0], argv[optind + 2]);
104                 exit(2);
105         }
106
107         srand(42);
108
109         start = last = time(0);
110         end += start;
111
112         for (i = 0; i < count && time(0) < end; i++) {
113                 char filename[4096];
114
115                 snprintf(filename, sizeof(filename), "%s%d", base, i);
116
117                 fd = open(filename, mode, 0666);
118                 if (fd < 0) {
119                         fprintf(stderr, "fail to open %s\n", filename);
120                         rc = errno;
121                         break;
122                 }
123
124                 len = random() % 4096;
125
126                 if (do_read == 0) {
127                         c = write(fd, buf, len);
128                         if (c != len) {
129                                 fprintf(stderr, "fail to write %s, len %d,"
130                                         " written %d\n", filename, len, c);
131                                 rc = errno;
132                                 break;
133                         }
134                 } else {
135                         c = read(fd, buf, len);
136                 }
137                 nbytes += c;
138
139                 if (close(fd) < 0) {
140                         fprintf(stderr, "can't close %s\n", filename);
141                         rc = errno;
142                         break;
143                 }
144
145                 if (i && (i % 10000) == 0) {
146                         printf(" - %ld bytes (time %ld total %ld last %ld)"
147                                "\n", nbytes, time(0), time(0) - start,
148                                time(0) - last);
149                         last = time(0);
150                 }
151         }
152         printf("total: %s %ld bytes in %ld seconds: %.2f bytes/second\n",
153                do_read ? "read" : do_append ? "append" : "write", nbytes,
154                time(0) - start, ((double)nbytes / (time(0) - start)));
155
156         return rc;
157 }