summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchange/taler-exchange-wirewatch.c28
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;