On Sat, Jan 16, 2016 at 7:52 PM, Nenad Merdanovic <ni...@nimzo.info> wrote:
> Forgot to add the ML :/
>
> On 01/16/2016 07:43 PM, Nenad Merdanovic wrote:
>> Hello Robert,
>>
>> + Baptiste
>>
>>>
>>> Connect() failed for backend bk: no free ports.
>>>
>>> If you comment out either the load-server-state-from-file line or remove 
>>> 'resolvers dns' from the end of the server line, then the backend works 
>>> correctly.
>>>
>>
>> This happens because of:
>> server.c:2156
>> /* update server IP only if DNS resolution is used on the server */
>>     if (srv->resolution) {
>>         memset(&addr, 0, sizeof(struct sockaddr_storage));
>>         if (str2ip2(params[0], &addr, 0))
>>             memcpy(&srv->addr, &addr, sizeof(struct sockaddr_storage));
>>
>> str2ip2 doesn't work with ports (and there are none in the dump file),
>> yet we overwrite the whole struct.
>>
>> Few options I see:
>> 1. Dump the port to the state file, use str2sa_range
>> 2. Check the ss_family of 'addr', memcpy only the address
>>
>> And my personal favorite
>> 3. Just (ab)use something like "server_parse_addr_change_request(srv,
>> params[0]);" with a small change so it accepts the 'updater' also, which
>> could say 'server-state' or something.
>>
>>> The same behaviour with 1.7-dev1, and I encounter the issue on Linux and 
>>> OSX.
>>>
>>> It’s worth noting that "show servers state" returns nothing if there are a 
>>> lot of backends, hence I’m using the 'local' option.
>>>
>>>
>>> B.
>>>
>>
>> Regards,
>> Nenad
>>


Hi guys,

Good catch nenad :)
I may use solution #2 for now. I'll provide a patch asap for this bug.

That said, I'm working on a function which allow changing the server
port at run time using the stats socket.
It will be able to match if a port is provided or not and update both
ADDR and/or PORT accordingly (and will be compatible with AF_UNIX).

Baptiste

Reply via email to