summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Gallagher <sgallagh@redhat.com>2010-01-13 14:13:14 -0500
committerStephen Gallagher <sgallagh@redhat.com>2010-01-14 09:09:44 -0500
commit89648ee8c27f91b178c6eda3dadec854bd631cb9 (patch)
tree3ff182e52085c2f5324b4a9297c411e79c3a014b
parenta3292cb6f06ac6ba9a9bdeb9a080751b3635a3ec (diff)
downloadsssd-89648ee8c27f91b178c6eda3dadec854bd631cb9.tar.gz
sssd-89648ee8c27f91b178c6eda3dadec854bd631cb9.tar.xz
sssd-89648ee8c27f91b178c6eda3dadec854bd631cb9.zip
Explicitly set async DNS timeout
We will allow 5s per DNS server, no retries.
-rw-r--r--server/providers/data_provider_fo.c2
-rw-r--r--server/resolv/async_resolv.c13
-rw-r--r--server/resolv/async_resolv.h2
-rw-r--r--server/tests/fail_over-tests.c2
-rw-r--r--server/tests/resolv-tests.c2
5 files changed, 15 insertions, 6 deletions
diff --git a/server/providers/data_provider_fo.c b/server/providers/data_provider_fo.c
index 23c857aa0..7d0240489 100644
--- a/server/providers/data_provider_fo.c
+++ b/server/providers/data_provider_fo.c
@@ -66,7 +66,7 @@ int be_init_failover(struct be_ctx *ctx)
return ENOMEM;
}
- ret = resolv_init(ctx, ctx->ev, &ctx->be_fo->resolv);
+ ret = resolv_init(ctx, ctx->ev, 5, &ctx->be_fo->resolv);
if (ret != EOK) {
talloc_zfree(ctx->be_fo);
return ret;
diff --git a/server/resolv/async_resolv.c b/server/resolv/async_resolv.c
index c350d6c36..8455b575e 100644
--- a/server/resolv/async_resolv.c
+++ b/server/resolv/async_resolv.c
@@ -72,6 +72,9 @@ struct resolv_ctx {
ares_channel channel;
/* List of file descriptors that are watched by tevent. */
struct fd_watch *fds;
+
+ /* Time in milliseconds before canceling a DNS request */
+ int timeout;
};
struct resolv_ctx *context_list;
@@ -242,7 +245,12 @@ recreate_ares_channel(struct resolv_ctx *ctx)
*/
options.sock_state_cb = fd_event;
options.sock_state_cb_data = ctx;
- ret = ares_init_options(&new_channel, &options, ARES_OPT_SOCK_STATE_CB);
+ options.timeout = ctx->timeout * 1000;
+ options.tries = 1;
+ ret = ares_init_options(&new_channel, &options,
+ ARES_OPT_SOCK_STATE_CB |
+ ARES_OPT_TIMEOUTMS |
+ ARES_OPT_TRIES);
if (ret != ARES_SUCCESS) {
DEBUG(1, ("Failed to initialize ares channel: %s\n",
resolv_strerror(ret)));
@@ -261,7 +269,7 @@ recreate_ares_channel(struct resolv_ctx *ctx)
int
resolv_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx,
- struct resolv_ctx **ctxp)
+ int timeout, struct resolv_ctx **ctxp)
{
int ret;
struct resolv_ctx *ctx;
@@ -271,6 +279,7 @@ resolv_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx,
return ENOMEM;
ctx->ev_ctx = ev_ctx;
+ ctx->timeout = timeout;
ret = recreate_ares_channel(ctx);
if (ret != EOK) {
diff --git a/server/resolv/async_resolv.h b/server/resolv/async_resolv.h
index e0515383b..5558e15c6 100644
--- a/server/resolv/async_resolv.h
+++ b/server/resolv/async_resolv.h
@@ -47,7 +47,7 @@
struct resolv_ctx;
int resolv_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx,
- struct resolv_ctx **ctxp);
+ int timeout, struct resolv_ctx **ctxp);
void resolv_reread_configuration(void);
diff --git a/server/tests/fail_over-tests.c b/server/tests/fail_over-tests.c
index 16cc60e3e..c3e9dfe52 100644
--- a/server/tests/fail_over-tests.c
+++ b/server/tests/fail_over-tests.c
@@ -71,7 +71,7 @@ setup_test(void)
fail("Could not init tevent context");
}
- ret = resolv_init(ctx, ctx->ev, &ctx->resolv);
+ ret = resolv_init(ctx, ctx->ev, 5, &ctx->resolv);
if (ret != EOK) {
talloc_free(ctx);
fail("Could not init resolv context");
diff --git a/server/tests/resolv-tests.c b/server/tests/resolv-tests.c
index d6b8c4f38..0c18dfdcf 100644
--- a/server/tests/resolv-tests.c
+++ b/server/tests/resolv-tests.c
@@ -73,7 +73,7 @@ static int setup_resolv_test(struct resolv_test_ctx **ctx)
return EFAULT;
}
- ret = resolv_init(test_ctx, test_ctx->ev, &test_ctx->resolv);
+ ret = resolv_init(test_ctx, test_ctx->ev, 5, &test_ctx->resolv);
if (ret != EOK) {
fail("Could not init resolv context");
talloc_free(test_ctx);