This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push:
new fd309997df Additional clean-up after HTTP/2 stream reset to aid GC
fd309997df is described below
commit fd309997dfd0d351b26959a8afd7bffec33dd0de
Author: Mark Thomas <[email protected]>
AuthorDate: Fri Aug 21 11:23:23 2026 +0100
Additional clean-up after HTTP/2 stream reset to aid GC
---
java/org/apache/coyote/http2/HpackDecoder.java | 17 ++++++++++++-----
java/org/apache/coyote/http2/Http2UpgradeHandler.java | 1 +
webapps/docs/changelog.xml | 3 +++
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/java/org/apache/coyote/http2/HpackDecoder.java
b/java/org/apache/coyote/http2/HpackDecoder.java
index ae14e63169..b914523293 100644
--- a/java/org/apache/coyote/http2/HpackDecoder.java
+++ b/java/org/apache/coyote/http2/HpackDecoder.java
@@ -17,6 +17,7 @@
package org.apache.coyote.http2;
import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
@@ -36,7 +37,7 @@ public class HpackDecoder {
/**
* The object that receives the headers that are emitted from this decoder
*/
- private HeaderEmitter headerEmitter;
+ private final AtomicReference<HeaderEmitter> headerEmitter = new
AtomicReference<>();
/**
* The header table
@@ -409,12 +410,12 @@ public class HpackDecoder {
HeaderEmitter getHeaderEmitter() {
- return headerEmitter;
+ return headerEmitter.get();
}
void setHeaderEmitter(HeaderEmitter headerEmitter) {
- this.headerEmitter = headerEmitter;
+ this.headerEmitter.set(headerEmitter);
// Reset limit tracking
headerCount = 0;
countedCookie = false;
@@ -422,8 +423,14 @@ public class HpackDecoder {
}
+ void compareAndSetHeaderEmitter(HeaderEmitter expectedValue, HeaderEmitter
newValue) {
+ // Only used in stream replacement so should not reset limits
+ this.headerEmitter.compareAndSet(expectedValue, newValue);
+ }
+
+
void clearHeaderEmitter() {
- headerEmitter = null;
+ headerEmitter.set(null);
}
@@ -458,7 +465,7 @@ public class HpackDecoder {
if (log.isTraceEnabled()) {
log.trace(sm.getString("hpackdecoder.emitHeader", name,
value));
}
- headerEmitter.emitHeader(name, value);
+ headerEmitter.get().emitHeader(name, value);
}
}
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index 87bc5718c1..162436565a 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -1984,6 +1984,7 @@ class Http2UpgradeHandler extends AbstractStream
implements InternalHttpUpgradeH
log.trace(sm.getString("upgradeHandler.replace.first",
getConnectionId(), original.getIdAsString()));
}
streams.put(original.getIdentifier(), replacement);
+ getHpackDecoder().compareAndSetHeaderEmitter((Stream) current,
HEADER_SINK);
int made;
original.windowAllocationLock.lock();
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index bdfef89e0d..2d19774bd2 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -265,6 +265,9 @@
Ensure per request HTTP/2 bad request marker is cleared when the
request
is recycled. (markt)
</fix>
+ <fix>
+ Additional clean-up after HTTP/2 stream reset to aid GC. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]