Victor Duchovni: > On Mon, Aug 31, 2009 at 01:40:34PM -0400, Wietse Venema wrote: > > > > We just pass a list of servers to the LDAP library. > > > > > > Perhaps the simplest enhancement would be to "rotate" the server list > > > when a query times out, before asking the LDAP library to re-connect. > > > > > > server-list before time-out: s1 s2 ... sN > > > server-list after time-out: s2 ... sN s1 > > > > > > Any other suggestions? > > > > Reversing the list may get a quicker recovery when there are more > > than 2 servers, and the time-out happens somewhere in the middle. > > > > When there are 2 servers, then rotating is equivalent to reversing. > > I am reluctant to reverse the list, because this gives us only two > possible orders (as opposed to N orders with N elements), and we are I > think promising the user to use servers in the order specified. > > The rotate code is simple: > > Index: src/global/dict_ldap.c > --- src/global/dict_ldap.c 27 Apr 2009 03:36:00 -0000 1.1.1.1 > +++ src/global/dict_ldap.c 31 Aug 2009 18:07:17 -0000 > @@ -570,7 +570,26 @@ > > #endif > > -/* Establish a connection to the LDAP server. */ > +/* dict_ldap_rotate - rotate server list */ > + > +static void dict_ldap_rotate(DICT_LDAP *dict_ldap) > +{ > + char *s = dict_ldap->server_host; > + char *s1 = mystrtok(&s, " "); /* SPC separated post initial parse */ > + > + /* > + * If more than one LDAP server specified, rotate the first one to the > end > + * of the list. > + */ > + if (*s) { > + s = concatenate(s, " ", s1, (char *)0); > + myfree(dict_ldap->server_host); > + dict_ldap->server_host = s; > + } > +} > + > +/* dict_ldap_connect - Establish a connection to the LDAP server. */ > + > static int dict_ldap_connect(DICT_LDAP *dict_ldap) > { > const char *myname = "dict_ldap_connect"; > @@ -620,6 +639,13 @@ > dict_errno = DICT_ERR_RETRY; > return (-1); > } > + > + /* > + * The current connection has just saved the server list. > + * Rotate the server list for any future connection attempts. > + */ > + dict_ldap_rotate(dict_ldap); > + > mytimeval.tv_sec = dict_ldap->timeout; > mytimeval.tv_usec = 0; > if (ldap_set_option(dict_ldap->ld, LDAP_OPT_NETWORK_TIMEOUT, &mytimeval) > !=
This looks like unconditional rotation after non-error? Wietse