add logic to retry /keys if /keys download fails

This commit is contained in:
Christian Grothoff 2018-08-19 12:12:00 +02:00
parent 1541f2c2d6
commit 433fab96c9
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
2 changed files with 38 additions and 9 deletions

View File

@ -1,5 +1,5 @@
{ {
"url": "payto://x-taler-bank/localhost:8082/2", "url": "payto://x-taler-bank/localhost:8082/2",
"salt": "04NPZ9DY6SQZHKNNFPYRNND7H7J7M9EG1RMY56F1PE7RKV16SMDCG2EK0F12GF6KP558VRE4QWPEG421X163YBVCSK17JQDHQFPBY50", "salt": "B9H7WG3A6881HNVK7C508EHMJ10Z0CEB21Z9047KXKMCZG67JK5M27EQNRW38KNPVXDYNYTX27PA34VSA8JN3NXJA0BX655WGJMM7B8",
"master_sig": "8XQ6CFKNN0RFQMCVPVSMF650Z012X4TR68VTMT35W6R0E24G2XY0Q1E5G32YVX4P3928TB32H0JETMGSMMSREKA2Z7YA6FJZX6HQA0R" "master_sig": "FCJAM149MFKTMD8XQ7S32TBD53VN97Y3BCXFXSGQ8DH94P18XXCPRA3Z9ZYBQ4JFFEPS4RE48ACS99MMM193QZ10M7MKGS2B685F030"
} }

View File

@ -112,12 +112,22 @@ struct TALER_EXCHANGE_Handle
*/ */
struct KeysRequest *kr; struct KeysRequest *kr;
/**
* Task for retrying /keys request.
*/
struct GNUNET_SCHEDULER_Task *retry_task;
/** /**
* Key data of the exchange, only valid if * Key data of the exchange, only valid if
* @e handshake_complete is past stage #MHS_CERT. * @e handshake_complete is past stage #MHS_CERT.
*/ */
struct TALER_EXCHANGE_Keys key_data; struct TALER_EXCHANGE_Keys key_data;
/**
* Retry /keys frequency.
*/
struct GNUNET_TIME_Relative retry_delay;
/** /**
* When does @e key_data expire? * When does @e key_data expire?
*/ */
@ -768,10 +778,10 @@ free_key_data (struct TALER_EXCHANGE_Keys *key_data)
/** /**
* Initiate download of /keys from the exchange. * Initiate download of /keys from the exchange.
* *
* @param exchange where to download /keys from * @param cls exchange where to download /keys from
*/ */
static void static void
request_keys (struct TALER_EXCHANGE_Handle *exchange); request_keys (void *cls);
/** /**
@ -791,7 +801,9 @@ TALER_EXCHANGE_check_keys_current (struct TALER_EXCHANGE_Handle *exchange,
if ( (GNUNET_NO == force_download) && if ( (GNUNET_NO == force_download) &&
(0 < GNUNET_TIME_absolute_get_remaining (exchange->key_data_expiration).rel_value_us) ) (0 < GNUNET_TIME_absolute_get_remaining (exchange->key_data_expiration).rel_value_us) )
return exchange->key_data_expiration; return exchange->key_data_expiration;
request_keys (exchange); if (NULL != exchange->retry_task)
exchange->retry_task = GNUNET_SCHEDULER_add_now (&request_keys,
exchange);
return GNUNET_TIME_UNIT_ZERO_ABS; return GNUNET_TIME_UNIT_ZERO_ABS;
} }
@ -827,6 +839,13 @@ keys_completed_cb (void *cls,
switch (response_code) switch (response_code)
{ {
case 0: case 0:
free_keys_request (kr);
exchange->kr = NULL;
GNUNET_assert (NULL == exchange->retry_task);
exchange->retry_delay = GNUNET_TIME_STD_BACKOFF (exchange->retry_delay);
exchange->retry_task = GNUNET_SCHEDULER_add_delayed (exchange->retry_delay,
&request_keys,
exchange);
break; break;
case MHD_HTTP_OK: case MHD_HTTP_OK:
if (NULL == resp_obj) if (NULL == resp_obj)
@ -882,6 +901,7 @@ keys_completed_cb (void *cls,
} }
json_decref (exchange->key_data_raw); json_decref (exchange->key_data_raw);
exchange->key_data_raw = json_deep_copy (resp_obj); exchange->key_data_raw = json_deep_copy (resp_obj);
exchange->retry_delay = GNUNET_TIME_UNIT_ZERO;
break; break;
default: default:
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@ -1107,7 +1127,8 @@ TALER_EXCHANGE_connect (struct GNUNET_CURL_Context *ctx,
exchange->url = GNUNET_strdup (url); exchange->url = GNUNET_strdup (url);
exchange->cert_cb = cert_cb; exchange->cert_cb = cert_cb;
exchange->cert_cb_cls = cert_cb_cls; exchange->cert_cb_cls = cert_cb_cls;
request_keys (exchange); exchange->retry_task = GNUNET_SCHEDULER_add_now (&request_keys,
exchange);
return exchange; return exchange;
} }
@ -1115,18 +1136,21 @@ TALER_EXCHANGE_connect (struct GNUNET_CURL_Context *ctx,
/** /**
* Initiate download of /keys from the exchange. * Initiate download of /keys from the exchange.
* *
* @param exchange where to download /keys from * @param cls exchange where to download /keys from
*/ */
static void static void
request_keys (struct TALER_EXCHANGE_Handle *exchange) request_keys (void *cls)
{ {
struct TALER_EXCHANGE_Handle *exchange = cls;
struct KeysRequest *kr; struct KeysRequest *kr;
CURL *eh; CURL *eh;
exchange->retry_task = NULL;
GNUNET_assert (NULL == exchange->kr); GNUNET_assert (NULL == exchange->kr);
kr = GNUNET_new (struct KeysRequest); kr = GNUNET_new (struct KeysRequest);
kr->exchange = exchange; kr->exchange = exchange;
if (GNUNET_YES == MAH_handle_is_ready (exchange) && !TALER_EXCHANGE_API_DISABLE_CHERRYPICKING) if (GNUNET_YES ==
MAH_handle_is_ready (exchange) && !TALER_EXCHANGE_API_DISABLE_CHERRYPICKING)
{ {
char *arg; char *arg;
@ -1198,6 +1222,11 @@ TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle *exchange)
json_decref (exchange->key_data_raw); json_decref (exchange->key_data_raw);
exchange->key_data_raw = NULL; exchange->key_data_raw = NULL;
} }
if (NULL != exchange->retry_task)
{
GNUNET_SCHEDULER_cancel (exchange->retry_task);
exchange->retry_task = NULL;
}
GNUNET_free (exchange->url); GNUNET_free (exchange->url);
GNUNET_free (exchange); GNUNET_free (exchange);
} }