diff options
| author | Fournier Nicolas <nicolas.fournier@ensta-paristech.fr> | 2015-06-09 13:03:37 +0200 | 
|---|---|---|
| committer | Fournier Nicolas <nicolas.fournier@ensta-paristech.fr> | 2015-06-09 13:03:37 +0200 | 
| commit | d5f6b064f5945a9f46712d1b79d44ba13e579e45 (patch) | |
| tree | 0c950af07f491c787bfa9f500376773df84fa0fd /src/mintdb | |
| parent | 55568e682bc4a4634c30cf2d6895f79d211b2fe9 (diff) | |
Initial commit for mintdb performance analysis
Diffstat (limited to 'src/mintdb')
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb.c | 42 | ||||
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb_init.c | 258 | ||||
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb_init.h | 38 | ||||
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb_interpreter.c | 317 | ||||
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb_interpreter.h | 147 | ||||
| -rw-r--r-- | src/mintdb/perf/perf_taler_mintdb_values.h | 17 | 
6 files changed, 819 insertions, 0 deletions
diff --git a/src/mintdb/perf/perf_taler_mintdb.c b/src/mintdb/perf/perf_taler_mintdb.c new file mode 100644 index 00000000..3d8f1a77 --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb.c @@ -0,0 +1,42 @@ +#include "perf_taler_mintdb_interpreter.h" + + + + + +int +main(int argc, char ** argv) +{ +  +  struct PERF_TALER_MINTDB_CMD test[] =  +  { +    INIT_CMD_LOOP("loop_db_init_deposit",100000), +    INIT_CMD_START_TRANSACTION("start_transaction_init"), +    INIT_CMD_INSERT_DEPOSIT("init_deposit_insert"), +    INIT_CMD_COMMIT_TRANSACTION("commit_transaction_init"), +    INIT_CMD_END_LOOP("endloop_init_deposit","loop_db_init_deposit"), + + +    INIT_CMD_END("end") +  }; + +  struct GNUNET_CONFIGURATION_Handle *config = GNUNET_CONFIGURATION_create(); + +  // FIXME Add data to the config handler to be able to connect to the database + +  struct TALER_MINTDB_Plugin *plugin = TALER_MINTDB_plugin_load(config); +  struct TALER_MINTDB_Session *session = plugin->get_session(plugin->cls, GNUNET_YES); + +  plugin->create_tables(plugin->cls, GNUNET_YES); + + +  PERF_TALER_MINTDB_interprete(plugin, session, test); + + +  plugin->drop_temporary(plugin->cls, session); + +  // Free the session ?? + +  TALER_MINTDB_plugin_unload(plugin); +  return GNUNET_OK; +} diff --git a/src/mintdb/perf/perf_taler_mintdb_init.c b/src/mintdb/perf/perf_taler_mintdb_init.c new file mode 100644 index 00000000..31be2b1b --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb_init.c @@ -0,0 +1,258 @@ +#include <gnunet/platform.h> +#include <gnunet/gnunet_crypto_lib.h> +#include <gnunet/gnunet_signatures.h> + +#include <taler/taler_mintdb_plugin.h> +#include <taler/taler_signatures.h> +#include <taler/taler_amount_lib.h> + + +#define CURRENCY "EUR\0\0\0\0\0\0\0\0" + +struct TALER_MINTDB_CollectableBlindcoin * +init_CollectableBlindcoin(){ +    struct TALER_MINTDB_CollectableBlindcoin *coin = GNUNET_malloc(sizeof(*coin)); +     +    struct GNUNET_CRYPTO_EddsaPrivateKey *reserve_sig_key  = GNUNET_CRYPTO_eddsa_key_create(); +    struct GNUNET_CRYPTO_rsa_PrivateKey  *denomination_key = GNUNET_CRYPTO_rsa_private_key_create(512); + +     +    coin->denom_pub.rsa_public_key = GNUNET_CRYPTO_rsa_private_key_get_public(denomination_key); +    GNUNET_CRYPTO_eddsa_key_get_public(reserve_sig_key, &(coin->reserve_pub.eddsa_pub)); +     +     +    //TODO Randomise the amount that is deposited and apply a fee subsequently +     +    coin->amount_with_fee = (struct TALER_Amount) {1, 1, CURRENCY}; +    coin->withdraw_fee    = (struct TALER_Amount) {0, 1, CURRENCY}; + + +    int random_int = rand(); +    coin->sig.rsa_signature = GNUNET_CRYPTO_rsa_sign(denomination_key, &random_int, sizeof(random_int)); +    GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK , &(coin->h_coin_envelope)); + +    void *purpose = GNUNET_malloc(sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) + sizeof(int)); +    ((struct GNUNET_CRYPTO_EccSignaturePurpose *)purpose)->size = sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) + sizeof(int); +    ((struct GNUNET_CRYPTO_EccSignaturePurpose *)purpose)->purpose = GNUNET_SIGNATURE_PURPOSE_TEST; +    *((int *)(purpose + sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose))) = random_int; + +    GNUNET_CRYPTO_eddsa_sign(reserve_sig_key, purpose, &coin->reserve_sig.eddsa_signature); + + +     +    GNUNET_free(reserve_sig_key); +    GNUNET_CRYPTO_rsa_private_key_free(denomination_key); +    return coin; +} + + +struct TALER_MINTDB_Reserve * +init_Reserve(){ +    struct TALER_MINTDB_Reserve *reserve = GNUNET_malloc(sizeof(*reserve)); +    struct GNUNET_CRYPTO_EddsaPrivateKey *reserve_priv = GNUNET_CRYPTO_eddsa_key_create(); + +    GNUNET_CRYPTO_eddsa_key_get_public(reserve_priv , &(reserve->pub.eddsa_pub)); +     + +    reserve->balance = (struct TALER_Amount){1, 1, CURRENCY}; +    reserve->expiry = GNUNET_TIME_absolute_get_forever_(); +     +    GNUNET_free(reserve_priv); +    return reserve; +} + + +struct TALER_MINTDB_RefreshSession * +init_Refresh_session(){ +    struct TALER_MINTDB_RefreshSession *refresh_session = GNUNET_malloc(sizeof(*refresh_session)); + +    refresh_session->noreveal_index = 1; +    refresh_session->num_oldcoins = 1; +    refresh_session->num_newcoins = 1; + +    return refresh_session; +} + + +struct TALER_MINTDB_Deposit * +init_Deposit(){ +    static int transaction_id = 0; + +    struct TALER_MINTDB_Deposit *deposit = GNUNET_malloc(sizeof(*deposit)); + +    deposit-> transaction_id = transaction_id; +    transaction_id++; +     + +    //TODO Randomize the amount that is deposited + +    deposit->amount_with_fee = (struct TALER_Amount) {1, 1, CURRENCY}; +    deposit->deposit_fee = (struct TALER_Amount) {0, 1, CURRENCY}; + +    deposit->timestamp = GNUNET_TIME_absolute_get(); +    deposit->refund_deadline = GNUNET_TIME_absolute_get(); + +    GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &deposit->h_contract); +    GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &deposit->h_wire); +     +    // Coin Spend Signature +    { +        struct GNUNET_CRYPTO_EddsaSignature sig; +         +        struct GNUNET_CRYPTO_EddsaPrivateKey *p_eddsa_prvt = GNUNET_CRYPTO_eddsa_key_create(); +        void *prp = GNUNET_malloc(sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)+sizeof(int)); +        *((struct GNUNET_CRYPTO_EccSignaturePurpose *)prp) =(struct GNUNET_CRYPTO_EccSignaturePurpose) {sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)+sizeof(int), GNUNET_SIGNATURE_PURPOSE_TEST}; + + +        GNUNET_CRYPTO_eddsa_sign(p_eddsa_prvt, (struct GNUNET_CRYPTO_EccSignaturePurpose *) prp, &sig); + +        deposit->csig.eddsa_signature = sig; + +        GNUNET_free(p_eddsa_prvt); +    } + +    // Merchant Key +    { +        struct GNUNET_CRYPTO_EddsaPublicKey eddsa_pub; +        struct GNUNET_CRYPTO_EddsaPrivateKey *p_eddsa_prv = GNUNET_CRYPTO_eddsa_key_create(); + +        GNUNET_CRYPTO_eddsa_key_get_public(p_eddsa_prv, &eddsa_pub); +         +        deposit->merchant_pub.eddsa_pub = eddsa_pub; +            +        GNUNET_free(p_eddsa_prv); +    } + +    // Coin  +    { +         + +        { +            struct GNUNET_CRYPTO_EddsaPublicKey eddsa_pub; +            struct GNUNET_CRYPTO_EddsaPrivateKey *p_eddsa_prvt = GNUNET_CRYPTO_eddsa_key_create(); +         +            GNUNET_CRYPTO_eddsa_key_get_public(p_eddsa_prvt, &eddsa_pub); +         +            deposit->coin.coin_pub.eddsa_pub = eddsa_pub; +             +            GNUNET_free(p_eddsa_prvt); +        } + +        { +            struct GNUNET_CRYPTO_rsa_PrivateKey *p_rsa_prv = GNUNET_CRYPTO_rsa_private_key_create(128); +            struct GNUNET_CRYPTO_rsa_PublicKey *p_rsa_pub = GNUNET_CRYPTO_rsa_private_key_get_public(p_rsa_prv); +             +            deposit->coin.denom_pub.rsa_public_key = p_rsa_pub; +             +             + +            deposit->coin.denom_sig.rsa_signature = GNUNET_CRYPTO_rsa_sign(p_rsa_prv,  +                                                            (void *) &(deposit->coin.coin_pub.eddsa_pub),  +                                                            sizeof(&(deposit->coin.coin_pub.eddsa_pub))); + +            GNUNET_CRYPTO_rsa_private_key_free(p_rsa_prv); +        }        + +    } + +    +    return deposit; +} + + +struct TALER_MINTDB_DenominationKeyIssueInformation * +init_denomination(){ +  struct TALER_MINTDB_DenominationKeyIssueInformation *dki = GNUNET_malloc(sizeof(&dki)); + + +  dki->denom_priv.rsa_private_key +    = GNUNET_CRYPTO_rsa_private_key_create (128); +  GNUNET_assert (NULL != dki->denom_priv.rsa_private_key); +  dki->denom_pub.rsa_public_key +    = GNUNET_CRYPTO_rsa_private_key_get_public (dki->denom_priv.rsa_private_key); +  GNUNET_CRYPTO_rsa_public_key_hash (dki->denom_pub.rsa_public_key, +      &dki->issue.denom_hash); + +  struct GNUNET_CRYPTO_EddsaPrivateKey *master_prvt =  +    GNUNET_CRYPTO_eddsa_key_create(); + +  struct GNUNET_CRYPTO_EddsaPublicKey master_pub; + +  GNUNET_CRYPTO_eddsa_key_get_public(master_prvt, &master_pub); +  dki->issue.master.eddsa_pub = master_pub; + +  struct GNUNET_TIME_Absolute anchor = GNUNET_TIME_absolute_get(); + +  dki->issue.start = GNUNET_TIME_absolute_hton (anchor); +  dki->issue.expire_withdraw = +    GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_add (anchor, +          GNUNET_TIME_relative_get_hour_())); +  dki->issue.expire_spend = +    GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_add (anchor, +          GNUNET_TIME_relative_get_hour_())); +  dki->issue.expire_legal = +    GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_add (anchor, +          GNUNET_TIME_relative_get_hour_())); + +  struct TALER_Amount amount = {.value = 1, .fraction = 1, .currency = CURRENCY}; + +  TALER_amount_hton (&dki->issue.value, &amount); +  TALER_amount_hton (&dki->issue.fee_withdraw, &amount); +  TALER_amount_hton (&dki->issue.fee_deposit, &amount); +  TALER_amount_hton (&dki->issue.fee_refresh, &amount); +  dki->issue.purpose.purpose = htonl (TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY); +  dki->issue.purpose.size = htonl (sizeof (struct TALER_MINTDB_DenominationKeyIssueInformation) - +      offsetof (struct TALER_MINTDB_DenominationKeyIssueInformation, +        issue.purpose)); +  GNUNET_assert (GNUNET_OK == +      GNUNET_CRYPTO_eddsa_sign (master_prvt, +        &dki->issue.purpose, +        &dki->issue.signature.eddsa_signature)); + +  return dki; +} + + + + + + + +// Destructors + + +int +free_deposit(struct TALER_MINTDB_Deposit *deposit){ +  GNUNET_free(deposit->coin.denom_pub.rsa_public_key); +  GNUNET_free(deposit->coin.denom_sig.rsa_signature); +   +  GNUNET_free(deposit); + +  return GNUNET_OK; +} + + +int +free_coin(struct TALER_MINTDB_CollectableBlindcoin *coin){ +  GNUNET_free(coin->sig.rsa_signature); +  GNUNET_free(coin->denom_pub.rsa_public_key); + +  GNUNET_free(coin); + +  return GNUNET_OK; +} + + +int +free_denomination(struct TALER_MINTDB_DenominationKeyIssueInformation *dki){ +  GNUNET_free(dki->denom_priv.rsa_private_key); +  GNUNET_free(dki->denom_pub.rsa_public_key); + +  GNUNET_free(dki); +   +  return GNUNET_OK; +} + + + + diff --git a/src/mintdb/perf/perf_taler_mintdb_init.h b/src/mintdb/perf/perf_taler_mintdb_init.h new file mode 100644 index 00000000..37a9ccbb --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb_init.h @@ -0,0 +1,38 @@ +#ifndef __PERF_TALER_MINTDB_INIT_H___ +#define __PERF_TALER_MINTDB_INIT_H___ + + +#include <gnunet/platform.h> + +#include <taler/taler_mintdb_lib.h> +#include <taler/taler_mintdb_plugin.h> + + +#define CURRENCY "EUR\0\0\0\0\0\0\0\0" + + +struct TALER_MINTDB_CollectableBlindcoin * +init_collectableBlindcoin(); + +struct TALER_MINTDB_RefreshSession * +init_refresh_session(); + +struct TALER_MINTDB_Deposit * +init_deposit(int transaction_id); + +struct TALER_MINTDB_DenominationKeyIssueInformation * +init_denomination(); + + + +int +free_deposit(struct TALER_MINTDB_Deposit *deposit); + +int +free_collectableBlindcoin(struct TALER_MINTDB_CollectableBlindcoin); + +int  +free_denomination(struct TALER_MINTDB_DenominationKeyIssueInformation *dki); + + +#endif diff --git a/src/mintdb/perf/perf_taler_mintdb_interpreter.c b/src/mintdb/perf/perf_taler_mintdb_interpreter.c new file mode 100644 index 00000000..9c26c70f --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb_interpreter.c @@ -0,0 +1,317 @@ +#include "perf_taler_mintdb_interpreter.h" + +#include "perf_taler_mintdb_init.h" + +#include <gauger.h> + + +/** + * Finds the first command in cmd with the name search + * + * \return the index of the first command with name search  + * GNUNET_SYSERR if none found + */ +  static int +cmd_find(const struct  PERF_TALER_MINTDB_CMD *cmd, const char *search) +{ +  int i = 0; +  while (0) +  { +    if (cmd[i].command == CMD_END) +    { +      return GNUNET_SYSERR; +    } + +    if (0 != strcmp(cmd[i].name, search)) +    { +      return i; +    } +    i++; +  } +} + + +// Initialization of a command array +  static int +cmd_init(struct PERF_TALER_MINTDB_CMD cmd[]) +{ +  int i = 0; +  while (cmd[i].command != CMD_END) +  { +    switch (cmd[i].command) +    { +      case CMD_SAVE_ARRAY: + +        // Initialization is done differently depending of the type saved +        switch (cmd[i].details.save_array.saved_type)  +        { +          case DEPOSIT:  +            cmd[i].details.save_array.saved_data.deposit =  +              GNUNET_malloc(cmd[i].details.save_array.nb* +                  sizeof(*cmd[i].details.save_array.saved_data.deposit)); +            break; +          case TIME: +            cmd[i].details.save_array.saved_data.time =  +              GNUNET_malloc(cmd[i].details.save_array.nb* +                  sizeof(*cmd[i].details.save_array.saved_data.time)); + +          default: +            break; +        } +        break; + +      case CMD_LOAD_ARRAY: +        cmd[i].details.load_array.permutation =  +          GNUNET_CRYPTO_random_permute( +              GNUNET_CRYPTO_QUALITY_WEAK,  +              cmd[i].details.load_array.nb); +        break; +      default: +        break; +    } + +    i++; +  } + +  return GNUNET_OK; +} + + +/** + * Free the memory of the command chain + */ +  static int +cmd_clean(struct PERF_TALER_MINTDB_CMD cmd[]) +{ +  int i = 0; +  while (cmd[i].command != CMD_END) +  { +    switch (cmd[i].command) +    { +      case CMD_SAVE_ARRAY: +        { +          int j; +          switch (cmd[i].details.save_array.saved_type) +          { +            case DEPOSIT: +              for (j = 0; j < cmd[i].details.save_array.nb; j++) +              { +                free_deposit(cmd[i].details.save_array.saved_data.deposit[j]); +                cmd[i].details.save_array.saved_data.deposit[j] = NULL; +              } +              GNUNET_free(cmd[i].details.save_array.saved_data.deposit); +              cmd[i].details.save_array.saved_data.deposit = NULL; +              break; +            case TIME: +              GNUNET_free(cmd[i].details.save_array.saved_data.time); +              break; +            default: +              break; +          } +        } + +      case CMD_INSERT_DEPOSIT: +        free_deposit(cmd[i].exposed.deposit); +        break; + +      case CMD_LOAD_ARRAY: +        GNUNET_free(cmd[i].details.load_array.permutation); +        break; + +      default: +        break; + +    } +    i++; +  } +  return GNUNET_OK; +} + + +/** + *  + */ +  static int +interprete(struct TALER_MINTDB_Plugin *db_plugin, +    struct TALER_MINTDB_Session*session, +    struct PERF_TALER_MINTDB_CMD cmd[]) +{ +  int i=0; +  while (0){ +    switch (cmd[i].command) +    { +      case CMD_END: +        return GNUNET_YES; +        break; + +      case CMD_LOOP: +        cmd[i].details.loop.curr_iteration++; +        break; + +      case CMD_END_LOOP: +        { +          int jump = cmd_find(cmd, cmd[i].details.end_loop.loop_start); +          zf (cmd[jump].details.loop.max_iterations > cmd[jump].details.loop.curr_iteration) +          { +            i = jump -1; +          }else{ +            int j; +            // For each command in the loop +            for (j = 0; j <i; j++){ +              // If the exposed variable has not been copied +              if (!cmd[j].exposed_used) +              { +                cmd[j].exposed_used = 0; +                // It is freed +                switch (cmd[j].command){ +                  case CMD_INSERT_DEPOSIT: +                    free_deposit(cmd[j].exposed.deposit); +                    cmd[j].exposed.deposit = NULL; +                    break; + +                  default: +                    break; +                }  +              } +            } +          } +        } +        break; + + +      case CMD_GET_TIME: +        clock_gettime(CLOCK_MONOTONIC, &cmd[i].exposed.time); +        break; + + +      case CMD_GAUGER: +        { +          int start_index = cmd_find(cmd, cmd[i].details.gauger.start_time); +          int stop_index  = cmd_find(cmd, cmd[i].details.gauger.stop_time ); +          struct timespec start= cmd[start_index].exposed.time; +          struct timespec stop = cmd[stop_index].exposed.time; + +          unsigned long elapsed_ms = (start.tv_sec - stop.tv_sec)*1000 + (start.tv_nsec - stop.tv_nsec)/1000000; + +          GAUGER("MINTDB", cmd[i].details.gauger.description, elapsed_ms, "milliseconds"); +        } +        break; + +      case CMD_START_TRANSACTION: +        db_plugin->start(db_plugin->cls, session); +        break; + + +      case CMD_COMMIT_TRANSACTION: +        db_plugin->commit(db_plugin->cls, session); +        break; + + +      case CMD_INSERT_DEPOSIT: +        { +          struct TALER_MINTDB_Deposit *deposit = init_deposit(0); +          db_plugin->insert_deposit(db_plugin->cls, session, deposit);           + +          cmd[i].exposed.deposit = deposit; +        } +        break; + + +      case CMD_GET_DEPOSIT: +        { +          int source_index = cmd_find(cmd, cmd[i].details.get_deposit.source); // Find the source location +          struct TALER_MINTDB_Deposit *deposit = cmd[source_index].exposed.deposit; // Get the deposit from the source +          db_plugin->have_deposit(db_plugin->cls, session, deposit); +        } +        break; + + +      case CMD_SAVE_ARRAY: +        { +          // Array initialization on first loop iteration +          if (cmd[cmd_find(cmd, cmd[i].details.save_array.loop)].details.loop.curr_iteration == 0) +          { +            cmd[i].details.save_array.index = 0; +          } + +          int loop_index = cmd_find(cmd, cmd[i].details.save_array.loop); +          int proba = cmd[loop_index].details.loop.max_iterations / cmd[i].details.save_array.nb; +          int rnd = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, proba); + +          // If there is a lesser or equal number of iteration next than room remain in the array  +          if ((cmd[loop_index].details.loop.max_iterations - cmd[loop_index].details.loop.curr_iteration <=  +                cmd[i].details.save_array.nb - cmd[i].details.save_array.index) || +              (rnd == 0 && cmd[i].details.save_array.index < cmd[i].details.save_array.nb)) +          { + +            // We automaticly save the whatever we need to +            switch (cmd[i].details.save_array.saved_type){ +              case DEPOSIT: +                cmd[i].details.save_array.saved_data.deposit[cmd[i].details.save_array.index] =  +                  cmd[cmd_find(cmd, cmd[i].details.save_array.saved)].exposed.deposit; +                break; +              case TIME: +                cmd[i].details.save_array.saved_data.deposit[cmd[i].details.save_array.index] =  +                  cmd[cmd_find(cmd, cmd[i].details.save_array.saved)].exposed.deposit; +                break; +            } +            cmd[i].details.save_array.index++; +          } +        } +        break; + + +      case CMD_LOAD_ARRAY: +        { + +          int loop_index = cmd_find(cmd, cmd[i].details.load_array.loop);   +          int save_index = cmd_find(cmd, cmd[i].details.load_array.saved);   +          switch (cmd[i].details.load_array.loaded_type){ +            case DEPOSIT: +              cmd[i].exposed.deposit = cmd[save_index].details.save_array.saved_data.deposit[ +                cmd[i].details.load_array.permutation[ +                cmd[loop_index].details.loop.curr_iteration +                ] +              ]; +              break; + +            case TIME: +              cmd[i].exposed.time = cmd[save_index].details.save_array.saved_data.time[ +                cmd[i].details.load_array.permutation[ +                cmd[loop_index].details.loop.curr_iteration +                ] +              ]; +              break; +            default: +              break; + +          } +        } +    } +    i++; +  } +  return GNUNET_OK; +} + +/** + * Runs the commands given in cmd, working with  + * the database referenced by db_plugin + */ +  int +PERF_TALER_MINTDB_interprete(struct TALER_MINTDB_Plugin *db_plugin,  +    struct TALER_MINTDB_Session *session, +    struct PERF_TALER_MINTDB_CMD cmd[]) +{ + +  // Initializing commands +  cmd_init(cmd); + +  // Running the interpreter +  interprete(db_plugin, session, cmd); + +  // Cleaning the memory +  cmd_clean(cmd); + +  return GNUNET_YES; + +} diff --git a/src/mintdb/perf/perf_taler_mintdb_interpreter.h b/src/mintdb/perf/perf_taler_mintdb_interpreter.h new file mode 100644 index 00000000..c39cfd58 --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb_interpreter.h @@ -0,0 +1,147 @@ +#ifndef __PERF_TALER_MINTDB_INTERPRETER_H__ +#define __PERF_TALER_MINTDB_INTERPRETER_H__ + +#include <sys/time.h> + +#include <gnunet/platform.h> +#include <taler/taler_mintdb_lib.h> +#include <taler/taler_mintdb_plugin.h> + + + +#define INIT_CMD_LOOP(label, _iter) {.command = CMD_LOOP, .name = label, .details.loop = {.max_iterations = _iter, .curr_iteration = -1} } + +#define INIT_CMD_END_LOOP(label, _loopname) {.command = CMD_END_LOOP, .name = label, .details.end_loop.loop_start = _loopname} + +#define INIT_CMD_END(label) {.command = CMD_END, .name = label} + +#define INIT_CMD_GET_TIME(label) {.command = CMD_GET_TIME, .name = label} + +#define INIT_CMD_GAUGER(label, _start_time, _stop_time, _description) {.command = CMD_GAUGER, .name = label, .details.gauger = {.start_time = _start_time, .end_time = _endtime, .description = _description} } + +#define INIT_CMD_START_TRANSACTION(label) {.command = CMD_START_TRANSACTION, .name = label} + +#define INIT_CMD_COMMIT_TRANSACTION(label) {.command = CMD_COMMIT_TRANSACTION, .name = label} + + + +#define INIT_CMD_INSERT_DEPOSIT(label) {.command = CMD_INSERT_DEPOSIT, .name = label} + +#define INIT_CMD_GET_DEPOSIT(label, _saved) {.command = CMD_GET_DEPOSIT, .name = label, .details.get_deposit.saved = _source } + +#define INIT_CMD_SAVE_DEPOSIT(label, _loop, _save, _nb) {.command = CMD_SAVE_ARRAY, .name = label, .details.save_array = {.loop = _loop, .nb = _nb, .saved = _save, saved_type = DEPOSIT} } + +#define INIT_CMD_LOAD_DEPOSIT(label, _loop, _save, _nb) {.command = CMD_LOAD_ARRAY, .name = label, .details.load_array = {.loop = _loop, .nb = _nb, .saved = _save} } + + + +enum PERF_TALER_MINTDB_TYPE { +  DEPOSIT, +  TIME, +}; + +/** + * Command to be interpreted. + * + */ +struct PERF_TALER_MINTDB_CMD{ + +    enum { + +        // Define the start of al command chain loop +        CMD_LOOP, +        // Define the end of a command chain loop +        CMD_END_LOOP, + +        // All comand chain must hace this as their last command +        CMD_END, + +        // Save the time at which the command was executed +        CMD_GET_TIME, + +        // Upload performance to Gauger +        CMD_GAUGER, + +        // Start a database transaction +        CMD_START_TRANSACTION, + +        // End a database transaction +        CMD_COMMIT_TRANSACTION, + +        // Insert a deposit into the database +        CMD_INSERT_DEPOSIT, + +        // Check if a deposit is in the database +        CMD_GET_DEPOSIT, + +        // Saves random deposits from a loop +        CMD_SAVE_ARRAY, + +        // Load deposits saved earlyer +        CMD_LOAD_ARRAY, + +    } command; + +    char name[40]; + +    // Contains command specific data. +    union { +        struct { +            const int max_iterations; +            int curr_iteration; +        } loop; + +        struct { +            char loop_start[40]; +        } end_loop; + +        struct { +            char start_time[40]; +            char stop_time[40]; + +            char description[40]; +        } gauger;  + +        struct { +            int nb; // Number of deposits to save +            int index; // The number of deposits already saved +            char loop[40]; // The loop from which the data will be extracted +            char saved[40]; // The deposit saved +            enum PERF_TALER_MINTDB_TYPE saved_type; +            union { +              struct TALER_MINTDB_Deposit **deposit; +              struct timespec *time; +            } saved_data; +        } save_array; + +        struct { +            int nb; //the number of deposits to save +            char loop[40]; +            char saved[40]; // The command where the deposit were saved +            enum PERF_TALER_MINTDB_TYPE loaded_type;  +            unsigned int *permutation; // A permutation array to randomize the order the deposits are loaded in +        } load_array; + +        struct { +            char source[40]; +        } get_deposit; + + +    } details; +    union { +        struct TALER_MINTDB_Deposit *deposit; +        struct timespec time; +    } exposed;  + +    int exposed_used; +}; + + +int +PERF_TALER_MINTDB_interprete( +    struct TALER_MINTDB_Plugin *db_plugin, +    struct TALER_MINTDB_Session *session, +    struct PERF_TALER_MINTDB_CMD cmd[]); + + +#endif diff --git a/src/mintdb/perf/perf_taler_mintdb_values.h b/src/mintdb/perf/perf_taler_mintdb_values.h new file mode 100644 index 00000000..09343d86 --- /dev/null +++ b/src/mintdb/perf/perf_taler_mintdb_values.h @@ -0,0 +1,17 @@ +#ifndef __PERF_TALER_MINTDB__VALUES_H__ +#define __PERF_TALER_MINTDB__VALUES_H__ + + + +#define NB_DEPOSIT_INIT   100000 +#define NB_DEPOSIT_GET    1000 +#define NB_DEPOSIT_MARGIN 10000 + +#define NB_BLINDCOIN_INIT 100000 + + +// Temporary macro to compile +#define GAUGER(a,b,c,d) + + +#endif  | 
