diff options
| author | Christian Grothoff <christian@grothoff.org> | 2022-02-24 13:53:09 +0100 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2022-02-24 13:53:19 +0100 | 
| commit | fd9ba53c492835b52bd75a5ae113b7bcc81fe161 (patch) | |
| tree | ccb61b10436e0fdc5cb068595fad26e910bdabb2 /src/exchange/taler-exchange-httpd_deposit.c | |
| parent | 10b9023575b14e581cfd952b75039e71488f5a8f (diff) | |
make_coin_known can experience serialization failures, add retry logic
Diffstat (limited to 'src/exchange/taler-exchange-httpd_deposit.c')
| -rw-r--r-- | src/exchange/taler-exchange-httpd_deposit.c | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/src/exchange/taler-exchange-httpd_deposit.c b/src/exchange/taler-exchange-httpd_deposit.c index ea319f23..66cbe04c 100644 --- a/src/exchange/taler-exchange-httpd_deposit.c +++ b/src/exchange/taler-exchange-httpd_deposit.c @@ -442,12 +442,24 @@ TEH_handler_deposit (struct MHD_Connection *connection,      enum GNUNET_DB_QueryStatus qs;      /* make sure coin is 'known' in database */ -    qs = TEH_make_coin_known (&deposit.coin, -                              connection, -                              &dc.known_coin_id, -                              &mhd_ret); -    /* no transaction => no serialization failures should be possible */ -    GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); +    for (unsigned int tries = 0; tries<MAX_TRANSACTION_COMMIT_RETRIES; tries++) +    { +      qs = TEH_make_coin_known (&deposit.coin, +                                connection, +                                &dc.known_coin_id, +                                &mhd_ret); +      /* no transaction => no serialization failures should be possible */ +      if (GNUNET_DB_STATUS_SOFT_ERROR != qs) +        break; +    } +    if (GNUNET_DB_STATUS_SOFT_ERROR == qs) +    { +      GNUNET_break (0); +      return TALER_MHD_reply_with_error (connection, +                                         MHD_HTTP_INTERNAL_SERVER_ERROR, +                                         TALER_EC_GENERIC_DB_COMMIT_FAILED, +                                         "make_coin_known"); +    }      if (qs < 0)        return mhd_ret;    }  | 
