5 #include "rfs_assert.h"
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
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.
18 #define REDUCE_MEMORY_TRACE_SIZE
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
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
34 #define FH_MAP_SIZE 400000
35 //#define FH_MAP_SIZE 40000
36 #define FH_HTABLE_SIZE FH_MAP_SIZE
38 /* trace play policy related defines */
39 #define SPEED_UP // only one of SPEED_UP and SLOW_DOWN is defined
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
48 #define WORKLOAD_PLAY /* play according dependency and as fast as it can, ignore timestamp */
51 #define MAX_PLAY_WINDOW 8
52 #define MAX_OUTSTANDING_REQ 4 /* too big outstanding window reduces throughput */
54 #define MAX_PLAY_WINDOW 1000
55 //#define MAX_PLAY_WINDOW 8
56 #define MAX_OUTSTANDING_REQ 8
57 //#define MAX_OUTSTANDING_REQ 16
59 #define UDP /* currently we only support using UDP, support for TCP will be added later */
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 */
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
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;
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.
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.
93 * void (*setbuf_t)(int index, char * arg, char * arg);
95 * When setting up receiving result buffer, the function takes one arguement,
97 * void (*setbuf_t)(char * res, char * arg);
99 typedef void (*setbuf_t)();
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
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
122 char trace_fh [MAX_TRACE_FH_SIZE+1];
123 char path[MAX_PLAY_PATH_SIZE];
130 char reply_trace_fh[MAX_TRACE_FH_SIZE+1];
131 char line[MAX_TRACE_LINE_LENGTH];
132 } memory_trace_ent_t;
145 #ifdef REDUCE_MEMORY_TRACE_SIZE
146 char * reply_trace_fh;
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 */
158 int biod_req_index; /* Index in to the biod_req array which contains all outstanding requests */
159 struct ladtime start;
161 struct ladtime interval;
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); }
179 #define CYCLIC_PRINT(index) \
180 {printf("%s head %d tail %d, size %d\n", index.name, index.head, index.tail, index.size);}
182 #define CYCLIC_FULL(index) \
183 (((index.head+1)%index.size)==index.tail)
185 #define CYCLIC_EMPTY(index) \
186 (index.tail==index.head)
188 #define CYCLIC_NUM(index) \
189 ((index.head + index.size - index.tail) % index.size)
191 #define CYCLIC_MOVE_HEAD(index) \
193 if (CYCLIC_FULL(index)) { \
194 CYCLIC_PRINT(index) \
196 RFS_ASSERT (!CYCLIC_FULL(index)); \
197 index.head=(index.head+1)%(index.size); \
200 #define CYCLIC_MOVE_TAIL(index) \
202 RFS_ASSERT (!CYCLIC_EMPTY(index)) \
203 index.tail=(index.tail+1)%(index.size); \
207 #define CYCLIC_MOVE_TAIL_TO(index,dest) \
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); \
214 RFS_ASSERT ((dest>=0) && (dest<index.size) && (dest!=index.head)) \
216 if (CYCLIC_NUM(index) > oldnum) { \
217 CYCLIC_PRINT(index); \
218 printf("dest %d old_num %d \n", dest, oldnum); \
220 RFS_ASSERT (CYCLIC_NUM(index) <= oldnum); \
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))
229 extern struct ladtime current;
230 extern struct ladtime trace_starttime;
231 extern struct ladtime time_offset;
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;
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
247 extern fh_map_t fh_map [FH_MAP_SIZE];
249 extern int fh_map_debug ;
250 extern struct generic_entry * fh_htable [FH_HTABLE_SIZE];
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;
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;
304 #define FIRST_STAGE 0
305 #define READ_DEP_TAB_STAGE 1
306 #define TRACE_PLAY_STAGE 2
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
324 //#define RECV_THREAD can not tune up the version with receive thread quickly
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;
346 extern int trace_timestamp1, trace_timestamp2;
347 //#define SEQUEN_READ
348 //#define SEQUEN_READ_NUM 1000
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;