Re: RFR: 8257736: InputStream from BodyPublishers.ofInputStream() leaks when IOE happens [v5]

2021-01-13 Thread Yasumasa Suenaga
On Wed, 13 Jan 2021 18:59:30 GMT, Daniel Fuchs  wrote:

>> PING: could you review this PR?
>
> Hi Yasumasa,
> 
> The new StreamCloseTest seems to be suffering from some race conditions; On 
> windows I saw it failing 29 times out of 50.
> 
> config StreamCloseTest.setup(): success
> test StreamCloseTest.closeTestOnException(): success
> test StreamCloseTest.normallyCloseTest(): failure
> java.io.IOException: HTTP/1.1 header parser received no bytes
>   at 
> java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:584)
>   at 
> java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
>   at StreamCloseTest.normallyCloseTest(StreamCloseTest.java:134)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>   at 
> org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
>   at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
>   at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
>   at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
>   at 
> org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
>   at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
>   at org.testng.TestRunner.privateRun(TestRunner.java:773)
>   at org.testng.TestRunner.run(TestRunner.java:623)
>   at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
>   at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
>   at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
>   at org.testng.SuiteRunner.run(SuiteRunner.java:259)
>   at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
>   at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
>   at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
>   at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
>   at org.testng.TestNG.run(TestNG.java:1018)
>   at 
> com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:94)
>   at 
> com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:54)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>   at 
> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127)
>   at java.base/java.lang.Thread.run(Thread.java:831)
> Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
>   at 
> java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:345)
>   at 
> java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:675)
>   at 
> java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302)
>   at 
> java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268)
>   at 
> java.net.http/jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)
>   at 
> java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)
>   at 
> java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
>   at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
>   at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
>   ... 1 more
> Caused by: java.io.IOException: An established connection was aborted by the 
> software in your host machine
>   at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
>   at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:46)
>   at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
>   at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)
>   at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
>   at 
> java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:417)
>   at 
> java.net.http/jdk.internal.net.http.SocketTube.readAvailable(SocketTube.java:1162)
>   at 
> java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:825)
>   at 
> java.net.http/jdk.internal.net.ht

Re: RFR: 8257736: InputStream from BodyPublishers.ofInputStream() leaks when IOE happens [v5]

2021-01-13 Thread Yasumasa Suenaga
> `InputStream` from `BodyPublishers.ofInputStream()` is usually closed when 
> the stream reaches EOF. However IOE handler returns without closing.
> 
> I confirmed this problem in `BodyPublishers.ofInputStream()`, but I think 
> `BodyPublishers.ofFile()`has same problem because it also use 
> `StreamIterator`as well as `ofInputStream()`.
> 
> 
> # How to reproduce:
> 
> Following code (Test.java) attempts to post body from `TestInputStream` which 
> throws IOE in `read()`. "close called" is shown on the console if `close()` 
> is called.
> 
> import java.io.*;
> import java.net.*;
> import java.net.http.*;
> 
> public class Test{
> 
>   private static class TestInputStream extends InputStream{
> 
> public TestInputStream(){
>   super();
>   System.out.println("test c'tor");
> }
> 
> @Override
> public int read() throws IOException{
>   System.out.println("read called");
>   throw new IOException("test");
> }
> 
> @Override
> public void close() throws IOException{
>   System.out.println("close called");
>   super.close();
> }
> 
>   }
> 
>   public static void main(String[] args) throws Exception{
> var http = HttpClient.newHttpClient();
> var request = HttpRequest.newBuilder()
>  .uri(URI.create("http://httpbin.org/post";))
>  
> .POST(HttpRequest.BodyPublishers.ofInputStream(() -> new TestInputStream()))
>  .build();
> http.send(request, HttpResponse.BodyHandlers.discarding());
> System.out.println("Press any key to exit...");
> System.in.read();
>   }
> }

Yasumasa Suenaga has updated the pull request incrementally with one additional 
commit since the last revision:

  Use HttpServerAdapters in StreamCloseTest.java

-

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/1614/files
  - new: https://git.openjdk.java.net/jdk/pull/1614/files/95badebc..a081290f

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=1614&range=04
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=1614&range=03-04

  Stats: 45 lines in 1 file changed: 9 ins; 25 del; 11 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1614.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1614/head:pull/1614

PR: https://git.openjdk.java.net/jdk/pull/1614


Re: RFR: 8259662: SocketException should be passed through [v2]

2021-01-13 Thread Clive Verghese
On Wed, 13 Jan 2021 18:41:26 GMT, Rajan Halade  wrote:

