1 /*
2    dbench version 2
3    Copyright (C) Andrew Tridgell 1999
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "config.h"
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <stddef.h>
23 #include <signal.h>
24 #include <unistd.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <dirent.h>
28 #include <sys/stat.h>
29 #include <sys/time.h>
30 #include <sys/wait.h>
31 #include <sys/types.h>
32 #include <sys/socket.h>
33 #include <fcntl.h>
34 #include <time.h>
35 #include <sys/ipc.h>
36 #include <sys/shm.h>
37 #include <sys/mman.h>
38 
39 #ifdef HAVE_SYS_VFS_H
40 #include <sys/vfs.h>
41 #endif
42 
43 #ifdef HAVE_SYS_STATVFS_H
44 #include <sys/statvfs.h>
45 #endif
46 
47 #include <sys/param.h>
48 #ifdef HAVE_SYS_MOUNT_H
49 #include <sys/mount.h>
50 #endif
51 #include <utime.h>
52 #include <errno.h>
53 #include <strings.h>
54 #ifdef HAVE_STDINT_H
55 #include <stdint.h>
56 #endif
57 #include <netinet/in.h>
58 #include <netinet/tcp.h>
59 #include <netdb.h>
60 
61 #if HAVE_ATTR_XATTR_H
62 #include <attr/xattr.h>
63 #elif HAVE_SYS_XATTR_H
64 #include <sys/xattr.h>
65 #elif HAVE_SYS_ATTRIBUTES_H
66 #include <sys/attributes.h>
67 #endif
68 
69 #ifdef HAVE_SYS_EXTATTR_H
70 #include <sys/extattr.h>
71 #endif
72 
73 #ifdef HAVE_SYS_UIO_H
74 #include <sys/uio.h>
75 #endif
76 
77 #ifndef MSG_WAITALL
78 #define MSG_WAITALL 0x100
79 #endif
80 
81 #define PRINT_FREQ 1
82 
83 #ifndef MIN
84 #define MIN(x,y) ((x)<(y)?(x):(y))
85 #endif
86 
87 #define TCP_PORT 7003
88 #define TCP_OPTIONS "TCP_NODELAY SO_REUSEADDR"
89 
90 #define BOOL int
91 #define True 1
92 #define False 0
93 #define uint32 unsigned
94 
95 struct op {
96 	unsigned count;
97 	double total_time;
98 	double max_latency;
99 };
100 
101 struct child_struct {
102 	int id;
103 	int failed;
104 	int line;
105 	int done;
106 	int cleanup;
107 	int cleanup_finished;
108 	const char *directory;
109 	double bytes;
110 	double bytes_done_warmup;
111 	double max_latency;
112 	double worst_latency;
113 	struct timeval starttime;
114 	struct timeval lasttime;
115 	off_t bytes_since_fsync;
116 	char *cname;
117 	struct {
118 		double last_bytes;
119 		struct timeval last_time;
120 	} rate;
121 	struct opnames {
122 		struct op op_NTCreateX;
123 		struct op op_Close;
124 		struct op op_Rename;
125 		struct op op_Unlink;
126 		struct op op_Deltree;
127 		struct op op_Rmdir;
128 		struct op op_Mkdir;
129 		struct op op_Qpathinfo;
130 		struct op op_Qfileinfo;
131 		struct op op_Qfsinfo;
132 		struct op op_Sfileinfo;
133 		struct op op_Find;
134 		struct op op_WriteX;
135 		struct op op_ReadX;
136 		struct op op_LockX;
137 		struct op op_UnlockX;
138 		struct op op_Flush;
139 	} op;
140 	void *private;
141 };
142 
143 struct options {
144 	int nprocs;
145 	int sync_open;
146 	int sync_dirs;
147 	int do_fsync;
148 	int no_resolve;
149 	int fsync_frequency;
150 	char *tcp_options;
151 	int timelimit;
152 	int warmup;
153 	const char *directory;
154 	char *loadfile;
155 	double targetrate;
156 	int ea_enable;
157 	const char *server;
158 	int clients_per_process;
159 	int one_byte_write_fix;
160 	int stat_check;
161 	int fake_io;
162 	int skip_cleanup;
163 	int per_client_results;
164 };
165 
166 /* CreateDisposition field. */
167 #define FILE_SUPERSEDE 0
168 #define FILE_OPEN 1
169 #define FILE_CREATE 2
170 #define FILE_OPEN_IF 3
171 #define FILE_OVERWRITE 4
172 #define FILE_OVERWRITE_IF 5
173 
174 /* CreateOptions field. */
175 #define FILE_DIRECTORY_FILE       0x0001
176 #define FILE_WRITE_THROUGH        0x0002
177 #define FILE_SEQUENTIAL_ONLY      0x0004
178 #define FILE_NON_DIRECTORY_FILE   0x0040
179 #define FILE_NO_EA_KNOWLEDGE      0x0200
180 #define FILE_EIGHT_DOT_THREE_ONLY 0x0400
181 #define FILE_RANDOM_ACCESS        0x0800
182 #define FILE_DELETE_ON_CLOSE      0x1000
183 
184 #ifndef O_DIRECTORY
185 #define O_DIRECTORY    0200000
186 #endif
187 
188 #include "proto.h"
189 
190 extern struct options options;
191