summaryrefslogtreecommitdiffstats
path: root/src/providers
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2012-12-17 12:04:54 +0100
committerJakub Hrozek <jhrozek@redhat.com>2012-12-18 16:40:51 +0100
commite148ba6dbb26a0eac162ac9a2ff550da2c883808 (patch)
tree3759902a64db4b95a0a42d110d4936d451b77546 /src/providers
parent4f945b6b3646fb982cc8e3c41c38059052f2240f (diff)
downloadsssd-e148ba6dbb26a0eac162ac9a2ff550da2c883808.tar.gz
sssd-e148ba6dbb26a0eac162ac9a2ff550da2c883808.tar.xz
sssd-e148ba6dbb26a0eac162ac9a2ff550da2c883808.zip
try primary server after retry_timeout + 1 seconds when switching to backup
https://fedorahosted.org/sssd/ticket/1679 The problem is when we are about to reset the server status, we don't get through the timeout (30 seconds) because the "switch to primary server" task is scheduled 30 seconds after fall back to a backup server. Thus the server status remains "not working" and is resetted after another 30 seconds. We need to make sure that the server status is tried after the timeout period. retry_timeout is currently hardcoded to 30, thus the change in man page.
Diffstat (limited to 'src/providers')
-rw-r--r--src/providers/data_provider_fo.c3
-rw-r--r--src/providers/fail_over.c9
-rw-r--r--src/providers/fail_over.h2
3 files changed, 13 insertions, 1 deletions
diff --git a/src/providers/data_provider_fo.c b/src/providers/data_provider_fo.c
index a1b96be35..69ade47b9 100644
--- a/src/providers/data_provider_fo.c
+++ b/src/providers/data_provider_fo.c
@@ -531,6 +531,7 @@ static void be_resolve_server_done(struct tevent_req *subreq)
struct tevent_req);
struct be_resolve_server_state *state = tevent_req_data(req,
struct be_resolve_server_state);
+ time_t timeout = fo_get_service_retry_timeout(state->svc->fo_service) + 1;
int ret;
ret = be_resolve_server_process(subreq, state, &new_subreq);
@@ -546,7 +547,7 @@ static void be_resolve_server_done(struct tevent_req *subreq)
/* FIXME: make the timeout configurable */
ret = be_primary_server_timeout_activate(state->ctx, state->ev,
state->ctx, state->svc,
- 30);
+ timeout);
if (ret != EOK) {
goto fail;
}
diff --git a/src/providers/fail_over.c b/src/providers/fail_over.c
index f3bba37f7..e7c44174d 100644
--- a/src/providers/fail_over.c
+++ b/src/providers/fail_over.c
@@ -1555,6 +1555,15 @@ fo_get_server_hostname_last_change(struct fo_server *server)
return server->common->last_status_change.tv_sec;
}
+time_t fo_get_service_retry_timeout(struct fo_service *svc)
+{
+ if (svc == NULL || svc->ctx == NULL || svc->ctx->opts == NULL) {
+ return 0;
+ }
+
+ return svc->ctx->opts->retry_timeout;
+}
+
void fo_reset_services(struct fo_ctx *fo_ctx)
{
struct fo_service *service;
diff --git a/src/providers/fail_over.h b/src/providers/fail_over.h
index 0eb212584..1ad081e78 100644
--- a/src/providers/fail_over.h
+++ b/src/providers/fail_over.h
@@ -192,6 +192,8 @@ time_t fo_get_server_hostname_last_change(struct fo_server *server);
int fo_is_srv_lookup(struct fo_server *s);
+time_t fo_get_service_retry_timeout(struct fo_service *svc);
+
void fo_reset_services(struct fo_ctx *fo_ctx);
bool fo_svc_has_server(struct fo_service *service, struct fo_server *server);