00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <jf/jf_config.h>
00021
00022
00023
00024
#ifdef HAVE_ERRNO_H
00025
# include <errno.h>
00026
#endif
00027
#ifdef HAVE_STRING_H
00028
# include <string.h>
00029
#endif
00030
#ifdef HAVE_LIBGEN_H
00031
# include <libgen.h>
00032
#endif
00033
00034
#include <jf_file.h>
00035
#include <jf/jf_timer.h>
00036
#include <jf/jf_patches.h>
00037
00038
00039
00040
00041
#ifdef JF_TRACE_MODULE
00042
# undef JF_TRACE_MODULE
00043
#endif
00044 #define JF_TRACE_MODULE JF_TRACE_MOD_PRG_UTILS
00045
00046
00047
00048
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;
00068
00069
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
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
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
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
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
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
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
00194
00195
00196
00197
00198
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
00294 #define BENCH_TEST_REPETITIONS 12
00295
00296
00297 #define BENCH_TEST_TRANSACTIONS 25
00298
00299
00300
00301
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
00322
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
00332
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
00340
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
00350
void bench_test_results_reset(bench_test_results_t btr);
00351
00352
00353
int bench_test_results_compute(bench_test_results_t btr);
00354
00355
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
00364
void bench_test_results_clean(bench_test_results_t btr);
00365
00366
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 }
00394
00395
00396
while ((opt =
getopt(argc, argv,
"p:c:v:x:hf")) != -1) {
00397
switch (opt) {
00398
case 'p':
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':
00409
print_help(argv[0]);
00410
return 0;
00411
break;
00412
case 'c':
00413
csv_file_name =
optarg;
00414
break;
00415
case 'x':
00416
xml_file_name =
optarg;
00417
break;
00418
case 'v':
00419
verbose_mode = strtol(
optarg, NULL, 0);
00420
break;
00421
case 'f':
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 }
00435 }
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 }
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 }
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 }
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 }
00541 }
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 }
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 }
00577 }
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 }
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 }
00664 }
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 }
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
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 }
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
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 }
00819 }
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
00837
00838
00839
00840
00841
00842
00843
int best = 0, worst = 0;
00844
00845
for (i = 0; i <
BENCH_TEST_REPETITIONS; ++i) {
00846
00847
00848
00849
00850
00851
00852
00853
00854 }
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
for (i = 1; i <
BENCH_TEST_REPETITIONS; ++i) {
00866
00867
00868
00869
00870
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 }
00877 btr[best][j][k][l][m].valid =
FALSE;
00878 btr[worst][j][k][l][m].valid =
FALSE;
00879 }
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 }
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 }
00997
if (NULL != xml)
00998 fprintf(xml,
" </number_of_records>\n");
00999 }
01000
if (NULL != xml)
01001 fprintf(xml,
" </record_size>\n");
01002 }
01003
if (NULL != xml)
01004 fprintf(xml,
" </number_of_files>\n");
01005 }
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 }
01037
01038
if (NULL != xml)
01039 fprintf(xml,
" </test>\n");
01040 }
01041
01042
if (NULL != csv)
01043 fclose(csv);
01044
if (NULL != xml) {
01045 fprintf(xml,
"</libjf_benchmark>\n");
01046 fclose(xml);
01047 }
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 }
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 }
01111 }
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 }
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 }
01161 }
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 }
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 }
01248 }
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 }
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 }
01303 }
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
01335
if (1 != fwrite(
01336
buffer, block_size, 1,
01337
bench_table_get_stream(bt, i)))
01338
THROW(FWRITE_ERROR);
01339 }
01340 }
01341
01342
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 }
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 }
01366 }
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 }
01404 }
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 }
01424 }
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
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 }
01479 }
01480
01481
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 }
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 }
01504 }
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 }
01561 }
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 }
01580 }
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
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 }
01647 }
01648
01649
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 }
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 }
01678 }
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 }
01749 }
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 }
01770 }
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
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 }
01836 }
01837
01838
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 }
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 }
01864 }
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 }
01901 }
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 }
01921 }
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 }
01973 }
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 }
01993 }
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
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 }
02069 }
02070
02071
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 }
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 }
02101 }
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 }
02182 }
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 }
02204 }
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