JDK-7181141 : Socket fails to return available data for Windows 7 64 and Java 7
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.net
  • Affected Version: 7u5
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_7
  • CPU: x86
  • Submitted: 2012-07-02
  • Updated: 2012-07-30
  • Resolved: 2012-07-30
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]

i.e Windows 7 Profesional SP 1


EXTRA RELEVANT SYSTEM CONFIGURATION :
Office LAN with internet via DNS


A DESCRIPTION OF THE PROBLEM :
When switched to Java 7 on Windows 64 bit http communication often hangs.

We encountered the problem initially when our unit tests started to fail after switching to Java 7 on Windows 64 bit. We're using Simple 4.1.21 framework to mock server responses for our client code unit tests. Most of the tests work fine but for buffers exceeding 15KB they keep failing. This is reproducible every time, unfortunately because of the complexity we are unable to provide you with this code, however we were able to also reproduce it with the attached code which performs similar network operations.

There is no exception thrown anywhere in the code - I am able to step through every part of the exchange up until the response is written by Simple framework - but we never get any notification in our code of data that is known to be available on the socket.

Because of the bug 7077696 I set the rules to allow all java traffic pass the Windows firewall but that didn't have any effect.

For the provided download example the following stacktrace (obtained with jvisualvm) shows where the code is blocked waiting on socket read:

"RMI TCP Connection(2)-192.168.5.101" daemon prio=6 tid=0x000000000aa8d800 nid=0x3b0 runnable [0x000000000b21e000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0x00000000ebae2fa0> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- <0x00000000eb77df00> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"JMX server connection timeout 13" daemon prio=6 tid=0x000000000a9b5800 nid=0x1078 in Object.wait() [0x000000000b53f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000000eb9567a8> (a [I)
	at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
	- locked <0x00000000eb9567a8> (a [I)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"RMI Scheduler(0)" daemon prio=6 tid=0x000000000a936000 nid=0xc84 waiting on condition [0x000000000b3bf000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000eb768f28> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"RMI TCP Connection(1)-192.168.5.101" daemon prio=6 tid=0x000000000a8d5800 nid=0xcf8 runnable [0x000000000adee000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0x00000000eb8b41d0> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- <0x00000000eb77b5f0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"RMI TCP Accept-0" daemon prio=6 tid=0x000000000a926000 nid=0x1040 runnable [0x000000000b06f000]
   java.lang.Thread.State: RUNNABLE
	at java.net.DualStackPlainSocketImpl.accept0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:121)
	at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
	at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:183)
	- locked <0x00000000eb76ee38> (a java.net.SocksSocketImpl)
	at java.net.ServerSocket.implAccept(ServerSocket.java:522)
	at java.net.ServerSocket.accept(ServerSocket.java:490)
	at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:359)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"Service Thread" daemon prio=6 tid=0x00000000088e2800 nid=0x1158 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"C2 CompilerThread1" daemon prio=10 tid=0x00000000088de800 nid=0x770 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"C2 CompilerThread0" daemon prio=10 tid=0x00000000088d9800 nid=0x1488 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Attach Listener" daemon prio=10 tid=0x00000000088d9000 nid=0x16c8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Signal Dispatcher" daemon prio=10 tid=0x00000000088d1800 nid=0x13f0 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Finalizer" daemon prio=8 tid=0x00000000020c9000 nid=0x848 in Object.wait() [0x0000000009def000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000000eb4057f0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x00000000eb4057f0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

   Locked ownable synchronizers:
	- None

"Reference Handler" daemon prio=10 tid=0x00000000020c2000 nid=0xdf8 in Object.wait() [0x0000000009b5e000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000000eb405370> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
	- locked <0x00000000eb405370> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
	- None

"main" prio=6 tid=0x0000000001fcc800 nid=0x13ac runnable [0x000000000220f000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000000eb46f688> (a java.io.BufferedInputStream)
	at sun.net.www.MeteredStream.read(MeteredStream.java:134)
	- locked <0x00000000eb4721c0> (a sun.net.www.http.KeepAliveStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:133)
	at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3035)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000000eb44d930> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:107)
	at DownloadJar.main(DownloadJar.java:26)

   Locked ownable synchronizers:
	- None

"VM Thread" prio=10 tid=0x00000000020be000 nid=0x1620 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x0000000002013800 nid=0x1570 runnable

"GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000002015000 nid=0xf58 runnable

"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002017000 nid=0x1454 runnable

"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002018800 nid=0x1668 runnable

"VM Periodic Task Thread" prio=10 tid=0x00000000088fb000 nid=0x95c waiting on condition

JNI global references: 147





REGRESSION.  Last worked in version 6u31

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. run the attached download example (from closed issue 7115226)
2. the download will hang (at least for me) two out of three times



EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
the download finishes
ACTUAL -
download blocks on socket read

REPRODUCIBILITY :
This bug can be reproduced often.

---------- BEGIN SOURCE ----------
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

/*EXPECTED VERSUS ACTUAL BEHAVIOR :
This program will very often hang before downloading the full contents of netty-3.2.6.Final.jar
ERROR MESSAGES/STACK TRACES THAT OCCUR :
no error messages - this program just hangs
*/
public class DownloadJar {

	public static void main(String[] args) throws MalformedURLException {
		URL url
			= new URL("http://repo1.maven.org/maven2/org/jboss/netty/netty/3.2.6.Final/netty-3.2.6.Final.jar");
		try {
				
			BufferedInputStream in = new BufferedInputStream(url.openStream());
		  BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("netty.jar"));
			
			byte[] buf = new byte[2048];
			int len = 0;
			int total = 0;
			while ((len = in.read(buf)) > 0) {
				total += len;
				System.out.println(total / 1024 + "KB");
				out.write(buf, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

//EOF

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
force use of IPv4:
-Djava.net.preferIPv4Stack=true