You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2020/09/25 13:34:32 UTC
[tomcat] 06/09: Reduce memory footprint of closed http/2 streams
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 30df6a08eb6ab45b409cc2fc4732d31bdcfbb521
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Sep 24 21:47:09 2020 +0100
Reduce memory footprint of closed http/2 streams
This refactoring replaces closed streams with a new RecycledStream
object and changes the mechanism used to look up known streams.
Pull up state
---
.../apache/coyote/http2/AbstractNonZeroStream.java | 21 ++++++++++++++++-----
java/org/apache/coyote/http2/RecycledStream.java | 16 +---------------
java/org/apache/coyote/http2/Stream.java | 16 +---------------
3 files changed, 18 insertions(+), 35 deletions(-)
diff --git a/java/org/apache/coyote/http2/AbstractNonZeroStream.java b/java/org/apache/coyote/http2/AbstractNonZeroStream.java
index 582ab1e..084de33 100644
--- a/java/org/apache/coyote/http2/AbstractNonZeroStream.java
+++ b/java/org/apache/coyote/http2/AbstractNonZeroStream.java
@@ -31,17 +31,22 @@ abstract class AbstractNonZeroStream extends AbstractStream {
private static final Log log = LogFactory.getLog(AbstractNonZeroStream.class);
private static final StringManager sm = StringManager.getManager(AbstractNonZeroStream.class);
+ protected final StreamStateMachine state;
+
private volatile int weight;
- AbstractNonZeroStream(Integer identifier) {
- this(identifier, Constants.DEFAULT_WEIGHT);
+ AbstractNonZeroStream(String connectionId, Integer identifier) {
+ super(identifier);
+ this.weight = Constants.DEFAULT_WEIGHT;
+ this.state = new StreamStateMachine(connectionId, getIdAsString());
}
- AbstractNonZeroStream(Integer identifier, int weight) {
+ AbstractNonZeroStream(Integer identifier, int weight, StreamStateMachine state) {
super(identifier);
this.weight = weight;
+ this.state = state;
}
@@ -97,7 +102,13 @@ abstract class AbstractNonZeroStream extends AbstractStream {
this.weight = weight;
}
- abstract boolean isClosedFinal();
- abstract void checkState(FrameType frameType) throws Http2Exception;
+ final boolean isClosedFinal() {
+ return state.isClosedFinal();
+ }
+
+
+ final void checkState(FrameType frameType) throws Http2Exception {
+ state.checkFrameType(frameType);
+ }
}
diff --git a/java/org/apache/coyote/http2/RecycledStream.java b/java/org/apache/coyote/http2/RecycledStream.java
index 1915dff..9d6177c 100644
--- a/java/org/apache/coyote/http2/RecycledStream.java
+++ b/java/org/apache/coyote/http2/RecycledStream.java
@@ -23,12 +23,10 @@ package org.apache.coyote.http2;
class RecycledStream extends AbstractNonZeroStream {
private final String connectionId;
- private final StreamStateMachine state;
RecycledStream(String connectionId, Integer identifier, int weight, StreamStateMachine state) {
- super(identifier, weight);
+ super(identifier, weight, state);
this.connectionId = connectionId;
- this.state = state;
}
@@ -38,18 +36,6 @@ class RecycledStream extends AbstractNonZeroStream {
}
- @Override
- boolean isClosedFinal() {
- return state.isClosedFinal();
- }
-
-
- @Override
- final void checkState(FrameType frameType) throws Http2Exception {
- state.checkFrameType(frameType);
- }
-
-
@SuppressWarnings("sync-override")
@Override
void incrementWindowSize(int increment) throws Http2Exception {
diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java
index 2c1b714..e8a27ea 100644
--- a/java/org/apache/coyote/http2/Stream.java
+++ b/java/org/apache/coyote/http2/Stream.java
@@ -69,7 +69,6 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter {
private volatile long contentLengthReceived = 0;
private final Http2UpgradeHandler handler;
- private final StreamStateMachine state;
private final WindowAllocationManager allocationManager = new WindowAllocationManager(this);
// State machine would be too much overhead
@@ -93,11 +92,10 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter {
Stream(Integer identifier, Http2UpgradeHandler handler, Request coyoteRequest) {
- super(identifier);
+ super(handler.getConnectionId(), identifier);
this.handler = handler;
handler.addChild(this);
setWindowSize(handler.getRemoteSettings().getInitialWindowSize());
- state = new StreamStateMachine(getConnectionId(), getIdAsString());
if (coyoteRequest == null) {
// HTTP/2 new request
this.coyoteRequest = new Request();
@@ -194,12 +192,6 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter {
@Override
- final void checkState(FrameType frameType) throws Http2Exception {
- state.checkFrameType(frameType);
- }
-
-
- @Override
final synchronized void incrementWindowSize(int windowSizeIncrement) throws Http2Exception {
// If this is zero then any thread that has been trying to write for
// this stream will be waiting. Notify that thread it can continue. Use
@@ -647,12 +639,6 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter {
}
- @Override
- final boolean isClosedFinal() {
- return state.isClosedFinal();
- }
-
-
final void closeIfIdle() {
state.closeIfIdle();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org