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