From 060816eafd6756575e94982e224ac47c8c6e69a6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 29 May 2021 08:38:33 +0200 Subject: [PATCH] fix for soft fail error handling in wirewatch discovered in #6892, bugnote 17930: bank API calls us one more time after returning SYSERR, and we must in that case not bump the progress point just because a commit succeeds after the rollback --- src/exchange/taler-exchange-wirewatch.c | 28 ++++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c index 1b5c5d41e..480b3ee36 100644 --- a/src/exchange/taler-exchange-wirewatch.c +++ b/src/exchange/taler-exchange-wirewatch.c @@ -111,6 +111,11 @@ struct WireAccount */ int delay; + /** + * Did we experience a soft failure during the current + * transaction? + */ + bool soft_fail; }; @@ -358,10 +363,20 @@ history_cb (void *cls, (unsigned int) ec, http_status); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "End of list. Committing progress!\n"); - qs = db_plugin->commit (db_plugin->cls, - session); + if (wa->soft_fail) + { + /* no point to commit, transaction was already rolled + back after we encountered a soft failure */ + wa->soft_fail = false; + qs = GNUNET_DB_STATUS_SOFT_ERROR; + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "End of list. Committing progress!\n"); + qs = db_plugin->commit (db_plugin->cls, + session); + } if (GNUNET_DB_STATUS_SOFT_ERROR == qs) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -459,10 +474,7 @@ history_cb (void *cls, "Got DB soft error for reserves_in_insert. Rolling back.\n"); db_plugin->rollback (db_plugin->cls, session); - /* try again */ - GNUNET_assert (NULL == task); - task = GNUNET_SCHEDULER_add_now (&find_transfers, - NULL); + wa->soft_fail = true; return GNUNET_SYSERR; } wa->delay = GNUNET_NO;