diff options
author | Pavel Březina <pbrezina@redhat.com> | 2014-11-21 12:34:54 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-12-08 10:39:45 +0100 |
commit | babaca78cc196e7e0dcc3e972347951a081159f2 (patch) | |
tree | ee5f135177631bb3a9b513d9169a06ac5968a205 /src/providers/dp_ptask.c | |
parent | 5dcf3ffa3aa228701a79556dc0b889dba0aac535 (diff) | |
download | sssd-babaca78cc196e7e0dcc3e972347951a081159f2.tar.gz sssd-babaca78cc196e7e0dcc3e972347951a081159f2.tar.xz sssd-babaca78cc196e7e0dcc3e972347951a081159f2.zip |
be_ptask: let backoff affect only period
With this patch the first and enabled delay values are respected.
Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src/providers/dp_ptask.c')
-rw-r--r-- | src/providers/dp_ptask.c | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/src/providers/dp_ptask.c b/src/providers/dp_ptask.c index 3540579e8..b5ab79b1d 100644 --- a/src/providers/dp_ptask.c +++ b/src/providers/dp_ptask.c @@ -28,13 +28,21 @@ #include "providers/dp_ptask_private.h" #include "providers/dp_ptask.h" +#define backoff_allowed(ptask) (ptask->max_backoff != 0) + enum be_ptask_schedule { BE_PTASK_SCHEDULE_FROM_NOW, BE_PTASK_SCHEDULE_FROM_LAST }; +enum be_ptask_delay { + BE_PTASK_FIRST_DELAY, + BE_PTASK_ENABLED_DELAY, + BE_PTASK_PERIOD +}; + static void be_ptask_schedule(struct be_ptask *task, - time_t delay, + enum be_ptask_delay delay_type, enum be_ptask_schedule from); static int be_ptask_destructor(void *pvt) @@ -86,7 +94,7 @@ static void be_ptask_timeout(struct tevent_context *ev, DEBUG(SSSDBG_OP_FAILURE, "Task [%s]: timed out\n", task->name); talloc_zfree(task->req); - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_PERIOD, BE_PTASK_SCHEDULE_FROM_NOW); } static void be_ptask_done(struct tevent_req *req); @@ -106,7 +114,8 @@ static void be_ptask_execute(struct tevent_context *ev, DEBUG(SSSDBG_TRACE_FUNC, "Back end is offline\n"); switch (task->offline) { case BE_PTASK_OFFLINE_SKIP: - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_PERIOD, + BE_PTASK_SCHEDULE_FROM_NOW); return; case BE_PTASK_OFFLINE_DISABLE: /* This case is normally handled by offline callback but we @@ -131,7 +140,7 @@ static void be_ptask_execute(struct tevent_context *ev, DEBUG(SSSDBG_OP_FAILURE, "Task [%s]: failed to execute task, " "will try again later\n", task->name); - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_PERIOD, BE_PTASK_SCHEDULE_FROM_NOW); return; } @@ -150,7 +159,8 @@ static void be_ptask_execute(struct tevent_context *ev, DEBUG(SSSDBG_OP_FAILURE, "Task [%s]: failed to set timeout, " "the task will be rescheduled\n", task->name); - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_PERIOD, + BE_PTASK_SCHEDULE_FROM_NOW); } } @@ -172,39 +182,47 @@ static void be_ptask_done(struct tevent_req *req) DEBUG(SSSDBG_TRACE_FUNC, "Task [%s]: finished successfully\n", task->name); - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_LAST); + be_ptask_schedule(task, BE_PTASK_PERIOD, BE_PTASK_SCHEDULE_FROM_LAST); break; default: DEBUG(SSSDBG_OP_FAILURE, "Task [%s]: failed with [%d]: %s\n", task->name, ret, sss_strerror(ret)); - be_ptask_schedule(task, task->period, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_PERIOD, BE_PTASK_SCHEDULE_FROM_NOW); break; } } static void be_ptask_schedule(struct be_ptask *task, - time_t delay, + enum be_ptask_delay delay_type, enum be_ptask_schedule from) { struct timeval tv; + time_t delay = 0; if (!task->enabled) { DEBUG(SSSDBG_TRACE_FUNC, "Task [%s]: disabled\n", task->name); return; } - if (task->allow_backoff) { - if (task->backoff_delay == 0) { - task->backoff_delay = task->period; - } else { - task->backoff_delay = (task->backoff_delay * 2 > task->max_backoff) - ? task->max_backoff - : task->backoff_delay * 2; - delay = task->backoff_delay; + switch (delay_type) { + case BE_PTASK_FIRST_DELAY: + delay = task->first_delay; + break; + case BE_PTASK_ENABLED_DELAY: + delay = task->enabled_delay; + break; + case BE_PTASK_PERIOD: + delay = task->period; + + if (backoff_allowed(task) && task->period * 2 <= task->max_backoff) { + /* double the period for the next execution */ + task->period *= 2; } + break; } + /* add random offset */ if (task->random_offset != 0) { delay = delay + (rand_r(&task->ro_seed) % task->random_offset); } @@ -274,9 +292,12 @@ errno_t be_ptask_create(TALLOC_CTX *mem_ctx, task->ev = be_ctx->ev; task->be_ctx = be_ctx; task->period = period; + task->orig_period = period; + task->first_delay = first_delay; task->enabled_delay = enabled_delay; task->random_offset = random_offset; task->ro_seed = time(NULL) * getpid(); + task->max_backoff = max_backoff; task->timeout = timeout; task->offline = offline; task->send_fn = send_fn; @@ -288,11 +309,6 @@ errno_t be_ptask_create(TALLOC_CTX *mem_ctx, goto done; } - if (max_backoff != 0) { - task->max_backoff = max_backoff; - task->allow_backoff = true; - } - task->enabled = true; talloc_set_destructor((TALLOC_CTX*)task, be_ptask_destructor); @@ -316,7 +332,7 @@ errno_t be_ptask_create(TALLOC_CTX *mem_ctx, DEBUG(SSSDBG_TRACE_FUNC, "Periodic task [%s] was created\n", task->name); - be_ptask_schedule(task, first_delay, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_FIRST_DELAY, BE_PTASK_SCHEDULE_FROM_NOW); if (_task != NULL) { *_task = task; @@ -343,7 +359,7 @@ void be_ptask_enable(struct be_ptask *task) DEBUG(SSSDBG_TRACE_FUNC, "Task [%s]: enabling task\n", task->name); task->enabled = true; - be_ptask_schedule(task, task->enabled_delay, BE_PTASK_SCHEDULE_FROM_NOW); + be_ptask_schedule(task, BE_PTASK_ENABLED_DELAY, BE_PTASK_SCHEDULE_FROM_NOW); } /* Disable the task, but if a request already in progress, let it finish. */ @@ -353,10 +369,7 @@ void be_ptask_disable(struct be_ptask *task) talloc_zfree(task->timer); task->enabled = false; - - if (task->allow_backoff) { - task->backoff_delay = 0; - } + task->period = task->orig_period; } void be_ptask_destroy(struct be_ptask **task) |