You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2023/11/01 07:57:30 UTC

(servicecomb-java-chassis) branch master updated: [#3727]Fix metrics not correct when timeout/connection timeout (#4005)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 58bef312b [#3727]Fix metrics not correct when timeout/connection timeout (#4005)
58bef312b is described below

commit 58bef312b02e24e52eb1aa63ba3b01d70ea50142
Author: liubao68 <bi...@qq.com>
AuthorDate: Wed Nov 1 15:57:25 2023 +0800

    [#3727]Fix metrics not correct when timeout/connection timeout (#4005)
---
 .../rest/client/RestClientCodecFilter.java         |  8 ++++---
 .../transport/rest/client/RestClientSender.java    | 28 ++++++++++++----------
 2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
index 9f3c89152..e77f58e99 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.transport.rest.client;
 
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
 
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.core.CoreConst;
@@ -77,8 +78,11 @@ public class RestClientCodecFilter implements ConsumerFilter {
   public CompletableFuture<Response> onFilter(Invocation invocation, FilterNode nextNode) {
     invocation.getInvocationStageTrace().startGetConnection();
     startClientFiltersRequest(invocation);
+    CompletionStage<HttpClientRequest> createRequest =
+        transportContextFactory.createHttpClientRequest(invocation).toCompletionStage()
+            .whenComplete((c, e) -> invocation.getInvocationStageTrace().finishGetConnection());
     return CompletableFuture.completedFuture(null)
-        .thenCompose(v -> transportContextFactory.createHttpClientRequest(invocation).toCompletionStage())
+        .thenCompose(v -> createRequest)
         .thenAccept(httpClientRequest -> prepareTransportContext(invocation, httpClientRequest))
         .thenAccept(v -> invocation.onStartSendRequest())
         .thenAccept(v -> encoder.encode(invocation))
@@ -92,8 +96,6 @@ public class RestClientCodecFilter implements ConsumerFilter {
   }
 
   protected void prepareTransportContext(Invocation invocation, HttpClientRequest httpClientRequest) {
-    invocation.getInvocationStageTrace().finishGetConnection();
-
     copyExtraHttpHeaders(invocation, httpClientRequest);
 
     RestClientTransportContext transportContext = transportContextFactory.create(invocation, httpClientRequest);
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
index 5d3e879bc..30ab71f7d 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
@@ -22,8 +22,6 @@ import static org.apache.servicecomb.transport.rest.client.RestClientEncoder.gen
 import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
 
-import jakarta.servlet.http.Part;
-
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.common.http.HttpStatus;
@@ -41,6 +39,7 @@ import io.vertx.core.MultiMap;
 import io.vertx.core.buffer.Buffer;
 import io.vertx.core.http.HttpClientRequest;
 import io.vertx.core.http.HttpClientResponse;
+import jakarta.servlet.http.Part;
 
 public class RestClientSender {
   private static final Logger LOGGER = LoggerFactory.getLogger(RestClientSender.class);
@@ -75,9 +74,11 @@ public class RestClientSender {
 
   protected void runInVertxContext() {
     sendInVertxContext()
-        .exceptionally(throwable -> {
-          future.completeExceptionally(throwable);
-          return null;
+        .whenComplete((v, e) -> {
+          if (e != null) {
+            future.completeExceptionally(e);
+          }
+          writeFinished();
         });
   }
 
@@ -87,11 +88,12 @@ public class RestClientSender {
     Multimap<String, Part> uploads = requestParameters.getUploads();
     if (uploads == null) {
       if (requestParameters.getBodyBuffer() != null) {
-        httpClientRequest.end(requestParameters.getBodyBuffer());
+        return CompletableFuture.completedFuture(null).thenCompose(
+            v -> httpClientRequest.end(requestParameters.getBodyBuffer()).toCompletionStage());
       } else {
-        httpClientRequest.end();
+        return CompletableFuture.completedFuture(null).thenCompose(
+            v -> httpClientRequest.end().toCompletionStage());
       }
-      return CompletableFuture.completedFuture(null);
     }
 
     if (requestParameters.getBodyBuffer() != null) {
@@ -100,6 +102,10 @@ public class RestClientSender {
     return sendFiles();
   }
 
+  private void writeFinished() {
+    invocation.getInvocationStageTrace().finishWriteToBuffer(System.nanoTime());
+  }
+
   protected CompletableFuture<Void> sendFiles() {
     CompletableFuture<Void> sendFileFuture = CompletableFuture.completedFuture(null);
 
@@ -111,8 +117,7 @@ public class RestClientSender {
       sendFileFuture = sendFileFuture.thenCompose(v -> sendFile(entry.getValue(), name, boundary));
     }
 
-    return sendFileFuture
-        .thenAccept(v -> httpClientRequest.end(genBoundaryEndBuffer(boundary)));
+    return sendFileFuture.thenCompose(v -> httpClientRequest.end(genBoundaryEndBuffer(boundary)).toCompletionStage());
   }
 
   private CompletableFuture<Void> sendFile(Part part, String name, String boundary) {
@@ -167,8 +172,7 @@ public class RestClientSender {
 
   protected void processMetrics() {
     InvocationStageTrace stageTrace = invocation.getInvocationStageTrace();
-    stageTrace.finishWriteToBuffer(System.nanoTime());
-    // even failed and did not received response, still set time for it
+    // even failed and did not receive response, still set time for it
     // that will help to know the real timeout time
     stageTrace.finishReceiveResponse();
     stageTrace.startClientFiltersResponse();