diff options
author | Christian Grothoff <grothoff@gnunet.org> | 2021-05-29 08:38:33 +0200 |
---|---|---|
committer | Christian Grothoff <grothoff@gnunet.org> | 2021-05-29 08:38:33 +0200 |
commit | 060816eafd6756575e94982e224ac47c8c6e69a6 (patch) | |
tree | 26808a6ab0ba17d9553cfa3765c64489d7d00b26 | |
parent | 3df47fa6d76ab01a3532659378ca54bb00724e1e (diff) |
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
-rw-r--r-- | src/exchange/taler-exchange-wirewatch.c | 28 |
1 files 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; |