summaryrefslogtreecommitdiff
path: root/src/c/request.c
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2011-01-23 18:16:30 -0500
committerGravatar Adam Chlipala <adam@chlipala.net>2011-01-23 18:16:30 -0500
commit997ba73ed8bc1b1d1e181570f6211ea6d0f68335 (patch)
treee667f8ad9df5e0e7f41b0bbc2f2d4f074eb0ccc2 /src/c/request.c
parentfa0d31c65e80bc15ca5bfbb6e22f1f68674f3dab (diff)
Proper error handling for periodic tasks
Diffstat (limited to 'src/c/request.c')
-rw-r--r--src/c/request.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/c/request.c b/src/c/request.c
index 4372c074..a5f0e2f1 100644
--- a/src/c/request.c
+++ b/src/c/request.c
@@ -96,10 +96,26 @@ static void *periodic_loop(void *data) {
exit(1);
while (1) {
+ int retries_left = MAX_RETRIES;
+
failure_kind r;
do {
+ uw_reset(ctx);
r = uw_runCallback(ctx, p->pdic.callback);
- } while (r == UNLIMITED_RETRY);
+ if (r == BOUNDED_RETRY)
+ --retries_left;
+ else if (r == UNLIMITED_RETRY)
+ p->ls->log_debug(p->ls->logger_data, "Error triggers unlimited retry in periodic: %s\n", uw_error_message(ctx));
+ else if (r == BOUNDED_RETRY)
+ p->ls->log_debug(p->ls->logger_data, "Error triggers bounded retry in periodic: %s\n", uw_error_message(ctx));
+ else if (r == FATAL)
+ p->ls->log_error(p->ls->logger_data, "Fatal error: %s\n", uw_error_message(ctx));
+ if (r == FATAL || r == BOUNDED_RETRY || r == UNLIMITED_RETRY)
+ try_rollback(ctx, 0, p->ls->logger_data, p->ls->log_error);
+ } while (r == UNLIMITED_RETRY || (r == BOUNDED_RETRY && retries_left > 0));
+
+ if (r != FATAL && r != BOUNDED_RETRY)
+ uw_commit(ctx);
sleep(p->pdic.period);
};