summaryrefslogtreecommitdiffstats
path: root/server/providers/ldap/ldap_id.c
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2009-10-21 16:39:31 -0400
committerStephen Gallagher <sgallagh@redhat.com>2009-10-22 13:56:20 -0400
commitd4fda88466dd49910eb562258a3be3dd253e33ec (patch)
treed036a79f8d034af08a502de75fc252de1fa2ac0b /server/providers/ldap/ldap_id.c
parentfeb09e4b9ab708951a96e388c044b07c12866104 (diff)
downloadsssd-d4fda88466dd49910eb562258a3be3dd253e33ec.tar.gz
sssd-d4fda88466dd49910eb562258a3be3dd253e33ec.tar.xz
sssd-d4fda88466dd49910eb562258a3be3dd253e33ec.zip
Better offline/enumeration behavior
Go offline in case of hard errors too. It makes no sense to keep trying too often when you have bad credentials for example. Also delay starting the enumeration thread so that we finish initializations first (bind to ldap is still a blocking operation and this may interfere with clients/monitor registrations).
Diffstat (limited to 'server/providers/ldap/ldap_id.c')
-rw-r--r--server/providers/ldap/ldap_id.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/server/providers/ldap/ldap_id.c b/server/providers/ldap/ldap_id.c
index 04aaa0836..681848f71 100644
--- a/server/providers/ldap/ldap_id.c
+++ b/server/providers/ldap/ldap_id.c
@@ -219,7 +219,6 @@ static void users_get_done(struct tevent_req *req)
const char *error = NULL;
int ret = EOK;
-
if (tevent_req_is_error(req, &tstate, &err)) {
ret = err;
}
@@ -230,6 +229,8 @@ static void users_get_done(struct tevent_req *req)
if (ret == ETIMEDOUT) {
dp_err = DP_ERR_TIMEOUT;
+ }
+ if (ret == ETIMEDOUT || ret == EFAULT) {
ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data,
struct sdap_id_ctx);
be_mark_offline(ctx->be);
@@ -395,6 +396,8 @@ static void groups_get_done(struct tevent_req *req)
if (ret == ETIMEDOUT) {
dp_err = DP_ERR_TIMEOUT;
+ }
+ if (ret == ETIMEDOUT || ret == EFAULT) {
ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data,
struct sdap_id_ctx);
be_mark_offline(ctx->be);
@@ -535,6 +538,8 @@ static void groups_by_user_done(struct tevent_req *req)
if (ret == ETIMEDOUT) {
dp_err = DP_ERR_TIMEOUT;
+ }
+ if (ret == ETIMEDOUT || ret == EFAULT) {
ctx = talloc_get_type(breq->be_ctx->bet_info[BET_ID].pvt_bet_data,
struct sdap_id_ctx);
be_mark_offline(ctx->be);
@@ -804,9 +809,7 @@ fail:
DEBUG(9, ("User enumeration failed with: (%d)[%s]\n",
(int)err, strerror(err)));
- if (err == ETIMEDOUT) {
- be_mark_offline(state->ctx->be);
- }
+ be_mark_offline(state->ctx->be);
}
DEBUG(1, ("Failed to enumerate users, retrying later!\n"));
@@ -831,10 +834,8 @@ static void ldap_id_enum_groups_done(struct tevent_req *subreq)
return;
fail:
- if (err == ETIMEDOUT) {
- be_mark_offline(state->ctx->be);
- }
-
+ /* always go offline on failures */
+ be_mark_offline(state->ctx->be);
DEBUG(1, ("Failed to enumerate groups, retrying later!\n"));
tevent_req_done(req);
}
@@ -1137,8 +1138,9 @@ int sdap_id_setup_tasks(struct sdap_id_ctx *ctx)
/* set up enumeration task */
if (ctx->be->domain->enumerate) {
- /* run the first immediately */
- ctx->last_run = tevent_timeval_current();
+ /* run the first one in a couple of seconds so that we have time to
+ * finish initializations first*/
+ ctx->last_run = tevent_timeval_current_ofs(2, 0);
enum_task = tevent_add_timer(ctx->be->ev, ctx, ctx->last_run,
ldap_id_enumerate, ctx);
if (!enum_task) {