diff options
Diffstat (limited to 'src/providers')
-rw-r--r-- | src/providers/ldap/ldap_common.c | 31 | ||||
-rw-r--r-- | src/providers/ldap/ldap_id_enum.c | 14 |
2 files changed, 42 insertions, 3 deletions
diff --git a/src/providers/ldap/ldap_common.c b/src/providers/ldap/ldap_common.c index 9945b4b13..a38d5cc20 100644 --- a/src/providers/ldap/ldap_common.c +++ b/src/providers/ldap/ldap_common.c @@ -415,12 +415,37 @@ int sdap_id_setup_tasks(struct sdap_id_ctx *ctx) struct timeval tv; int ret = EOK; int delay; + bool has_enumerated; /* set up enumeration task */ if (ctx->be->domain->enumerate) { - /* run the first one in a couple of seconds so that we have time to - * finish initializations first*/ - tv = tevent_timeval_current_ofs(10, 0); + /* If this is the first startup, we need to kick off + * an enumeration immediately, to close a window where + * clients requesting get*ent information won't get an + * immediate reply with no entries + */ + ret = sysdb_has_enumerated(ctx->be->sysdb, + ctx->be->domain, + &has_enumerated); + if (ret != EOK) { + return ret; + } + if (has_enumerated) { + /* At least one enumeration has previously run, + * so clients will get cached data. We will delay + * starting to enumerate by 10s so we don't slow + * down the startup process if this is happening + * during system boot. + */ + tv = tevent_timeval_current_ofs(10, 0); + } else { + /* This is our first startup. Schedule the + * enumeration to start immediately once we + * enter the mainloop. + */ + tv = tevent_timeval_current(); + } + ret = ldap_id_enumerate_set_timer(ctx, tv); } else { /* the enumeration task, runs the cleanup process by itself, diff --git a/src/providers/ldap/ldap_id_enum.c b/src/providers/ldap/ldap_id_enum.c index f2ac8c6a9..8695f3550 100644 --- a/src/providers/ldap/ldap_id_enum.c +++ b/src/providers/ldap/ldap_id_enum.c @@ -134,12 +134,26 @@ static void ldap_id_enumerate_reschedule(struct tevent_req *req) uint64_t err; struct timeval tv; int delay; + errno_t ret; if (tevent_req_is_error(req, &tstate, &err)) { /* On error schedule starting from now, not the last run */ tv = tevent_timeval_current(); } else { tv = ctx->last_enum; + + /* Ok, we've completed an enumeration. Save this to the + * sysdb so we can postpone starting up the enumeration + * process on the next SSSD service restart (to avoid + * slowing down system boot-up + */ + ret = sysdb_set_enumerated(ctx->be->sysdb, + ctx->be->domain, + true); + if (ret != EOK) { + DEBUG(1, ("Could not mark domain as having enumerated.\n")); + /* This error is non-fatal, so continue */ + } } talloc_zfree(req); |