8218559: Reimplement the Legacy Socket API

Chris Hegarty chris.hegarty at oracle.com
Wed May 8 15:25:05 UTC 2019


Alan,

On 01/05/2019 14:10, Alan Bateman wrote:
> 
> JEP 353 [1] is now a candidate and I would like to get the CSR [2] 
> finalized and the changes reviewed so that it can be targeted.
> 
> The webrev with the changes is here:
>     http://cr.openjdk.java.net/~alanb/8221481/1/webrev/index.html
This is a nice. The code is well structured and much more readable than
the plain implementation.

Some specific comments:

NioSocketImpl.java

  If configureBlocking returned a boolean, then an assert could be
  written to ensure that it operates as expected. For example, both
  connect and accept require it to actually switch the block mode for
  timed operations when called ( it cannot be a no-op ).

  RuntimeException is being used to transport IOException between
  FileDescriptorCloser::run ( which cannot throw a checked exception )
  and tryClose. I believe that tryClose should catch and unwrap this
  carrier RuntimeException.

  When tryClose is invoked in end[Read|Write|Connect|Accept], I believe
  that IOExceptions should be suppressed, at least when `completed` is
  true.

  typos "an" -> "a"
   408  * @throws SocketException if the socket is closed or *an* socket 
I/O error occurs
   429  * @throws SocketException if the socket is closed or *an* socket 
I/O error occurs

   882         // shutdown output when linger interval not set to 0
   883         try {
   884             var SO_LINGER = StandardSocketOptions.SO_LINGER;
   885             if ((int) Net.getSocketOption(fd, SO_LINGER) != 0) {
   886                 Net.shutdown(fd, Net.SHUT_WR);
   887             }
   888         } catch (IOException ignore) { }

  Is this a bug fix, or something that you ran across? I'm not familiar
  with this.

SocketImpl.java

  "45  * @implNote Client and server sockets created with the {@code 
Socket} and
   46  * {@code SocketServer} public constructors create a 
system/platform default
   47  * {@code SocketImpl}."

  The public no-args j.n.Socket constructor has the following slightly
  different wording: "Creates an unconnected socket, with the
  system-default type of SocketImpl." - these should probably be
  consistent.

  Why the use of "Java virtual machine" and "command line", since it is
  just a system property. I assume that this must come from the read-once
  nature of its impact? If so, are there other example of such and where?

  49  * newer implementation. The JDK continues to ship with the older 
implementation
  50  * to allow code to run that depends on unspecified behavior that 
differs between
  51  * the old and new implementations.

  If the intention of this property is as a temporarily aid for folk,
  that have code that depend upon the unspecified behavior, to run
  successfully until that code can be amended to remove the dependency on
  the particular unspecified behavior, then can that please be made
  clear.

  The property is effectively terminally deprecated at birth, right? If
  so, can a note indicating such be added.

Timeouts.java

  The test uses `assertTrue(false);` in a few places. TestNG has
  `org.testng.Assert.fail(String)` for this.

  Only time will tell if these tests that check duration will be stable
  on all platforms and configurations.

UdpSocket.java

  The new test scenario uses a hardcoded port number. Could this be a
  problem?

   121             while (ref.get() != null) {
   122                 System.gc();
   123                 Thread.sleep(100);
   124             }

  Is this loop guaranteed to exist at some point?

  80   assertTrue(Arrays.equals(array1, 0, n, array2, 0, n), "Unexpected 
contents");

  Can use `assertEquals(byte[] actual, byte[] expected, String message)`,
  which will print the arrays if unequal.

NewSocketMethods.java

  Is the change in this class still needed, or left over from a previous
  iteration?

test/jdk/java/net/SocketImpl/BadUsages.java

  At one point I added test/jdk/java/net/SocketImpl/BadSocketImpls.java
  to the sandbox branch. Have the test scenarios been subsumed into
  BadUsages? Or where have they gone?

-Chris.




More information about the net-dev mailing list