summaryrefslogtreecommitdiff
path: root/server
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
parentfeb09e4b9ab708951a96e388c044b07c12866104 (diff)
downloadsssd-d4fda88466dd49910eb562258a3be3dd253e33ec.tar.gz
sssd-d4fda88466dd49910eb562258a3be3dd253e33ec.tar.bz2
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')
-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 04aaa083..681848f7 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) {