[JDK-8257080] Java does not try all DNS results when opening a socket

Benjamin Marwell bmarwell at apache.org
Wed Dec 16 13:40:22 UTC 2020


On 16.12.20 13:49, Alan Bateman wrote:
> On 16/12/2020 09:04, Benjamin Marwell wrote:
>> Hi Alan,
>>
>> > I can't tell if your proposal is focused on the Socket constructors
>> > that take a hostname or more generally changing all APIs that
>> > connect to a SocketAddress to support connecting to an
>> > isUnresolved InetSocketAddress
>>
>> Way before we even get to sockets. I am talking about InetAddress.
>> It’s resolving logic is resolve()[0]. That’s it. But an InetAddress 
>> does not carry any
>> port information and thus should not resolve in my opinion.
>>
>> ---
>>
>> I think I would start looking in java/net/AbstractPlainSocketImpl.java.
>> These are the relevant lines: 
>> https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java#L149-L164 
>> <https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java*L149-L164__;Iw!!GqivPVa7Brio!IQGo98vib-LqfZaVN1Y7MJ51_ZRRrljY_n6IM-btaxHD3suFHe77kiBgTeSYGhb8tw$> 
>>
>>
>> For the new implementation these lines seem pretty relevant:
>> https://github.com/openjdk/jdk/blob/51d5164ca2b4801c14466e8d1420ecf27cb7615f/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java#L560-L562 
>> <https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/51d5164ca2b4801c14466e8d1420ecf27cb7615f/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java*L560-L562__;Iw!!GqivPVa7Brio!IQGo98vib-LqfZaVN1Y7MJ51_ZRRrljY_n6IM-btaxHD3suFHe77kiBgTeQy8PBhSg$> 
>>
>> That is where I would probably add the for loop.
>>
>> Here is python’s implementation as a reference:
>> https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/socket.py#L707-L719 
>> <https://urldefense.com/v3/__https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/socket.py*L707-L719__;Iw!!GqivPVa7Brio!IQGo98vib-LqfZaVN1Y7MJ51_ZRRrljY_n6IM-btaxHD3suFHe77kiBgTeTvZM9G2A$> 
>>
>>
>> By the way, any changes would solve a few other issues as well:
>> https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8201428 
>> <https://urldefense.com/v3/__https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8201428__;!!GqivPVa7Brio!IQGo98vib-LqfZaVN1Y7MJ51_ZRRrljY_n6IM-btaxHD3suFHe77kiBgTeQkc7Ex1w$> 
>>
>> https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8192780 
>> <https://urldefense.com/v3/__https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8192780__;!!GqivPVa7Brio!IQGo98vib-LqfZaVN1Y7MJ51_ZRRrljY_n6IM-btaxHD3suFHe77kiBgTeSpuxbIvA$> 
>>
>>
> 
> If I read your mail correctly, I think what you are proposing is to 
> change the existing APIs to allow an unresolved InetSocketAddress to be 
> specified, is that right? I suspect this approach will have a lot of 
> implications for methods that are called after the socket is created as 
> it would require re-creating the underlying socket when a connect 
> attempt fails (the socket may have been explicitly bound or socket 
> options were set). There are issues with the semantics of the timeout 
> parameter. It might not be possible to even do this with APIs such as 
> SocketChannel when the channel is configured non-blocking.
> 
> If the starting point is the Socket constructor that takes a host name 
> and port then it might be easier because that can do the lookup and 
> cycle through the addresses and/or overlap the connection attempts.
> 
> If you have cycles to do experiments and report back then it would be 
> useful. I assume the attractiveness of changing the existing APIs is so 
> that existing usages, e.g. HTTP protocol handler, could use it without 
> changing to a new APIs. Maybe changing existing vs. new API could be 
> part of your investigation? I think it would also be useful to know if a 
> simple iteration through the addresses is sufficient for more cases or 
> whether something close to Happy Eyeballs would be needed. There have 
> been a few discussions here over the years on the latter as it is hard 
> to get right and there may be a case of having support for that in the 
> APIs.
> 
> -Alan
> 
> 
> 

Huh… the APIs have already been changed which is why the issues above 
exist. There is no workaround anymore.

It is true that I did not take into account that other methods would 
rely on this. The biggest issue I see (easily) is the connect timeout.
It must either be distributed along all connection attempts or per 
connection attempt – both would change semantics.

I just looked up Happy Eyeballs, and this comes very close to
what I mean. I like that it implies DNS-RR.

Lets see if I (or anyone else) can come up with a sample implementation.

Thanks,
Ben



More information about the net-dev mailing list