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; imark_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);