Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Server fails receiving large data over http/2 #35180

Closed
querdenker2k opened this issue Aug 3, 2023 · 32 comments · Fixed by #35700
Closed

Server fails receiving large data over http/2 #35180

querdenker2k opened this issue Aug 3, 2023 · 32 comments · Fixed by #35700
Labels
area/vertx kind/bug Something isn't working
Milestone

Comments

@querdenker2k
Copy link

querdenker2k commented Aug 3, 2023

Describe the bug

While sending data to a Quarkus rest endpoint with 1000 bytes it's all fine regardless of http or http/2.
But sending for example 1MB it fails using http/2. Because http/2 is the standard for most clients thats a problem.

Expected behavior

Http/2 calls with ~1MB should not fail.

Actual behavior

Http/2 calls with huge data (e.g. 1MB fails) throws an exception java.io.EOFException: EOF reached while reading

java.io.IOException: Can't get stream 1: java.io.EOFException: EOF reached while reading

	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:857)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
	at io.quarkus.http2_reproducer.MyServiceTest.callWithProtocol(MyServiceTest.java:37)
	at io.quarkus.http2_reproducer.MyServiceTest.testHttp2Big(MyServiceTest.java:26)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
	at java.base/java.lang.reflect.Method.invoke(Method.java:578)
	at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:1015)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:829)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: java.io.IOException: Can't get stream 1: java.io.EOFException: EOF reached while reading
	at java.net.http/jdk.internal.net.http.Exchange.lambda$checkForUpgradeAsync$13(Exchange.java:567)
	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
	at java.net.http/jdk.internal.net.http.Exchange.lambda$checkForUpgradeAsync$14(Exchange.java:551)
	at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
	at java.net.http/jdk.internal.net.http.ResponseSubscribers.lambda$getBodyAsync$2(ResponseSubscribers.java:1155)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
	at java.net.http/jdk.internal.net.http.ResponseSubscribers$NullSubscriber.onComplete(ResponseSubscribers.java:694)
	at java.net.http/jdk.internal.net.http.common.HttpBodySubscriberWrapper.complete(HttpBodySubscriberWrapper.java:111)
	at java.net.http/jdk.internal.net.http.Http1Exchange$Http1ResponseBodySubscriber.complete(Http1Exchange.java:215)
	at java.net.http/jdk.internal.net.http.common.HttpBodySubscriberWrapper.onComplete(HttpBodySubscriberWrapper.java:172)
	at java.net.http/jdk.internal.net.http.ResponseContent$FixedLengthBodyParser.onSubscribe(ResponseContent.java:566)
	at java.net.http/jdk.internal.net.http.Http1Response$BodyReader.onSubscribe(Http1Response.java:665)
	at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.handlePendingDelegate(Http1AsyncReceiver.java:395)
	at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:214)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:205)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$TryEndDeferredCompleter.complete(SequentialScheduler.java:347)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:151)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.io.EOFException: EOF reached while reading
	at java.net.http/jdk.internal.net.http.Http2Connection$Http2TubeSubscriber.onComplete(Http2Connection.java:1448)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:648)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:853)
	at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:303)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:256)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:782)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:965)
	at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:253)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:1337)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:1282)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1282)

Aug. 03, 2023 2:44:44 PM io.quarkus.bootstrap.runner.Timing printStopTime
INFO: quarkus-http2-reproducer stopped in 0.030s
Disconnected from the target VM, address: '127.0.0.1:46823', transport: 'socket'

Process finished with exit code 255

How to Reproduce?

Clone and mvn clean package
https://github.com/querdenker2k/http2-reproducer

Output of uname -a or ver

Linux s2140414 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Output of java -version

java version "17.0.7" 2023-04-18 LTS Java(TM) SE Runtime Environment Oracle GraalVM 17.0.7+8.1 (build 17.0.7+8-LTS-jvmci-23.0-b12) Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 17.0.7+8.1 (build 17.0.7+8-LTS-jvmci-23.0-b12, mixed mode, sharing)

GraalVM version (if different from Java)

No response

Quarkus version or git rev

3.2.2.Final

Build tool (ie. output of mvnw --version or gradlew --version)

3.8.1

Additional information

No response

@querdenker2k querdenker2k added the kind/bug Something isn't working label Aug 3, 2023
@geoand
Copy link
Contributor

geoand commented Aug 3, 2023

Can you add the exception that is produced?

Furthermore, can you try with quarkus-resteasy-reactive-jackson instead of quarkus-resteasy-jackson ?

@geoand geoand added the triage/needs-feedback We are waiting for feedback. label Aug 3, 2023
@querdenker2k
Copy link
Author

Tested with the reactive version produces the same error.

@geoand
Copy link
Contributor

geoand commented Aug 3, 2023

Right, I just tried it myself as well. It it yet to be seen however if this is an HTTP Client issue, I'll have to try that tomorrow

@querdenker2k
Copy link
Author

