Re: OpenJDK HTTP Client Bug

2013-03-04 Thread Chris Hegarty

Hi Stuart,

I think you should also move the setSoTimeout within the try. It could 
also fail, for the same reason, socket has been closed. It will make the 
code a little less pretty, but should be more robust.


-Chris.

On 02/03/2013 08:55, Stuart Douglas wrote:

Seeing as the patch appears to have been stripped here it is inline:

diff -r 2eb3ac105b7f src/share/classes/sun/net/www/http/HttpClient.java
--- a/src/share/classes/sun/net/www/http/HttpClient.javaWed Feb 27 
21:05:09 2013 -0800
+++ b/src/share/classes/sun/net/www/http/HttpClient.javaSat Mar 02 
19:06:26 2013 +1100
@@ -362,13 +362,15 @@

  protected synchronized boolean available() throws IOException {
  boolean available = true;
-int old = serverSocket.getSoTimeout();
-serverSocket.setSoTimeout(1);
-BufferedInputStream tmpbuf =
-new BufferedInputStream(serverSocket.getInputStream());
+int old = -1;

  PlatformLogger logger = HttpURLConnection.getHttpLogger();
  try {
+old = serverSocket.getSoTimeout();
+serverSocket.setSoTimeout(1);
+
+BufferedInputStream tmpbuf =
+new BufferedInputStream(serverSocket.getInputStream());
  int r = tmpbuf.read();
  if (r == -1) {
  if (logger.isLoggable(PlatformLogger.FINEST)) {
@@ -382,8 +384,17 @@
  logger.finest("HttpClient.available(): " +
  "SocketTimeout: its available");
  }
+} catch (SocketException e) {
+if (logger.isLoggable(PlatformLogger.FINEST)) {
+logger.finest("HttpClient.available(): " +
+"SocketException: not available");
+}
+available = false;
+old = -1; //we don't want to call setSoTimeout, as that will throw 
an exception
  } finally {
-serverSocket.setSoTimeout(old);
+if(old != -1) {
+serverSocket.setSoTimeout(old);
+}
  }
  return available;
  }


- Original Message -

From: "Chris Hegarty"
To: "Stuart Douglas"
Cc: "Alessio Soldano", "OpenJDK Network Dev 
list", "Rob McKenna"

Sent: Saturday, 2 March, 2013 7:37:30 PM
Subject: Re: OpenJDK HTTP Client Bug

[bcc'ing off jdk7-...@openjdk.java.net, and including
net-dev@openjdk.java.net]

Hi Stuart,

Thanks for reporting this issue.

It does indeed look like a regression/side-effect of that recent
change.
There is no sign of your attached patch, maybe it got stripped by
mailman. You can probably just post it inline.

Thanks,
-Chris.

On 03/02/2013 08:18 AM, Stuart Douglas wrote:

Hello everyone,

(This is my first post to this list, so I am not 100% sure if this
is
the right place).

I have run into a bug in the JDK HttpClient that was caused by a
recent
commit:

http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/diff/e6dc1d9bc70b/src/share/classes/sun/net/www/http/HttpClient.java


The method sun.net.www.http.HttpClient#available() can throw
java.net.SocketException, which can cause the creation of the
HttpClient
to fail. This will happen if there is a connection in the cache
that has
timed out and the socket has been closed.

I have attached a small patch that should resolve the problem,
although
due to its intermittent nature I have not been able to verify with
100%
certainty.


The exception is:

Caused by: java.net.SocketException: Socket Closed
  at
  java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
  at java.net.Socket.getSoTimeout(Socket.java:1032)
  at sun.net.www.http.HttpClient.available(HttpClient.java:356)
  at sun.net.www.http.HttpClient.New(HttpClient.java:273)
  at sun.net.www.http.HttpClient.New(HttpClient.java:310)
  at
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)

  at
sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)

  at
sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)

  at
sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)

  at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1410)



This issue also seems to affect JDK 6, and it appears that other
people
have also run into this:
http://stackoverflow.com/questions/14270311/rather-mysterious-socketexception-with-java-1-6-on-centos-4


I attempted to file a bug for this on the Oracle website, however
as far
as I can tell it was ignored.

Stuart





Re: OpenJDK HTTP Client Bug

2013-03-03 Thread Rob McKenna

Thanks again, I'll get this sorted as soon as I can.

-Rob

On 02/03/13 20:59, Stuart Douglas wrote:
The review ID it was assigned was 2436558, however I did not hear 
anything more.


(Also I am not sure if my last post actually made it through to the 
net-dev list, as I got a bounce message saying it was awaiting 
moderator approval as I am not a member).


Stuart

Rob McKenna wrote:

Thanks for this Stuart, do you happen to have a reference to the bug you
filed on the Oracle site?

-Rob

On 02/03/13 08:55, Stuart Douglas wrote:

Seeing as the patch appears to have been stripped here it is inline:

