diff options
-rw-r--r-- | src/backend/taler-merchant-httpd_private-get-orders.c | 18 | ||||
-rw-r--r-- | src/backenddb/merchant-0001.sql | 7 | ||||
-rw-r--r-- | src/backenddb/plugin_merchantdb_postgres.c | 20 |
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", |