I tried this as well with curl. You could use --http2 or --http1.1.
I don't want to teaser but with --http1.1 its working and with --http2 not. I can tomorrow post the command a sample request.

@querdenker2k
Copy link
Author

I updated the reproducer. There are now two examples for using curl.
Just start the application and run the examples.

@geoand
Copy link
Contributor

geoand commented Aug 4, 2023

@vietj @cescoffier there seems to be an issue with Vert.x here.
If I take the reproducer by @querdenker2k and apply the following patch:

From b585b8cac4f5d030f2f96021248cb6cd9eb66fd7 Mon Sep 17 00:00:00 2001
From: Georgios Andrianakis <geoand@gmail.com>
Date: Fri, 4 Aug 2023 08:26:37 +0300
Subject: [PATCH] Demonstrate the problem with Vert.x only

---
 pom.xml                                       |  4 ++--
 .../quarkus/http2_reproducer/MyService.java   | 12 -----------
 .../io/quarkus/http2_reproducer/Vertx.java    | 20 +++++++++++++++++++
 .../http2_reproducer/MyServiceTest.java       |  2 +-
 4 files changed, 23 insertions(+), 15 deletions(-)
 delete mode 100644 src/main/java/io/quarkus/http2_reproducer/MyService.java
 create mode 100644 src/main/java/io/quarkus/http2_reproducer/Vertx.java

diff --git a/pom.xml b/pom.xml
index 6311dfd..7562bcc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,7 +44,7 @@
     <dependencies>
         <dependency>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
+            <artifactId>quarkus-vertx-http</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
@@ -56,4 +56,4 @@
             <artifactId>httpclient5</artifactId>
         </dependency>
     </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/src/main/java/io/quarkus/http2_reproducer/MyService.java b/src/main/java/io/quarkus/http2_reproducer/MyService.java
