summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/back-shr.c110
-rw-r--r--src/plug-sch.c4
2 files changed, 96 insertions, 18 deletions
diff --git a/src/back-shr.c b/src/back-shr.c
index c68640a..36ecc0b 100644
--- a/src/back-shr.c
+++ b/src/back-shr.c
@@ -664,40 +664,56 @@ backend_shr_get_vattr_sdnlist(struct plugin_state *state,
return ret;
}
-/* Scan for the list of configured groups and sets. */
-void
-backend_shr_startup(struct plugin_state *state,
- Slapi_PBlock *parent_pb,
- const char *filter)
+struct backend_shr_data_init_cbdata {
+ Slapi_PBlock *parent_pb;
+ struct plugin_state *state;
+ const char *filter;
+};
+
+#define PLUGIN_SCAN_DELAY 5
+
+static void
+backend_shr_data_initialize_thread_cb(void *arg)
{
- Slapi_PBlock *pb;
+ struct backend_shr_data_init_cbdata *cbdata = (struct backend_shr_data_init_cbdata *)arg;
+ Slapi_PBlock *pb = NULL;
struct backend_set_config_entry_add_cbdata set_cbdata;
+ int result = 0;
+ if (cbdata == NULL) {
+ return;
+ }
+
+ /* Scan may require consulting SSSD for external identities
+ * therefore, we need to make sure the scan starts after ns-slapd
+ * started to serve LDAP clients. There is no a signal for this,
+ * so we just wait some time. */
+ DS_Sleep(PR_SecondsToInterval(PLUGIN_SCAN_DELAY));
- backend_update_params(parent_pb, state);
+ backend_update_params(cbdata->parent_pb, cbdata->state);
slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ cbdata->state->plugin_desc->spd_id,
"searching under \"%s\" for configuration\n",
- state->plugin_base);
- pb = wrap_pblock_new(parent_pb);
+ cbdata->state->plugin_base);
+ pb = wrap_pblock_new(cbdata->parent_pb);
slapi_search_internal_set_pb(pb,
- state->plugin_base,
+ cbdata->state->plugin_base,
LDAP_SCOPE_ONELEVEL,
- filter,
+ cbdata->filter,
NULL, FALSE,
NULL,
NULL,
- state->plugin_identity,
+ cbdata->state->plugin_identity,
0);
if (map_wrlock() != 0) {
slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ cbdata->state->plugin_desc->spd_id,
"failed to search under \"%s\" for "
"configuration: failed to acquire a lock\n",
- state->plugin_base);
+ cbdata->state->plugin_base);
goto done_with_lock;
}
- set_cbdata.state = state;
+ set_cbdata.state = cbdata->state;
set_cbdata.pb = pb;
slapi_search_internal_callback_pb(pb, &set_cbdata,
NULL,
@@ -706,6 +722,68 @@ backend_shr_startup(struct plugin_state *state,
map_unlock();
done_with_lock:
slapi_pblock_destroy(pb);
+ if (cbdata) {
+ slapi_ch_free((void**)&cbdata);
+ }
+}
+
+static void
+backend_shr_data_initialize_thread(time_t when, void *arg)
+{
+ struct backend_shr_data_init_cbdata *cbdata = (struct backend_shr_data_init_cbdata *)arg;
+ PRThread *thread = NULL;
+
+ /* start data import as a separate thread */
+ thread = PR_CreateThread(PR_USER_THREAD, backend_shr_data_initialize_thread_cb,
+ (void *)arg, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD,
+ PR_UNJOINABLE_THREAD, SLAPD_DEFAULT_THREAD_STACKSIZE);
+ if (thread == NULL) {
+ slapi_log_error(SLAPI_LOG_FATAL,
+ cbdata->state->plugin_desc->spd_id,
+ "unable to create compatibility tree scan thread!\n");
+ } else {
+ slapi_log_error(SLAPI_LOG_FATAL,
+ cbdata->state->plugin_desc->spd_id,
+ "%s tree scan will start in about %d seconds!\n",
+ cbdata->state->plugin_desc->spd_id, PLUGIN_SCAN_DELAY);
+ }
+
+}
+
+/* Scan for the list of configured groups and sets. */
+void
+backend_shr_startup(struct plugin_state *state,
+ Slapi_PBlock *parent_pb,
+ const char *filter)
+{
+ struct backend_shr_data_init_cbdata *cbdata = NULL;
+
+ cbdata = (struct backend_shr_data_init_cbdata *)
+ slapi_ch_malloc(sizeof(struct backend_shr_data_init_cbdata));
+
+ if (cbdata == NULL) {
+ slapi_log_error(SLAPI_LOG_FATAL,
+ state->plugin_desc->spd_id,
+ "failed to create a task for populating "
+ "compatibility tree\n");
+ return;
+ }
+
+ cbdata->state = state;
+ cbdata->parent_pb = parent_pb;
+ cbdata->filter = filter;
+
+ /* Schedule running a callback that will create a thread */
+ slapi_eq_once(backend_shr_data_initialize_thread,
+ cbdata, PR_SecondsToInterval(PLUGIN_SCAN_DELAY));
+
+ slapi_log_error(SLAPI_LOG_FATAL,
+ cbdata->state->plugin_desc->spd_id,
+ "scheduled %s tree scan in about %d seconds after the server startup!\n",
+ state->plugin_desc->spd_id, PLUGIN_SCAN_DELAY);
+
+ return;
+
}
/* Process a set configuration directory entry. Pull out the group and set
diff --git a/src/plug-sch.c b/src/plug-sch.c
index f132e6d..95a4fd8 100644
--- a/src/plug-sch.c
+++ b/src/plug-sch.c
@@ -109,8 +109,6 @@ plugin_startup(Slapi_PBlock *pb)
state->plugin_base ? "\"" : "",
state->plugin_base ? state->plugin_base : "NULL",
state->plugin_base ? "\"" : "");
- /* Populate the tree of fake entries. */
- backend_startup(pb, state);
state->pam_lock = wrap_new_rwlock();
backend_nss_init_context((struct nss_ops_ctx**) &state->nss_context);
if ((slapi_pblock_get(pb, SLAPI_PLUGIN_CONFIG_ENTRY, &plugin_entry) == 0) &&
@@ -123,6 +121,8 @@ plugin_startup(Slapi_PBlock *pb)
wrap_rwlock_wrlock(state->cached_entries_lock);
state->cached_entries = PL_NewHashTable(0, PL_HashString, PL_CompareStrings, PL_CompareValues, 0, 0);
wrap_rwlock_unlock(state->cached_entries_lock);
+ /* Populate the tree of fake entries. */
+ backend_startup(pb, state);
/* Note that the plugin is ready to go. */
slapi_log_error(SLAPI_LOG_PLUGIN, plugin_description.spd_id,
"plugin startup completed\n");