diff -r 2eb3ac105b7f src/share/classes/sun/net/www/http/HttpClient.java
--- a/src/share/classes/sun/net/www/http/HttpClient.java Wed Feb 27
21:05:09 2013 -0800
+++ b/src/share/classes/sun/net/www/http/HttpClient.java Sat Mar 02
19:06:26 2013 +1100
@@ -362,13 +362,15 @@
protected synchronized boolean available() throws IOException {
boolean available = true;
- int old = serverSocket.getSoTimeout();
- serverSocket.setSoTimeout(1);
- BufferedInputStream tmpbuf =
- new BufferedInputStream(serverSocket.getInputStream());
+ int old = -1;
PlatformLogger logger = HttpURLConnection.getHttpLogger();
try {
+ old = serverSocket.getSoTimeout();
+ serverSocket.setSoTimeout(1);
+
+ BufferedInputStream tmpbuf =
+ new BufferedInputStream(serverSocket.getInputStream());
int r = tmpbuf.read();
if (r == -1) {
if (logger.isLoggable(PlatformLogger.FINEST)) {
@@ -382,8 +384,17 @@
logger.finest("HttpClient.available(): " +
"SocketTimeout: its available");
}
+ } catch (SocketException e) {
+ if (logger.isLoggable(PlatformLogger.FINEST)) {
+ logger.finest("HttpClient.available(): " +
+ "SocketException: not available");
+ }
+ available = false;
+ old = -1; //we don't want to call setSoTimeout, as that will throw
an exception
} finally {
- serverSocket.setSoTimeout(old);
+ if(old != -1) {
+ serverSocket.setSoTimeout(old);
+ }
}
return available;
}


- Original Message -

From: "Chris Hegarty" 
To: "Stuart Douglas" 
Cc: "Alessio Soldano" , "OpenJDK Network Dev
list" , "Rob McKenna"

Sent: Saturday, 2 March, 2013 7:37:30 PM
Subject: Re: OpenJDK HTTP Client Bug

[bcc'ing off jdk7-...@openjdk.java.net, and including
net-dev@openjdk.java.net]

Hi Stuart,

Thanks for reporting this issue.

It does indeed look like a regression/side-effect of that recent
change.
There is no sign of your attached patch, maybe it got stripped by
mailman. You can probably just post it inline.

Thanks,
-Chris.

On 03/02/2013 08:18 AM, Stuart Douglas wrote:

Hello everyone,

(This is my first post to this list, so I am not 100% sure if this
is
the right place).

I have run into a bug in the JDK HttpClient that was caused by a
recent
commit:

http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/diff/e6dc1d9bc70b/src/share/classes/sun/net/www/http/HttpClient.java 





The method sun.net.www.http.HttpClient#available() can throw
java.net.SocketException, which can cause the creation of the
HttpClient
to fail. This will happen if there is a connection in the cache
that has
timed out and the socket has been closed.

I have attached a small patch that should resolve the problem,
although
due to its intermittent nature I have not been able to verify with
100%
certainty.


The exception is:

Caused by: java.net.SocketException: Socket Closed
at
java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
at java.net.Socket.getSoTimeout(Socket.java:1032)
at sun.net.www.http.HttpClient.available(HttpClient.java:356)
at sun.net.www.http.HttpClient.New(HttpClient.java:273)
at sun.net.www.http.HttpClient.New(HttpClient.java:310)
at
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987) 




at
sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923) 




at
sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841) 




at
sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031) 




at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1410) 






This issue also seems to affect JDK 6, and it appears that other
people
have also run into this:
http://stackoverflow.com/questions/14270311/rather-mysterious-socketexception-with-java-1-6-on-centos-4 





I attempted to file a bug for this on the Oracle website, however
as far
as I can tell it was ignored.

Stuart







Re: OpenJDK HTTP Client Bug

2013-03-02 Thread Rob McKenna
Thanks for this Stuart, do you happen to have a reference to the bug you 
filed on the Oracle site?


-Rob

On 02/03/13 08:55, Stuart Douglas wrote:

Seeing as the patch appears to have been stripped here it is inline:

