This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push: new 4fa399a Add debug for TestFlowControl as it appears to un unstable 4fa399a is described below commit 4fa399a17fc97daad1772d02ea938c29a799464d Author: Mark Thomas <ma...@apache.org> AuthorDate: Tue Mar 16 20:49:49 2021 +0000 Add debug for TestFlowControl as it appears to un unstable --- .../apache/coyote/http2/Http2UpgradeHandler.java | 9 +- .../apache/coyote/http2/LocalStrings.properties | 2 + java/org/apache/coyote/http2/Stream.java | 3 + test/org/apache/coyote/http2/TestFlowControl.java | 154 +++++++++++---------- 4 files changed, 93 insertions(+), 75 deletions(-) diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java index 9ce6b1d..a247795 100644 --- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java +++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java @@ -1469,7 +1469,14 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH AbstractNonZeroStream abstractNonZeroStream = getAbstractNonZeroStream(streamId, true); abstractNonZeroStream.checkState(FrameType.DATA); abstractNonZeroStream.receivedData(payloadSize); - return abstractNonZeroStream.getInputByteBuffer(); + ByteBuffer result = abstractNonZeroStream.getInputByteBuffer(); + + if (log.isDebugEnabled()) { + log.debug(sm.getString("upgradeHandler.startRequestBodyFrame.result", + getConnectionId(), abstractNonZeroStream.getIdAsString(), result)); + } + + return result; } diff --git a/java/org/apache/coyote/http2/LocalStrings.properties b/java/org/apache/coyote/http2/LocalStrings.properties index a8e0a85..7e7fe63 100644 --- a/java/org/apache/coyote/http2/LocalStrings.properties +++ b/java/org/apache/coyote/http2/LocalStrings.properties @@ -96,6 +96,7 @@ stream.inputBuffer.empty=The Stream input buffer is empty. Waiting for more data stream.inputBuffer.readTimeout=Timeout waiting to read data from client stream.inputBuffer.reset=Stream reset stream.inputBuffer.signal=Data added to inBuffer when read thread is waiting. Signalling that thread to continue +stream.inputBuffer.swallowUnread=Swallowing [{0}] bytes previous read into input stream buffer stream.notWritable=Connection [{0}], Stream [{1}], This stream is not writable stream.outputBuffer.flush.debug=Connection [{0}], Stream [{1}], flushing output with buffer at position [{2}], writeInProgress [{3}] and closed [{4}] stream.recycle=Connection [{0}], Stream [{1}] has been recycled @@ -138,6 +139,7 @@ upgradeHandler.reset.receive=Connection [{0}], Stream [{1}], Reset received due upgradeHandler.rst.debug=Connection [{0}], Stream [{1}], Error [{2}], Message [{3}], RST (closing stream) upgradeHandler.sendPrefaceFail=Connection [{0}], Failed to send preface to client upgradeHandler.socketCloseFailed=Error closing socket +upgradeHandler.startRequestBodyFrame.result=Connection [{0}], Stream [{1}] startRequestBodyFrame returned [{2}] upgradeHandler.stream.closed=Stream [{0}] has been closed for some time upgradeHandler.stream.even=A new remote stream ID of [{0}] was requested but all remote streams must use odd identifiers upgradeHandler.stream.notWritable=Connection [{0}], Stream [{1}], This stream is not writable diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java index 9fb2055..1cb6f97 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -1194,6 +1194,9 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { synchronized (inputBuffer) { closed = true; int unreadByteCount = inBuffer.position(); + if (log.isDebugEnabled()) { + log.debug(sm.getString("stream.inputBuffer.swallowUnread", Integer.valueOf(unreadByteCount))); + } if (unreadByteCount > 0) { inBuffer.position(0); inBuffer.limit(inBuffer.limit() - unreadByteCount); diff --git a/test/org/apache/coyote/http2/TestFlowControl.java b/test/org/apache/coyote/http2/TestFlowControl.java index 950a790..4d08781 100644 --- a/test/org/apache/coyote/http2/TestFlowControl.java +++ b/test/org/apache/coyote/http2/TestFlowControl.java @@ -18,6 +18,8 @@ package org.apache.coyote.http2; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.logging.Level; +import java.util.logging.LogManager; import org.junit.Assert; import org.junit.Test; @@ -32,90 +34,95 @@ public class TestFlowControl extends Http2TestBase { @Test public void testNotFound() throws Exception { - http2Connect(); + LogManager.getLogManager().getLogger("org.apache.coyote.http2").setLevel(Level.ALL); + try { + http2Connect(); - // Connection and per-stream flow control default to 64k-1 bytes + // Connection and per-stream flow control default to 64k-1 bytes - // Set up a POST request to a non-existent end-point - // Generate headers - byte[] headersFrameHeader = new byte[9]; - ByteBuffer headersPayload = ByteBuffer.allocate(128); + // Set up a POST request to a non-existent end-point + // Generate headers + byte[] headersFrameHeader = new byte[9]; + ByteBuffer headersPayload = ByteBuffer.allocate(128); - MimeHeaders headers = new MimeHeaders(); - headers.addValue(":method").setString("POST"); - headers.addValue(":scheme").setString("http"); - headers.addValue(":path").setString("/path-does-not-exist"); - headers.addValue(":authority").setString("localhost:" + getPort()); - headers.addValue("content-length").setLong(65536); - hpackEncoder.encode(headers, headersPayload); + MimeHeaders headers = new MimeHeaders(); + headers.addValue(":method").setString("POST"); + headers.addValue(":scheme").setString("http"); + headers.addValue(":path").setString("/path-does-not-exist"); + headers.addValue(":authority").setString("localhost:" + getPort()); + headers.addValue("content-length").setLong(65536); + hpackEncoder.encode(headers, headersPayload); - headersPayload.flip(); + headersPayload.flip(); - ByteUtil.setThreeBytes(headersFrameHeader, 0, headersPayload.limit()); - headersFrameHeader[3] = FrameType.HEADERS.getIdByte(); - // Flags. end of headers (0x04) - headersFrameHeader[4] = 0x04; - // Stream id - ByteUtil.set31Bits(headersFrameHeader, 5, 3); + ByteUtil.setThreeBytes(headersFrameHeader, 0, headersPayload.limit()); + headersFrameHeader[3] = FrameType.HEADERS.getIdByte(); + // Flags. end of headers (0x04) + headersFrameHeader[4] = 0x04; + // Stream id + ByteUtil.set31Bits(headersFrameHeader, 5, 3); - writeFrame(headersFrameHeader, headersPayload); + writeFrame(headersFrameHeader, headersPayload); - // Generate body - // Max data payload is 16k - byte[] dataFrameHeader = new byte[9]; - ByteBuffer dataPayload = ByteBuffer.allocate(16 * 1024); + // Generate body + // Max data payload is 16k + byte[] dataFrameHeader = new byte[9]; + ByteBuffer dataPayload = ByteBuffer.allocate(16 * 1024); - while (dataPayload.hasRemaining()) { - dataPayload.put((byte) 'x'); - } - dataPayload.flip(); - - // Size - ByteUtil.setThreeBytes(dataFrameHeader, 0, dataPayload.limit()); - ByteUtil.set31Bits(dataFrameHeader, 5, 3); - - // Read the 404 error page - // headers - parser.readFrame(true); - // body - parser.readFrame(true); - // reset (because the request body was not fully read) - parser.readFrame(true); - - // Validate response - // Response size varies as error page is generated and includes version - // number - String trace = output.getTrace(); - int start = trace.indexOf("[content-length]-[") + 18; - int end = trace.indexOf("]", start); - String contentLength = trace.substring(start, end); - - Assert.assertEquals( - "3-HeadersStart\n" + - "3-Header-[:status]-[404]\n" + - "3-Header-[content-type]-[text/html;charset=utf-8]\n" + - "3-Header-[content-language]-[en]\n" + - "3-Header-[content-length]-[" + contentLength + "]\n" + - "3-Header-[date]-[Wed, 11 Nov 2015 19:18:42 GMT]\n" + - "3-HeadersEnd\n" + - "3-Body-" + contentLength + "\n" + - "3-EndOfStream\n" + - "3-RST-[8]\n", output.getTrace()); - output.clearTrace(); - - // Write 3*16k=48k of request body - int count = 0; - while (count < 3) { + while (dataPayload.hasRemaining()) { + dataPayload.put((byte) 'x'); + } + dataPayload.flip(); + + // Size + ByteUtil.setThreeBytes(dataFrameHeader, 0, dataPayload.limit()); + ByteUtil.set31Bits(dataFrameHeader, 5, 3); + + // Read the 404 error page + // headers + parser.readFrame(true); + // body + parser.readFrame(true); + // reset (because the request body was not fully read) + parser.readFrame(true); + + // Validate response + // Response size varies as error page is generated and includes version + // number + String trace = output.getTrace(); + int start = trace.indexOf("[content-length]-[") + 18; + int end = trace.indexOf("]", start); + String contentLength = trace.substring(start, end); + + Assert.assertEquals( + "3-HeadersStart\n" + + "3-Header-[:status]-[404]\n" + + "3-Header-[content-type]-[text/html;charset=utf-8]\n" + + "3-Header-[content-language]-[en]\n" + + "3-Header-[content-length]-[" + contentLength + "]\n" + + "3-Header-[date]-[Wed, 11 Nov 2015 19:18:42 GMT]\n" + + "3-HeadersEnd\n" + + "3-Body-" + contentLength + "\n" + + "3-EndOfStream\n" + + "3-RST-[8]\n", output.getTrace()); + output.clearTrace(); + + // Write 3*16k=48k of request body + int count = 0; + while (count < 3) { + writeFrame(dataFrameHeader, dataPayload); + waitForWindowSize(0); + dataPayload.position(0); + count++; + } + + // EOS + dataFrameHeader[4] = 0x01; writeFrame(dataFrameHeader, dataPayload); waitForWindowSize(0); - dataPayload.position(0); - count++; + } finally { + LogManager.getLogManager().getLogger("org.apache.coyote.http2").setLevel(Level.INFO); } - - // EOS - dataFrameHeader[4] = 0x01; - writeFrame(dataFrameHeader, dataPayload); - waitForWindowSize(0); } @@ -131,7 +138,6 @@ public class TestFlowControl extends Http2TestBase { parser.readFrame(true); trace = output.getTrace(); output.clearTrace(); - System.out.println(trace); found = trace.startsWith(prefix); } while (!found); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org