I'll do the testing on AIX. Thanks, Volker
On Mon, Nov 23, 2015 at 6:35 PM, Michael McMahon <michael.x.mcma...@oracle.com> wrote: > Lucy, > > We can run the change through the standard test system here that will check > it out on all platforms. > > Alan mentioned to me earlier that we could tweak the wording that I > suggested > to be more consistent with other options. So, I just need to check that with > him. > > Thanks > Michael. > > > On 23/11/15 17:21, Lu, Yingqi wrote: >> >> Michael/Volker/Alan, >> >> Thank you all very much for your feedback! >> >> Michael, I like your wording for SO_REUSEPORT in >> java.net.StandardSocketOptions and I will remove the link to the Linux page. >> It will be updated for the next version of the patch. Regarding to >> "reference this text from everywhere else", do you mean doing something like >> {@see StandardSocketOptions#SO_REUSEPORT}? >> >> Michael/Volker, yes, I agree that we should enable this feature on all the >> supporting platforms. I will try to add the code in the next version as >> well. However, I do not have all the OSes so that I might not be able to >> test them. Can any of you please help with the testing? >> >> Alan, I will add the isReusePortSupported method in the Net.c and only add >> SO_REUSEPORT into the options set only when it is supported. >> >> Thank you, >> Lucy >> >> -----Original Message----- >> From: Michael McMahon [mailto:michael.x.mcma...@oracle.com] >> Sent: Monday, November 23, 2015 3:42 AM >> To: Volker Simonis <volker.simo...@gmail.com>; Alan Bateman >> <alan.bate...@oracle.com> >> Cc: Kharbas, Kishor <kishor.khar...@intel.com>; net-dev@openjdk.java.net; >> Lu, Yingqi <yingqi...@intel.com> >> Subject: Re: Patch for adding SO_REUSEPORT socket option >> >> How about the following for the apidoc in j.n.StandardSocketOptions? >> >> We can then reference this text from everywhere else rather than repeating >> it. >> >> (just noticed Lucy was not included in the last few mails) >> >> - Michael >> >> /** >> * Re-use port. >> * >> * <p> The value of this socket option is a {@code Boolean} that >> represents >> * whether the option is enabled or disabled. The exact semantics of >> this >> * socket option are socket type and system dependent. >> * >> * SO_REUSEPORT can be used with both TCP and UDP sockets. >> * >> * <p> In the case of stream-oriented sockets, this socket option >> allows >> * multiple listening sockets to be bound to both the same address >> * and same port. >> * >> * <p> For datagram-oriented sockets the socket option is used to >> allow >> * multiple UDP sockets to be bound to the same address and port. >> * >> * @implNote Generally, this option must be set before the >> * socket is bound or connected. Changing the value of this socket >> option >> * after the socket is bound has no effect. There may be further >> * restrictions imposed by implementations such as the requirement >> that >> * all sockets bound to the same port, must have set the option. >> */ >> >> On 23/11/15 10:54, Michael McMahon wrote: >>> >>> I agree we should enable the option on all platforms. >>> We can add the code to do that and run the tests. >>> >>> On the existing use of SO_REUSEPORT on AIX and Mac it appears that is >>> set to emulate expected behavior on other platforms when SO_REUSEADDR >>> is set for datagram sockets. >>> The expectation is that ports can be reused for datagram sockets and >>> the JCK tests this. So, I guess we have to leave this behavior by >>> default, except if SO_REUSEPORT is explicitly disabled maybe. Though >>> this code hasn't been forward ported to JDK 9 yet. >>> >>> For reference, SO_REUSEPORT on Linux is documented here >>> http://man7.org/linux/man-pages/man7/socket.7.html >>> >>> - Michael >>> >>> On 23/11/15 09:13, Volker Simonis wrote: >>>> >>>> Hi Lucy, >>>> >>>> in general I support the addition of SO_REUSEPORT to the set of >>>> standard socket options. However for me the problem is not that this >>>> new option is not supported on all platforms, but instead that it has >>>> such different semantics on different platforms. If you look at the >>>> code, you'll see that we already implicitly set SO_REUSEPORT on Mac >>>> and AIX for datagram sockets for which we set SO_REUSEADDR. So maybe >>>> we have to rethink this, once SO_REUSEPORT becomes available as a >>>> standard socket option. >>>> >>>> I like the new wording you've posted for JavaDoc of SO_REUSEPORT, but >>>> I think the sentence: >>>> >>>> * Although SO_REUSEADDR option already enables similar >>>> * functionality, SO_REUSEPORT prevents port hijacking and >>>> * distributes the involving datagrams evenly across all of the >>>> * receiving threads. >>>> >>>> refers to a Linux-specific implementation detail which shouldn't be >>>> mentioned in the general documentation. You already have the sentence >>>> "The exact semantics of this socket option are socket type and system >>>> dependent" which should let everybody think twice before using this >>>> option. I'm also not sure about the link to the Linux article but I >>>> again think it is inappropriate in a general API documentation >>>> (otherwise we would have to add links for every platform which >>>> supports SO_REUSEPORT). >>>> >>>> As far as I can see (and please correct me if I'm wrong) you actually >>>> only add the new option for Linux platforms. But this socket option >>>> is also supported on Solaris (>= 11), MacOS X, AIX. So could you >>>> please enable it on the other platforms as well. >>>> >>>> Finally I want to mention the good stackoverflow article at >>>> http://stackoverflow.com/questions/14388706/socket-options-so-reusead >>>> dr-and-so-reuseport-how-do-they-differ-do-they-mean-t >>>> >>>> which covers the topic SO_REUSEADDR vs. SO_REUSEPORT quite well. And >>>> I've collected the man-page entries for SO_REUSEADDR and SO_REUSEPORT >>>> for the systems I have (unfortunately, I couldn't find an updated >>>> Linux man-page which mentions SO_REUSEPORT): >>>> >>>> Linux >>>> ===== >>>> >>>> SO_REUSEADDR >>>> Indicates that the rules used in validating addresses >>>> supplied in a bind(2) call should allow reuse of local >>>> addresses. For AF_INET sockets this means that a socket >>>> may bind, except when there is an active listening >>>> socket bound to the address. When the listening socket >>>> is bound to INADDR_ANY with a specific port then it is >>>> not possi- ble to bind to this port for any local >>>> address. Argument is an integer boolean flag. >>>> >>>> Linux will only allow port reuse with the SO_REUSEADDR option >>>> when this option was set both in the previous program that >>>> performed a bind(2) to the port and in the program that wants >>>> to reuse the port. This differs from some implementations >>>> (e.g., FreeBSD) where only the later program needs to set the >>>> SO_REUSEADDR option. Typically this difference is invisi- ble, >>>> since, for example, a server program is designed to always set >>>> this option. >>>> >>>> MacOS X >>>> ======= >>>> SO_REUSEADDR enables local address reuse >>>> SO_REUSEPORT enables duplicate address and port bindings >>>> >>>> SO_REUSEADDR indicates that the rules used in validating >>>> addresses supplied in a bind(2) call should allow reuse of local >>>> addresses. >>>> >>>> SO_REUSEPORT allows completely duplicate bindings by multiple >>>> processes if they all set SO_REUSEPORT before bind- ing the port. >>>> This option permits multiple instances of a program to each >>>> receive UDP/IP multicast or broadcast datagrams destined for the >>>> bound port. >>>> >>>> Solaris >>>> ======= >>>> >>>> SO_REUSEADDR enable/disable local address reuse >>>> >>>> >>>> SO_REUSEPORT enable/disable local port reuse for >>>> PF_INET/PF_INET6 socket >>>> >>>> The SO_REUSEADDR/SO_REUSEPORT options indi- cate that the rules >>>> used in validating addresses and ports supplied in a >>>> bind(3SOCKET) call should allow reuse of local addresses or >>>> ports. >>>> >>>> AIX >>>> === >>>> >>>> SO_REUSEADDR >>>> Specifies that the rules used in validating >>>> addresses supplied by a bind subroutine should >>>> allow reuse of a local port. A particular IP >>>> address can only be bound once to the same >>>> port. This option enables or disables reuse of >>>> local ports. >>>> >>>> SO_REUSEADDR allows an application to explicitly >>>> deny subsequent bind subroutine to the port/address >>>> of the socket with SO_REUSEADDR set. This allows an >>>> application to block other applications from >>>> binding with the bind subroutine. >>>> >>>> SO_REUSEPORT >>>> Specifies that the rules used in validating >>>> addresses supplied by a bind subroutine should >>>> allow reuse of a local port/address >>>> combination. Each binding of the port/address >>>> combination must specify the SO_REUSEPORT socket >>>> option. This option enables or disables the reuse >>>> of local port/address combinations. >>>> >>>> HPUX >>>> ==== >>>> >>>> SO_REUSEADDR >>>> (int; boolean; AF_INET sockets only) If enabled, allows >>>> a local address to be reused in subsequent calls to >>>> bind(). Default: disallowed. >>>> >>>> SO_REUSEPORT >>>> (int; boolean; AF_INET sockets only) If enabled, allows >>>> a local address and port to be reused in subsequent >>>> calls to bind(). Default: disallowed. >>>> >>>> Setting the SO_REUSEADDR option allows the local socket address >>>> to be reused in subsequent calls to bind(). This permits >>>> multiple SOCK_STREAM sockets to be bound to the same local >>>> address, as long as all existing sockets with the desired local >>>> address are in a connected state before bind() is called for a >>>> new socket. For SOCK_DGRAM sockets, SO_REUSEADDR allows >>>> multiple sockets to receive UDP multicast datagrams addressed to >>>> the bound port number. For all SOCK_DGRAM sockets bound to the >>>> same local address, SO_REUSEADDR must be set before calling >>>> bind(). >>>> >>>> Setting the SO_REUSEPORT option allows multiple SOCK_DGRAM >>>> sockets to share the same address and port. Each one of those >>>> sockets, including the first one to use that port, must specify >>>> this option before calling bind(). >>>> >>>> Regards, >>>> Volker >>>> >>>> >>>> On Mon, Nov 23, 2015 at 9:00 AM, Alan Bateman >>>> <alan.bate...@oracle.com> wrote: >>>>> >>>>> On 23/11/2015 04:12, Lu, Yingqi wrote: >>>>> >>>>> Hi Alan, >>>>> >>>>> >>>>> >>>>> One more question please J I want to make sure I understand >>>>> correctly on your following suggestion. In order to use >>>>> supportedOptions method to test SO_REUSEPORT, I will need to first >>>>> write a native function to check if SO_REUSEPORT is supported. Then, >>>>> in the defaultOptions method, I do a conditional add for >>>>> StandardSocketOptions.SO_REUSEPORT if it is supported on the >>>>> platform? Is this a preferred way to implement? Please let me know! >>>>> >>>>> >>>>> Yes as supportedOptions() shouldn't return SO_REUSEPORT in the set >>>>> when it's not supported. It might be simplest to put that code in >>>>> sun.nio.ch.Net, maybe isReusePortSupported or some such method. In >>>>> the implementation >>>>> (Net.c) then you can return true or false depending on the platform >>>>> and maybe kernel version. >>>>> >>>>> -Alan > >