summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFournier Nicolas <nicolas.fournier@ensta-paristech.fr>2015-07-06 11:10:47 +0200
committerFournier Nicolas <nicolas.fournier@ensta-paristech.fr>2015-07-06 11:10:47 +0200
commitff7cb5edbb82c70994d0264455955e6cf6fe5067 (patch)
tree3e22dffb95a49e568059900b49fdb2ac8a5029cd
parent7ad57d7a6708eb451395a78b4c88797844d78d62 (diff)
downloadexchange-ff7cb5edbb82c70994d0264455955e6cf6fe5067.tar.gz
exchange-ff7cb5edbb82c70994d0264455955e6cf6fe5067.tar.bz2
exchange-ff7cb5edbb82c70994d0264455955e6cf6fe5067.zip
New load_random command
-rw-r--r--src/mintdb/perf_taler_mintdb_interpreter.c179
-rw-r--r--src/mintdb/perf_taler_mintdb_interpreter.h57
2 files changed, 226 insertions, 10 deletions
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