mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
s4:samldb: use the code path with async ldb
This removes the event_context leak that caused NT_STATUS_TOO_MANY_OPENED_FILES in the server, because of all the epool fds metze
This commit is contained in:
parent
95940d75ec
commit
59c3df814a
@ -154,12 +154,8 @@ static int samldb_search_template_callback(struct ldb_request *req,
|
||||
goto done;
|
||||
}
|
||||
if (ares->error != LDB_SUCCESS) {
|
||||
#ifdef REAL_EVENT_SYSTEM_HOOKED_UP
|
||||
return ldb_module_done(ac->req, ares->controls,
|
||||
ares->response, ares->error);
|
||||
#else
|
||||
return ldb_request_done(req, ares->error);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch (ares->type) {
|
||||
@ -187,21 +183,13 @@ static int samldb_search_template_callback(struct ldb_request *req,
|
||||
case LDB_REPLY_DONE:
|
||||
|
||||
talloc_free(ares);
|
||||
#ifdef REAL_EVENT_SYSTEM_HOOKED_UP
|
||||
ret = samldb_next_step(ac);
|
||||
#else
|
||||
return ldb_request_done(req, LDB_SUCCESS);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
done:
|
||||
if (ret != LDB_SUCCESS) {
|
||||
#ifdef REAL_EVENT_SYSTEM_HOOKED_UP
|
||||
return ldb_module_done(ac->req, NULL, NULL, ret);
|
||||
#else
|
||||
return ldb_request_done(req, ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
return LDB_SUCCESS;
|
||||
@ -240,20 +228,7 @@ static int samldb_search_template(struct samldb_ctx *ac)
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
/* NOTE: this is a request on a different database!
|
||||
*
|
||||
* Therefore we need to do a bloody sync call
|
||||
* otherwise the fake event queue will never call it
|
||||
* as it runs on the main ldb context and knows
|
||||
* nothing about the templates_ldb one */
|
||||
#ifdef REAL_EVENT_SYSTEM_HOOKED_UP
|
||||
ev = ldb_get_event_context(ac->module->ldb);
|
||||
#else
|
||||
ev = event_context_init(NULL);
|
||||
#endif
|
||||
if (!talloc_reference(templates_ldb, ev)) {
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
templates_ldb = ldb_wrap_connect(ac->module->ldb, ev,
|
||||
lparm_ctx, templates_ldb_path,
|
||||
@ -264,6 +239,10 @@ static int samldb_search_template(struct samldb_ctx *ac)
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
if (!talloc_reference(templates_ldb, ev)) {
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
ret = ldb_set_opaque(ac->module->ldb,
|
||||
"templates_ldb", templates_ldb);
|
||||
if (ret != LDB_SUCCESS) {
|
||||
@ -295,25 +274,7 @@ static int samldb_search_template(struct samldb_ctx *ac)
|
||||
talloc_steal(req, basedn);
|
||||
ac->ares = NULL;
|
||||
|
||||
/* NOTE: this is a request on a different database!
|
||||
* Therefore we need to do a bloody sync call
|
||||
* otherwise the fake event queue will never call it
|
||||
* as it runs on the main ldb context and knows
|
||||
* nothing about the templates_ldb one */
|
||||
#ifdef REAL_EVENT_SYSTEM_HOOKED_UP
|
||||
return ldb_request(templates_ldb, req);
|
||||
#else
|
||||
ret = ldb_request(templates_ldb, req);
|
||||
if (ret != LDB_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
ret = ldb_wait(req->handle, LDB_WAIT_ALL);
|
||||
if (ret != LDB_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return samldb_next_step(ac);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int samldb_apply_template(struct samldb_ctx *ac)
|
||||
|
Loading…
Reference in New Issue
Block a user