diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-05-17 21:55:08 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-05-17 21:55:08 +0200 |
commit | 38e0c53097a6df0033a35ba90f712b3c89571a98 (patch) | |
tree | e2d2c485ba8a9d65992b25240c175b6d8f439fe0 /src | |
parent | 81e3d4fe0930e964a2012df3d5e994edcff1da26 (diff) | |
download | merchant-38e0c53097a6df0033a35ba90f712b3c89571a98.tar.gz merchant-38e0c53097a6df0033a35ba90f712b3c89571a98.tar.bz2 merchant-38e0c53097a6df0033a35ba90f712b3c89571a98.zip |
implement POST reserves timeout (#6875)
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/taler-merchant-httpd_private-post-reserves.c | 63 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_private-post-transfers.c | 2 |
2 files changed, 63 insertions, 2 deletions
diff --git a/src/backend/taler-merchant-httpd_private-post-reserves.c b/src/backend/taler-merchant-httpd_private-post-reserves.c index 095264d3..b2cc14c6 100644 --- a/src/backend/taler-merchant-httpd_private-post-reserves.c +++ b/src/backend/taler-merchant-httpd_private-post-reserves.c @@ -1,6 +1,6 @@ /* This file is part of TALER - (C) 2020 Taler Systems SA + (C) 2021 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as @@ -30,6 +30,14 @@ /** + * How long to wait before giving up processing with the exchange? + */ +#define EXCHANGE_GENERIC_TIMEOUT (GNUNET_TIME_relative_multiply ( \ + GNUNET_TIME_UNIT_SECONDS, \ + 15)) + + +/** * Information we keep for an individual call to the POST /reserves handler. */ struct PostReserveContext @@ -76,6 +84,11 @@ struct PostReserveContext struct TMH_EXCHANGES_FindOperation *fo; /** + * Task run on timeout. + */ + struct GNUNET_SCHEDULER_Task *timeout_task; + + /** * Initial balance of the reserve. */ struct TALER_Amount initial_balance; @@ -127,6 +140,11 @@ TMH_force_rc_resume () rc = rcn) { rcn = rc->next; + if (NULL != rc->timeout_task) + { + GNUNET_SCHEDULER_cancel (rc->timeout_task); + rc->timeout_task = NULL; + } if (rc->suspended) { rc->suspended = false; @@ -159,6 +177,11 @@ reserve_context_cleanup (void *cls) TMH_EXCHANGES_find_exchange_cancel (rc->fo); rc->fo = NULL; } + if (NULL != rc->timeout_task) + { + GNUNET_SCHEDULER_cancel (rc->timeout_task); + rc->timeout_task = NULL; + } GNUNET_assert (! rc->suspended); GNUNET_free (rc->payto_uri); GNUNET_free (rc); @@ -189,6 +212,11 @@ handle_exchange (void *cls, rc->fo = NULL; rc->suspended = false; + if (NULL != rc->timeout_task) + { + GNUNET_SCHEDULER_cancel (rc->timeout_task); + rc->timeout_task = NULL; + } MHD_resume_connection (rc->connection); GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, @@ -229,6 +257,35 @@ handle_exchange (void *cls, } +/** + * Handle a timeout for the processing of the wire request. + * + * @param cls closure + */ +static void +handle_exchange_timeout (void *cls) +{ + struct PostReserveContext *rc = cls; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Resuming POST /private/reserves with error after timeout\n"); + rc->timeout_task = NULL; + if (NULL != rc->fo) + { + TMH_EXCHANGES_find_exchange_cancel (rc->fo); + rc->fo = NULL; + } + rc->suspended = false; + MHD_resume_connection (rc->connection); + GNUNET_CONTAINER_DLL_remove (rc_head, + rc_tail, + rc); + rc->ec = TALER_EC_MERCHANT_GENERIC_EXCHANGE_TIMEOUT; + rc->http_status = MHD_HTTP_GATEWAY_TIMEOUT; + TMH_trigger_daemon (); /* we resumed, kick MHD */ +} + + MHD_RESULT TMH_private_post_reserves (const struct TMH_RequestHandler *rh, struct MHD_Connection *connection, @@ -283,6 +340,10 @@ TMH_private_post_reserves (const struct TMH_RequestHandler *rh, GNUNET_NO, &handle_exchange, rc); + rc->timeout_task + = GNUNET_SCHEDULER_add_delayed (EXCHANGE_GENERIC_TIMEOUT, + &handle_exchange_timeout, + rc); rc->suspended = true; GNUNET_CONTAINER_DLL_insert (rc_head, rc_tail, diff --git a/src/backend/taler-merchant-httpd_private-post-transfers.c b/src/backend/taler-merchant-httpd_private-post-transfers.c index 76f86ce2..4fd0819d 100644 --- a/src/backend/taler-merchant-httpd_private-post-transfers.c +++ b/src/backend/taler-merchant-httpd_private-post-transfers.c @@ -33,7 +33,7 @@ */ #define TRANSFER_GENERIC_TIMEOUT (GNUNET_TIME_relative_multiply ( \ GNUNET_TIME_UNIT_SECONDS, \ - 1)) + 15)) /** * How often do we retry the simple INSERT database transaction? |