>> Clive Verghese has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Fix bugids and use server port passed as a parameter
>
> test/jdk/sun/security/ssl/SSLContextImpl/ShouldThrowSSLExceptionWhenPeerClosesSocket.java
>  line 32:
> 
>> 30: 
>> 31: /*
>> 32:  * @test
> 
> Suggestion:
> 
>  * @test
>  * @bug 8259662 8259516

Thank you for the feedback. I have updated the change to include the bug ids.

-

PR: https://git.openjdk.java.net/jdk/pull/2057


Re: RFR: 8259662: SocketException should be passed through [v2]

2021-01-13 Thread Clive Verghese
> Redo for 8237578: JDK-8214339 (SSLSocketImpl wraps SocketException) appears 
> to not be fully fixed
> 
> This also fixes JDK-8259516: Alerts sent by peer may not be received 
> correctly during TLS handshake

Clive Verghese has updated the pull request incrementally with one additional 
commit since the last revision:

  Fix bugids and use server port passed as a parameter

-

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/2057/files
  - new: https://git.openjdk.java.net/jdk/pull/2057/files/00667985..da98249d

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2057&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2057&range=00-01

  Stats: 3 lines in 2 files changed: 1 ins; 0 del; 2 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2057.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2057/head:pull/2057

PR: https://git.openjdk.java.net/jdk/pull/2057


Re: RFR: 8257736: InputStream from BodyPublishers.ofInputStream() leaks when IOE happens [v4]

2021-01-13 Thread Daniel Fuchs
On Thu, 7 Jan 2021 00:32:42 GMT, Yasumasa Suenaga  wrote:

>> @ChrisHegarty @dfuch could you review new change? It updates a testcase.
>
> PING: could you review this PR?

Hi Yasumasa,

The new StreamCloseTest seems to be suffering from some race conditions; On 
windows I saw it failing 29 times out of 50.

config StreamCloseTest.setup(): success
test StreamCloseTest.closeTestOnException(): success
test StreamCloseTest.normallyCloseTest(): failure
java.io.IOException: HTTP/1.1 header parser received no bytes
at 
java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:584)
at 
java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
at StreamCloseTest.normallyCloseTest(StreamCloseTest.java:134)
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at 
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
at 
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:773)
at org.testng.TestRunner.run(TestRunner.java:623)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
at org.testng.SuiteRunner.run(SuiteRunner.java:259)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
at org.testng.TestNG.run(TestNG.java:1018)
at 
com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:94)
at 
com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:54)
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at 
com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127)
at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
at 
java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:345)
at 
java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:675)
at 
java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302)
at 
java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268)
at 
java.net.http/jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)
at 
java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)
at 
java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
... 1 more
Caused by: java.io.IOException: An established connection was aborted by the 
software in your host machine
at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:46)
at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
at 
java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:417)
at 
java.net.http/jdk.internal.net.http.SocketTube.readAvailable(SocketTube.java:1162)
at 
java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:825)
at 
java.net.http/jdk.internal.net

Re: RFR: 8259662: SocketException should be passed through

2021-01-13 Thread Rajan Halade
On Wed, 13 Jan 2021 06:19:18 GMT, Clive Verghese  wrote:

> Redo for 8237578: JDK-8214339 (SSLSocketImpl wraps SocketException) appears 
> to not be fully fixed
> 
> This also fixes JDK-8259516: Alerts sent by peer may not be received 
> correctly during TLS handshake

Changes requested by rhalade (Reviewer).

test/jdk/sun/security/ssl/SSLContextImpl/ShouldThrowSSLExceptionWhenPeerClosesSocket.java
 line 32:

> 30: 
> 31: /*
> 32:  * @test

Suggestion:

 * @test
 * @bug 8259662 8259516

-

PR: https://git.openjdk.java.net/jdk/pull/2057


Integrated: JDK-8212035 : merge jdk.test.lib.util.SimpleHttpServer with jaxp.library.SimpleHttpServer

2021-01-13 Thread Mahendra Chhipa
On Fri, 4 Dec 2020 19:44:33 GMT, Mahendra Chhipa 
 wrote:

> jaxp.library.SimpleHttpServer
> https://bugs.openjdk.java.net/browse/JDK-8212035

This pull request has now been integrated.

Changeset: 5df2a949
Author:Mahendra Chhipa 
Committer: Daniel Fuchs 
URL:   https://git.openjdk.java.net/jdk/commit/5df2a949
Stats: 651 lines in 17 files changed: 227 ins; 321 del; 103 mod

8212035: merge jdk.test.lib.util.SimpleHttpServer with 
jaxp.library.SimpleHttpServer

Reviewed-by: dfuchs

-

PR: https://git.openjdk.java.net/jdk/pull/1632


Re: RFR: 8259631: Reapply pattern match instanceof use in HttpClientImpl

2021-01-13 Thread Chris Hegarty
On Tue, 12 Jan 2021 16:05:01 GMT, Aleksei Efimov  wrote:

> Hi,
> 
> The proposed change adds back [1] `instanceof` pattern match use to 
> `HttpClientImpl` class. It was previously removed by 
> [JDK-8258696](https://bugs.openjdk.java.net/browse/JDK-8258696) due to docs 
> build failure.
> 
> Aleksei
> 
> [1] `git rollback be41468c --no-commit`

Marked as reviewed by chegar (Reviewer).

-

PR: https://git.openjdk.java.net/jdk/pull/2051


Re: RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Сергей Цыпанов
On Wed, 13 Jan 2021 13:48:40 GMT, Claes Redestad  wrote:

>> Instead of allocating a copy of underlying array via 
>> `CharArrayWriter.toCharArray()` and passing it to constructor of String
>> String str = new String(charArrayWriter.toCharArray());
>> we could call `toString()` method
>> String str = charArrayWriter.toString();
>> decoding existing char[] without making a copy. This slightly speeds up the 
>> method reducing at the same time memory consumption for decoding URLs with 
>> non-latin symbols:
>> @State(Scope.Thread)
>> @BenchmarkMode(Mode.AverageTime)
>> @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
>> public class UrlEncoderBenchmark {
>>   private static final Charset charset = Charset.defaultCharset();
>>   private static final String utf8Url = 
>> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN
>> 
>>   @Benchmark
>>   public String encodeUtf8() {
>> return URLEncoder.encode(utf8Url, charset);
>>   }
>> }
>> The benchmark on my maching give the following output:
>> before
>> BenchmarkMode  Cnt   
>>   ScoreError   Units
>> UrlEncoderBenchmark.encodeUtf8   avgt  100  
>> 1166.378 ±  8.411   ns/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
>> 932.944 ±  6.393  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
>> 1712.193 ±  0.005B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
>> 929.221 ± 24.268  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
>> 1705.444 ± 43.235B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100   
>>   0.006 ±  0.001  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100   
>>   0.011 ±  0.002B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
>> 652.000   counts
>> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
>> 334.000   ms
>> 
>> after
>> BenchmarkMode  Cnt   
>>   ScoreError   Units
>> UrlEncoderBenchmark.encodeUtf8   avgt  100  
>> 1058.851 ±  6.006   ns/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
>> 931.489 ±  5.182  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
>> 1552.176 ±  0.005B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
>> 933.491 ± 24.164  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
>> 1555.488 ± 39.204B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100   
>>   0.006 ±  0.001  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100   
>>   0.010 ±  0.002B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
>> 655.000   counts
>> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
>> 333.000   ms
>
> Looks good.
> 
> I wonder... `CharArrayWriter` is an old and synchronized data structure, and 
> since the instance used here isn't shared that synchronization seem useless. 
> And since you're now bypassing the `char[]` and going straight for a `String` 
> you might get better performance with a `StringBuilder` here? (`setLength(0)` 
> instead of `reset()`...)

@cl4es hi, let me try `StringBuilder`

-

PR: https://git.openjdk.java.net/jdk/pull/1598


Re: RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Claes Redestad
On Thu, 3 Dec 2020 14:29:58 GMT, Сергей Цыпанов 
 wrote:

> Instead of allocating a copy of underlying array via 
> `CharArrayWriter.toCharArray()` and passing it to constructor of String
> String str = new String(charArrayWriter.toCharArray());
> we could call `toString()` method
> String str = charArrayWriter.toString();
> decoding existing char[] without making a copy. This slightly speeds up the 
> method reducing at the same time memory consumption for decoding URLs with 
> non-latin symbols:
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
> public class UrlEncoderBenchmark {
>   private static final Charset charset = Charset.defaultCharset();
>   private static final String utf8Url = 
> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN
> 
>   @Benchmark
>   public String encodeUtf8() {
> return URLEncoder.encode(utf8Url, charset);
>   }
> }
> The benchmark on my maching give the following output:
> before
> BenchmarkMode  Cnt
>  ScoreError   Units
> UrlEncoderBenchmark.encodeUtf8   avgt  100  
> 1166.378 ±  8.411   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
> 932.944 ±  6.393  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
> 1712.193 ±  0.005B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
> 929.221 ± 24.268  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
> 1705.444 ± 43.235B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100
>  0.011 ±  0.002B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
> 652.000   counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
> 334.000   ms
> 
> after
> BenchmarkMode  Cnt
>  ScoreError   Units
> UrlEncoderBenchmark.encodeUtf8   avgt  100  
> 1058.851 ±  6.006   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
> 931.489 ±  5.182  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
> 1552.176 ±  0.005B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
> 933.491 ± 24.164  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
> 1555.488 ± 39.204B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100
>  0.010 ±  0.002B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
> 655.000   counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
> 333.000   ms

Looks good.

I wonder... `CharArrayWriter` is an old and synchronized data structure, and 
since the instance used here isn't shared that synchronization seem useless. 
And since you're now bypassing the `char[]` and going straight for a `String` 
you might get better performance with a `StringBuilder` here? (`setLength(0)` 
instead of `reset()`...)

-

Marked as reviewed by redestad (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/1598


Re: RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Attila Szegedi
On Thu, 3 Dec 2020 14:29:58 GMT, Сергей Цыпанов 
 wrote:

> Instead of allocating a copy of underlying array via 
> `CharArrayWriter.toCharArray()` and passing it to constructor of String
> String str = new String(charArrayWriter.toCharArray());
> we could call `toString()` method
> String str = charArrayWriter.toString();
> decoding existing char[] without making a copy. This slightly speeds up the 
> method reducing at the same time memory consumption for decoding URLs with 
> non-latin symbols:
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
> public class UrlEncoderBenchmark {
>   private static final Charset charset = Charset.defaultCharset();
>   private static final String utf8Url = 
> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN
> 
>   @Benchmark
>   public String encodeUtf8() {
> return URLEncoder.encode(utf8Url, charset);
>   }
> }
> The benchmark on my maching give the following output:
> before
> BenchmarkMode  Cnt
>  ScoreError   Units
> UrlEncoderBenchmark.encodeUtf8   avgt  100  
> 1166.378 ±  8.411   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
> 932.944 ±  6.393  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
> 1712.193 ±  0.005B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
> 929.221 ± 24.268  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
> 1705.444 ± 43.235B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100
>  0.011 ±  0.002B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
> 652.000   counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
> 334.000   ms
> 
> after
> BenchmarkMode  Cnt
>  ScoreError   Units
> UrlEncoderBenchmark.encodeUtf8   avgt  100  
> 1058.851 ±  6.006   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
> 931.489 ±  5.182  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
> 1552.176 ±  0.005B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
> 933.491 ± 24.164  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
> 1555.488 ± 39.204B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100
>  0.010 ±  0.002B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
> 655.000   counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
> 333.000   ms

Looks good!

-

Marked as reviewed by attila (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/1598


Re: RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Attila Szegedi
On Mon, 11 Jan 2021 09:28:46 GMT, Сергей Цыпанов 
 wrote:

>> Looks good!
>
> @szegedi could you please create a ticket for this change? Otherwise I cannot 
> merge it

Filed a ticket, you should rename this PR to "8259699: Reduce char[] copying in 
URLEncoder.encode(String, Charset)"

-

PR: https://git.openjdk.java.net/jdk/pull/1598


Re: RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Сергей Цыпанов
On Sun, 10 Jan 2021 20:13:51 GMT, Attila Szegedi  wrote:

>> Instead of allocating a copy of underlying array via 
>> `CharArrayWriter.toCharArray()` and passing it to constructor of String
>> String str = new String(charArrayWriter.toCharArray());
>> we could call `toString()` method
>> String str = charArrayWriter.toString();
>> decoding existing char[] without making a copy. This slightly speeds up the 
>> method reducing at the same time memory consumption for decoding URLs with 
>> non-latin symbols:
>> @State(Scope.Thread)
>> @BenchmarkMode(Mode.AverageTime)
>> @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
>> public class UrlEncoderBenchmark {
>>   private static final Charset charset = Charset.defaultCharset();
>>   private static final String utf8Url = 
>> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN
>> 
>>   @Benchmark
>>   public String encodeUtf8() {
>> return URLEncoder.encode(utf8Url, charset);
>>   }
>> }
>> The benchmark on my maching give the following output:
>> before
>> BenchmarkMode  Cnt   
>>   ScoreError   Units
>> UrlEncoderBenchmark.encodeUtf8   avgt  100  
>> 1166.378 ±  8.411   ns/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
>> 932.944 ±  6.393  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
>> 1712.193 ±  0.005B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
>> 929.221 ± 24.268  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
>> 1705.444 ± 43.235B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100   
>>   0.006 ±  0.001  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100   
>>   0.011 ±  0.002B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
>> 652.000   counts
>> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
>> 334.000   ms
>> 
>> after
>> BenchmarkMode  Cnt   
>>   ScoreError   Units
>> UrlEncoderBenchmark.encodeUtf8   avgt  100  
>> 1058.851 ±  6.006   ns/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
>> 931.489 ±  5.182  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
>> 1552.176 ±  0.005B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
>> 933.491 ± 24.164  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
>> 1555.488 ± 39.204B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100   
>>   0.006 ±  0.001  MB/sec
>> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100   
>>   0.010 ±  0.002B/op
>> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
>> 655.000   counts
>> UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
>> 333.000   ms
>
> Looks good!

@szegedi could you please create a ticket for this change? Otherwise I cannot 
merge it

-

PR: https://git.openjdk.java.net/jdk/pull/1598


RFR: 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset)

2021-01-13 Thread Сергей Цыпанов
Instead of allocating a copy of underlying array via 
`CharArrayWriter.toCharArray()` and passing it to constructor of String
String str = new String(charArrayWriter.toCharArray());
we could call `toString()` method
String str = charArrayWriter.toString();
decoding existing char[] without making a copy. This slightly speeds up the 
method reducing at the same time memory consumption for decoding URLs with 
non-latin symbols:
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class UrlEncoderBenchmark {
  private static final Charset charset = Charset.defaultCharset();
  private static final String utf8Url = 
"https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN

  @Benchmark
  public String encodeUtf8() {
return URLEncoder.encode(utf8Url, charset);
  }
}
The benchmark on my maching give the following output:
before
BenchmarkMode  Cnt 
ScoreError   Units
UrlEncoderBenchmark.encodeUtf8   avgt  100  
1166.378 ±  8.411   ns/op
UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
932.944 ±  6.393  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
1712.193 ±  0.005B/op
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
929.221 ± 24.268  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
1705.444 ± 43.235B/op
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100 
0.006 ±  0.001  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100 
0.011 ±  0.002B/op
UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
652.000   counts
UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
334.000   ms

after
BenchmarkMode  Cnt 
ScoreError   Units
UrlEncoderBenchmark.encodeUtf8   avgt  100  
1058.851 ±  6.006   ns/op
UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rateavgt  100   
931.489 ±  5.182  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm   avgt  100  
1552.176 ±  0.005B/op
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space   avgt  100   
933.491 ± 24.164  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm  avgt  100  
1555.488 ± 39.204B/op
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space   avgt  100 
0.006 ±  0.001  MB/sec
UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100 
0.010 ±  0.002B/op
UrlEncoderBenchmark.encodeUtf8:·gc.count avgt  100   
655.000   counts
UrlEncoderBenchmark.encodeUtf8:·gc.time  avgt  100   
333.000   ms

-

Commit messages:
 - Merge branch 'master' into enc
 - Improve URLEncoder.encode(String, Charset)

Changes: https://git.openjdk.java.net/jdk/pull/1598/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1598&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8259699
  Stats: 8 lines in 1 file changed: 0 ins; 0 del; 8 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1598.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1598/head:pull/1598

PR: https://git.openjdk.java.net/jdk/pull/1598


Re: RFR: 8259662: SocketException should be passed through

2021-01-13 Thread Daniel Fuchs
On Wed, 13 Jan 2021 06:19:18 GMT, Clive Verghese  wrote:

> Redo for 8237578: JDK-8214339 (SSLSocketImpl wraps SocketException) appears 
> to not be fully fixed
> 
> This also fixes JDK-8259516: Alerts sent by peer may not be received 
> correctly during TLS handshake

The changes to the HttpClient test look reasonable to me. I'll let the security 
libs experts comment on the rest of this change however.

best regards,
-- daniel

-

PR: https://git.openjdk.java.net/jdk/pull/2057


RFR: 8259662: SocketException should be passed through

2021-01-13 Thread Clive Verghese
Redo for 8237578: JDK-8214339 (SSLSocketImpl wraps SocketException) appears to 
not be fully fixed

This also fixes JDK-8259516: Alerts sent by peer may not be received correctly 
during TLS handshake

-

Commit messages:
 - 8259662: SocketException should be passed through

Changes: https://git.openjdk.java.net/jdk/pull/2057/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2057&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8259662
  Stats: 488 lines in 7 files changed: 479 ins; 0 del; 9 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2057.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2057/head:pull/2057

PR: https://git.openjdk.java.net/jdk/pull/2057