diff options
-rw-r--r-- | src/mintdb/perf_taler_mintdb.c | 3 | ||||
-rw-r--r-- | src/mintdb/perf_taler_mintdb_interpreter.c | 179 | ||||
-rw-r--r-- | src/mintdb/perf_taler_mintdb_interpreter.h | 57 |
3 files changed, 228 insertions, 11 deletions
diff --git a/src/mintdb/perf_taler_mintdb.c b/src/mintdb/perf_taler_mintdb.c index bc855f300..91d61f467 100644 --- a/src/mintdb/perf_taler_mintdb.c +++ b/src/mintdb/perf_taler_mintdb.c @@ -120,6 +120,7 @@ main (int argc, char ** argv) "./test-mint-db-postgres.conf", NULL, benchmark); - + if (GNUNET_SYSERR == ret) + return 1; return 0; } diff --git a/src/mintdb/perf_taler_mintdb_interpreter.c b/src/mintdb/perf_taler_mintdb_interpreter.c index 98a8c4608..5eb5aad52 100644 --- a/src/mintdb/perf_taler_mintdb_interpreter.c +++ b/src/mintdb/perf_taler_mintdb_interpreter.c @@ -24,6 +24,8 @@ #include "gauger.h" +#define FIND_TEST(cmd, string, arg) \ + /** * Represents the state of the interpreter */ @@ -375,6 +377,26 @@ interpret_load_array (struct PERF_TALER_MINTDB_interpreter_state *state) /** + * Part of the interpreter specific to + * #PERF_TALER_MINTDB_CMD_LOAD_RANDOM + * Get a random element from a #PERF_TALER_MINTDB_CMD_SAVE_ARRAY and exposes it + */ +static void +interpret_load_random (struct PERF_TALER_MINTDB_interpreter_state *state) +{ + unsigned int index; + int save_index; + + GNUNET_assert (0 <= + (save_index = cmd_find (state->cmd, + state->cmd[state->i].details.load_random.label_save))); + index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, + state->cmd[save_index].details.save_array.nb_saved); + state->cmd[state->i].exposed = + data_copy (state->cmd[save_index].details.data_saved[index]); +} + +/** * Iterate over the commands, acting accordingly at each step * * @param state the current state of the interpreter @@ -382,7 +404,6 @@ interpret_load_array (struct PERF_TALER_MINTDB_interpreter_state *state) static int interpret (struct PERF_TALER_MINTDB_interpreter_state *state) { - for (state->i=0; PERF_TALER_MINTDB_CMD_END != state->cmd[state->i].command; state->i++) { switch (state->cmd[state->i].command) @@ -448,6 +469,7 @@ interpret (struct PERF_TALER_MINTDB_interpreter_state *state) case PERF_TALER_MINTDB_CMD_ABORT_TRANSACTION: state->plugin->rollback (state->plugin->cls, state->session); + break; case PERF_TALER_MINTDB_CMD_SAVE_ARRAY: interpret_save_array (state); @@ -457,13 +479,17 @@ interpret (struct PERF_TALER_MINTDB_interpreter_state *state) interpret_load_array (state); break; + case PERF_TALER_MINTDB_CMD_LOAD_RANDOM: + interprete_load_random(state); + break; + case PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT: { int dki_index; struct TALER_MINTDB_Deposit *deposit; GNUNET_assert (GNUNET_SYSERR != - (dki_index = cmd_find(state->cmd, + (dki_index = cmd_find (state->cmd, state->cmd[state->i].details.insert_deposit.label_dki))); GNUNET_assert (NULL != (deposit = PERF_TALER_MINTDB_deposit_init (state->cmd[dki_index].exposed.data.dki))); @@ -508,7 +534,7 @@ interpret (struct PERF_TALER_MINTDB_interpreter_state *state) state->session, &reserve->pub, &reserve->balance, - GNUNET_TIME_absolute_get(), + GNUNET_TIME_absolute_get (), details ); json_decref (details); @@ -642,13 +668,14 @@ PERF_TALER_MINTDB_interpret (struct TALER_MINTDB_Plugin *db_plugin, /** + * Initialize the database and run the benchmark * * @param benchmark_name the name of the benchmark, displayed in the logs * @param configuration_file path to the taler configuration file to use * @param init the commands to use for the database initialisation, * if #NULL the standard initialization is used * @param benchmark the commands for the benchmark - * @return GNUNET_OK upon success; GNUNET_SYSERR upon failure + * @return #GNUNET_OK upon success; GNUNET_SYSERR upon failure */ int PERF_TALER_MINTDB_run_benchmark (const char *benchmark_name, @@ -752,8 +779,6 @@ PERF_TALER_MINTDB_run_benchmark (const char *benchmark_name, "Error connectiong to the database"); return ret; } - - ret = plugin->create_tables (plugin->cls, GNUNET_YES); if (GNUNET_OK != ret) @@ -769,6 +794,9 @@ PERF_TALER_MINTDB_run_benchmark (const char *benchmark_name, { init = init_def; } + if (GNUNET_SYSERR ==PERF_TALER_MINTDB_check (init)) + return GNUNET_SYSERR; + ret = PERF_TALER_MINTDB_interpret (plugin, init); if (GNUNET_OK != ret) @@ -780,6 +808,8 @@ PERF_TALER_MINTDB_run_benchmark (const char *benchmark_name, /* * Running the benchmark */ + if (GNUNET_SYSERR ==PERF_TALER_MINTDB_check (benchmark)) + return GNUNET_SYSERR; ret = PERF_TALER_MINTDB_interpret (plugin, benchmark); if (GNUNET_OK != ret) @@ -808,3 +838,140 @@ PERF_TALER_MINTDB_run_benchmark (const char *benchmark_name, return ret; } + + +/** + * Tests if @a label is reference to a command of @a cmd + * Prints an error containing @a desc if a problem occurs + * + * @param cmd the cmd array checked + * @param label the label checked + * @param i the index of the command beeing checked (used for error reporting + * @param desc a description of the label checked + */ +static int +find_test (const struct PERF_TALER_MINTDB_Cmd *cmd, + const char *label, + const unsigned int i, + const char *desc) +{ + int ret; + + ret = cmd_find (cmd, label); + if (GNUNET_SYSERR == ret) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Error at %s:index %d wrong label for %s", + cmd[i].label, + i, + desc); + } + return ret; +} + + +/** + * Check if the given command array is syntaxicly correct + * This will check if the label are corrects but will not check if + * they are pointing to an apropriate command. + * + * @param cmd the command array to check + * @return #GNUNET_OK is @a cmd is correct; #GNUNET_SYSERR if it is'nt + */ +int +PERF_TALER_MINTDB_check (const struct PERF_TALER_MINTDB_Cmd *cmd) +{ + unsigned int i; + int ret = GNUNET_OK; + + for (i = 0; PERF_TALER_MINTDB_CMD_END != cmd[i].command; i++) + { + int ret_loc = GNUNET_OK; + switch (cmd[i].command) + { + case PERF_TALER_MINTDB_CMD_END_LOOP: + ret_loc = find_test (cmd, + cmd[i].details.end_loop.label_loop, + i, + "label_loop"); + break; + + case PERF_TALER_MINTDB_CMD_GAUGER: + ret_loc = find_test (cmd, + cmd[i].details.gauger.label_start, + i, + "label_start"); + break; + + case PERF_TALER_MINTDB_CMD_SAVE_ARRAY: + ret_loc = find_test (cmd, + cmd[i].details.save_array.label_loop, + i, + "label_loop"); + ret_loc = find_test (cmd, + cmd[i].details.save_array.label_save, + i, + "label_save"); + break; + + case PERF_TALER_MINTDB_CMD_LOAD_ARRAY: + ret_loc = find_test (cmd, + cmd[i].details.load_array.label_loop, + i, + "label_loop"); + ret_loc = find_test (cmd, + cmd[i].details.load_array.label_save, + i, + "label_save"); + break; + + case PERF_TALER_MINTDB_CMD_GET_DENOMINATION: + ret_loc = find_test (cmd, + cmd[i].details.get_denomination.label_source, + i, + "label_source"); + break; + + case PERF_TALER_MINTDB_CMD_GET_RESERVE: + ret_loc = find_test (cmd, + cmd[i].details.get_reserve.label_source, + i, + "label_source"); + break; + + case PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT: + ret_loc = find_test (cmd, + cmd[i].details.insert_deposit.label_dki, + i, + "label_dki"); + break; + + case PERF_TALER_MINTDB_CMD_GET_DEPOSIT: + ret_loc = find_test (cmd, + cmd[i].details.get_deposit.label_source, + i, + "label_source"); + break; + + case PERF_TALER_MINTDB_CMD_INSERT_WITHDRAW: + ret_loc = find_test (cmd, + cmd[i].details.insert_withdraw.label_dki, + i, + "label_dki"); + break; + + case PERF_TALER_MINTDB_CMD_GET_WITHDRAW: + ret_loc = find_test (cmd, + cmd[i].details.get_withdraw.label_source, + i, + "label_source"); + break; + + default : + break; + } + if (GNUNET_OK == ret) + ret = (GNUNET_SYSERR == ret_loc)?GNUNET_SYSERR:GNUNET_OK; + } + return ret; +} diff --git a/src/mintdb/perf_taler_mintdb_interpreter.h b/src/mintdb/perf_taler_mintdb_interpreter.h index 8595d046b..b62a87e75 100644 --- a/src/mintdb/perf_taler_mintdb_interpreter.h +++ b/src/mintdb/perf_taler_mintdb_interpreter.h @@ -114,9 +114,10 @@ * @param _label_start label of the start of the measurment * @param _label_stop label of the end of the measurment * @param _description description of the measure displayed in Gauger + * @param _unit the unit of the data measured, typicly something/sec * @param _divide number of measurments in the interval [FIXME: need UNIT] */ -#define PERF_TALER_MINTDB_INIT_CMD_GAUGER(_label, _label_start, _label_stop, _description, _divide) \ +#define PERF_TALER_MINTDB_INIT_CMD_GAUGER(_label, _label_start, _label_stop, _description, _unit, _divide) \ { \ .command = PERF_TALER_MINTDB_CMD_GAUGER, \ .label = _label, \ @@ -125,6 +126,7 @@ .label_start = _label_start, \ .label_stop = _label_stop, \ .description = _description, \ + .unit = _unit \ .divide = _divide, \ } \ } @@ -344,6 +346,7 @@ struct PERF_TALER_MINTDB_Data /** * Storage for a variety of data type + * The data saved should match #type */ union PERF_TALER_MINTDB_Memory { @@ -412,7 +415,7 @@ enum PERF_TALER_MINTDB_CMD_Name PERF_TALER_MINTDB_CMD_COMMIT_TRANSACTION, /** - * Abort a transaction + * Abort a transaction started with #PERF_TALER_MINTDB_CMD_START_TRANSACTION */ PERF_TALER_MINTDB_CMD_ABORT_TRANSACTION, @@ -422,11 +425,18 @@ enum PERF_TALER_MINTDB_CMD_Name PERF_TALER_MINTDB_CMD_SAVE_ARRAY, /** - * Load deposits saved earlier + * Load items saved earlier in a #PERF_TALER_MINTDB_CMD_SAVE_ARRAY + * The items are loaded in a random order, but all of them will be loaded */ PERF_TALER_MINTDB_CMD_LOAD_ARRAY, /** + * Loads a random item from a #PERF_TALER_MINTDB_CMD_SAVE_ARRAY + * A random item is loaded each time the command is run + */ + PERF_TALER_MINTDB_CMD_LOAD_RANDOM, + + /** * Insert a deposit into the database */ PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT, @@ -510,7 +520,7 @@ union PERF_TALER_MINTDB_CMD_Details /** * Details about the #PERF_TALER_MINTDB_CMD_GAUGER command */ - struct PERF_TALER_MINTDB_CMD_GaugerDetails + struct PERF_TALER_MINTDB_CMD_gaugerDetails { /** * Label of the starting timestamp @@ -528,6 +538,11 @@ union PERF_TALER_MINTDB_CMD_Details const char *description; /** + * The name of the metric beeing used + */ + const char *unit; + + /** * Constant the result needs to be divided by * to get the result per unit */ @@ -586,6 +601,17 @@ union PERF_TALER_MINTDB_CMD_Details /** + * Contains data for the #PERF_TALER_MINTDB_CMD_LOAD_RANDOM command + */ + struct PERF_TALER_MINTDB_CMD_loadRandomDetails + { + /** + * The label of the #PERF_TALER_MINTDB_CMD_SAVE_ARRAY the items will be extracted from + */ + const char *label_save; + } load_random; + + /** * Data used by the #PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT command */ struct PERF_TALER_MINTDB_CMD_insertDepositDetails @@ -648,6 +674,17 @@ union PERF_TALER_MINTDB_CMD_Details */ const char *label_reserve; } insert_withdraw; + + /** + * + */ + struct PERF_TALER_MINTDB_CMD_getWithdraw + { + /** + * label of the source for the withdra information + */ + const char *label_source; + } get_withdraw; }; @@ -706,4 +743,16 @@ PERF_TALER_MINTDB_interpret( struct TALER_MINTDB_Plugin *db_plugin, struct PERF_TALER_MINTDB_Cmd cmd[]); + +/** + * Check if the given command array is syntaxicly correct + * This will check if the label are corrects but will not check if + * they are pointing to an apropriate command. + * + * @param cmd the command array to check + * @return #GNUNET_OK is @a cmd is correct; #GNUNET_SYSERR if it is'nt + */ +int +PERF_TALER_MINTDB_check (const struct PERF_TALER_MINTDB_Cmd *cmd); + #endif |