> On 29 Sep 2016, at 09:16, Vyom Tewari <vyom.tew...@oracle.com> wrote:
> 
> Hi All,
> 
> Please find the latest 
> webrev(http://cr.openjdk.java.net/~vtewari/8153674/webrev0.1/index.html). I 
> had removed the SO_REUSEPORT & spec from constructor.

Thank you Vyom, this looks good to me.

-Chris.

> Thanks,
> 
> Vyom
> 
> On Thursday 29 September 2016 01:38 AM, Chris Hegarty wrote:
>> 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>(*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>().contains
>>>  
>>> 
>>> 
>>> 
>>> <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>.SO_REUSEPORT
>>>  
>>> 
>>> 
>>> 
>>> <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>(StandardSocketOptions
>>>  
>>> 
>>> 
>>> 
>>> <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>, 
>>> 
>>> 
>>> *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 
>>> 
>>> Webrev  : 
>>> http://cr.openjdk.java.net/~vtewari/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
>>>  
>>>  
>>>  
>>>  
>> 
> 

Reply via email to