summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-03-03 19:39:19 +0100
committerChristian Grothoff <christian@grothoff.org>2022-03-03 19:39:25 +0100
commitf951cdef8ced141326887c1a996e8546774514f6 (patch)
tree6de32e119c3b074e81229cb9c7f4c7252a61bb31
parent4c53d42e44cbab55194b2f0fb71ffc3cb082b56a (diff)
downloadexchange-f951cdef8ced141326887c1a996e8546774514f6.tar.gz
exchange-f951cdef8ced141326887c1a996e8546774514f6.tar.bz2
exchange-f951cdef8ced141326887c1a996e8546774514f6.zip
include shard when marking deposits tiny/done to make better use of partitions/shards
-rw-r--r--src/exchange/taler-exchange-aggregator.c4
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c21
-rw-r--r--src/exchangedb/test_exchangedb.c2
-rw-r--r--src/include/taler_exchangedb_plugin.h4
4 files changed, 26 insertions, 5 deletions
diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c
index c552610a7..58bf20738 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -488,6 +488,7 @@ deposit_cb (void *cls,
"Aggregator marks deposit %llu as done\n",
(unsigned long long) row_id);
qs = db_plugin->mark_deposit_done (db_plugin->cls,
+ merchant_pub,
row_id);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
@@ -610,6 +611,7 @@ aggregate_cb (void *cls,
return qs;
}
qs = db_plugin->mark_deposit_done (db_plugin->cls,
+ &au->merchant_pub,
row_id);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
@@ -842,12 +844,14 @@ run_aggregation (void *cls)
}
/* Mark transactions by row_id as minor */
qs = db_plugin->mark_deposit_tiny (db_plugin->cls,
+ &au_active.merchant_pub,
au_active.row_id);
if (0 <= qs)
{
for (unsigned int i = 0; i<au_active.rows_offset; i++)
{
qs = db_plugin->mark_deposit_tiny (db_plugin->cls,
+ &au_active.merchant_pub,
au_active.additional_rows[i]);
if (0 > qs)
break;
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index c9512e64f..86480f29b 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -1217,15 +1217,17 @@ prepare_statements (struct PostgresClosure *pg)
"mark_deposit_tiny",
"UPDATE deposits"
" SET tiny=TRUE"
- " WHERE deposit_serial_id=$1",
- 1),
+ " WHERE shard=$2"
+ " AND deposit_serial_id=$1",
+ 2),
/* Used in #postgres_mark_deposit_done() */
GNUNET_PQ_make_prepare (
"mark_deposit_done",
"UPDATE deposits"
" SET done=TRUE"
- " WHERE deposit_serial_id=$1;",
- 1),
+ " WHERE shard=$2"
+ " AND deposit_serial_id=$1;",
+ 2),
/* Used in #postgres_get_coin_transactions() to obtain information
about how a coin has been spend with /deposit requests. */
GNUNET_PQ_make_prepare (
@@ -5429,16 +5431,20 @@ postgres_have_deposit2 (
* @e iterate_ready_deposits()
*
* @param cls the @e cls of this struct with the plugin-specific state
+ * @param merchant_pub identifies the beneficiary of the deposit
* @param rowid identifies the deposit row to modify
* @return query result status
*/
static enum GNUNET_DB_QueryStatus
postgres_mark_deposit_tiny (void *cls,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t rowid)
{
struct PostgresClosure *pg = cls;
+ uint64_t deposit_shard = compute_shard (merchant_pub);
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&rowid),
+ GNUNET_PQ_query_param_uint64 (&deposit_shard),
GNUNET_PQ_query_param_end
};
@@ -5454,16 +5460,20 @@ postgres_mark_deposit_tiny (void *cls,
* @e iterate_ready_deposits() or @e iterate_matching_deposits().
*
* @param cls the @e cls of this struct with the plugin-specific state
+ * @param merchant_pub identifies the beneficiary of the deposit
* @param rowid identifies the deposit row to modify
* @return query result status
*/
static enum GNUNET_DB_QueryStatus
postgres_mark_deposit_done (void *cls,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t rowid)
{
struct PostgresClosure *pg = cls;
+ uint64_t deposit_shard = compute_shard (merchant_pub);
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&rowid),
+ GNUNET_PQ_query_param_uint64 (&deposit_shard),
GNUNET_PQ_query_param_end
};
@@ -8054,7 +8064,8 @@ postgres_start_deferred_wire_out (void *cls)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_ExecuteStatement es[] = {
- GNUNET_PQ_make_execute ("START TRANSACTION ISOLATION LEVEL READ COMMITTED"),
+ GNUNET_PQ_make_execute (
+ "START TRANSACTION ISOLATION LEVEL READ COMMITTED;"),
GNUNET_PQ_make_execute ("SET CONSTRAINTS ALL DEFERRED;"),
GNUNET_PQ_EXECUTE_STATEMENT_END
};
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index cad2983ea..7ca1839ff 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -2279,6 +2279,7 @@ run (void *cls)
"test-2"));
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->mark_deposit_tiny (plugin->cls,
+ &deposit.merchant_pub,
deposit_rowid));
FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
plugin->get_ready_deposit (plugin->cls,
@@ -2300,6 +2301,7 @@ run (void *cls)
"test-3"));
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->mark_deposit_done (plugin->cls,
+ &deposit.merchant_pub,
deposit_rowid));
FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
plugin->commit (plugin->cls));
diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h
index 9841d45dc..35bf673b4 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -2979,11 +2979,13 @@ struct TALER_EXCHANGEDB_Plugin
* returned by @e iterate_ready_deposits()
*
* @param cls the @e cls of this struct with the plugin-specific state
+ * @param merchant_pub identifies the beneficiary of the deposit
* @param deposit_rowid identifies the deposit row to modify
* @return query result status
*/
enum GNUNET_DB_QueryStatus
(*mark_deposit_tiny)(void *cls,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t rowid);
@@ -2993,11 +2995,13 @@ struct TALER_EXCHANGEDB_Plugin
* @e iterate_ready_deposits() or @e iterate_matching_deposits().
*
* @param cls the @e cls of this struct with the plugin-specific state
+ * @param merchant_pub identifies the beneficiary of the deposit
* @param deposit_rowid identifies the deposit row to modify
* @return query result status
*/
enum GNUNET_DB_QueryStatus
(*mark_deposit_done)(void *cls,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t rowid);