summaryrefslogtreecommitdiffstats
path: root/src/providers/dp_ptask.c
diff options
context:
space:
mode:
authorMichal Zidek <mzidek@redhat.com>2014-07-07 17:45:45 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-07-31 11:52:13 +0200
commitb39098de5bbb7513d5509fb30a3096a3bd9d43f2 (patch)
treedbd5883064330139f87b023b0ffecfa3c5371147 /src/providers/dp_ptask.c
parentab0ab5a30379b84d6e05e1f2dc457bd1dd97401f (diff)
downloadsssd-b39098de5bbb7513d5509fb30a3096a3bd9d43f2.tar.gz
sssd-b39098de5bbb7513d5509fb30a3096a3bd9d43f2.tar.xz
sssd-b39098de5bbb7513d5509fb30a3096a3bd9d43f2.zip
ptask: Add backoff feature to the ptask api.
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> Reviewed-by: Simo Sorce <simo@redhat.com>
Diffstat (limited to 'src/providers/dp_ptask.c')
-rw-r--r--src/providers/dp_ptask.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/providers/dp_ptask.c b/src/providers/dp_ptask.c
index 4d0fec445..255ad3fca 100644
--- a/src/providers/dp_ptask.c
+++ b/src/providers/dp_ptask.c
@@ -40,6 +40,9 @@ struct be_ptask {
time_t random_offset;
unsigned int ro_seed;
time_t timeout;
+ bool allow_backoff;
+ time_t max_backoff;
+ time_t backoff_delay;
enum be_ptask_offline offline;
be_ptask_send_t send_fn;
be_ptask_recv_t recv_fn;
@@ -210,6 +213,17 @@ static void be_ptask_schedule(struct be_ptask *task,
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;
+ }
+ }
+
if (task->random_offset != 0) {
delay = delay + (rand_r(&task->ro_seed) % task->random_offset);
}
@@ -253,6 +267,7 @@ errno_t be_ptask_create(TALLOC_CTX *mem_ctx,
time_t random_offset,
time_t timeout,
enum be_ptask_offline offline,
+ time_t max_backoff,
be_ptask_send_t send_fn,
be_ptask_recv_t recv_fn,
void *pvt,
@@ -290,6 +305,11 @@ 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);
@@ -350,6 +370,10 @@ void be_ptask_disable(struct be_ptask *task)
talloc_zfree(task->timer);
task->enabled = false;
+
+ if (task->allow_backoff) {
+ task->backoff_delay = 0;
+ }
}
void be_ptask_destroy(struct be_ptask **task)
@@ -418,6 +442,7 @@ errno_t be_ptask_create_sync(TALLOC_CTX *mem_ctx,
time_t random_offset,
time_t timeout,
enum be_ptask_offline offline,
+ time_t max_backoff,
be_ptask_sync_t fn,
void *pvt,
const char *name,
@@ -437,7 +462,7 @@ errno_t be_ptask_create_sync(TALLOC_CTX *mem_ctx,
ret = be_ptask_create(mem_ctx, be_ctx, period, first_delay,
enabled_delay, random_offset, timeout, offline,
- be_ptask_sync_send, be_ptask_sync_recv,
+ max_backoff, be_ptask_sync_send, be_ptask_sync_recv,
ctx, name, _task);
if (ret != EOK) {
goto done;