deleted file mode 100644
index 9180c82..0000000
--- a/src/main/java/io/quarkus/http2_reproducer/MyService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.quarkus.http2_reproducer;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-
-@Path("/bigdata")
-public class MyService {
-    @POST
-    public String receiveBigData(byte[] data) {
-        return "received: " + data.length;
-    }
-}
diff --git a/src/main/java/io/quarkus/http2_reproducer/Vertx.java b/src/main/java/io/quarkus/http2_reproducer/Vertx.java
new file mode 100644
index 0000000..1af3365
--- /dev/null
+++ b/src/main/java/io/quarkus/http2_reproducer/Vertx.java
@@ -0,0 +1,20 @@
+package io.quarkus.http2_reproducer;
+
+import io.vertx.core.http.HttpMethod;
+import io.vertx.ext.web.Router;
+import io.vertx.ext.web.handler.BodyHandler;
+import jakarta.enterprise.event.Observes;
+import jakarta.inject.Singleton;
+
+@Singleton
+public class Vertx {
+
+    public void init(@Observes Router router) {
+        router.route().handler(BodyHandler.create());
+
+
+        router.route(HttpMethod.POST, "/bigdata").handler(rc -> {
+            rc.response().end("\"received: \" + data.length");
+        });
+    }
+}
diff --git a/src/test/java/io/quarkus/http2_reproducer/MyServiceTest.java b/src/test/java/io/quarkus/http2_reproducer/MyServiceTest.java
index 84df1c3..40cf12d 100644
--- a/src/test/java/io/quarkus/http2_reproducer/MyServiceTest.java
+++ b/src/test/java/io/quarkus/http2_reproducer/MyServiceTest.java
@@ -30,7 +30,7 @@ public class MyServiceTest {
         HttpClient client = HttpClient.newBuilder()
             .version(version)
             .build();
-        HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:8081/rs/bigdata"))
+        HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:8081/bigdata"))
             .POST(HttpRequest.BodyPublishers.ofByteArray(new byte[size]))
             .build();
         HttpResponse<String> response =
-- 
2.34.1

the problem still persists

@querdenker2k
Copy link
Author

querdenker2k commented Aug 4, 2023

By the way, i came from Quarkus 2.16.3 where this wasn't a problem. But maybe just because the client uses HTTP/1.1 per default.

@querdenker2k
Copy link
Author

yes, this is currently set in the reproducer

@vietj
Copy link

vietj commented Aug 4, 2023

it could also be a bug in resteasy reactive that happens with HTTP/2 protocol and not HTTP/1.1, I think the best to figure out would be to reproduce it with Vert.x HTTP/2 without Quarkus. Perhaps the test can be modified to add a reactive route in Quarkus and have it implemented with Vert.x doing the same operation than resteasy reactive do ?

@geoand
Copy link
Contributor

geoand commented Aug 4, 2023

@vietj my patch doesn't use RESTEasy Reactive at all.

It just uses Quarkus to start the application, the endpoint is pure Vert.x

@vietj
Copy link

vietj commented Aug 4, 2023 via email

@geoand
Copy link
Contributor

geoand commented Aug 4, 2023

I did not try (not enough time today), but I see no reason why it would behave differently.

@mschorsch
Copy link
Contributor

@querdenker2k What happens If you remove the dependency on org.apache.httpcomponents.client5:httpclient5? Does th error still persists?

@vietj
Copy link

vietj commented Aug 4, 2023

I did not try (not enough time today), but I see no reason why it would behave differently.

that would help isolate the error and try with different version of vertx to check if there is a regression from a previous version

@geoand
Copy link
Contributor

geoand commented Aug 7, 2023

@vietj here is the pure Vert.x reproducer

@vietj
Copy link

vietj commented Aug 7, 2023

thanks @geoand I'll have a look soon

@geoand
Copy link
Contributor

geoand commented Aug 7, 2023

Thanks!

@geoand geoand removed the triage/needs-feedback We are waiting for feedback. label Aug 7, 2023
@vietj
Copy link

vietj commented Aug 7, 2023

it seems a bug in HTTP/1.1 upgrade to HTTP/2 in Vert.x, with SSL and HTTP/2 it works fine

@gsmet
Copy link
Member

gsmet commented Aug 7, 2023

@vietj is it a regression? (to know if it's a red flag for 3.2). 2.13.x is using Vert.x 4.3.4.

@vietj
Copy link

vietj commented Aug 7, 2023

no @gsmet , this is a bug that has been discovered, it affects the Vert.x HTTP server for client that want to use HTTP/2 in plaintext with an HTTP/1.1 upgrade that do not use SSL with a request body greater than the initial window size of an HTTP/2 connection (the server window size). In such situation, the vertx server believes that the extra data below the window size is erroneous and reject it.

@vietj
Copy link

vietj commented Aug 7, 2023

My opinion is that this bug has been there fore a while and is somehow edgy.

@querdenker2k
Copy link
Author

It's not so edgy. I tried a large request with http2 (via curl) against my productive deployment and it failed. I think that currently all clients are using http1.1 and therefor the error doesn't occur.
With http2 and tls it's all fine.
But in safe production environment where http is used or kubernetes where the ingress terminates the tls this could be a problem.

@vietj
Copy link

vietj commented Aug 8, 2023

I agree, I might be wrong, my only assumption is that based on the fact I do not recommend to use H2C with upgrade in production because of potential bottleneck it introduces and the fact that it has not been reported in years of availability.

As said above if anyone would to use H2C in production then I would recommend to use direct H2C instead (without HTTP/1.1 upgrade) because the HTTP/1.1 to HTTP/2 upgrade can be a performance bottleneck, the first HTTP request performed by the client uses HTTP/1.1 to send the body and will be the only request allowed on the connection until the HTTP/1.1 request is fully sent. The Vert.x HTTP server does support this on the server and the client.

@vietj
Copy link

vietj commented Aug 8, 2023

The bug is fixed in this PR : eclipse-vertx/vert.x#4802

@geoand
Copy link
Contributor

geoand commented Aug 8, 2023

Thanks @vietj !

@querdenker2k
Copy link
Author

@vietj @geoand Can you say when this will be released and then included in a new Quarkus release?

@geoand
Copy link
Contributor

geoand commented Aug 14, 2023

Not yet, as Vert.x upgrades in Quarkus require some work

@vietj
Copy link

vietj commented Aug 14, 2023 via email

cescoffier added a commit to cescoffier/quarkus that referenced this issue Sep 4, 2023
Also bump Quarkus HTTP to 5.0.3.Final to handle a breaking change in the Vert.x API.

Fix quarkusio#35180
Fix quarkusio#34719
cescoffier added a commit to cescoffier/quarkus that referenced this issue Sep 4, 2023
Also bump Quarkus HTTP to 5.0.3.Final to handle a breaking change in the Vert.x API.

Fix quarkusio#35180
Fix quarkusio#34719
Fix quarkusio#35278
@quarkus-bot quarkus-bot bot added this to the 3.4 - main milestone Sep 5, 2023
aloubyansky pushed a commit to aloubyansky/quarkus that referenced this issue Nov 1, 2023
Also bump Quarkus HTTP to 5.0.3.Final to handle a breaking change in the Vert.x API.

Fix quarkusio#35180
Fix quarkusio#34719
Fix quarkusio#35278
holly-cummins pushed a commit to holly-cummins/quarkus that referenced this issue Feb 8, 2024
Also bump Quarkus HTTP to 5.0.3.Final to handle a breaking change in the Vert.x API.

Fix quarkusio#35180
Fix quarkusio#34719
Fix quarkusio#35278
@Shivanksinghal
Copy link

I am facing the same issue with quarkus 3.11.2

@geoand
Copy link
Contributor

geoand commented Jul 9, 2024

How about with 3.12.1?

@Shivanksinghal
Copy link

I am facing the same issue with quarkus 3.11.2

nvm it was the issue with the wiremock stub server

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/vertx kind/bug Something isn't working
Projects
None yet
7 participants