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]

Reply via email to