X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=source3%2Fwinbindd%2Fwinbindd_dual.c;h=993166d82d91991646effe62e11a625b027eaefb;hp=33f1393e08203a7d0fd374bd8104895f476aa00e;hb=b4384b7f0ecf3b47dd60acaf77636b679e3adc05;hpb=cb920dd8732af30a7f74d5b492ea6ddfc2adfcbd diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 33f1393e082..993166d82d9 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -248,33 +248,31 @@ static void wb_child_request_cleanup(struct tevent_req *req, DLIST_REMOVE(winbindd_children, state->child); } -static bool winbindd_child_busy(struct winbindd_child *child) -{ - return tevent_queue_length(child->queue) > 0; -} - -static struct winbindd_child *find_idle_child(struct winbindd_domain *domain) +struct winbindd_child *choose_domain_child(struct winbindd_domain *domain) { + struct winbindd_child *shortest = &domain->children[0]; + struct winbindd_child *current; int i; for (i=0; ichildren[i])) { - return &domain->children[i]; - } - } + size_t shortest_len, current_len; - return NULL; -} + current = &domain->children[i]; + current_len = tevent_queue_length(current->queue); -struct winbindd_child *choose_domain_child(struct winbindd_domain *domain) -{ - struct winbindd_child *result; + if (current_len == 0) { + /* idle child */ + return current; + } - result = find_idle_child(domain); - if (result != NULL) { - return result; + shortest_len = tevent_queue_length(shortest->queue); + + if (current_len < shortest_len) { + shortest = current; + } } - return &domain->children[rand() % lp_winbind_max_domain_connections()]; + + return shortest; } struct dcerpc_binding_handle *dom_child_handle(struct winbindd_domain *domain)