101 lines
4.2 KiB
Diff
101 lines
4.2 KiB
Diff
|
|
From 9a0231683a77e2957cea0fdee88b193b30b0c976 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Mark Thomas <markt@apache.org>
|
||
|
|
Date: Fri, 22 May 2020 11:27:49 +0100
|
||
|
|
Subject: [PATCH] Fix BZ 64467. Improve performance of closing idle streams
|
||
|
|
|
||
|
|
---
|
||
|
|
.../coyote/http2/Http2UpgradeHandler.java | 10 +++---
|
||
|
|
.../coyote/http2/TestHttp2Section_5_1.java | 31 ++++++++++++++++---
|
||
|
|
webapps/docs/changelog.xml | 4 +++
|
||
|
|
3 files changed, 36 insertions(+), 9 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
|
||
|
|
index bd836940fb..f0d5f27bda 100644
|
||
|
|
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
|
||
|
|
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
|
||
|
|
@@ -1343,11 +1343,11 @@ public HeaderEmitter headersStart(int streamId, boolean headersEndStream)
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
- private void closeIdleStreams(int newMaxActiveRemoteStreamId) throws Http2Exception {
|
||
|
|
- for (int i = maxActiveRemoteStreamId + 2; i < newMaxActiveRemoteStreamId; i += 2) {
|
||
|
|
- Stream stream = getStream(i, false);
|
||
|
|
- if (stream != null) {
|
||
|
|
- stream.closeIfIdle();
|
||
|
|
+ private void closeIdleStreams(int newMaxActiveRemoteStreamId) {
|
||
|
|
+ for (Entry<Integer,Stream> entry : streams.entrySet()) {
|
||
|
|
+ if (entry.getKey().intValue() > maxActiveRemoteStreamId &&
|
||
|
|
+ entry.getKey().intValue() < newMaxActiveRemoteStreamId) {
|
||
|
|
+ entry.getValue().closeIfIdle();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
maxActiveRemoteStreamId = newMaxActiveRemoteStreamId;
|
||
|
|
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
|
||
|
|
index 2a466814e1..f878653ecf 100644
|
||
|
|
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
|
||
|
|
+++ b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
|
||
|
|
@@ -147,21 +147,44 @@ public void testClientSendOldStream() throws Exception {
|
||
|
|
|
||
|
|
@Test
|
||
|
|
public void testImplicitClose() throws Exception {
|
||
|
|
+ doTestImplicitClose(5);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+
|
||
|
|
+ // https://bz.apache.org/bugzilla/show_bug.cgi?id=64467
|
||
|
|
+ @Test
|
||
|
|
+ public void testImplicitCloseLargeId() throws Exception {
|
||
|
|
+ doTestImplicitClose(Integer.MAX_VALUE - 8);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+
|
||
|
|
+ private void doTestImplicitClose(int lastStreamId) throws Exception {
|
||
|
|
+
|
||
|
|
+ long startFirst = System.nanoTime();
|
||
|
|
http2Connect();
|
||
|
|
+ long durationFirst = System.nanoTime() - startFirst;
|
||
|
|
|
||
|
|
sendPriority(3, 0, 16);
|
||
|
|
- sendPriority(5, 0, 16);
|
||
|
|
+ sendPriority(lastStreamId, 0, 16);
|
||
|
|
|
||
|
|
- sendSimpleGetRequest(5);
|
||
|
|
+ long startSecond = System.nanoTime();
|
||
|
|
+ sendSimpleGetRequest(lastStreamId);
|
||
|
|
readSimpleGetResponse();
|
||
|
|
- Assert.assertEquals(getSimpleResponseTrace(5), output.getTrace());
|
||
|
|
+ long durationSecond = System.nanoTime() - startSecond;
|
||
|
|
+
|
||
|
|
+ Assert.assertEquals(getSimpleResponseTrace(lastStreamId), output.getTrace());
|
||
|
|
output.clearTrace();
|
||
|
|
|
||
|
|
+ // Allow second request to take up to 5 times first request or up to 1 second - whichever is the larger - mainly
|
||
|
|
+ // to allow for CI systems under load that can exhibit significant timing variation.
|
||
|
|
+ Assert.assertTrue("First request took [" + durationFirst/1000000 + "ms], second request took [" +
|
||
|
|
+ durationSecond/1000000 + "ms]", durationSecond < 1000000000 || durationSecond < durationFirst * 3);
|
||
|
|
+
|
||
|
|
// Should trigger an error since stream 3 should have been implicitly
|
||
|
|
// closed.
|
||
|
|
sendSimpleGetRequest(3);
|
||
|
|
|
||
|
|
- handleGoAwayResponse(5);
|
||
|
|
+ handleGoAwayResponse(lastStreamId);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
|
||
|
|
index 5665df4..7b81937 100644
|
||
|
|
--- a/webapps/docs/changelog.xml
|
||
|
|
+++ b/webapps/docs/changelog.xml
|
||
|
|
@@ -1803,6 +1803,10 @@
|
||
|
|
HTTP 205 responses. Additional fix to r1795278. Based on a patch
|
||
|
|
provided by Alexandr Saperov. (violetagg)
|
||
|
|
</fix>
|
||
|
|
+ <fix>
|
||
|
|
+ <bug>64467</bug>: Improve performance of closing idle HTTP/2 streams.
|
||
|
|
+ (markt)
|
||
|
|
+ </fix>
|
||
|
|
<update>
|
||
|
|
<bug>61345</bug>: Add a server listener that can be used to do system
|
||
|
|
property replacement from the property source configured in the
|