diff -r 2eb3ac105b7f src/share/classes/sun/net/www/http/HttpClient.java
--- a/src/share/classes/sun/net/www/http/HttpClient.javaWed Feb 27 
21:05:09 2013 -0800
+++ b/src/share/classes/sun/net/www/http/HttpClient.javaSat Mar 02 
19:06:26 2013 +1100
@@ -362,13 +362,15 @@
  
  protected synchronized boolean available() throws IOException {

  boolean available = true;
-int old = serverSocket.getSoTimeout();
-serverSocket.setSoTimeout(1);
-BufferedInputStream tmpbuf =
-new BufferedInputStream(serverSocket.getInputStream());
+int old = -1;
  
  PlatformLogger logger = HttpURLConnection.getHttpLogger();

  try {
+old = serverSocket.getSoTimeout();
+serverSocket.setSoTimeout(1);
+
+BufferedInputStream tmpbuf =
+new BufferedInputStream(serverSocket.getInputStream());
  int r = tmpbuf.read();
  if (r == -1) {
  if (logger.isLoggable(PlatformLogger.FINEST)) {
@@ -382,8 +384,17 @@
  logger.finest("HttpClient.available(): " +
  "SocketTimeout: its available");
  }
+} catch (SocketException e) {
+if (logger.isLoggable(PlatformLogger.FINEST)) {
+logger.finest("HttpClient.available(): " +
+"SocketException: not available");
+}
+available = false;
+old = -1; //we don't want to call setSoTimeout, as that will throw 
an exception
  } finally {
-serverSocket.setSoTimeout(old);
+if(old != -1) {
+serverSocket.setSoTimeout(old);
+}
  }
  return available;
  }


- Original Message -

From: "Chris Hegarty" 
To: "Stuart Douglas" 
Cc: "Alessio Soldano" , "OpenJDK Network Dev list" 
, "Rob McKenna"

Sent: Saturday, 2 March, 2013 7:37:30 PM
Subject: Re: OpenJDK HTTP Client Bug

[bcc'ing off jdk7-...@openjdk.java.net, and including
net-dev@openjdk.java.net]

Hi Stuart,

Thanks for reporting this issue.

It does indeed look like a regression/side-effect of that recent
change.
There is no sign of your attached patch, maybe it got stripped by
mailman. You can probably just post it inline.

Thanks,
-Chris.

On 03/02/2013 08:18 AM, Stuart Douglas wrote:

Hello everyone,

(This is my first post to this list, so I am not 100% sure if this
is
the right place).

I have run into a bug in the JDK HttpClient that was caused by a
recent
commit:

http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/diff/e6dc1d9bc70b/src/share/classes/sun/net/www/http/HttpClient.java


The method sun.net.www.http.HttpClient#available() can throw
java.net.SocketException, which can cause the creation of the
HttpClient
to fail. This will happen if there is a connection in the cache
that has
timed out and the socket has been closed.

I have attached a small patch that should resolve the problem,
although
due to its intermittent nature I have not been able to verify with
100%
certainty.


The exception is:

Caused by: java.net.SocketException: Socket Closed
  at
  java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
  at java.net.Socket.getSoTimeout(Socket.java:1032)
  at sun.net.www.http.HttpClient.available(HttpClient.java:356)
  at sun.net.www.http.HttpClient.New(HttpClient.java:273)
  at sun.net.www.http.HttpClient.New(HttpClient.java:310)
  at
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)

  at
sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)

  at
sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)

  at
sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)

  at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1410)



This issue also seems to affect JDK 6, and it appears that other
people
have also run into this:
http://stackoverflow.com/questions/14270311/rather-mysterious-socketexception-with-java-1-6-on-centos-4


I attempted to file a bug for this on the Oracle website, however
as far
as I can tell it was ignored.

Stuart





Re: OpenJDK HTTP Client Bug

2013-03-02 Thread Chris Hegarty
[bcc'ing off jdk7-...@openjdk.java.net, and including 
net-dev@openjdk.java.net]


Hi Stuart,

Thanks for reporting this issue.

It does indeed look like a regression/side-effect of that recent change. 
There is no sign of your attached patch, maybe it got stripped by 
mailman. You can probably just post it inline.


Thanks,
-Chris.

On 03/02/2013 08:18 AM, Stuart Douglas wrote:

Hello everyone,

(This is my first post to this list, so I am not 100% sure if this is
the right place).

I have run into a bug in the JDK HttpClient that was caused by a recent
commit:

http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/diff/e6dc1d9bc70b/src/share/classes/sun/net/www/http/HttpClient.java


The method sun.net.www.http.HttpClient#available() can throw
java.net.SocketException, which can cause the creation of the HttpClient
to fail. This will happen if there is a connection in the cache that has
timed out and the socket has been closed.

I have attached a small patch that should resolve the problem, although
due to its intermittent nature I have not been able to verify with 100%
certainty.


The exception is:

Caused by: java.net.SocketException: Socket Closed
 at java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
 at java.net.Socket.getSoTimeout(Socket.java:1032)
 at sun.net.www.http.HttpClient.available(HttpClient.java:356)
 at sun.net.www.http.HttpClient.New(HttpClient.java:273)
 at sun.net.www.http.HttpClient.New(HttpClient.java:310)
 at
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)

 at
sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)

 at
sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)

 at
sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)

 at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1410)



This issue also seems to affect JDK 6, and it appears that other people
have also run into this:
http://stackoverflow.com/questions/14270311/rather-mysterious-socketexception-with-java-1-6-on-centos-4


I attempted to file a bug for this on the Oracle website, however as far
as I can tell it was ignored.

Stuart