Thank you Lucy,

We’ll proceed with removing the setting of SO_REUSEPORT from the
MulticastSocket constructor and spec.

-Chris.

> On 28 Sep 2016, at 20:02, Lu, Yingqi <yingqi...@intel.com> wrote:
> 
> Hi Vyom,
>  
> Thank you very much checking with us.
>  
> We agree that SO_RESUEADDR and SO_REUSEPORT behave the same way for 
> MulticastSocket. There is no need to check and enable SO_REUSEPORT for this 
> particular type of socket. SO_REUSEADDR is sufficient.
>  
> Thanks,
> Lucy
>  
>  <>From: Vyom Tewari [mailto:vyom.tew...@oracle.com] 
> Sent: Wednesday, September 28, 2016 1:26 AM
> To: Chris Hegarty <chris.hega...@oracle.com>; Mark Sheppard 
> <mark.shepp...@oracle.com>; net-dev <net-dev@openjdk.java.net>; Kaczmarek, 
> Eric <eric.kaczma...@intel.com>; Viswanathan, Sandhya 
> <sandhya.viswanat...@intel.com>; Kharbas, Kishor <kishor.khar...@intel.com>; 
> Aundhe, Shirish <shirish.aun...@intel.com>; Lu, Yingqi <yingqi...@intel.com>
> Subject: Re: RFR 8153674: Expected SocketException not thrown when calling 
> bind() with setReuseAddress(false)
>  
> Hi All,
> 
> I had off line discussion here at Oracle and we decided  not to override 
> getReuseAddr/setReuseAddr for MulticastSocket. If user wants, he can set the 
> SO_REUSEPORT with "setOption" before bind.
> 
> For MulticastSocket SO_REUSEADDR&SO_REUSEPORT are semantically equivalent 
> which means either option will be sufficient to indicate that the 
> address&port is reusable. So setting SO_REUSEPORT in constructor is really 
> necessary/required ?
> 
> I am looking some comments on this from Intel people(they are in mail chain) 
> who did this original change, before we decide how we wants to proceed on 
> this issue.
> 
> Thanks,
> 
> Vyom
> 
>  
> On Wednesday 14 September 2016 08:47 PM, Chris Hegarty wrote:
> On 14/09/16 15:53, Mark Sheppard wrote: 
> 
> 
> that's true wrt SO_REUSEPORT in MulticastSocket constructor. But the 
> same could have been argued for the original 
> invocation of setReuseAddress, by default , in the constructors, which 
> is encapsulating, what pereceived as, common or defacto 
> practice wrt applying SO_REUSEADDR on mcast sockets at the system level. 
> As I understand it, it is generally perceived that SO_REUSEADDR and 
> SO_REUSEPORT are semantically equivalent for multicast sockets. 
> As such, I think in the case of MulticastSocket, the fact that the 
> setRuseAddress() is called in the constructor, it is appropriate 
> to set SO_REUSEPORT also when it exists in the OS. 
> 
> I take your point on the semantics of setReuseAddress in DatagramSocket 
> as per its spec. The spec does allude to MulticastSocket. 
> As such, the current proposal's changes just lack the appropriate 
> javadoc to describe its behavior, and its additional functionality of 
> setting SO_REUSEPORT. 
> It is not necessary that overridden method should mirror the semantics 
> of the base class method. 
> If it is accepted that it is generally perceived that SO_REUSEADDR and 
> SO_REUSEPORT are semantically equivalent for multicast sockets, 
> then it seems appropriate that an overriding setReuseAddress(..) method 
> in MulticastSocket can reflect this. 
> 
> That sounds reasonable. 
> 
> -Chris. 
> 
> 
> regards 
> Mark 
> 
> 
> 
> On 14/09/2016 14:58, Chris Hegarty wrote: 
> 
> One additional remark. 
> 
> Was it appropriate to update the legacy MC constructors 
> to set the new JDK 9 SO_REUSEPORT in the first place? 
> This can be achievable, opt-in from new code, by creating 
> an unbound MS, setting the option, then binding. 
> 
> -Chris. 
> 
> On 14/09/16 14:47, Chris Hegarty wrote: 
> 
> Mark, 
> 
> On 14/09/16 14:22, Mark Sheppard wrote: 
> 
> 
> Hi Chris, 
>      I don't fully understand your objections to the approach taken. 
> Is there a compatibility issue with the addition of the additional 
> methods to MulticastSocket? 
> 
> The concern is with setReuseAddress performing an operation that 
> is not clear from the method specification, e.g. from setReuseAddress() 
> 
>      * Enable/disable the SO_REUSEADDR socket option. 
> 
> This is no longer accurate. The proposed changes would affect 
> SO_REUSEPORT too. 
> 
> 
> I don't see Datagram.setReuseAddress(...) handling the SO_REUSEPORT 
> option, this has to be done explicitly via setOption at this level of 
> abstraction. 
> 
> Yes, it is a bit odd, but these are legacy classes. I am not opposed 
> to adding a new method for this, or something else. I just want to 
> avoid future issues and confusion when setReuseAddress is called and 
> then it is noticed that, the somewhat orthogonal option, SO_REUSEPORT's 
> value has changed. setReuseAddress's spec is very clear about what it 
> does. 
> 
> 
> MulticastSocket is a subclass of DatagramSocket (that in itself is a 
> questionable structuring), and as such 
> has specialized behaviour, and part  of that specialization is the 
> setting of  the setting SO_REUSEADDR and SO_REUSEPORT 
> in its constructors, to enable address reuse semantics, prior to 
> binding 
> an address. 
> 
> Understood. Of course, the setting of SO_REUSEPORT is new in 9, 
> hence the problem. 
> 
> 
> As part of that specialization, it would seem appropriate that 
> MulticastSocket manipulate the SO_REUSEPORT 
> option in a consistent way. Adding an overridden setReuseAddress(...) 
> method provides that consistency and 
> encapsulates the specialized behaviour. 
> 
> I agree with the abstraction, just not that setReuseAddress should 
> be used to achieve it. The name and spec of this method is so 
> tied to SO_REUSEADDR. 
> 
> 
> Is alternatively proposal to NOT do anything to MulticastSocket, BUT 
> document clearly how to handle the failing scenario, that an 
> MulticastSocket 
> requires both setReuseAddress() and a setOption call to disable 
> reuseaddress semantics on an unbound MulticastSocket ? 
> 
> That is one option, and the option that I was suggesting as a possible 
> alternative. 
> 
> 
> This then raises the question of why have a convenience method, such as 
> setReuseAddress() in the first place, when it can be handled 
> adequately via the setOption 
> 
> We are moving away from these option specific getter and setter 
> methods, in favor of the more general get/setOption methods, as 
> the latter are more adaptable. 
> 
> If setReuseAddress is to operate on more than SO_REUSEADDR, then 
> its spec should be very clear about this. 
> 
> -Chris. 
> 
> 
> 
> regards 
> Mark 
> 
> On 14/09/2016 13:34, Chris Hegarty wrote: 
> 
> Mark, 
> 
> On 14/09/16 13:23, Mark Sheppard wrote: 
> 
> 
> Hi Chris, 
>     so are you accepting that it is correct to add the overridden 
> methods in MulticastSocket and that these need 
> appropriate javadoc ? 
> 
> I think we need these, but they should just call their super 
> equivalents, i.e. no implicit setting of SO_REUSEPORT. They would 
> exist solely as a place to locate guidance, or a note, that one 
> will likely want to set SO_REUSEPORT too. 
> 
> 
> or are you advocating pushing the handing of the SO_REUSEPORT into 
> the 
> base DatagramSocket class ? 
> 
> It is already there. I am not proposing to change this. 
> 
> 
> It is not clear how your code changes fit in the proposed fix i.e. 
> the 
> explicit setting of the option to false? 
> 
> My proposal is an alternative. It is not related to the current 
> webrev. 
> 
> 
> With the current proposed changes then I think it would be 
> sufficient to 
> invoke setReuseAddress(true) in MulticastSocket constructors 
> rather than 
> 
>         // Enable SO_REUSEADDR before binding 
>         setReuseAddress 
> <https://java.se.oracle.com/source/s?defs=setReuseAddress&project=jdk9-dev> 
> <https://java.se.oracle.com/source/s?defs=setReuseAddress&project=jdk9-dev>(*true*);
>  
> 
> 
> 
> 
>         // Enable SO_REUSEPORT if supported before binding 
>         *if* (supportedOptions 
> <https://java.se.oracle.com/source/xref/jdk9-dev/jdk/src/java.base/share/classes/java/net/MulticastSocket.java#supportedOptions>
>  
> <https://java.se.oracle.com/source/xref/jdk9-dev/jdk/src/java.base/share/classes/java/net/MulticastSocket.java#supportedOptions>().contains
>  
> 
> 
> 
> <https://java.se.oracle.com/source/s?defs=contains&project=jdk9-dev> 
> <https://java.se.oracle.com/source/s?defs=contains&project=jdk9-dev>(StandardSocketOptions
>  
> 
> 
> 
> <https://java.se.oracle.com/source/s?defs=StandardSocketOptions&project=jdk9-dev>
>  
> <https://java.se.oracle.com/source/s?defs=StandardSocketOptions&project=jdk9-dev>.SO_REUSEPORT
>  
> 
> 
> 
> <https://java.se.oracle.com/source/s?defs=SO_REUSEPORT&project=jdk9-dev> 
> <https://java.se.oracle.com/source/s?defs=SO_REUSEPORT&project=jdk9-dev>)) 
> 
> 
> { 
>             *this*.setOption 
> <https://java.se.oracle.com/source/s?defs=setOption&project=jdk9-dev> 
> <https://java.se.oracle.com/source/s?defs=setOption&project=jdk9-dev>(StandardSocketOptions
>  
> 
> 
> 
> <https://java.se.oracle.com/source/s?defs=StandardSocketOptions&project=jdk9-dev>
>  
> <https://java.se.oracle.com/source/s?defs=StandardSocketOptions&project=jdk9-dev>.SO_REUSEPORT
>  
> 
> 
> 
> <https://java.se.oracle.com/source/s?defs=SO_REUSEPORT&project=jdk9-dev> 
> <https://java.se.oracle.com/source/s?defs=SO_REUSEPORT&project=jdk9-dev>, 
> 
> 
> *true*); 
>         } 
> 
> 
> as the overridden setReuseAddress takes care of SO_REUSEPORT 
> 
> Yes, this is what Vyom has proposed, in the webrev. 
> 
> I would like to explore an alternative, so see what it would look 
> like. 
> 
> -Chris. 
> 
> 
> 
> regards 
> Mark 
> 
> On 14/09/2016 11:43, Chris Hegarty wrote: 
> 
> Vyom, 
> 
> On 11/09/16 08:01, Vyom Tewari wrote: 
> 
> Hi All, 
> 
> Please review the below code change. 
> 
> Bug        : https://bugs.openjdk.java.net/browse/JDK-8153674 
> <https://bugs.openjdk.java.net/browse/JDK-8153674> 
> 
> Webrev  : 
> http://cr.openjdk.java.net/~vtewari/8153674/webrev0.0/index.html 
> <http://cr.openjdk.java.net/%7Evtewari/8153674/webrev0.0/index.html> 
> <http://cr.openjdk.java.net/%7Evtewari/8153674/webrev0.0/index.html> 
> <http://cr.openjdk.java.net/%7Evtewari/8153674/webrev0.0/index.html>
> 
> 
> This change override the "get/setReuseAddress"  for MulticaseSocket 
> and 
> will abstract with both reuse attributes(SO_REUSEADDR & 
> SO_REUSEPORT). 
> 
> This issue arises since the changes for 6432031 "Add support for 
> SO_REUSEPORT" [1], which sets SO_REUSEPORT on MulticastSocket, if 
> the available. So setting setReuseAddress(false) alone is no longer 
> sufficient to disable address/port reuse, one must also set 
> SO_REUSEPORT to false. 
> 
> I would be really nervous about changing set/getReuseAddress, 
> without 
> at least updating the javadoc to indicate that it is now, for MS, 
> operating on two socket options.  Although, I do have sympathy 
> here since SO_REUSEPORT and SO_REUSEADDR are almost identical when 
> dealing with multicasting. 
> 
> An alternative, maybe; Since the MS constructors document that 
> SO_REUSEPORT will be set, where available, maybe a javadoc note 
> on the set/getReuseAddress methods would be sufficient, that 
> indicates that StandardSocketOptions#SO_REUSEPORT may also need 
> to be set to have the desired effect? 
> 
> If so, then code would have to: 
> 
>     setReuseAddress(false); 
> 
>     if 
> (supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) 
> this.setOption(StandardSocketOptions.SO_REUSEPORT, false); 
> 
>   , but at least it is explicit. 
> 
> Q: not all MS constructors document that SO_REUSEPORT is set, but 
> they should, right? This seems to have slipped past during 6432031 
> [1]. 
> 
> -Chris. 
> 
> [1] https://bugs.openjdk.java.net/browse/JDK-6432031 
> <https://bugs.openjdk.java.net/browse/JDK-6432031>
>  
>  
>  
>  

Reply via email to