summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/taler-merchant-httpd_private-get-orders.c18
-rw-r--r--src/backenddb/merchant-0001.sql7
-rw-r--r--src/backenddb/plugin_merchantdb_postgres.c20
3 files changed, 41 insertions, 4 deletions
diff --git a/src/backend/taler-merchant-httpd_private-get-orders.c b/src/backend/taler-merchant-httpd_private-get-orders.c
index 85660812..9546ae06 100644
--- a/src/backend/taler-merchant-httpd_private-get-orders.c
+++ b/src/backend/taler-merchant-httpd_private-get-orders.c
@@ -273,7 +273,7 @@ add_order (void *cls,
struct GNUNET_TIME_Absolute creation_time)
{
struct TMH_PendingOrder *po = cls;
- json_t *contract_terms;
+ json_t *contract_terms = NULL;
struct TALER_PrivateContractHash h_contract_terms;
enum GNUNET_DB_QueryStatus qs;
const char *summary;
@@ -282,6 +282,10 @@ add_order (void *cls,
bool paid;
struct TALER_Amount order_amount;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Adding order `%s' (%llu) to result set\n",
+ orig_order_id,
+ (unsigned long long) order_serial);
qs = TMH_db->lookup_order_status_by_serial (TMH_db->cls,
po->instance_id,
order_serial,
@@ -319,6 +323,7 @@ add_order (void *cls,
&contract_terms,
&os,
NULL);
+ GNUNET_break (os == order_serial);
}
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
{
@@ -332,9 +337,18 @@ add_order (void *cls,
&unused,
&contract_terms);
}
+ if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Order %llu disappeared during iteration. Skipping.\n",
+ (unsigned long long) order_serial);
+ json_decref (contract_terms); /* should still be NULL */
+ GNUNET_free (order_id);
+ return;
+ }
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
- GNUNET_break (0); /* Failed: #7025 */
+ GNUNET_break (0);
po->result = TALER_EC_GENERIC_DB_FETCH_FAILED;
json_decref (contract_terms);
GNUNET_free (order_id);
diff --git a/src/backenddb/merchant-0001.sql b/src/backenddb/merchant-0001.sql
index a4058a8a..aaee8998 100644
--- a/src/backenddb/merchant-0001.sql
+++ b/src/backenddb/merchant-0001.sql
@@ -273,6 +273,13 @@ COMMENT ON COLUMN merchant_contract_terms.pay_deadline
CREATE INDEX IF NOT EXISTS merchant_contract_terms_by_merchant_and_expiration
ON merchant_contract_terms
(merchant_serial,pay_deadline);
+COMMENT ON INDEX merchant_contract_terms_by_merchant_and_expiration
+ IS 'for delete_contract_terms';
+CREATE INDEX IF NOT EXISTS merchant_contract_terms_by_expiration
+ ON merchant_contract_terms
+ (paid,pay_deadline);
+COMMENT ON INDEX merchant_contract_terms_by_expiration
+ IS 'for unlock_contracts';
CREATE INDEX IF NOT EXISTS merchant_contract_terms_by_merchant_and_payment
ON merchant_contract_terms
(merchant_serial,paid);
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c
index 4f4966f6..7bdbaf63 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -1557,6 +1557,7 @@ postgres_expire_locks (void *cls)
};
enum GNUNET_DB_QueryStatus qs1;
enum GNUNET_DB_QueryStatus qs2;
+ enum GNUNET_DB_QueryStatus qs3;
check_connection (pg);
qs1 = GNUNET_PQ_eval_prepared_non_select (pg->conn,
@@ -1575,10 +1576,19 @@ postgres_expire_locks (void *cls)
GNUNET_break (0);
return;
}
+ qs3 = GNUNET_PQ_eval_prepared_non_select (pg->conn,
+ "unlock_contracts",
+ params);
+ if (qs3 < 0)
+ {
+ GNUNET_break (0);
+ return;
+ }
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Released %d+%d locks\n",
+ "Released %d+%d+%d locks\n",
qs1,
- qs2);
+ qs2,
+ qs3);
}
@@ -7090,6 +7100,12 @@ postgres_connect (void *cls)
"DELETE FROM merchant_orders"
" WHERE pay_deadline < $1",
1),
+ /* for postgres_expire_locks() */
+ GNUNET_PQ_make_prepare ("unlock_contracts",
+ "DELETE FROM merchant_contract_terms"
+ " WHERE NOT paid"
+ " AND pay_deadline < $1",
+ 1),
/* for postgres_delete_order() */
GNUNET_PQ_make_prepare ("delete_order",