summaryrefslogtreecommitdiff
path: root/src/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
parentfa0d31c65e80bc15ca5bfbb6e22f1f68674f3dab (diff)
Proper error handling for periodic tasks
Diffstat (limited to 'src/c')
-rw-r--r--src/c/request.c18
-rw-r--r--src/c/urweb.c9
2 files changed, 20 insertions, 7 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);
};
diff --git a/src/c/urweb.c b/src/c/urweb.c
index 67df7a2e..693cc87f 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -3684,15 +3684,12 @@ uw_Basis_postBody uw_getPostBody(uw_context ctx) {
failure_kind uw_runCallback(uw_context ctx, void (*callback)(uw_context)) {
int r = setjmp(ctx->jmp_buf);
- if (ctx->app->db_begin(ctx))
- uw_error(ctx, BOUNDED_RETRY, "Error running SQL BEGIN");
-
if (r == 0) {
+ if (ctx->app->db_begin(ctx))
+ uw_error(ctx, BOUNDED_RETRY, "Error running SQL BEGIN");
+
callback(ctx);
- uw_commit(ctx);
}
- else
- uw_rollback(ctx, 0);
return r;
}