reduce redundant data fetch (#5444)

This commit is contained in:
Christian Grothoff 2018-10-19 11:01:40 +02:00
parent 9114794bee
commit fb952babf6
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
5 changed files with 70 additions and 10 deletions

View File

@ -172,13 +172,12 @@ TEH_DB_calculate_transaction_list_totals (struct TALER_EXCHANGEDB_TransactionLis
struct TALER_Amount *ret) struct TALER_Amount *ret)
{ {
struct TALER_Amount spent = *off; struct TALER_Amount spent = *off;
struct TALER_EXCHANGEDB_TransactionList *pos;
struct TALER_Amount refunded; struct TALER_Amount refunded;
GNUNET_assert (GNUNET_OK == GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (spent.currency, TALER_amount_get_zero (spent.currency,
&refunded)); &refunded));
for (pos = tl; NULL != pos; pos = pos->next) for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos = pos->next)
{ {
switch (pos->type) switch (pos->type)
{ {

View File

@ -2107,7 +2107,7 @@ TEH_KS_handler_keys (struct TEH_RequestHandler *rh,
sizeof (struct KeysResponseData), sizeof (struct KeysResponseData),
&krd_search_comparator); &krd_search_comparator);
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Filtering /keys by cherry pick date %s found entry %u/%u\n", "Filtering /keys by cherry pick date %s found entry %u/%u\n",
GNUNET_STRINGS_absolute_time_to_string (last_issue_date), GNUNET_STRINGS_absolute_time_to_string (last_issue_date),
(unsigned int) (krd - key_state->krd_array), (unsigned int) (krd - key_state->krd_array),

View File

@ -252,20 +252,22 @@ refresh_melt_transaction (void *cls,
struct RefreshMeltContext *rmc = cls; struct RefreshMeltContext *rmc = cls;
struct TALER_EXCHANGEDB_RefreshMelt rm; struct TALER_EXCHANGEDB_RefreshMelt rm;
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
uint32_t noreveal_index;
/* Check if we already created such a session */ /* Check if we already created such a session */
qs = TEH_plugin->get_melt (TEH_plugin->cls, qs = TEH_plugin->get_melt_index (TEH_plugin->cls,
session, session,
&rmc->refresh_session.rc, &rmc->refresh_session.rc,
&rm); &noreveal_index);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
{ {
TALER_LOG_DEBUG ("Found already-melted coin\n"); TALER_LOG_DEBUG ("Found already-melted coin\n");
*mhd_ret = reply_refresh_melt_success (connection, *mhd_ret = reply_refresh_melt_success (connection,
&rmc->refresh_session.rc, &rmc->refresh_session.rc,
rm.session.noreveal_index); noreveal_index);
/* FIXME: is it normal to return "hard error" upon /* Note: we return "hard error" to ensure the wrapper
* _finding_ some data into the database? */ does not retry the transaction, and to also not generate
a "fresh" response (as we would on "success") */
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
if (0 > qs) if (0 > qs)

View File

@ -858,6 +858,14 @@ postgres_prepare (PGconn *db_conn)
" ON (kc.denom_pub_hash = denom.denom_pub_hash)" " ON (kc.denom_pub_hash = denom.denom_pub_hash)"
" WHERE rc=$1;", " WHERE rc=$1;",
1), 1),
/* Used in #postgres_get_melt_index() to fetch
the noreveal index from a previous melt operation */
GNUNET_PQ_make_prepare ("get_melt_index",
"SELECT"
" noreveal_index"
" FROM refresh_commitments"
" WHERE rc=$1;",
1),
/* Used in #postgres_select_refreshs_above_serial_id() to fetch /* Used in #postgres_select_refreshs_above_serial_id() to fetch
refresh session with id '\geq' the given parameter */ refresh session with id '\geq' the given parameter */
GNUNET_PQ_make_prepare ("audit_get_refresh_commitments_incr", GNUNET_PQ_make_prepare ("audit_get_refresh_commitments_incr",
@ -3484,6 +3492,39 @@ postgres_get_melt (void *cls,
} }
/**
* Lookup noreveal index of a previous melt operation under the given
* @a rc.
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
* @param session database handle to use
* @param rc commitment hash to use to locate the operation
* @param[out] refresh_melt where to store the result
* @return transaction status
*/
static enum GNUNET_DB_QueryStatus
postgres_get_melt_index (void *cls,
struct TALER_EXCHANGEDB_Session *session,
const struct TALER_RefreshCommitmentP *rc,
uint32_t *noreveal_index)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (rc),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint32 ("noreveal_index",
noreveal_index),
GNUNET_PQ_result_spec_end
};
return GNUNET_PQ_eval_prepared_singleton_select (session->conn,
"get_melt_index",
params,
rs);
}
/** /**
* Store new refresh melt commitment data. * Store new refresh melt commitment data.
* *
@ -7035,6 +7076,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
plugin->select_refunds_by_coin = &postgres_select_refunds_by_coin; plugin->select_refunds_by_coin = &postgres_select_refunds_by_coin;
plugin->insert_melt = &postgres_insert_melt; plugin->insert_melt = &postgres_insert_melt;
plugin->get_melt = &postgres_get_melt; plugin->get_melt = &postgres_get_melt;
plugin->get_melt_index = &postgres_get_melt_index;
plugin->insert_refresh_reveal = &postgres_insert_refresh_reveal; plugin->insert_refresh_reveal = &postgres_insert_refresh_reveal;
plugin->get_refresh_reveal = &postgres_get_refresh_reveal; plugin->get_refresh_reveal = &postgres_get_refresh_reveal;
plugin->get_link_data = &postgres_get_link_data; plugin->get_link_data = &postgres_get_link_data;

View File

@ -1606,6 +1606,23 @@ struct TALER_EXCHANGEDB_Plugin
struct TALER_EXCHANGEDB_RefreshMelt *refresh_melt); struct TALER_EXCHANGEDB_RefreshMelt *refresh_melt);
/**
* Lookup noreveal index of a previous melt operation under the given
* @a rc.
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
* @param session database handle to use
* @param rc commitment hash to use to locate the operation
* @param[out] refresh_melt where to store the result
* @return transaction status
*/
enum GNUNET_DB_QueryStatus
(*get_melt_index) (void *cls,
struct TALER_EXCHANGEDB_Session *session,
const struct TALER_RefreshCommitmentP *rc,
uint32_t *noreveal_index);
/** /**
* Store in the database which coin(s) the wallet wanted to create * Store in the database which coin(s) the wallet wanted to create
* in a given refresh operation and all of the other information * in a given refresh operation and all of the other information