Enable real-time trace replay instead of maximum-speed replay mode.
[bluesky.git] / TBBT / trace_play / rfs_c_def.h
1 #ifndef RFS_H
2 #define RFS_H
3 #include "sfs_c_def.h"
4 #include "profile.h"
5 #include "rfs_assert.h"
6
7 /* the maximum number of operations depended by one operation */
8 /* the dependency include read/write, write/write, all operations with a
9  * one file handle/delete or rename's target if exists, the dependency
10  * does not include the create/all operations with relevant file handle
11  * This dependency is maintained by a flag in file handle mapping table
12  */
13 #define MAX_DEP_OPS 10 
14 //#define DEP_TAB_SIZE  200000 /* the dependency table size */
15 /* Right now we don't wrap around with dep_tab, for each request, there
16  * is one entry in dependency table and one entry in lines buffer.
17  */
18 #define REDUCE_MEMORY_TRACE_SIZE
19
20 #define EVENT_ORDER_SIZE 1000000
21 #ifdef REDUCE_MEMORY_TRACE_SIZE
22 //#define DEP_TAB_SIZE   1100000 /* the dependency table size */
23 #define DEP_TAB_SIZE     100000 /* the dependency table size */
24 //#define DEP_TAB_SIZE   10000 /* the dependency table size */
25 #define MAX_MEMORY_TRACE_LINES  DEP_TAB_SIZE 
26 //#define MAX_TRACE_LINE_LENGTH 768
27 #define MAX_TRACE_LINE_LENGTH 300
28 #else
29 #define MAX_TRACE_LINE_LENGTH 768
30 #define DEP_TAB_SIZE    500000 /* the dependency table size */
31 #define MAX_MEMORY_TRACE_LINES  DEP_TAB_SIZE*2 
32 #endif
33
34 #define FH_MAP_SIZE 400000
35 //#define FH_MAP_SIZE 40000
36 #define FH_HTABLE_SIZE FH_MAP_SIZE                                                               
37
38 /* trace play policy related defines */
39 #define SPEED_UP                // only one of SPEED_UP and     SLOW_DOWN is defined
40 //#define SLOW_DOWN
41 extern int PLAY_SCALE;
42 #define TIME_PLAY /* play according original timestamp or scaled timestamp together with dependency */
43 #define NO_DEPENDENCY_TABLE
44 //#define MAX_COMMAND_REPLY_DISTANCE 1000
45 #define MAX_COMMAND_REPLY_DISTANCE_FOR_PAIR 1000
46 #define MAX_COMMAND_REPLY_DISTANCE 2
47
48 #define WORKLOAD_PLAY /* play according dependency and as fast as it can, ignore timestamp */
49
50 #ifdef TIME_PLAY
51 #define MAX_PLAY_WINDOW 8
52 #define MAX_OUTSTANDING_REQ 4   /* too big outstanding window reduces throughput */
53 #else
54 #define MAX_PLAY_WINDOW 1000
55 //#define MAX_PLAY_WINDOW 8
56 #define MAX_OUTSTANDING_REQ 8
57 //#define MAX_OUTSTANDING_REQ 16
58 #endif
59 #define UDP     /* currently we only support using UDP, support for TCP will be added later */
60
61 /* the flag to indicate the current status of a trace request */
62 #define DEP_FLAG_FREE 0                 /* free entry */
63 #define DEP_FLAG_INIT 1                 /* initialized */
64 #define DEP_FLAG_CANDIDATE 2
65 #define DEP_FLAG_WAIT_FHANDLE 3 /* waiting for leading fhandle */
66 #define DEP_FLAG_FHANDLE_READY 4
67 #define DEP_FLAG_WAIT_DIRECTORY 5
68 #define DEP_FLAG_DIRECTORY_READY 6
69 #define DEP_FLAG_WAIT_DELETE 7  /* waiting for deleting the object */
70 #define DEP_FLAG_SENT 8                 /* Request has been sent out, waiting for replies */
71 #define DEP_FLAG_DONE 9                 /* Reply has been received and processed */
72 #define BUSY    1
73 #define IDLE    0
74
75 #define MAX_ARG_RES_SIZE 512
76 #define MAX_BUF1_SIZE 65536     /* for readdirplus, 208 each entry, max 128 entries */
77 #define MAX_BUF2_SIZE NFS_MAXPATHLEN
78
79 extern int TRACE_COMMAND_REPLY_FLAG_POS;
80 extern int TRACE_VERSION_POS;
81 extern int TRACE_MSGID_POS;
82 extern int TRACE_FH_SIZE;
83
84 /* Two setbuf_t procedure exists for each NFS operation, one for setting up NFS 
85  * operation argument buffer, another for setting up NFS operation result receiving buffer.
86  *
87  * When setting up argument, the function takes two argument, the first 
88  * argument is index to dep_tab, the second argument is the buffer pointer to 
89  * be setup. Sometimes, there is no extra argument other than index, for example: read
90  * Sometimes, there is one extra argument, e.g the buffer for lookup name.
91  * Sometimes, there are two extra arguments, e..g rename, symlink.
92  *
93  * void (*setbuf_t)(int index, char * arg, char * arg);
94  *
95  * When setting up receiving result buffer, the function takes one arguement,
96  * the buffer pointer.
97  * void (*setbuf_t)(char * res, char * arg);
98  */
99 typedef void (*setbuf_t)();
100
101 typedef struct {
102         int nfsv3_proc;
103         setbuf_t setarg;
104         setbuf_t setres;
105         xdrproc_t xdr_arg;
106         xdrproc_t xdr_res;
107 } rfs_op_type;
108
109 #define MAX_TRACE_FH_SIZE 64
110 #define TRACE_FH_FILE_SIZE 48
111 #define TRACE_FH_DIR_SIZE 40
112 #define MAX_PLAY_PATH_SIZE 256
113
114 /* flags in fh_map_t */
115 #define FH_MAP_FLAG_FREE 0
116 #define FH_MAP_FLAG_DISCARD 1
117 #define FH_MAP_FLAG_PARTIAL 2
118 #define FH_MAP_FLAG_COMPLETE 3
119 typedef struct {
120         int flag;
121         int lock;
122         char trace_fh [MAX_TRACE_FH_SIZE+1];
123         char path[MAX_PLAY_PATH_SIZE];
124         nfs_fh3 play_fh;
125 } fh_map_t;
126
127 typedef struct {
128         int disk_index;
129         int trace_status;
130         char reply_trace_fh[MAX_TRACE_FH_SIZE+1];
131         char line[MAX_TRACE_LINE_LENGTH];
132 } memory_trace_ent_t;
133         
134
135 typedef struct {
136         int flag;       
137         int disk_index;
138         int memory_index;
139         char * line;
140         char * reply_line;
141         fh_map_t * fh;
142         fh_map_t * fh_2;
143         char * trace_fh;
144         char * trace_fh_2;
145 #ifdef REDUCE_MEMORY_TRACE_SIZE
146         char * reply_trace_fh;
147 #endif
148         int proc;       /* the prototype independent NFS operation number defined in sfs_c_def.h
149                                  * e.g. NULLCALL NFS3PROC_READ etc */
150         struct timeval timestamp;       /* The timestamp of a request in the trace */
151 #ifdef NO_DEPENDENCY_TABLE
152         int dep_ops[MAX_DEP_OPS]; /* Other requests need to be processed prior this request */
153                                                                  /* dep_tab[i] == -1 means the dependency has been resolved */
154         int init_dep_num;                       /* The number of request being depended initially */
155         int cur_dep_num;                        /* The number of remaining ones which have not been finished */ 
156                                                                 /* at initialization time, init_dep_num == cur_dep_num */
157 #endif
158         int biod_req_index;     /* Index in to the biod_req array which contains all outstanding requests */
159         struct ladtime start;
160         struct ladtime stop;
161         struct ladtime interval;
162         int skip_sec;
163         int status;
164         int trace_status;
165 } dep_tab_t;
166
167 typedef struct {
168         char name[32];
169         int head;
170         int tail;
171         int size;
172 } cyclic_index_t;
173
174 #define CYCLIC_INIT(str,index,SIZE) \
175         {index.head=0; index.tail=0; index.size=SIZE; \
176          RFS_ASSERT(strlen(str)<sizeof(index.name)); \
177          strcpy(index.name, str); }
178
179 #define CYCLIC_PRINT(index) \
180         {printf("%s head %d tail %d, size %d\n", index.name, index.head, index.tail, index.size);}
181
182 #define CYCLIC_FULL(index) \
183         (((index.head+1)%index.size)==index.tail)
184
185 #define CYCLIC_EMPTY(index)     \
186         (index.tail==index.head)
187
188 #define CYCLIC_NUM(index) \
189         ((index.head + index.size - index.tail) % index.size)
190
191 #define CYCLIC_MOVE_HEAD(index) \
192         { \
193                 if (CYCLIC_FULL(index)) { \
194                         CYCLIC_PRINT(index) \
195                 } \
196                 RFS_ASSERT (!CYCLIC_FULL(index)); \
197                 index.head=(index.head+1)%(index.size); \
198         }
199
200 #define CYCLIC_MOVE_TAIL(index) \
201         { \
202                 RFS_ASSERT (!CYCLIC_EMPTY(index)) \
203                 index.tail=(index.tail+1)%(index.size); \
204         }
205
206 /*
207 #define CYCLIC_MOVE_TAIL_TO(index,dest) \
208         { \
209                 int oldnum = CYCLIC_NUM(index); \
210                 if (! ((dest>=0) && (dest<index.size) && (dest!=index.head))) { \
211                         CYCLIC_PRINT(index); \
212                         printf("dest %d\n", dest); \
213                 } \
214                 RFS_ASSERT ((dest>=0) && (dest<index.size) && (dest!=index.head)) \
215                 index.tail = dest; \
216                 if (CYCLIC_NUM(index) > oldnum) { \
217                         CYCLIC_PRINT(index); \
218                         printf("dest %d old_num %d \n", dest, oldnum); \
219                 } \
220                 RFS_ASSERT (CYCLIC_NUM(index) <= oldnum); \
221         }
222 */
223
224 #define CYCLIC_MINUS(A,B,size) ((A+size-B)%size)
225 #define CYCLIC_ADD(A,B,size) ((A+B)%size)
226 #define CYCLIC_LESS(index,A,B) \
227 (CYCLIC_MINUS(A,index.tail,index.size)<CYCLIC_MINUS(B,index.tail,index.size))
228
229 extern struct ladtime current;
230 extern struct ladtime trace_starttime;
231 extern struct ladtime time_offset;
232
233 extern rfs_op_type rfs_Ops[];
234 extern sfs_op_type nfsv3_Ops[];
235 extern sfs_op_type * Ops;
236 extern int num_out_reqs;
237
238 extern cyclic_index_t dep_tab_index;
239 extern cyclic_index_t dep_window_index;
240 extern cyclic_index_t memory_trace_index;
241 int dep_window_max; /* the first entry outside of the dependency window */
242 /* If ordered by TIMESTAMP,
243  * memory_trace_index.tail <= dep_tab_index.tail < dep_window_max <=
244  * dep_tab_index.head <= memory_trace_index.head
245  */
246
247 extern fh_map_t fh_map [FH_MAP_SIZE];
248 extern int fh_i;
249 extern int fh_map_debug ;
250 extern struct generic_entry * fh_htable [FH_HTABLE_SIZE];
251
252 extern dep_tab_t dep_tab[DEP_TAB_SIZE];
253 extern int req_num_with_new_fh;
254 extern int req_num_with_discard_fh;
255 extern int req_num_with_init_fh;
256 extern memory_trace_ent_t memory_trace[MAX_MEMORY_TRACE_LINES];
257 extern int event_order[];
258 extern int event_order_index;
259 extern struct biod_req * biod_reqp;
260 extern int max_biod_reqs;
261 extern int rfs_debug;
262 extern int per_packet_debug;
263 extern int profile_debug;
264 extern int adjust_play_window_debug;
265 extern int dependency_debug;
266 extern int quiet_flag;
267 extern int read_data_owe;
268 extern int write_data_owe;
269 extern int read_data_total;
270 extern int write_data_total;
271 extern int read_data_adjust_times;
272 extern int write_data_adjust_times;
273 extern int read_data_owe_GB;
274 extern int write_data_owe_GB;
275 extern int read_data_total_GB;
276 extern int write_data_total_GB;
277
278 extern int failed_create_command_num;
279 extern int failed_other_command_num;
280 extern int skipped_readlink_command_num;
281 extern int skipped_custom_command_num;
282 extern int fh_path_map_err_num;
283 extern int skipped_fsstat_command_num;
284 extern int missing_reply_num;
285 extern int lookup_noent_reply_num;
286 extern int rename_rmdir_noent_reply_num;
287 extern int rmdir_not_empty_reply_num;
288 extern int loose_access_control_reply_num;
289 extern int lookup_err_due_to_rename_num;
290 extern int lookup_err_due_to_parallel_remove_num;
291 extern int lookup_eaccess_enoent_mismatch_num;
292 extern int read_io_err_num;
293 extern int stale_fhandle_err_num;
294 extern int proper_reply_num;
295 extern int run_stage_proper_reply_num;
296 extern int lookup_retry_num;
297 extern int can_not_catch_speed_num_total;
298 extern int can_not_catch_speed_num;
299 extern int poll_timeout_0_num;
300 extern int poll_timeout_pos_num;
301 extern int abnormal_EEXIST_num;
302 extern int abnormal_ENOENT_num;
303
304 #define FIRST_STAGE 0
305 #define READ_DEP_TAB_STAGE 1
306 #define TRACE_PLAY_STAGE 2
307 extern int stage;
308
309 #define IGNORE_SETATTR_CTIME
310 //#define TAKE_CARE_SETATTR_GID
311 //#define TAKE_CARE_SETATTR_UID
312 //#define TAKE_CARE_CREATE_MODE_BY_DAN
313 //#define TAKE_CARE_OTHER_FAILED_COMMAND
314 //#define TAKE_CARE_CUSTOM_COMMAND
315 //#define TAKE_CARE_FSSTAT_COMMAND
316 //#define TAKE_CARE_UNLOOKED_UP_NON_NEW_FILES
317 //#define TAKE_CARE_NOEMPTY_RMDIR
318 //#define TAKE_CARE_LOOKUP_EACCESS_ENOENT_MISMATCH
319 //#define TAKE_CARE_ACCESS_ERROR
320 //#define TAKE_CARE_SYMBOLIC_LINK
321 #define TOLERANT_READ_IO_ERR
322 #define TOLERANT_STALE_FHANDLE_ERR
323 #define IO_THREAD
324 //#define RECV_THREAD   can not tune up the version with receive thread quickly
325
326 extern FILE * profile_fp;
327 extern profile_t total_profile;
328 extern profile_t valid_get_nextop_profile;
329 extern profile_t invalid_get_nextop_profile;
330 extern profile_t valid_poll_and_get_reply_profile;
331 extern profile_t invalid_poll_and_get_reply_profile;
332 extern profile_t execute_next_request_profile;
333 extern profile_t receive_next_reply_profile;
334 extern profile_t decode_reply_profile;
335 extern profile_t check_reply_profile;
336 extern profile_t add_create_object_profile;
337 extern profile_t prepare_argument_profile;
338 extern profile_t biod_clnt_call_profile;
339 extern profile_t check_timeout_profile;
340 extern profile_t adjust_play_window_profile;
341 extern profile_t fgets_profile;
342 extern profile_t read_line_profile;
343 extern profile_t read_trace_profile;
344
345 extern int skip_sec;
346 extern int trace_timestamp1, trace_timestamp2;
347 //#define SEQUEN_READ
348 //#define SEQUEN_READ_NUM 1000
349
350 #define TRACE_BUF_FULL 0
351 #define TRACE_FILE_END 1
352 #define ASYNC_RPC_SEM_KEY 60000
353 extern int disk_io_status;
354 extern int WARMUP_TIME;
355 extern int disk_index; 
356 //#define NO_SEM
357 #endif