[SCM] Samba Shared Repository - branch master updated
Volker Lendecke
vlendec at samba.org
Mon Feb 12 18:52:01 UTC 2018
The branch, master has been updated
via b4384b7 winbind: Improve child selection
from cb920dd tests/samba-tool user wdigest: fix a flapping test
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b4384b7f0ecf3b47dd60acaf77636b679e3adc05
Author: Volker Lendecke <vl at samba.org>
Date: Fri Feb 9 10:27:55 2018 +0100
winbind: Improve child selection
This improves the situation when a client request blocks a winbind
child. This might be a slow samlogon or lookupnames to a domain that's
far away. With random selection of the child for new request coming in
we could end up with a long queue when other, non-blocked children
could serve those new requests. Choose the shortest queue.
This is an immediate and simple fix. Step two will be to have a
per-domain and not a per-child queue. Right now we're pre-selecting
the check-out queue at Fry's randomly without looking at the queue
length. With this change we're picking the shortest queue. The better
change will be what Fry's really does: One central queue and red/green
lights on the busy/free checkout counters.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
Autobuild-User(master): Volker Lendecke <vl at samba.org>
Autobuild-Date(master): Mon Feb 12 19:51:35 CET 2018 on sn-devel-144
-----------------------------------------------------------------------
Summary of changes:
source3/winbindd/winbindd_dual.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index 33f1393..993166d 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; i<lp_winbind_max_domain_connections(); i++) {
- if (!winbindd_child_busy(&domain->children[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)
--
Samba Shared Repository
More information about the samba-cvs
mailing list