8236925: (dc) Upgrade DatagramChannel socket adaptor to extend MulticastSocket

Daniel Fuchs daniel.fuchs at oracle.com
Tue Jan 14 17:49:58 UTC 2020

Hi Alan,

Globally this looks good to me. One small nit is that the `oldImpl`
field could now also become final (by applying the same trick you
did with createImpl - that is - have oldImpl() return a boolean
rather than set the field and assign the result in the constructor.

I've imported your patch and am currently running some tests.

best regards,

-- daniel

On 10/01/2020 14:55, Alan Bateman wrote:
> This is a patch to "upgrade" the DatagramChannel socket adaptor to 
> extend MulticastSocket. This is one of the final changes needed to 
> DatagramChannel and its socket adaptor buddy to make it easy to replace 
> the legacy DatagramSocket and MulticastSocket implementation. Daniel has 
> a draft JEP [1] with the all the details on this effort.
> The changes should be straight-forward to review as most of the methods 
> defined by MulticastSocket are easy to implement on DatagramChannel. A 
> few review notes:
> 1. MulticastSocket does not have a protected constructor to create the 
> socket with a custom DatagramSocketImpl. The DatagramSocketImpl 
> mechanism is legacy and not worth adding a constructor now. So the most 
> significant change in the patch is that the socket adaptor is changed to 
> invoke the MulticastSocket(SocketAddress) constructor. This requires a 
> special checked in the MulticastSocket and DatagramSocket constructor 
> that isn't pretty but it has the advantage that the dummy 
> DatagramSocketImpl can go away (it was never used anyway).
> 2. The DatagramSocket.impl field is changed to final. This is nice 
> because it avoids accidents with lazily creating an impl (say where the 
> socket adaptor doesn't override all methods). The final field means 
> there are several opportunities to for cleanup but I don't want to go 
> there in this patch (this is why getImpl continues to declare that it 
> throws SocketException). I also don't want to complicate things for the 
> JEP implementation in the sandbox.
> 3. The MulticastSocket spec in lacking in many areas and doesn't specify 
> the exceptions or behavior for many scenarios. The joinGroup methods 
> don't specify how they behave when already a member of the group. The 
> leaveGroup method doesn't specify the behavior when not a member. 
> Several methods don't specify the exception when invoked with null or 
> other bad input. The overrides in the socket adaptor try to maintain 
> compatibility with the the long standing behavior.
> 4. The DatagramSocket::socket spec is modified to drop the statement 
> that the socket adaptor doesn't have any public methods beyond those 
> defined by DatagramSocket. We need to drop the same statement from 
> SocketChannel and ServerSocketChannel, something for another issue. So I 
> need a CSR and that can also track the observable change that the 
> returned object is a MulticastSocket.
> 5. One issue with the test is that is initially tickled an intermittent 
> bug on macOS. The underlying setsockopt fails intermittently with ENOMEM 
> when attempting to join the group. There have been sightings of this 
> issue going back to JDK 7 [2]. Also sightings with the legacy 
> MulticastSocket implementation. The patch has a temporary workaround to 
> this issue. It's ugly but I can't duplicate it with this change. Daniel 
> has been thinking about doing the same workaround while we figure out if 
> there is a fix for macOS.
> The webrev with the changes is here:
>      http://cr.openjdk.java.net/~alanb/8236925/webrev/
> -Alan
> [1] https://bugs.openjdk.java.net/browse/JDK-8235674
> [2] https://mail.openjdk.java.net/pipermail/net-dev/2013-July/006769.html

More information about the nio-dev mailing list