bool bWinbindNormalizeNames;
bool bWinbindRpcOnly;
bool bCreateKrb5Conf;
+ int winbindMaxDomainConnections;
char *szIdmapBackend;
char *szIdmapAllocBackend;
char *szAddShareCommand;
.enum_list = NULL,
.flags = FLAG_ADVANCED,
},
+ {
+ .label = "winbind max domain connections",
+ .type = P_INTEGER,
+ .p_class = P_GLOBAL,
+ .ptr = &Globals.winbindMaxDomainConnections,
+ .special = NULL,
+ .enum_list = NULL,
+ .flags = FLAG_ADVANCED,
+ },
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
};
Globals.bUnixExtensions = True;
Globals.bResetOnZeroVC = False;
Globals.bCreateKrb5Conf = true;
+ Globals.winbindMaxDomainConnections = 2;
/* hostname lookups can be very expensive and are broken on
a large number of sites (tridge) */
FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames)
FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly)
FN_GLOBAL_BOOL(lp_create_krb5_conf, &Globals.bCreateKrb5Conf)
+FN_GLOBAL_INTEGER(lp_winbind_max_domain_connections,
+ &Globals.winbindMaxDomainConnections)
FN_GLOBAL_CONST_STRING(lp_idmap_backend, &Globals.szIdmapBackend)
FN_GLOBAL_STRING(lp_idmap_alloc_backend, &Globals.szIdmapAllocBackend)
/* The child pid we're talking to */
- struct winbindd_child child;
+ struct winbindd_child *children;
/* Callback we use to try put us back online. */
void setup_domain_child(struct winbindd_domain *domain)
{
- setup_child(&domain->child, domain_dispatch_table,
- "log.wb", domain->name);
+ int i;
- domain->child.domain = domain;
+ for (i=0; i<lp_winbind_max_domain_connections(); i++) {
+ setup_child(&domain->children[i], domain_dispatch_table,
+ "log.wb", domain->name);
+ domain->children[i].domain = domain;
+ }
}
static const struct winbindd_child_dispatch_table domain_dispatch_table[] = {
return;
}
+static struct winbindd_child *find_idle_child(struct winbindd_domain *domain)
+{
+ int i;
+
+ for (i=0; i<lp_winbind_max_domain_connections(); i++) {
+ if (!winbindd_child_busy(&domain->children[i])) {
+ return &domain->children[i];
+ }
+ }
+
+ return NULL;
+}
+
+static struct winbindd_child *choose_domain_child(
+ struct winbindd_domain *domain)
+{
+ struct winbindd_child *result;
+
+ result = find_idle_child(domain);
+ if (result != NULL) {
+ return result;
+ }
+ return &domain->children[rand() % lp_winbind_max_domain_connections()];
+}
+
struct domain_request_state {
TALLOC_CTX *mem_ctx;
struct winbindd_domain *domain;
struct domain_request_state *state;
if (domain->initialized) {
- async_request(mem_ctx, &domain->child, request, response,
+ struct winbindd_child *child = choose_domain_child(domain);
+
+ async_request(mem_ctx, child, request, response,
continuation, private_data_data);
return;
}
return;
}
- async_request(state->mem_ctx, &state->domain->child,
+ async_request(state->mem_ctx, &state->domain->children[0],
state->request, state->response,
state->continuation, state->private_data_data);
}
const char *name,
const struct winbindd_domain *r)
{
+ int i;
if (!r) {
return;
}
ndr_print_uint32(ndr, "sequence_number", r->sequence_number);
ndr_print_NTSTATUS(ndr, "last_status", r->last_status);
ndr_print_winbindd_cm_conn(ndr, "conn", &r->conn);
- ndr_print_winbindd_child(ndr, "child", &r->child);
+ for (i=0; i<lp_winbind_max_domain_connections(); i++) {
+ ndr_print_winbindd_child(ndr, "children", &r->children[i]);
+ }
ndr_print_uint32(ndr, "check_online_timeout", r->check_online_timeout);
ndr_print_ptr(ndr, "check_online_event", r->check_online_event);
ndr->depth--;
ZERO_STRUCTP(domain);
+ domain->children = SMB_MALLOC_ARRAY(
+ struct winbindd_child, lp_winbind_max_domain_connections());
+ if (domain->children == NULL) {
+ SAFE_FREE(domain);
+ return NULL;
+ }
+ memset(domain->children, 0,
+ sizeof(struct winbindd_child)
+ * lp_winbind_max_domain_connections());
+
fstrcpy(domain->name, domain_name);
if (alternative_name) {
fstrcpy(domain->alt_name, alternative_name);
fstrcpy(request->domain_name, domain->name);
request->data.init_conn.is_primary = domain->primary ? true : false;
fstrcpy(request->data.init_conn.dcname, "");
- async_request(mem_ctx, &domain->child, request, response,
+ async_request(mem_ctx, &domain->children[0], request, response,
init_child_recv, state);
return WINBINDD_PENDING;
}
state->request->data.init_conn.is_primary = False;
fstrcpy(state->request->data.init_conn.dcname, dcname);
- async_request(state->mem_ctx, &state->domain->child,
+ async_request(state->mem_ctx, &state->domain->children[0],
state->request, state->response,
init_child_recv, state);
}