Yes, I indeed tested on an old kernel - but that should still work after your change!
On Wednesday, November 25, 2015, Lu, Yingqi <yingqi...@intel.com> wrote: > Hi Volker, > > Thanks very much for letting me know. I actually took the related > regression tests and they all passed. I think you tested on an old kernel > which does not have SO_REUSEPORT enabled. In this case, it should not set > the flag. > > Let me double check. I will get back to you as soon as I can. > > Thanks, > Lucy > > -----Original Message----- > From: Volker Simonis [mailto:volker.simo...@gmail.com <javascript:;>] > Sent: Wednesday, November 25, 2015 10:46 AM > To: Lu, Yingqi <yingqi...@intel.com <javascript:;>> > Cc: Michael McMahon <michael.x.mcma...@oracle.com <javascript:;>>; Alan > Bateman <alan.bate...@oracle.com <javascript:;>>; Kharbas, Kishor < > kishor.khar...@intel.com <javascript:;>>; net-dev@openjdk.java.net > <javascript:;>; Kaczmarek, Eric <eric.kaczma...@intel.com <javascript:;>> > Subject: Re: Patch for adding SO_REUSEPORT socket option > > Hi Lucy, > > I took a brief look at your changes but there seems to be something not > right. I can't understand for example why you unconditionally try to set > SO_REUSEPORT on all sockets in Java_sun_nio_ch_Net_socket0() ? > > Also which your changes applied, simple regression tests like > test/java/net/SocketOption/OptionsTest.java start to fail even on > Linux/x86_64: > > java.net.SocketException: Protocol not available > at java.net.PlainDatagramSocketImpl.socketSetOption0(Native Method) > at > java.net.PlainDatagramSocketImpl.socketSetOption(PlainDatagramSocketImpl.java:85) > at > java.net.AbstractPlainDatagramSocketImpl.setOption(AbstractPlainDatagramSocketImpl.java:314) > at java.net.DatagramSocket.setReusePort(DatagramSocket.java:1145) > at java.net.MulticastSocket.<init>(MulticastSocket.java:180) > at java.net.MulticastSocket.<init>(MulticastSocket.java:142) > at OptionsTest.doMcSocketTests(OptionsTest.java:131) > at OptionsTest.main(OptionsTest.java:247) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:520) > at > com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:92) > at java.lang.Thread.run(Thread.java:747) > > > Can you please make sure that your changes at least don't break the > regression tests? > > Thank you and best regards, > Volker > > On Tue, Nov 24, 2015 at 6:04 PM, Lu, Yingqi <yingqi...@intel.com > <javascript:;>> wrote: > > Hi Michael/Alan/Volker, > > > > Following your suggestions, here is the most recent version (Version > > 4) of the patch. > > http://cr.openjdk.java.net/~mcberg/jdk/6432031/webrev.04/ > > > > In this version, we have done following changes: > > > > 1. Add reuseportSupported() method in sun.nio.ch.Net and its > implementation in Net.c. Only add SO_REUSEPORT to the option set when it is > supported. In all the tests, we use supportedOptions method to test if > SO_REUSEPORT is supported or not. > > > > 2. We dropped NetworkChannels from the Javadoc. We removed Linux > specific wordings in Javadoc for SO_REUSEPORT. > > > > 3. We expand the feature to all UNIX based OSes. However, we do not have > all the OSes to test. Please test and let us know if there is anything > missing in either compilation or run time. > > > > Please review the patch and let us know your feedback. Thank you very > much for your help! > > > > Thanks, > > Lucy > > > > -----Original Message----- > > From: net-dev [mailto:net-dev-boun...@openjdk.java.net <javascript:;>] > On Behalf Of > > Michael McMahon > > Sent: Monday, November 23, 2015 2:54 AM > > To: Volker Simonis <volker.simo...@gmail.com <javascript:;>>; Alan > Bateman > > <alan.bate...@oracle.com <javascript:;>> > > Cc: Kharbas, Kishor <kishor.khar...@intel.com <javascript:;>>; > > net-dev@openjdk.java.net <javascript:;> > > Subject: Re: Patch for adding SO_REUSEPORT socket option > > > > 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 > >> d r-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 > <javascript:;>> 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 > > >