libjf API reference guide

Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

jf_bench.c

Go to the documentation of this file.
00001 /* 00002 * Copyright 2005 Tiian 00003 * {In real life Tiian is Christian Ferrari} 00004 * This file is part of "libjf" package. 00005 * 00006 * "libjf" is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU Lesser General Public License as published by 00008 * the Free Software Foundation; either version 2.1 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * "libjf" is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public License 00017 * along with ; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 */ 00020 #include <jf/jf_config.h> 00021 00022 00023 00024 #ifdef HAVE_ERRNO_H 00025 # include <errno.h> 00026 #endif /* HAVE_ERRNO_H */ 00027 #ifdef HAVE_STRING_H 00028 # include <string.h> 00029 #endif /* HAVE_STRING_H */ 00030 #ifdef HAVE_LIBGEN_H 00031 # include <libgen.h> 00032 #endif /* HAVE_LIBGEN_H */ 00033 00034 #include <jf_file.h> 00035 #include <jf/jf_timer.h> 00036 #include <jf/jf_patches.h> 00037 00038 00039 00040 /* set module trace flag */ 00041 #ifdef JF_TRACE_MODULE 00042 # undef JF_TRACE_MODULE 00043 #endif /* JF_TRACE_MODULE */ 00044 #define JF_TRACE_MODULE JF_TRACE_MOD_PRG_UTILS 00045 00046 00047 00048 /* this is the official libjf benchmark utility program */ 00049 00050 00051 00052 #define VERBOSE_MODE_SIL 0 00053 #define VERBOSE_MODE_MIN 1 00054 #define VERBOSE_MODE_MID 2 00055 #define VERBOSE_MODE_MAX 3 00056 00057 const char *bench_file_name = "jf_bench_file_"; 00058 00059 struct bench_table_rec_s { 00060 char *name; 00061 FILE *stream; 00062 jf_file_t jfile; 00063 }; 00064 00065 00066 typedef struct { 00067 int last; /* n + 1: position 0 is used for 00068 * journal (if any, positions 1 .. n 00069 * are used for data files */ 00070 uint32_t policy; 00071 struct bench_table_rec_s *records; 00072 jf_journal_t journal; 00073 } bench_table_t; 00074 00075 00076 00077 int bench_table_create(bench_table_t *bt, const char *path_prefix, 00078 int number_of_files); 00079 00080 int bench_table_unlink(const bench_table_t *bt); 00081 00082 int bench_table_destroy(bench_table_t *bt); 00083 00084 static inline int bench_table_get_last(const bench_table_t *bt) 00085 { 00086 return bt->last; 00087 } 00088 00089 static inline const char *bench_table_get_name( 00090 const bench_table_t *bt, int i) 00091 { 00092 #ifdef _EXTRA_CHECK 00093 if (i > bt->last) 00094 return NULL; 00095 else 00096 #endif /* _EXTRA_CHECK */ 00097 return bt->records[i].name; 00098 } 00099 00100 static inline int bench_table_set_stream(bench_table_t *bt, int i, 00101 FILE *stream) 00102 { 00103 #ifdef _EXTRA_CHECK 00104 if (i > bt->last) 00105 return JF_RC_OUT_OF_RANGE; 00106 #endif /* _EXTRA_CHECK */ 00107 bt->records[i].stream = stream; 00108 return JF_RC_OK; 00109 } 00110 00111 static inline FILE *bench_table_get_stream(bench_table_t *bt, int i) 00112 { 00113 #ifdef _EXTRA_CHECK 00114 if (i > bt->last) 00115 return NULL; 00116 #endif /* _EXTRA_CHECK */ 00117 return bt->records[i].stream; 00118 } 00119 00120 static inline int bench_table_set_jfile(bench_table_t *bt, int i, 00121 jf_file_t *jf) 00122 { 00123 #ifdef _EXTRA_CHECK 00124 if (i > bt->last) 00125 return JF_RC_OUT_OF_RANGE; 00126 #endif /* _EXTRA_CHECK */ 00127 bt->records[i].jfile = *jf; 00128 return JF_RC_OK; 00129 } 00130 00131 static inline jf_file_t *bench_table_get_jfile(bench_table_t *bt, int i) 00132 { 00133 #ifdef _EXTRA_CHECK 00134 if (i > bt->last) 00135 return NULL; 00136 #endif /* _EXTRA_CHECK */ 00137 return &(bt->records[i].jfile); 00138 } 00139 00140 static inline void bench_table_reset(bench_table_t *bt) 00141 { 00142 bt->last = 0; 00143 bt->policy = 0; 00144 bt->records = NULL; 00145 } 00146 00147 static inline void bench_table_set_journal(bench_table_t *bt, jf_journal_t *j) 00148 { 00149 bt->journal = *j; 00150 } 00151 00152 static inline jf_journal_t *bench_table_get_journal(bench_table_t *bt) 00153 { 00154 return &(bt->journal); 00155 } 00156 00157 static inline uint32_t bench_table_get_policy(const bench_table_t *bt) 00158 { 00159 return bt->policy; 00160 } 00161 00162 static inline void bench_table_set_policy(bench_table_t *bt, uint32_t policy) 00163 { 00164 bt->policy = policy; 00165 } 00166 00167 00168 00169 #define BENCH_00_SIO_BLOCKS_SAFE 100 00170 #define BENCH_00_SIO_BLOCKS_FAST (100 * BENCH_00_SIO_BLOCKS_SAFE) 00171 00172 00173 /* Helper functions */ 00174 int bench_X0_sio_pre(bench_table_t *bt, 00175 const char *path_prefix, int number_of_files, 00176 uint32_t policy, const char *open_mode); 00177 int bench_X0_sio_post(bench_table_t *bt); 00178 int bench_X0_ljf_pre(bench_table_t *bt, 00179 const char *path_prefix, int number_of_files, 00180 uint32_t policy, const char *open_mode); 00181 int bench_X0_ljf_post(bench_table_t *bt); 00182 00183 int bench_X1_sio_pre(bench_table_t *bt, 00184 const char *path_prefix, int number_of_files, 00185 size_t block_size, int record_num, 00186 uint32_t policy, const char *open_mode); 00187 int bench_X1_ljf_pre(bench_table_t *bt, 00188 const char *path_prefix, int number_of_files, 00189 size_t block_size, int record_num, 00190 uint32_t policy, const char *open_mode); 00191 00192 /* 00193 * All benchmark functions have the same prototype: 00194 * path_prefix: place for files 00195 * number_of_file: how many files the bench should use 00196 * block_size: how many data for operation (not used in "_pre" and "_post") 00197 * policy: JF_JOURNAL_PROP_SYNC_SAFE -> fsync/fdatasync, 00198 * JF_JOURNAL_PROP_SYNC_FAST -> fflush 00199 */ 00200 int bench_00_sio_pre(bench_table_t *bt, 00201 const char *path_prefix, int number_of_files, 00202 size_t block_size, int record_num, uint32_t policy); 00203 int bench_00_sio_run(bench_table_t *bt, const void *buffer, 00204 size_t block_size, int record_num); 00205 int bench_00_sio_post(bench_table_t *bt); 00206 00207 int bench_00_ljf_pre(bench_table_t *bt, 00208 const char *path_prefix, int number_of_files, 00209 size_t block_size, int record_num, uint32_t policy); 00210 int bench_00_ljf_run(bench_table_t *bt, const void *buffer, 00211 size_t block_size, int record_num); 00212 int bench_00_ljf_post(bench_table_t *bt); 00213 00214 int bench_01_sio_pre(bench_table_t *bt, 00215 const char *path_prefix, int number_of_files, 00216 size_t block_size, int record_num, uint32_t policy); 00217 int bench_01_sio_run(bench_table_t *bt, const void *buffer, 00218 size_t block_size, int record_num); 00219 int bench_01_sio_post(bench_table_t *bt); 00220 00221 int bench_01_ljf_pre(bench_table_t *bt, 00222 const char *path_prefix, int number_of_files, 00223 size_t block_size, int record_num, uint32_t policy); 00224 int bench_01_ljf_run(bench_table_t *bt, const void *buffer, 00225 size_t block_size, int record_num); 00226 int bench_01_ljf_post(bench_table_t *bt); 00227 00228 int bench_02_sio_pre(bench_table_t *bt, 00229 const char *path_prefix, int number_of_files, 00230 size_t block_size, int record_num, uint32_t policy); 00231 int bench_02_sio_run(bench_table_t *bt, const void *buffer, 00232 size_t block_size, int record_num); 00233 int bench_02_sio_post(bench_table_t *bt); 00234 00235 int bench_02_ljf_pre(bench_table_t *bt, 00236 const char *path_prefix, int number_of_files, 00237 size_t block_size, int record_num, uint32_t policy); 00238 int bench_02_ljf_run(bench_table_t *bt, const void *buffer, 00239 size_t block_size, int record_num); 00240 int bench_02_ljf_post(bench_table_t *bt); 00241 00242 int bench_03_sio_pre(bench_table_t *bt, 00243 const char *path_prefix, int number_of_files, 00244 size_t block_size, int record_num, uint32_t policy); 00245 int bench_03_sio_run(bench_table_t *bt, const void *buffer, 00246 size_t block_size, int record_num); 00247 int bench_03_sio_post(bench_table_t *bt); 00248 00249 int bench_03_ljf_pre(bench_table_t *bt, 00250 const char *path_prefix, int number_of_files, 00251 size_t block_size, int record_num, uint32_t policy); 00252 int bench_03_ljf_run(bench_table_t *bt, const void *buffer, 00253 size_t block_size, int record_num); 00254 int bench_03_ljf_post(bench_table_t *bt); 00255 00256 00257 00258 typedef int (*bench_func_pre_t)(bench_table_t *bt, 00259 const char *path_prefix, int number_of_files, 00260 size_t block_size, int record_num, 00261 uint32_t policy); 00262 00263 typedef int (*bench_func_run_t)(bench_table_t *bt, const void *buffer, 00264 size_t block_size, int record_num); 00265 00266 typedef int (*bench_func_post_t)(bench_table_t *bt); 00267 00268 struct bench_test_func_s { 00269 const char *descr; 00270 double ratio_multiplier; 00271 bench_func_pre_t ljf_pre; 00272 bench_func_run_t ljf_run; 00273 bench_func_post_t ljf_post; 00274 bench_func_pre_t sio_pre; 00275 bench_func_run_t sio_run; 00276 bench_func_post_t sio_post; 00277 }; 00278 00279 struct bench_test_time_s { 00280 int valid; 00281 double ljf_usr; 00282 double ljf_sys; 00283 double ljf_ela; 00284 double sio_usr; 00285 double sio_sys; 00286 double sio_ela; 00287 }; 00288 00289 void bench_test_time_reset(struct bench_test_time_s *btt); 00290 00291 00292 00293 /* number of times a bench must be repeated */ 00294 #define BENCH_TEST_REPETITIONS 12 00295 00296 /* number of transactions for every bench */ 00297 #define BENCH_TEST_TRANSACTIONS 25 00298 00299 /* this factor is used to determine the size of the file must be used for 00300 * update benchmarks; 00301 * NOTE: can NOT be less than 2 */ 00302 #define BENCH_TEST_UPDATE_FACTOR 100 00303 00304 static struct bench_test_func_s bench_test_func_array[] = { 00305 { "Append only test", 1.0, 00306 bench_00_ljf_pre, bench_00_ljf_run, bench_00_ljf_post, 00307 bench_00_sio_pre, bench_00_sio_run, bench_00_sio_post }, 00308 { "Append, seek, read test", 2.0, 00309 bench_01_ljf_pre, bench_01_ljf_run, bench_01_ljf_post, 00310 bench_01_sio_pre, bench_01_sio_run, bench_01_sio_post }, 00311 { "Seek, update test", 1.0, 00312 bench_02_ljf_pre, bench_02_ljf_run, bench_02_ljf_post, 00313 bench_02_sio_pre, bench_02_sio_run, bench_02_sio_post }, 00314 { "Seek, read, seek, update test", 2.0, 00315 bench_03_ljf_pre, bench_03_ljf_run, bench_03_ljf_post, 00316 bench_03_sio_pre, bench_03_sio_run, bench_03_sio_post } 00317 }; 00318 00319 #define BENCH_TEST_TESTYPES (sizeof(bench_test_func_array)/sizeof(struct bench_test_func_s)) 00320 00321 /* record size used for operations */ 00322 /* ORDER IS MANDATORY */ 00323 static size_t bench_test_recsize_array[] = { 00324 16, 256, 4096 00325 }; 00326 00327 #define BENCH_TEST_RECSIZES (sizeof(bench_test_recsize_array)/sizeof(size_t)) 00328 00329 #define BENCH_TEST_MAX_RECSIZE (bench_test_recsize_array[BENCH_TEST_RECSIZES -1 ]) 00330 00331 /* number of records between sync point */ 00332 /* ORDER IS MANDATORY */ 00333 static int bench_test_recnum_array[] = { 00334 1, 10, 100 00335 }; 00336 00337 #define BENCH_TEST_RECNUMS (sizeof(bench_test_recnum_array)/sizeof(int)) 00338 00339 /* number of file in transaction */ 00340 /* ORDER IS MANDATORY */ 00341 static int bench_test_numfile_array[] = { 00342 1, 5 00343 }; 00344 00345 #define BENCH_TEST_NUMFILES (sizeof(bench_test_numfile_array)/sizeof(int)) 00346 00347 typedef struct bench_test_time_s bench_test_results_t[BENCH_TEST_REPETITIONS][BENCH_TEST_NUMFILES][BENCH_TEST_RECSIZES][BENCH_TEST_RECNUMS][BENCH_TEST_TESTYPES]; 00348 00349 /* reset data matrix */ 00350 void bench_test_results_reset(bench_test_results_t btr); 00351 00352 /* compute data matrix */ 00353 int bench_test_results_compute(bench_test_results_t btr); 00354 00355 /* compute data cell */ 00356 int bench_test_results_compute_one(bench_test_results_t btr, 00357 int repetition, 00358 int number_of_file, 00359 int record_size, 00360 int record_num, 00361 int test_type); 00362 00363 /* remove best and worst data */ 00364 void bench_test_results_clean(bench_test_results_t btr); 00365 00366 /* report benchmark data */ 00367 void bench_test_results_report(bench_test_results_t btr); 00368 00369 00370 00371 void print_help(char *arg); 00372 00373 00374 00375 static long verbose_mode = VERBOSE_MODE_MIN; 00376 static uint32_t sync_type = JF_JOURNAL_PROP_SYNC_SAFE; 00377 static char *path_prefix = NULL; 00378 static char *csv_file_name = NULL; 00379 static char *xml_file_name = NULL; 00380 static void *buffer = NULL; 00381 00382 00383 00384 int main(int argc, char *argv[]) 00385 { 00386 int opt; 00387 int ret_cod; 00388 bench_test_results_t btr; 00389 00390 if (argc < 1) { 00391 print_help(argv[0]); 00392 return 1; 00393 } /* if (argc < 2) */ 00394 00395 // parsing args 00396 while ((opt = getopt(argc, argv, "p:c:v:x:hf")) != -1) { 00397 switch (opt) { 00398 case 'p': /* path prefix */ 00399 if (NULL == (path_prefix = (char *)malloc( 00400 strlen(optarg) + 1))) { 00401 fprintf(stderr, "%s: unable to allocate " 00402 "memory for path prefix string\n", 00403 basename(argv[0])); 00404 return 1; 00405 } 00406 strcpy(path_prefix, optarg); 00407 break; 00408 case 'h': /* print help and exit */ 00409 print_help(argv[0]); 00410 return 0; 00411 break; 00412 case 'c': /* csv file name */ 00413 csv_file_name = optarg; 00414 break; 00415 case 'x': /* xml file name */ 00416 xml_file_name = optarg; 00417 break; 00418 case 'v': /* verbose mode */ 00419 verbose_mode = strtol(optarg, NULL, 0); 00420 break; 00421 case 'f': /* fast sync type */ 00422 sync_type = JF_JOURNAL_PROP_SYNC_FAST; 00423 break; 00424 case '?': 00425 case ':': 00426 print_help(argv[0]); 00427 return 1; 00428 break; 00429 default: 00430 fprintf(stderr, 00431 "%s: internal error, option '-%c' not " 00432 "handled\n", argv[0], opt); 00433 return 1; 00434 } // switch (opt) 00435 } // while opt 00436 00437 if (NULL == path_prefix) { 00438 print_help(argv[0]); 00439 return 1; 00440 } 00441 00442 if (NULL == (buffer = malloc(bench_test_recsize_array[ 00443 BENCH_TEST_RECSIZES-1]))) { 00444 fprintf(stderr, "%s: buffer can NOT be allocated\n", 00445 basename(argv[0])); 00446 return 1; 00447 } /* if (NULL == (buffer = malloc(MAX_BUFFER_SIZE))) */ 00448 00449 bench_test_results_reset(btr); 00450 00451 if (JF_RC_OK != (ret_cod = bench_test_results_compute(btr))) { 00452 fprintf(stderr, "%s/bench_test_results_compute: " 00453 "error while computing benchmark results: %d/%s\n", 00454 basename(argv[0]), ret_cod, jf_strerror(ret_cod)); 00455 return 1; 00456 } /* if (JF_RC_OK != (ret_cod = bench_test_results_compute(btr))) */ 00457 00458 bench_test_results_clean(btr); 00459 00460 bench_test_results_report(btr); 00461 00462 if (NULL != path_prefix) 00463 free(path_prefix); 00464 00465 return 0; 00466 } 00467 00468 00469 00470 void print_help(char *arg) 00471 { 00472 printf("Usage: %s -p <path prefix> [-c <csv file name>] [-x <xml file name>] [-v{0|1|2}] [-f] [-h]\n", 00473 basename(arg)); 00474 printf("Execute library benchmark\n\n"); 00475 printf("\t-c <csv file name> : produce a comma separated value with details\n"); 00476 printf("\t-x <xml file name> : produce a XML file with details\n"); 00477 printf("\t-v : verbose mode -v0 -v1 -v2\n"); 00478 printf("\t-p <path prefix> : where bench files must be allocated\n" 00479 "\t\texamples: '-p /tmp/' '-p $HOME/tmp/'\n"); 00480 printf("\t-f : use fast sync instead of safe sync\n"); 00481 printf("\t-h : print this help\n"); 00482 } 00483 00484 00485 00486 int bench_table_create(bench_table_t *bt, const char *path_prefix, 00487 int number_of_files) 00488 { 00489 enum Exception { INVALID_OPTION 00490 , INVALID_STATUS 00491 , MALLOC_ERROR1 00492 , MALLOC_ERROR2 00493 , NONE } excp; 00494 int ret_cod = JF_RC_INTERNAL_ERROR; 00495 00496 JF_TRACE(("bench_table_create\n")); 00497 TRY { 00498 int i; 00499 00500 if (number_of_files < 1) 00501 THROW(INVALID_OPTION); 00502 if (bt->last != 0) 00503 THROW(INVALID_STATUS); 00504 00505 bt->records = (struct bench_table_rec_s *)malloc( 00506 (number_of_files + 1) * 00507 sizeof(struct bench_table_rec_s)); 00508 if (NULL == bt->records) 00509 THROW(MALLOC_ERROR1); 00510 for (i = 0; i <= number_of_files; ++i) { 00511 if (NULL == (bt->records[i].name = (char *)malloc( 00512 strlen(path_prefix) + 00513 strlen(bench_file_name) + 100))) 00514 THROW(MALLOC_ERROR2); 00515 sprintf(bt->records[i].name, "%s%s%d", path_prefix, 00516 bench_file_name, i); 00517 JF_TRACE(("File name %d >%s<\n", 00518 i, bt->records[i].name)); 00519 } /* for (i = 0; i <= number_of_files; ++i) */ 00520 bt->last = number_of_files; 00521 00522 THROW(NONE); 00523 } CATCH { 00524 switch (excp) { 00525 case INVALID_OPTION: 00526 ret_cod = JF_RC_INVALID_OPTION; 00527 break; 00528 case INVALID_STATUS: 00529 ret_cod = JF_RC_INVALID_STATUS; 00530 break; 00531 case MALLOC_ERROR1: 00532 case MALLOC_ERROR2: 00533 ret_cod = JF_RC_MALLOC_ERROR; 00534 break; 00535 case NONE: 00536 ret_cod = JF_RC_OK; 00537 break; 00538 default: 00539 ret_cod = JF_RC_INTERNAL_ERROR; 00540 } /* switch (excp) */ 00541 } /* TRY-CATCH */ 00542 JF_TRACE(("bench_table_create/excp=%d/" 00543 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 00544 return ret_cod; 00545 } 00546 00547 00548 00549 int bench_table_unlink(const bench_table_t *bt) 00550 { 00551 enum Exception { UNLINK_ERROR 00552 , NONE } excp; 00553 int ret_cod = JF_RC_INTERNAL_ERROR; 00554 00555 JF_TRACE(("bench_table_unlink\n")); 00556 TRY { 00557 int i; 00558 00559 for (i = 0; i <= bt->last; ++i) { 00560 if (0 != unlink(bt->records[i].name) && 00561 ENOENT != errno) 00562 THROW(UNLINK_ERROR); 00563 } /* for (i = 0; i <= bt->last; ++i) */ 00564 00565 THROW(NONE); 00566 } CATCH { 00567 switch (excp) { 00568 case UNLINK_ERROR: 00569 ret_cod = JF_RC_UNLINK_ERROR; 00570 break; 00571 case NONE: 00572 ret_cod = JF_RC_OK; 00573 break; 00574 default: 00575 ret_cod = JF_RC_INTERNAL_ERROR; 00576 } /* switch (excp) */ 00577 } /* TRY-CATCH */ 00578 JF_TRACE(("bench_table_unlink/excp=%d/" 00579 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 00580 return ret_cod; 00581 } 00582 00583 00584 00585 int bench_table_destroy(bench_table_t *bt) 00586 { 00587 int i; 00588 00589 if (bt->last < 0) 00590 return -1; 00591 if (bt->last == 0) 00592 return 0; 00593 00594 for (i = 0; i <= bt->last; ++i) { 00595 JF_TRACE(("File name %d >%s<\n", i, bt->records[i].name)); 00596 free(bt->records[i].name); 00597 bt->records[i].name = NULL; 00598 } /* for (i = 0; i <= bt->n; ++i) */ 00599 free(bt->records); 00600 bt->records = NULL; 00601 bt->last = 0; 00602 return 0; 00603 } 00604 00605 00606 00607 void bench_test_time_reset(struct bench_test_time_s *btt) 00608 { 00609 btt->valid = FALSE; 00610 btt->ljf_usr = btt->ljf_sys = btt->ljf_ela = 00611 btt->sio_usr = btt->sio_sys = btt->sio_ela = 0.0; 00612 } 00613 00614 00615 00616 void bench_test_results_reset(bench_test_results_t btr) 00617 { 00618 int i, j, k, l, m; 00619 00620 for (i = 0; i < BENCH_TEST_REPETITIONS; ++i) 00621 for (j = 0; j < BENCH_TEST_NUMFILES; ++j) 00622 for (k = 0; k < BENCH_TEST_RECSIZES; ++k) 00623 for (l = 0; l < BENCH_TEST_RECNUMS; ++l) 00624 for (m = 0; m < BENCH_TEST_TESTYPES; 00625 ++m) 00626 bench_test_time_reset( 00627 &(btr[i][j][k][l][m])); 00628 } 00629 00630 00631 00632 int bench_test_results_compute(bench_test_results_t btr) 00633 { 00634 enum Exception { COMPUTE_ONE 00635 , NONE } excp; 00636 int ret_cod = JF_RC_INTERNAL_ERROR; 00637 00638 JF_TRACE(("bench_test_results_compute\n")); 00639 TRY { 00640 int i, j, k, l, m; 00641 00642 for (i = 0; i < BENCH_TEST_REPETITIONS; ++i) 00643 for (j = 0; j < BENCH_TEST_NUMFILES; ++j) 00644 for (k = 0; k < BENCH_TEST_RECSIZES; ++k) 00645 for (l = 0; l < BENCH_TEST_RECNUMS; 00646 ++l) 00647 for (m = 0; 00648 m < BENCH_TEST_TESTYPES; 00649 ++m) { 00650 ret_cod = bench_test_results_compute_one(btr, i, j, k, l, m); 00651 if (JF_RC_OK != ret_cod) THROW(COMPUTE_ONE); 00652 } 00653 THROW(NONE); 00654 } CATCH { 00655 switch (excp) { 00656 case COMPUTE_ONE: 00657 break; 00658 case NONE: 00659 ret_cod = JF_RC_OK; 00660 break; 00661 default: 00662 ret_cod = JF_RC_INTERNAL_ERROR; 00663 } /* switch (excp) */ 00664 } /* TRY-CATCH */ 00665 JF_TRACE(("bench_test_results_compute/excp=%d/" 00666 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 00667 return ret_cod; 00668 } 00669 00670 00671 00672 int bench_test_results_compute_one(bench_test_results_t btr, 00673 int repetition, 00674 int number_of_file, 00675 int record_size, 00676 int record_num, 00677 int test_type) 00678 { 00679 enum Exception { TIMER_RESET1 00680 , LJF_PRE 00681 , TIMER_START1 00682 , LJF_RUN 00683 , TIMER_STOP1 00684 , LJF_POST 00685 , TIMER_RESET2 00686 , SIO_PRE 00687 , TIMER_START2 00688 , SIO_RUN 00689 , TIMER_STOP2 00690 , SIO_POST 00691 , NONE } excp; 00692 int ret_cod = JF_RC_INTERNAL_ERROR; 00693 00694 JF_TRACE(("bench_test_results_compute_one\n")); 00695 TRY { 00696 int nof = bench_test_numfile_array[number_of_file]; 00697 size_t rs = bench_test_recsize_array[record_size]; 00698 int rn = bench_test_recnum_array[record_num]; 00699 struct bench_test_func_s *btt = 00700 &(bench_test_func_array[test_type]); 00701 jf_timer_t timer1, timer2; 00702 bench_table_t bt; 00703 int i, n = BENCH_TEST_TRANSACTIONS; 00704 00705 if (verbose_mode >= VERBOSE_MODE_MID) 00706 printf("Test type: '%s'; repetition: %d, nof: %d, " 00707 "rs: " SIZE_T_FORMAT ", rn: %d\n", 00708 btt->descr, repetition, nof, rs, rn); 00709 00710 ret_cod = jf_timer_reset(&timer1); 00711 if (JF_RC_OK != ret_cod) 00712 THROW(TIMER_RESET1); 00713 00714 ret_cod = btt->ljf_pre(&bt, path_prefix, nof, rs, rn, 00715 sync_type); 00716 if (JF_RC_OK != ret_cod) 00717 THROW(LJF_PRE); 00718 00719 ret_cod = jf_timer_start(&timer1); 00720 if (JF_RC_OK != ret_cod) 00721 THROW(TIMER_START1); 00722 00723 for (i = 0; i < n; ++i) { 00724 ret_cod = btt->ljf_run(&bt, buffer, rs, rn); 00725 if (JF_RC_OK != ret_cod) 00726 THROW(LJF_RUN); 00727 } /* for (i = 0; i < n; ++i) */ 00728 00729 ret_cod = jf_timer_stop(&timer1); 00730 if (JF_RC_OK != ret_cod) 00731 THROW(TIMER_STOP1); 00732 00733 ret_cod = btt->ljf_post(&bt); 00734 if (JF_RC_OK != ret_cod) 00735 THROW(LJF_POST); 00736 00737 if (verbose_mode >= VERBOSE_MODE_MAX) 00738 printf("LJF: user_time = %f, sys_time = %f, " 00739 "ela_time = %f\n", 00740 jf_timer_get_usr_time(&timer1), 00741 jf_timer_get_sys_time(&timer1), 00742 jf_timer_get_ela_time(&timer1)); 00743 00744 /* store values for LJF */ 00745 btr[repetition][number_of_file][record_size][record_num] 00746 [test_type].ljf_usr = jf_timer_get_usr_time(&timer1); 00747 btr[repetition][number_of_file][record_size][record_num] 00748 [test_type].ljf_sys = jf_timer_get_sys_time(&timer1); 00749 btr[repetition][number_of_file][record_size][record_num] 00750 [test_type].ljf_ela = jf_timer_get_ela_time(&timer1); 00751 00752 ret_cod = jf_timer_reset(&timer2); 00753 if (JF_RC_OK != ret_cod) 00754 THROW(TIMER_RESET2); 00755 00756 ret_cod = btt->sio_pre(&bt, path_prefix, nof, rs, rn, 00757 sync_type); 00758 if (JF_RC_OK != ret_cod) 00759 THROW(SIO_PRE); 00760 00761 ret_cod = jf_timer_start(&timer2); 00762 if (JF_RC_OK != ret_cod) 00763 THROW(TIMER_START2); 00764 00765 for (i = 0; i < n; ++i) { 00766 ret_cod = btt->sio_run(&bt, buffer, rs, rn); 00767 if (JF_RC_OK != ret_cod) 00768 THROW(SIO_RUN); 00769 } /* for (i = 0; i < n; ++i) */ 00770 00771 ret_cod = jf_timer_stop(&timer2); 00772 if (JF_RC_OK != ret_cod) 00773 THROW(TIMER_STOP2); 00774 00775 ret_cod = btt->sio_post(&bt); 00776 if (JF_RC_OK != ret_cod) 00777 THROW(SIO_POST); 00778 00779 if (verbose_mode >= VERBOSE_MODE_MAX) 00780 printf("SIO: user_time = %f, sys_time = %f, " 00781 "ela_time = %f\n", 00782 jf_timer_get_usr_time(&timer2), 00783 jf_timer_get_sys_time(&timer2), 00784 jf_timer_get_ela_time(&timer2)); 00785 00786 /* store values for SIO */ 00787 btr[repetition][number_of_file][record_size][record_num] 00788 [test_type].sio_usr = jf_timer_get_usr_time(&timer2); 00789 btr[repetition][number_of_file][record_size][record_num] 00790 [test_type].sio_sys = jf_timer_get_sys_time(&timer2); 00791 btr[repetition][number_of_file][record_size][record_num] 00792 [test_type].sio_ela = jf_timer_get_ela_time(&timer2); 00793 00794 btr[repetition][number_of_file][record_size][record_num] 00795 [test_type].valid = TRUE; 00796 00797 THROW(NONE); 00798 } CATCH { 00799 switch (excp) { 00800 case TIMER_RESET1: 00801 case LJF_PRE: 00802 case TIMER_START1: 00803 case LJF_RUN: 00804 case TIMER_STOP1: 00805 case LJF_POST: 00806 case TIMER_RESET2: 00807 case SIO_PRE: 00808 case TIMER_START2: 00809 case SIO_RUN: 00810 case TIMER_STOP2: 00811 case SIO_POST: 00812 break; 00813 case NONE: 00814 ret_cod = JF_RC_OK; 00815 break; 00816 default: 00817 ret_cod = JF_RC_INTERNAL_ERROR; 00818 } /* switch (excp) */ 00819 } /* TRY-CATCH */ 00820 JF_TRACE(("bench_test_results_compute_one/excp=%d/" 00821 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 00822 return ret_cod; 00823 } 00824 00825 00826 00827 void bench_test_results_clean(bench_test_results_t btr) 00828 { 00829 int i, j, k, l, m; 00830 00831 for (j = 0; j < BENCH_TEST_NUMFILES; ++j) 00832 for (k = 0; k < BENCH_TEST_RECSIZES; ++k) 00833 for (l = 0; l < BENCH_TEST_RECNUMS; ++l) 00834 for (m = 0; m < BENCH_TEST_TESTYPES; ++m) { 00835 /* 00836 double avg_ljf_usr = 0.0; 00837 double avg_ljf_sys = 0.0; 00838 double avg_ljf_ela = 0.0; 00839 double avg_sio_usr = 0.0; 00840 double avg_sio_sys = 0.0; 00841 double avg_sio_ela = 0.0; 00842 */ 00843 int best = 0, worst = 0; 00844 00845 for (i = 0; i < BENCH_TEST_REPETITIONS; ++i) { 00846 /* 00847 avg_ljf_usr += btr[i][j][k][l][m].ljf_usr; 00848 avg_ljf_sys += btr[i][j][k][l][m].ljf_sys; 00849 avg_ljf_ela += btr[i][j][k][l][m].ljf_ela; 00850 avg_sio_usr += btr[i][j][k][l][m].sio_usr; 00851 avg_sio_sys += btr[i][j][k][l][m].sio_sys; 00852 avg_sio_ela += btr[i][j][k][l][m].sio_ela; 00853 */ 00854 } /* for i */ 00855 00856 /* 00857 avg_ljf_usr /= BENCH_TEST_REPETITIONS; 00858 avg_ljf_sys /= BENCH_TEST_REPETITIONS; 00859 avg_ljf_ela /= BENCH_TEST_REPETITIONS; 00860 avg_sio_usr /= BENCH_TEST_REPETITIONS; 00861 avg_sio_sys /= BENCH_TEST_REPETITIONS; 00862 avg_sio_ela /= BENCH_TEST_REPETITIONS; 00863 */ 00864 00865 for (i = 1; i < BENCH_TEST_REPETITIONS; ++i) { 00866 /* 00867 if (btr[i][j][k][l][m].ljf_usr / avg_ljf_usr + btr[i][j][k][l][m].ljf_sys / avg_ljf_sys + btr[i][j][k][l][m].ljf_ela / avg_ljf_ela + btr[i][j][k][l][m].sio_usr / avg_sio_usr + btr[i][j][k][l][m].sio_sys / avg_sio_sys + btr[i][j][k][l][m].sio_ela / avg_sio_ela < btr[best][j][k][l][m].ljf_usr / avg_ljf_usr + btr[best][j][k][l][m].ljf_sys / avg_ljf_sys + btr[best][j][k][l][m].ljf_ela / avg_ljf_ela + btr[best][j][k][l][m].sio_usr / avg_sio_usr + btr[best][j][k][l][m].sio_sys / avg_sio_sys + btr[best][j][k][l][m].sio_ela / avg_sio_ela) 00868 best = i; 00869 if (btr[i][j][k][l][m].ljf_usr / avg_ljf_usr + btr[i][j][k][l][m].ljf_sys / avg_ljf_sys + btr[i][j][k][l][m].ljf_ela / avg_ljf_ela + btr[i][j][k][l][m].sio_usr / avg_sio_usr + btr[i][j][k][l][m].sio_sys / avg_sio_sys + btr[i][j][k][l][m].sio_ela / avg_sio_ela > btr[worst][j][k][l][m].ljf_usr / avg_ljf_usr + btr[worst][j][k][l][m].ljf_sys / avg_ljf_sys + btr[worst][j][k][l][m].ljf_ela / avg_ljf_ela + btr[worst][j][k][l][m].sio_usr / avg_sio_usr + btr[worst][j][k][l][m].sio_sys / avg_sio_sys + btr[worst][j][k][l][m].sio_ela / avg_sio_ela) 00870 worst = i; 00871 */ 00872 if (btr[i][j][k][l][m].ljf_ela + btr[i][j][k][l][m].sio_ela < btr[best][j][k][l][m].ljf_ela + btr[best][j][k][l][m].sio_ela) 00873 best = i; 00874 if (btr[i][j][k][l][m].ljf_ela + btr[i][j][k][l][m].sio_ela > btr[worst][j][k][l][m].ljf_ela + btr[worst][j][k][l][m].sio_ela) 00875 worst = i; 00876 } /* for i */ 00877 btr[best][j][k][l][m].valid = FALSE; 00878 btr[worst][j][k][l][m].valid = FALSE; 00879 } /* for m */ 00880 } 00881 00882 00883 00884 void bench_test_results_report(bench_test_results_t btr) 00885 { 00886 int i, j, k, l, m; 00887 00888 double ljf_usr = 0.0; 00889 double ljf_sys = 0.0; 00890 double ljf_ela = 0.0; 00891 double sio_usr = 0.0; 00892 double sio_sys = 0.0; 00893 double sio_ela = 0.0; 00894 double glo_effic = 0.0; 00895 long transactions = 0; 00896 double d_tran = 0.0; 00897 FILE *csv = NULL, *xml = NULL; 00898 00899 if (NULL != csv_file_name) 00900 csv = fopen(csv_file_name, "w"); 00901 if (NULL != xml_file_name) 00902 xml = fopen(xml_file_name, "w"); 00903 00904 if (NULL != csv) 00905 fprintf(csv, "\"Test type\",\"Number of files\"," 00906 "\"Record size\"," 00907 "\"Number of records\",\"Sequential\"," 00908 "\"LJF CPU user time\",\"SIO CPU user time\"," 00909 "\"LJF CPU sys time\",\"SIO CPU sys time\"," 00910 "\"LJF Elapsed time\",\"SIO Elapsed time\"\n"); 00911 if (NULL != xml) { 00912 fprintf(xml, 00913 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); 00914 fprintf(xml, "<libjf_benchmark>\n"); 00915 } /* if (NULL != xml) */ 00916 00917 for (m = 0; m < BENCH_TEST_TESTYPES; ++m) { 00918 double ljf_usr_perc = 0.0; 00919 double ljf_sys_perc = 0.0; 00920 double ljf_ela_ratio = 0.0; 00921 double sio_usr_perc = 0.0; 00922 double sio_sys_perc = 0.0; 00923 double sio_ela_ratio = 0.0; 00924 double effic = 1.0; 00925 long bytes = 0; 00926 00927 if (NULL != xml) 00928 fprintf(xml, " <test name='%s'>\n", 00929 bench_test_func_array[m].descr); 00930 00931 for (j = 0; j < BENCH_TEST_NUMFILES; ++j) { 00932 if (NULL != xml) 00933 fprintf(xml, " <number_of_files value='%d'>\n", 00934 bench_test_numfile_array[j]); 00935 for (k = 0; k < BENCH_TEST_RECSIZES; ++k) { 00936 if (NULL != xml) 00937 fprintf(xml, " <record_size value='"SIZE_T_FORMAT"'>\n", 00938 bench_test_recsize_array[k]); 00939 for (l = 0; l < BENCH_TEST_RECNUMS; ++l) { 00940 if (NULL != xml) 00941 fprintf(xml, " <number_of_records value='%d'>\n", 00942 bench_test_recnum_array[l]); 00943 for (i = 0; i < BENCH_TEST_REPETITIONS; ++i) { 00944 if (!btr[i][j][k][l][m].valid) 00945 continue; 00946 if (NULL != xml) 00947 fprintf(xml, " <sequential value='%d'>\n", i); 00948 transactions += BENCH_TEST_TRANSACTIONS; 00949 bytes += bench_test_numfile_array[j] * bench_test_recsize_array[k] * bench_test_recnum_array[l] * BENCH_TEST_TRANSACTIONS * bench_test_func_array[m].ratio_multiplier; 00950 ljf_usr += btr[i][j][k][l][m].ljf_usr; 00951 ljf_sys += btr[i][j][k][l][m].ljf_sys; 00952 ljf_ela += btr[i][j][k][l][m].ljf_ela; 00953 sio_usr += btr[i][j][k][l][m].sio_usr; 00954 sio_sys += btr[i][j][k][l][m].sio_sys; 00955 sio_ela += btr[i][j][k][l][m].sio_ela; 00956 if (NULL != csv) 00957 fprintf(csv,"\"%s\",%d," 00958 SIZE_T_FORMAT 00959 ",%d,%d,%f,%f," 00960 "%f,%f,%f,%f\n", 00961 bench_test_func_array[m].descr, 00962 bench_test_numfile_array[j], 00963 bench_test_recsize_array[k], 00964 bench_test_recnum_array[l], 00965 i, 00966 btr[i][j][k][l][m].ljf_usr, 00967 btr[i][j][k][l][m].sio_usr, 00968 btr[i][j][k][l][m].ljf_sys, 00969 btr[i][j][k][l][m].sio_sys, 00970 btr[i][j][k][l][m].ljf_ela, 00971 btr[i][j][k][l][m].sio_ela); 00972 00973 if (NULL != xml) 00974 fprintf(xml, 00975 " <LJF>\n" 00976 " <CPU_user_time>%f</CPU_user_time>\n" 00977 " <CPU_sys_time>%f</CPU_sys_time>\n" 00978 " <elapsed_time>%f</elapsed_time>\n" 00979 " </LJF>\n", 00980 btr[i][j][k][l][m].ljf_usr, 00981 btr[i][j][k][l][m].ljf_sys, 00982 btr[i][j][k][l][m].ljf_ela); 00983 if (NULL != xml) 00984 fprintf(xml, 00985 " <SIO>\n" 00986 " <CPU_user_time>%f</CPU_user_time>\n" 00987 " <CPU_sys_time>%f</CPU_sys_time>\n" 00988 " <elapsed_time>%f</elapsed_time>\n" 00989 " </SIO>\n", 00990 btr[i][j][k][l][m].sio_usr, 00991 btr[i][j][k][l][m].sio_sys, 00992 btr[i][j][k][l][m].sio_ela); 00993 00994 if (NULL != xml) 00995 fprintf(xml, " </sequential>\n"); 00996 } /* for i */ 00997 if (NULL != xml) 00998 fprintf(xml, " </number_of_records>\n"); 00999 } /* for l */ 01000 if (NULL != xml) 01001 fprintf(xml, " </record_size>\n"); 01002 } /* for k */ 01003 if (NULL != xml) 01004 fprintf(xml, " </number_of_files>\n"); 01005 } /* for j */ 01006 01007 ljf_ela_ratio = bytes / ljf_ela / 1024; 01008 ljf_usr_perc = 100.0 * ljf_usr / ljf_ela; 01009 ljf_sys_perc = 100.0 * ljf_sys / ljf_ela; 01010 sio_ela_ratio = bytes / sio_ela / 1024; 01011 sio_usr_perc = 100.0 * sio_usr / sio_ela; 01012 sio_sys_perc = 100.0 * sio_sys / sio_ela; 01013 01014 effic = ljf_ela_ratio / sio_ela_ratio; 01015 01016 glo_effic += effic; 01017 01018 d_tran = (double)transactions; 01019 01020 if (verbose_mode >= VERBOSE_MODE_MIN) { 01021 printf("----------------------------------------------------------------------------\n"); 01022 printf("\tBENCH TYPE: '%s'\n", bench_test_func_array[m].descr); 01023 printf("Ratio:\t\t" 01024 "ljf: %3.3f Kb/s\tsio: %3.3f Kb/s\n", 01025 ljf_ela_ratio, sio_ela_ratio); 01026 printf("Transac:\t" 01027 "ljf: %3.3f t/s\tsio: %3.3f t/s\n", 01028 d_tran/ljf_ela, d_tran/sio_ela); 01029 printf("User CPU:\t" 01030 "ljf: %3.3f %%\t\tsio: %3.3f %%\n", 01031 ljf_usr_perc, sio_usr_perc); 01032 printf("Sys CPU:\t" 01033 "ljf: %3.3f %%\t\tsio: %3.3f %%\n", 01034 ljf_sys_perc, sio_sys_perc); 01035 printf("Efficiency:\t%3.3f %%\n", effic * 100.0); 01036 } /* if (verbose_mode) */ 01037 01038 if (NULL != xml) 01039 fprintf(xml, " </test>\n"); 01040 } /* for m */ 01041 01042 if (NULL != csv) 01043 fclose(csv); 01044 if (NULL != xml) { 01045 fprintf(xml, "</libjf_benchmark>\n"); 01046 fclose(xml); 01047 } /* if (NULL != xml) */ 01048 01049 glo_effic = glo_effic/((double)BENCH_TEST_TESTYPES); 01050 01051 if (verbose_mode >= VERBOSE_MODE_SIL) 01052 printf("\nGLOBAL EFFICIENCY: %3.3f %%\n\n", glo_effic * 100.0); 01053 } 01054 01055 01056 01057 int bench_X0_sio_pre(bench_table_t *bt, 01058 const char *path_prefix, int number_of_files, 01059 uint32_t policy, const char *open_mode) 01060 { 01061 enum Exception { BENCH_TABLE_CREATE 01062 , BENCH_TABLE_UNLINK 01063 , FOPEN_ERROR 01064 , BENCH_TABLE_SET_STREAM 01065 , NONE } excp; 01066 int ret_cod = JF_RC_INTERNAL_ERROR; 01067 01068 JF_TRACE(("bench_X0_sio_pre\n")); 01069 TRY { 01070 int i; 01071 01072 bench_table_reset(bt); 01073 01074 bench_table_set_policy(bt, policy); 01075 01076 ret_cod = bench_table_create(bt, path_prefix, 01077 number_of_files); 01078 if (JF_RC_OK != ret_cod) 01079 THROW(BENCH_TABLE_CREATE); 01080 01081 ret_cod = bench_table_unlink(bt); 01082 if (JF_RC_OK != ret_cod) 01083 THROW(BENCH_TABLE_UNLINK); 01084 01085 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01086 FILE *stream = fopen( 01087 bench_table_get_name(bt, i), open_mode); 01088 if (NULL == stream) 01089 THROW(FOPEN_ERROR); 01090 ret_cod = bench_table_set_stream(bt, i, stream); 01091 if (JF_RC_OK != ret_cod) 01092 THROW(BENCH_TABLE_SET_STREAM); 01093 } /* for (i = 1; i <= bench_table_get_last(bt); ++i) */ 01094 01095 THROW(NONE); 01096 } CATCH { 01097 switch (excp) { 01098 case FOPEN_ERROR: 01099 ret_cod = JF_RC_FOPEN_ERROR; 01100 break; 01101 case BENCH_TABLE_SET_STREAM: 01102 case BENCH_TABLE_CREATE: 01103 case BENCH_TABLE_UNLINK: 01104 break; 01105 case NONE: 01106 ret_cod = JF_RC_OK; 01107 break; 01108 default: 01109 ret_cod = JF_RC_INTERNAL_ERROR; 01110 } /* switch (excp) */ 01111 } /* TRY-CATCH */ 01112 JF_TRACE(("bench_X0_sio_pre/excp=%d/" 01113 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01114 return ret_cod; 01115 } 01116 01117 01118 01119 int bench_X0_sio_post(bench_table_t *bt) 01120 { 01121 enum Exception { BENCH_TABLE_UNLINK 01122 , BENCH_TABLE_DESTROY 01123 , FCLOSE_ERROR 01124 , NONE } excp; 01125 int ret_cod = JF_RC_INTERNAL_ERROR; 01126 01127 JF_TRACE(("bench_X0_sio_post\n")); 01128 TRY { 01129 int i; 01130 01131 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01132 if (0 != fclose(bench_table_get_stream(bt, i))) 01133 THROW(FCLOSE_ERROR); 01134 } /* for (i = 1; i <= bench_table_get_last(bt); ++i) */ 01135 01136 ret_cod = bench_table_unlink(bt); 01137 if (JF_RC_OK != ret_cod) 01138 THROW(BENCH_TABLE_UNLINK); 01139 01140 ret_cod = bench_table_destroy(bt); 01141 if (JF_RC_OK != ret_cod) 01142 THROW(BENCH_TABLE_DESTROY); 01143 01144 bench_table_reset(bt); 01145 01146 THROW(NONE); 01147 } CATCH { 01148 switch (excp) { 01149 case BENCH_TABLE_UNLINK: 01150 case BENCH_TABLE_DESTROY: 01151 break; 01152 case FCLOSE_ERROR: 01153 ret_cod = JF_RC_FCLOSE_ERROR; 01154 break; 01155 case NONE: 01156 ret_cod = JF_RC_OK; 01157 break; 01158 default: 01159 ret_cod = JF_RC_INTERNAL_ERROR; 01160 } /* switch (excp) */ 01161 } /* TRY-CATCH */ 01162 JF_TRACE(("bench_X0_sio_post/excp=%d/" 01163 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01164 return ret_cod; 01165 } 01166 01167 01168 01169 int bench_X0_ljf_pre(bench_table_t *bt, 01170 const char *path_prefix, int number_of_files, 01171 uint32_t policy, const char *open_mode) 01172 { 01173 enum Exception { BENCH_TABLE_CREATE 01174 , BENCH_TABLE_UNLINK 01175 , JOURNAL_OPEN 01176 , FOPEN_ERROR 01177 , FILE_OPEN 01178 , BENCH_TABLE_SET_JFILE 01179 , NONE } excp; 01180 int ret_cod = JF_RC_INTERNAL_ERROR; 01181 01182 JF_TRACE(("bench_X0_ljf_pre\n")); 01183 TRY { 01184 jf_journal_t journal; 01185 struct jf_journal_opts_s jopts; 01186 struct jf_file_open_opts_s opts; 01187 int i; 01188 01189 bench_table_reset(bt); 01190 01191 bench_table_set_policy(bt, policy); 01192 01193 ret_cod = bench_table_create(bt, path_prefix, 01194 number_of_files); 01195 if (JF_RC_OK != ret_cod) 01196 THROW(BENCH_TABLE_CREATE); 01197 01198 ret_cod = bench_table_unlink(bt); 01199 if (JF_RC_OK != ret_cod) 01200 THROW(BENCH_TABLE_UNLINK); 01201 01202 jf_set_default_journal_opts(&jopts); 01203 jopts.flags |= JF_JOURNAL_PROP_OPEN_O_CREAT | 01204 JF_JOURNAL_PROP_OPEN_O_EXCL | policy; 01205 01206 ret_cod = jf_journal_open(&journal, 01207 bench_table_get_name(bt, 0), 01208 number_of_files, &jopts); 01209 if (JF_RC_OK != ret_cod) 01210 THROW(JOURNAL_OPEN); 01211 01212 bench_table_set_journal(bt, &journal); 01213 01214 jf_set_default_file_open_opts(&opts); 01215 opts.join_the_journal = TRUE; 01216 01217 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01218 jf_file_t jf; 01219 ret_cod = jf_file_open(&jf, 01220 bench_table_get_journal(bt), 01221 bench_table_get_name(bt, i), 01222 open_mode, &opts); 01223 if (JF_RC_OK != ret_cod) 01224 THROW(FILE_OPEN); 01225 ret_cod = bench_table_set_jfile(bt, i, &jf); 01226 if (JF_RC_OK != ret_cod) 01227 THROW(BENCH_TABLE_SET_JFILE); 01228 } /* for (i = 1; i <= bench_table_get_last(bt); ++i) */ 01229 01230 THROW(NONE); 01231 } CATCH { 01232 switch (excp) { 01233 case FOPEN_ERROR: 01234 ret_cod = JF_RC_FOPEN_ERROR; 01235 break; 01236 case BENCH_TABLE_CREATE: 01237 case BENCH_TABLE_UNLINK: 01238 case JOURNAL_OPEN: 01239 case FILE_OPEN: 01240 case BENCH_TABLE_SET_JFILE: 01241 break; 01242 case NONE: 01243 ret_cod = JF_RC_OK; 01244 break; 01245 default: 01246 ret_cod = JF_RC_INTERNAL_ERROR; 01247 } /* switch (excp) */ 01248 } /* TRY-CATCH */ 01249 JF_TRACE(("bench_X0_ljf_pre/excp=%d/" 01250 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01251 return ret_cod; 01252 } 01253 01254 01255 01256 int bench_X0_ljf_post(bench_table_t *bt) 01257 { 01258 enum Exception { FILE_CLOSE 01259 , JOURNAL_CLOSE 01260 , BENCH_TABLE_UNLINK 01261 , BENCH_TABLE_DESTROY 01262 , NONE } excp; 01263 int ret_cod = JF_RC_INTERNAL_ERROR; 01264 01265 JF_TRACE(("bench_X0_ljf_post\n")); 01266 TRY { 01267 int i; 01268 01269 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01270 ret_cod = jf_file_close(bench_table_get_jfile(bt, i)); 01271 if (JF_RC_OK != ret_cod) 01272 THROW(FILE_CLOSE); 01273 } /* for (i = 1; i <= bench_table_get_last(bt); ++i) */ 01274 01275 ret_cod = jf_journal_close(bench_table_get_journal(bt)); 01276 if (JF_RC_OK != ret_cod) 01277 THROW(JOURNAL_CLOSE); 01278 01279 ret_cod = bench_table_unlink(bt); 01280 if (JF_RC_OK != ret_cod) 01281 THROW(BENCH_TABLE_UNLINK); 01282 01283 ret_cod = bench_table_destroy(bt); 01284 if (JF_RC_OK != ret_cod) 01285 THROW(BENCH_TABLE_DESTROY); 01286 01287 bench_table_reset(bt); 01288 01289 THROW(NONE); 01290 } CATCH { 01291 switch (excp) { 01292 case FILE_CLOSE: 01293 case JOURNAL_CLOSE: 01294 case BENCH_TABLE_UNLINK: 01295 case BENCH_TABLE_DESTROY: 01296 break; 01297 case NONE: 01298 ret_cod = JF_RC_OK; 01299 break; 01300 default: 01301 ret_cod = JF_RC_INTERNAL_ERROR; 01302 } /* switch (excp) */ 01303 } /* TRY-CATCH */ 01304 JF_TRACE(("bench_X0_ljf_post/excp=%d/" 01305 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01306 return ret_cod; 01307 } 01308 01309 01310 01311 int bench_X1_sio_pre(bench_table_t *bt, 01312 const char *path_prefix, int number_of_files, 01313 size_t block_size, int record_num, 01314 uint32_t policy, const char *open_mode) 01315 { 01316 enum Exception { BENCH_X0_SIO_PRE 01317 , FWRITE_ERROR 01318 , STREAM_SYNC 01319 , NONE } excp; 01320 int ret_cod = JF_RC_INTERNAL_ERROR; 01321 01322 JF_TRACE(("bench_X1_sio_pre\n")); 01323 TRY { 01324 int i, j; 01325 01326 ret_cod = bench_X0_sio_pre(bt, path_prefix, number_of_files, 01327 policy, open_mode); 01328 if (JF_RC_OK != ret_cod) 01329 THROW(BENCH_X0_SIO_PRE); 01330 01331 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01332 for (j = 0; j < record_num * BENCH_TEST_UPDATE_FACTOR; 01333 ++j) { 01334 /* writing */ 01335 if (1 != fwrite( 01336 buffer, block_size, 1, 01337 bench_table_get_stream(bt, i))) 01338 THROW(FWRITE_ERROR); 01339 } /* for (j = 0; j < record_num * BENCH ...*/ 01340 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01341 01342 /* committing */ 01343 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01344 ret_cod = jf_stream_sync( 01345 bench_table_get_stream(bt, i), 01346 bench_table_get_policy(bt)); 01347 if (JF_RC_OK != ret_cod) 01348 THROW(STREAM_SYNC); 01349 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01350 01351 THROW(NONE); 01352 } CATCH { 01353 switch (excp) { 01354 case BENCH_X0_SIO_PRE: 01355 case STREAM_SYNC: 01356 break; 01357 case FWRITE_ERROR: 01358 ret_cod = JF_RC_FWRITE_ERROR; 01359 break; 01360 case NONE: 01361 ret_cod = JF_RC_OK; 01362 break; 01363 default: 01364 ret_cod = JF_RC_INTERNAL_ERROR; 01365 } /* switch (excp) */ 01366 } /* TRY-CATCH */ 01367 JF_TRACE(("bench_X1_sio_pre/excp=%d/" 01368 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01369 return ret_cod; 01370 } 01371 01372 01373 01374 int bench_X1_ljf_pre(bench_table_t *bt, 01375 const char *path_prefix, int number_of_files, 01376 size_t block_size, int record_num, 01377 uint32_t policy, const char *open_mode) 01378 { 01379 enum Exception { BENCH_X0_LJF_PRE 01380 , FILE_WRITE 01381 , JOURNAL_COMMIT 01382 , NONE } excp; 01383 int ret_cod = JF_RC_INTERNAL_ERROR; 01384 01385 JF_TRACE(("bench_X1_ljf_pre\n")); 01386 TRY { 01387 int i, j; 01388 01389 ret_cod = bench_X0_ljf_pre(bt, path_prefix, number_of_files, 01390 policy, open_mode); 01391 if (JF_RC_OK != ret_cod) 01392 THROW(BENCH_X0_LJF_PRE); 01393 01394 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01395 for (j = 0; j < record_num * BENCH_TEST_UPDATE_FACTOR; 01396 ++j) { 01397 size_t w; 01398 ret_cod = jf_file_write( 01399 bench_table_get_jfile(bt, i), 01400 buffer, block_size, &w); 01401 if (JF_RC_OK != ret_cod || block_size != w) 01402 THROW(FILE_WRITE); 01403 } /* for (j = 0; j < n; ++j) */ 01404 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01405 01406 ret_cod = jf_journal_commit( 01407 bench_table_get_journal(bt)); 01408 if (JF_RC_OK != ret_cod) 01409 THROW(JOURNAL_COMMIT); 01410 01411 THROW(NONE); 01412 } CATCH { 01413 switch (excp) { 01414 case BENCH_X0_LJF_PRE: 01415 case FILE_WRITE: 01416 case JOURNAL_COMMIT: 01417 break; 01418 case NONE: 01419 ret_cod = JF_RC_OK; 01420 break; 01421 default: 01422 ret_cod = JF_RC_INTERNAL_ERROR; 01423 } /* switch (excp) */ 01424 } /* TRY-CATCH */ 01425 JF_TRACE(("bench_X1_ljf_pre/excp=%d/" 01426 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01427 return ret_cod; 01428 } 01429 01430 01431 01432 int bench_00_sio_pre(bench_table_t *bt, 01433 const char *path_prefix, int number_of_files, 01434 size_t block_size, int record_num, uint32_t policy) 01435 { 01436 int ret_cod = JF_RC_INTERNAL_ERROR; 01437 JF_TRACE(("bench_00_sio_pre\n")); 01438 ret_cod = bench_X0_sio_pre(bt, path_prefix, number_of_files, 01439 policy, "ab"); 01440 JF_TRACE(("bench_00_sio_pre/" 01441 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01442 return ret_cod; 01443 } 01444 01445 01446 01447 int bench_00_sio_post(bench_table_t *bt) 01448 { 01449 int ret_cod = JF_RC_INTERNAL_ERROR; 01450 JF_TRACE(("bench_00_sio_post\n")); 01451 ret_cod = bench_X0_sio_post(bt); 01452 JF_TRACE(("bench_00_sio_post/" 01453 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01454 return ret_cod; 01455 } 01456 01457 01458 01459 int bench_00_sio_run(bench_table_t *bt, const void *buffer, 01460 size_t block_size, int record_num) 01461 { 01462 enum Exception { FWRITE_ERROR 01463 , STREAM_SYNC 01464 , NONE } excp; 01465 int ret_cod = JF_RC_INTERNAL_ERROR; 01466 01467 JF_TRACE(("bench_00_sio_run\n")); 01468 TRY { 01469 int i, j; 01470 01471 for (j = 0; j < record_num; ++j) { 01472 /* writing */ 01473 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01474 if (1 != fwrite( 01475 buffer, block_size, 1, 01476 bench_table_get_stream(bt, i))) 01477 THROW(FWRITE_ERROR); 01478 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01479 } /* for (j = 0; j < n; ++j) */ 01480 01481 /* committing */ 01482 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01483 ret_cod = jf_stream_sync( 01484 bench_table_get_stream(bt, i), 01485 bench_table_get_policy(bt)); 01486 if (JF_RC_OK != ret_cod) 01487 THROW(STREAM_SYNC); 01488 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01489 01490 THROW(NONE); 01491 } CATCH { 01492 switch (excp) { 01493 case STREAM_SYNC: 01494 break; 01495 case FWRITE_ERROR: 01496 ret_cod = JF_RC_FWRITE_ERROR; 01497 break; 01498 case NONE: 01499 ret_cod = JF_RC_OK; 01500 break; 01501 default: 01502 ret_cod = JF_RC_INTERNAL_ERROR; 01503 } /* switch (excp) */ 01504 } /* TRY-CATCH */ 01505 JF_TRACE(("bench_00_sio_run/excp=%d/" 01506 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01507 return ret_cod; 01508 } 01509 01510 01511 01512 int bench_00_ljf_pre(bench_table_t *bt, 01513 const char *path_prefix, int number_of_files, 01514 size_t block_size, int record_num, uint32_t policy) 01515 { 01516 int ret_cod = JF_RC_INTERNAL_ERROR; 01517 01518 JF_TRACE(("bench_00_ljf_pre\n")); 01519 ret_cod = bench_X0_ljf_pre(bt, path_prefix, number_of_files, 01520 policy, "a"); 01521 JF_TRACE(("bench_00_ljf_pre/" 01522 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01523 return ret_cod; 01524 } 01525 01526 01527 01528 int bench_00_ljf_post(bench_table_t *bt) 01529 { 01530 int ret_cod = JF_RC_INTERNAL_ERROR; 01531 JF_TRACE(("bench_00_ljf_post\n")); 01532 ret_cod = bench_X0_ljf_post(bt); 01533 JF_TRACE(("bench_00_ljf_post/" 01534 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01535 return ret_cod; 01536 } 01537 01538 01539 01540 int bench_00_ljf_run(bench_table_t *bt, const void *buffer, 01541 size_t block_size, int record_num) 01542 { 01543 enum Exception { FILE_WRITE 01544 , JOURNAL_COMMIT 01545 , NONE } excp; 01546 int ret_cod = JF_RC_INTERNAL_ERROR; 01547 01548 JF_TRACE(("bench_00_ljf_run\n")); 01549 TRY { 01550 int i, j; 01551 01552 for (j = 0; j < record_num; ++j) { 01553 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01554 size_t w; 01555 ret_cod = jf_file_write( 01556 bench_table_get_jfile(bt, i), 01557 buffer, block_size, &w); 01558 if (JF_RC_OK != ret_cod || block_size != w) 01559 THROW(FILE_WRITE); 01560 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01561 } /* for (j = 0; j < n; ++j) */ 01562 01563 ret_cod = jf_journal_commit( 01564 bench_table_get_journal(bt)); 01565 if (JF_RC_OK != ret_cod) 01566 THROW(JOURNAL_COMMIT); 01567 01568 THROW(NONE); 01569 } CATCH { 01570 switch (excp) { 01571 case FILE_WRITE: 01572 case JOURNAL_COMMIT: 01573 break; 01574 case NONE: 01575 ret_cod = JF_RC_OK; 01576 break; 01577 default: 01578 ret_cod = JF_RC_INTERNAL_ERROR; 01579 } /* switch (excp) */ 01580 } /* TRY-CATCH */ 01581 JF_TRACE(("bench_00_ljf_run/excp=%d/" 01582 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01583 return ret_cod; 01584 } 01585 01586 01587 01588 int bench_01_sio_pre(bench_table_t *bt, 01589 const char *path_prefix, int number_of_files, 01590 size_t block_size, int record_num, uint32_t policy) 01591 { 01592 int ret_cod = JF_RC_INTERNAL_ERROR; 01593 01594 JF_TRACE(("bench_01_sio_pre\n")); 01595 ret_cod = bench_X0_sio_pre(bt, path_prefix, number_of_files, 01596 policy, "ab+"); 01597 JF_TRACE(("bench_01_sio_pre/" 01598 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01599 return ret_cod; 01600 } 01601 01602 01603 01604 int bench_01_sio_post(bench_table_t *bt) 01605 { 01606 int ret_cod = JF_RC_INTERNAL_ERROR; 01607 JF_TRACE(("bench_01_sio_post\n")); 01608 ret_cod = bench_X0_sio_post(bt); 01609 JF_TRACE(("bench_01_sio_post/" 01610 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01611 return ret_cod; 01612 } 01613 01614 01615 01616 int bench_01_sio_run(bench_table_t *bt, const void *buffer, 01617 size_t block_size, int record_num) 01618 { 01619 enum Exception { FWRITE_ERROR 01620 , FSEEK_ERROR 01621 , FREAD_ERROR 01622 , STREAM_SYNC 01623 , NONE } excp; 01624 int ret_cod = JF_RC_INTERNAL_ERROR; 01625 01626 JF_TRACE(("bench_01_sio_run\n")); 01627 TRY { 01628 int i, j; 01629 byte_t tmp_buffer[BENCH_TEST_MAX_RECSIZE]; 01630 01631 for (j = 0; j < record_num; ++j) { 01632 /* writing */ 01633 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01634 if (1 != fwrite( 01635 buffer, block_size, 1, 01636 bench_table_get_stream(bt, i))) 01637 THROW(FWRITE_ERROR); 01638 if (0 != fseeko( 01639 bench_table_get_stream(bt, i), 01640 -((off_t)block_size), 01641 SEEK_CUR)) 01642 THROW(FSEEK_ERROR); 01643 if (1 != fread(tmp_buffer, block_size, 1, 01644 bench_table_get_stream(bt, i))) 01645 THROW(FREAD_ERROR); 01646 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01647 } /* for (j = 0; j < n; ++j) */ 01648 01649 /* committing */ 01650 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01651 ret_cod = jf_stream_sync( 01652 bench_table_get_stream(bt, i), 01653 bench_table_get_policy(bt)); 01654 if (JF_RC_OK != ret_cod) 01655 THROW(STREAM_SYNC); 01656 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01657 01658 THROW(NONE); 01659 } CATCH { 01660 switch (excp) { 01661 case STREAM_SYNC: 01662 break; 01663 case FWRITE_ERROR: 01664 ret_cod = JF_RC_FWRITE_ERROR; 01665 break; 01666 case FSEEK_ERROR: 01667 ret_cod = JF_RC_FSEEK_ERROR; 01668 break; 01669 case FREAD_ERROR: 01670 ret_cod = JF_RC_FREAD_ERROR; 01671 break; 01672 case NONE: 01673 ret_cod = JF_RC_OK; 01674 break; 01675 default: 01676 ret_cod = JF_RC_INTERNAL_ERROR; 01677 } /* switch (excp) */ 01678 } /* TRY-CATCH */ 01679 JF_TRACE(("bench_01_sio_run/excp=%d/" 01680 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01681 return ret_cod; 01682 } 01683 01684 01685 01686 int bench_01_ljf_pre(bench_table_t *bt, 01687 const char *path_prefix, int number_of_files, 01688 size_t block_size, int record_num, uint32_t policy) 01689 { 01690 int ret_cod = JF_RC_INTERNAL_ERROR; 01691 01692 JF_TRACE(("bench_01_ljf_pre\n")); 01693 ret_cod = bench_X0_ljf_pre(bt, path_prefix, number_of_files, 01694 policy, "a+"); 01695 JF_TRACE(("bench_01_ljf_pre/" 01696 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01697 return ret_cod; 01698 } 01699 01700 01701 01702 int bench_01_ljf_post(bench_table_t *bt) 01703 { 01704 int ret_cod = JF_RC_INTERNAL_ERROR; 01705 JF_TRACE(("bench_01_ljf_post\n")); 01706 ret_cod = bench_X0_ljf_post(bt); 01707 JF_TRACE(("bench_01_ljf_post/" 01708 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01709 return ret_cod; 01710 } 01711 01712 01713 01714 int bench_01_ljf_run(bench_table_t *bt, const void *buffer, 01715 size_t block_size, int record_num) 01716 { 01717 enum Exception { FILE_WRITE 01718 , FILE_SEEK 01719 , FILE_READ 01720 , JOURNAL_COMMIT 01721 , NONE } excp; 01722 int ret_cod = JF_RC_INTERNAL_ERROR; 01723 01724 JF_TRACE(("bench_01_ljf_run\n")); 01725 TRY { 01726 int i, j; 01727 byte_t tmp_buffer[BENCH_TEST_MAX_RECSIZE]; 01728 01729 for (j = 0; j < record_num; ++j) { 01730 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01731 size_t w; 01732 ret_cod = jf_file_write( 01733 bench_table_get_jfile(bt, i), 01734 buffer, block_size, &w); 01735 if (JF_RC_OK != ret_cod || block_size != w) 01736 THROW(FILE_WRITE); 01737 ret_cod = jf_file_seek( 01738 bench_table_get_jfile(bt, i), 01739 -((jf_offset_t)block_size), 01740 SEEK_CUR); 01741 if (JF_RC_OK != ret_cod) 01742 THROW(FILE_SEEK); 01743 ret_cod = jf_file_read( 01744 bench_table_get_jfile(bt, i), 01745 tmp_buffer, block_size, &w); 01746 if (JF_RC_OK != ret_cod) 01747 THROW(FILE_READ); 01748 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01749 } /* for (j = 0; j < n; ++j) */ 01750 01751 ret_cod = jf_journal_commit( 01752 bench_table_get_journal(bt)); 01753 if (JF_RC_OK != ret_cod) 01754 THROW(JOURNAL_COMMIT); 01755 01756 THROW(NONE); 01757 } CATCH { 01758 switch (excp) { 01759 case FILE_WRITE: 01760 case FILE_SEEK: 01761 case FILE_READ: 01762 case JOURNAL_COMMIT: 01763 break; 01764 case NONE: 01765 ret_cod = JF_RC_OK; 01766 break; 01767 default: 01768 ret_cod = JF_RC_INTERNAL_ERROR; 01769 } /* switch (excp) */ 01770 } /* TRY-CATCH */ 01771 JF_TRACE(("bench_01_ljf_run/excp=%d/" 01772 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01773 return ret_cod; 01774 } 01775 01776 01777 01778 int bench_02_sio_pre(bench_table_t *bt, 01779 const char *path_prefix, int number_of_files, 01780 size_t block_size, int record_num, uint32_t policy) 01781 { 01782 int ret_cod = JF_RC_INTERNAL_ERROR; 01783 01784 JF_TRACE(("bench_02_sio_pre\n")); 01785 ret_cod = bench_X1_sio_pre(bt, path_prefix, number_of_files, 01786 block_size, record_num, policy, "wb+"); 01787 JF_TRACE(("bench_02_sio_pre/" 01788 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01789 return ret_cod; 01790 } 01791 01792 01793 01794 int bench_02_sio_post(bench_table_t *bt) 01795 { 01796 int ret_cod = JF_RC_INTERNAL_ERROR; 01797 JF_TRACE(("bench_02_sio_post\n")); 01798 ret_cod = bench_X0_sio_post(bt); 01799 JF_TRACE(("bench_02_sio_post/" 01800 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01801 return ret_cod; 01802 } 01803 01804 01805 01806 int bench_02_sio_run(bench_table_t *bt, const void *buffer, 01807 size_t block_size, int record_num) 01808 { 01809 enum Exception { FSEEK_ERROR 01810 , FWRITE_ERROR 01811 , STREAM_SYNC 01812 , NONE } excp; 01813 int ret_cod = JF_RC_INTERNAL_ERROR; 01814 01815 JF_TRACE(("bench_02_sio_run\n")); 01816 TRY { 01817 int i, j; 01818 01819 for (j = 0; j < record_num; ++j) { 01820 /* writing */ 01821 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01822 off_t offset; 01823 offset = (off_t)( 01824 random() % (block_size * 01825 (BENCH_TEST_UPDATE_FACTOR * 01826 record_num - 1))); 01827 if (0 != fseeko( 01828 bench_table_get_stream(bt, i), 01829 offset, SEEK_SET)) 01830 THROW(FSEEK_ERROR); 01831 if (1 != fwrite( 01832 buffer, block_size, 1, 01833 bench_table_get_stream(bt, i))) 01834 THROW(FWRITE_ERROR); 01835 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01836 } /* for (j = 0; j < n; ++j) */ 01837 01838 /* committing */ 01839 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01840 ret_cod = jf_stream_sync( 01841 bench_table_get_stream(bt, i), 01842 bench_table_get_policy(bt)); 01843 if (JF_RC_OK != ret_cod) 01844 THROW(STREAM_SYNC); 01845 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01846 01847 THROW(NONE); 01848 } CATCH { 01849 switch (excp) { 01850 case FSEEK_ERROR: 01851 ret_cod = JF_RC_FSEEK_ERROR; 01852 break; 01853 case FWRITE_ERROR: 01854 ret_cod = JF_RC_FWRITE_ERROR; 01855 break; 01856 case STREAM_SYNC: 01857 break; 01858 case NONE: 01859 ret_cod = JF_RC_OK; 01860 break; 01861 default: 01862 ret_cod = JF_RC_INTERNAL_ERROR; 01863 } /* switch (excp) */ 01864 } /* TRY-CATCH */ 01865 JF_TRACE(("bench_02_sio_run/excp=%d/" 01866 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01867 return ret_cod; 01868 } 01869 01870 01871 01872 int bench_02_ljf_pre(bench_table_t *bt, 01873 const char *path_prefix, int number_of_files, 01874 size_t block_size, int record_num, uint32_t policy) 01875 { 01876 enum Exception { BENCH_X0_LJF_PRE 01877 , FILE_WRITE 01878 , JOURNAL_COMMIT 01879 , NONE } excp; 01880 int ret_cod = JF_RC_INTERNAL_ERROR; 01881 01882 JF_TRACE(("bench_02_ljf_pre\n")); 01883 TRY { 01884 int i, j; 01885 01886 ret_cod = bench_X1_ljf_pre(bt, path_prefix, number_of_files, 01887 block_size, record_num, 01888 policy, "w+"); 01889 if (JF_RC_OK != ret_cod) 01890 THROW(BENCH_X0_LJF_PRE); 01891 01892 for (j = 0; j < record_num; ++j) { 01893 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01894 size_t w; 01895 ret_cod = jf_file_write( 01896 bench_table_get_jfile(bt, i), 01897 buffer, block_size, &w); 01898 if (JF_RC_OK != ret_cod || block_size != w) 01899 THROW(FILE_WRITE); 01900 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01901 } /* for (j = 0; j < n; ++j) */ 01902 01903 ret_cod = jf_journal_commit( 01904 bench_table_get_journal(bt)); 01905 if (JF_RC_OK != ret_cod) 01906 THROW(JOURNAL_COMMIT); 01907 01908 THROW(NONE); 01909 } CATCH { 01910 switch (excp) { 01911 case BENCH_X0_LJF_PRE: 01912 case FILE_WRITE: 01913 case JOURNAL_COMMIT: 01914 break; 01915 case NONE: 01916 ret_cod = JF_RC_OK; 01917 break; 01918 default: 01919 ret_cod = JF_RC_INTERNAL_ERROR; 01920 } /* switch (excp) */ 01921 } /* TRY-CATCH */ 01922 JF_TRACE(("bench_02_ljf_pre/excp=%d/" 01923 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01924 return ret_cod; 01925 } 01926 01927 01928 01929 int bench_02_ljf_post(bench_table_t *bt) 01930 { 01931 int ret_cod = JF_RC_INTERNAL_ERROR; 01932 JF_TRACE(("bench_02_ljf_post\n")); 01933 ret_cod = bench_X0_ljf_post(bt); 01934 JF_TRACE(("bench_02_ljf_post/" 01935 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 01936 return ret_cod; 01937 } 01938 01939 01940 01941 int bench_02_ljf_run(bench_table_t *bt, const void *buffer, 01942 size_t block_size, int record_num) 01943 { 01944 enum Exception { FILE_WRITE 01945 , FILE_SEEK 01946 , JOURNAL_COMMIT 01947 , NONE } excp; 01948 int ret_cod = JF_RC_INTERNAL_ERROR; 01949 01950 JF_TRACE(("bench_02_ljf_run\n")); 01951 TRY { 01952 int i, j; 01953 01954 for (j = 0; j < record_num; ++j) { 01955 for (i = 1; i <= bench_table_get_last(bt); ++i) { 01956 jf_offset_t offset; 01957 size_t w; 01958 offset = (jf_offset_t)( 01959 random() % (block_size * 01960 (BENCH_TEST_UPDATE_FACTOR * 01961 record_num - 1))); 01962 ret_cod = jf_file_seek( 01963 bench_table_get_jfile(bt, i), 01964 offset, SEEK_SET); 01965 if (JF_RC_OK != ret_cod) 01966 THROW(FILE_SEEK); 01967 ret_cod = jf_file_write( 01968 bench_table_get_jfile(bt, i), 01969 buffer, block_size, &w); 01970 if (JF_RC_OK != ret_cod || block_size != w) 01971 THROW(FILE_WRITE); 01972 } /* for (i = 1; i <= bench_table_get_last(bt); */ 01973 } /* for (j = 0; j < n; ++j) */ 01974 01975 ret_cod = jf_journal_commit( 01976 bench_table_get_journal(bt)); 01977 if (JF_RC_OK != ret_cod) 01978 THROW(JOURNAL_COMMIT); 01979 01980 THROW(NONE); 01981 } CATCH { 01982 switch (excp) { 01983 case FILE_WRITE: 01984 case FILE_SEEK: 01985 case JOURNAL_COMMIT: 01986 break; 01987 case NONE: 01988 ret_cod = JF_RC_OK; 01989 break; 01990 default: 01991 ret_cod = JF_RC_INTERNAL_ERROR; 01992 } /* switch (excp) */ 01993 } /* TRY-CATCH */ 01994 JF_TRACE(("bench_02_ljf_run/excp=%d/" 01995 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 01996 return ret_cod; 01997 } 01998 01999 02000 02001 int bench_03_sio_pre(bench_table_t *bt, 02002 const char *path_prefix, int number_of_files, 02003 size_t block_size, int record_num, uint32_t policy) 02004 { 02005 int ret_cod = JF_RC_INTERNAL_ERROR; 02006 02007 JF_TRACE(("bench_03_sio_pre\n")); 02008 ret_cod = bench_X1_sio_pre(bt, path_prefix, number_of_files, 02009 block_size, record_num, policy, "wb+"); 02010 JF_TRACE(("bench_03_sio_pre/" 02011 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 02012 return ret_cod; 02013 } 02014 02015 02016 02017 int bench_03_sio_post(bench_table_t *bt) 02018 { 02019 int ret_cod = JF_RC_INTERNAL_ERROR; 02020 JF_TRACE(("bench_03_sio_post\n")); 02021 ret_cod = bench_X0_sio_post(bt); 02022 JF_TRACE(("bench_03_sio_post/" 02023 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 02024 return ret_cod; 02025 } 02026 02027 02028 02029 int bench_03_sio_run(bench_table_t *bt, const void *buffer, 02030 size_t block_size, int record_num) 02031 { 02032 enum Exception { FSEEK_ERROR1 02033 , FREAD_ERROR 02034 , FSEEK_ERROR2 02035 , FWRITE_ERROR 02036 , STREAM_SYNC 02037 , NONE } excp; 02038 int ret_cod = JF_RC_INTERNAL_ERROR; 02039 02040 JF_TRACE(("bench_03_sio_run\n")); 02041 TRY { 02042 int i, j; 02043 byte_t tmp_buffer[BENCH_TEST_MAX_RECSIZE]; 02044 02045 for (j = 0; j < record_num; ++j) { 02046 /* writing */ 02047 for (i = 1; i <= bench_table_get_last(bt); ++i) { 02048 off_t offset; 02049 offset = (off_t)( 02050 random() % (block_size * 02051 (BENCH_TEST_UPDATE_FACTOR * 02052 record_num - 1))); 02053 if (0 != fseeko( 02054 bench_table_get_stream(bt, i), 02055 offset, SEEK_SET)) 02056 THROW(FSEEK_ERROR1); 02057 if (1 != fread(tmp_buffer, block_size, 1, 02058 bench_table_get_stream(bt, i))) 02059 THROW(FREAD_ERROR); 02060 if (0 != fseeko( 02061 bench_table_get_stream(bt, i), 02062 offset, SEEK_SET)) 02063 THROW(FSEEK_ERROR2); 02064 if (1 != fwrite( 02065 buffer, block_size, 1, 02066 bench_table_get_stream(bt, i))) 02067 THROW(FWRITE_ERROR); 02068 } /* for (i = 1; i <= bench_table_get_last(bt); */ 02069 } /* for (j = 0; j < n; ++j) */ 02070 02071 /* committing */ 02072 for (i = 1; i <= bench_table_get_last(bt); ++i) { 02073 ret_cod = jf_stream_sync( 02074 bench_table_get_stream(bt, i), 02075 bench_table_get_policy(bt)); 02076 if (JF_RC_OK != ret_cod) 02077 THROW(STREAM_SYNC); 02078 } /* for (i = 1; i <= bench_table_get_last(bt); */ 02079 02080 THROW(NONE); 02081 } CATCH { 02082 switch (excp) { 02083 case FSEEK_ERROR1: 02084 case FSEEK_ERROR2: 02085 ret_cod = JF_RC_FSEEK_ERROR; 02086 break; 02087 case FREAD_ERROR: 02088 ret_cod = JF_RC_FREAD_ERROR; 02089 break; 02090 case FWRITE_ERROR: 02091 ret_cod = JF_RC_FWRITE_ERROR; 02092 break; 02093 case STREAM_SYNC: 02094 break; 02095 case NONE: 02096 ret_cod = JF_RC_OK; 02097 break; 02098 default: 02099 ret_cod = JF_RC_INTERNAL_ERROR; 02100 } /* switch (excp) */ 02101 } /* TRY-CATCH */ 02102 JF_TRACE(("bench_03_sio_run/excp=%d/" 02103 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 02104 return ret_cod; 02105 } 02106 02107 02108 02109 int bench_03_ljf_pre(bench_table_t *bt, 02110 const char *path_prefix, int number_of_files, 02111 size_t block_size, int record_num, uint32_t policy) 02112 { 02113 int ret_cod = JF_RC_INTERNAL_ERROR; 02114 02115 JF_TRACE(("bench_03_ljf_pre\n")); 02116 ret_cod = bench_X1_ljf_pre(bt, path_prefix, number_of_files, 02117 block_size, record_num, policy, "w+"); 02118 JF_TRACE(("bench_03_ljf_pre/" 02119 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 02120 return ret_cod; 02121 } 02122 02123 02124 02125 int bench_03_ljf_post(bench_table_t *bt) 02126 { 02127 int ret_cod = JF_RC_INTERNAL_ERROR; 02128 JF_TRACE(("bench_03_ljf_post\n")); 02129 ret_cod = bench_X0_ljf_post(bt); 02130 JF_TRACE(("bench_03_ljf_post/" 02131 "ret_cod=%d/errno=%d\n", ret_cod, errno)); 02132 return ret_cod; 02133 } 02134 02135 02136 02137 int bench_03_ljf_run(bench_table_t *bt, const void *buffer, 02138 size_t block_size, int record_num) 02139 { 02140 enum Exception { FILE_SEEK1 02141 , FILE_READ 02142 , FILE_SEEK2 02143 , FILE_WRITE 02144 , JOURNAL_COMMIT 02145 , NONE } excp; 02146 int ret_cod = JF_RC_INTERNAL_ERROR; 02147 02148 JF_TRACE(("bench_03_ljf_run\n")); 02149 TRY { 02150 int i, j; 02151 byte_t tmp_buffer[BENCH_TEST_MAX_RECSIZE]; 02152 02153 for (j = 0; j < record_num; ++j) { 02154 for (i = 1; i <= bench_table_get_last(bt); ++i) { 02155 jf_offset_t offset; 02156 size_t w; 02157 offset = (jf_offset_t)( 02158 random() % (block_size * 02159 (BENCH_TEST_UPDATE_FACTOR * 02160 record_num - 1))); 02161 ret_cod = jf_file_seek( 02162 bench_table_get_jfile(bt, i), 02163 offset, SEEK_SET); 02164 if (JF_RC_OK != ret_cod) 02165 THROW(FILE_SEEK1); 02166 ret_cod = jf_file_read( 02167 bench_table_get_jfile(bt, i), 02168 tmp_buffer, block_size, &w); 02169 if (JF_RC_OK != ret_cod) 02170 THROW(FILE_READ); 02171 ret_cod = jf_file_seek( 02172 bench_table_get_jfile(bt, i), 02173 offset, SEEK_SET); 02174 if (JF_RC_OK != ret_cod) 02175 THROW(FILE_SEEK2); 02176 ret_cod = jf_file_write( 02177 bench_table_get_jfile(bt, i), 02178 buffer, block_size, &w); 02179 if (JF_RC_OK != ret_cod || block_size != w) 02180 THROW(FILE_WRITE); 02181 } /* for (i = 1; i <= bench_table_get_last(bt); */ 02182 } /* for (j = 0; j < n; ++j) */ 02183 02184 ret_cod = jf_journal_commit( 02185 bench_table_get_journal(bt)); 02186 if (JF_RC_OK != ret_cod) 02187 THROW(JOURNAL_COMMIT); 02188 02189 THROW(NONE); 02190 } CATCH { 02191 switch (excp) { 02192 case FILE_WRITE: 02193 case FILE_SEEK1: 02194 case FILE_SEEK2: 02195 case FILE_READ: 02196 case JOURNAL_COMMIT: 02197 break; 02198 case NONE: 02199 ret_cod = JF_RC_OK; 02200 break; 02201 default: 02202 ret_cod = JF_RC_INTERNAL_ERROR; 02203 } /* switch (excp) */ 02204 } /* TRY-CATCH */ 02205 JF_TRACE(("bench_03_ljf_run/excp=%d/" 02206 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 02207 return ret_cod; 02208 } 02209 02210 02211

Copyright 2005 © Tiian