Selaa lähdekoodia

Use static trailers if possible (#1151)

Motivation:

Happy path RPCs end with the 'ok' status code. If the user doesn't
specify any trailers then the trailers are static and we can save an
allocation.

Modifications:

- If we're sending the '.ok' status and the user provides no trailers,
  use statically allocated trailers.
- Update allocation counts.

Result:

We save an allocation on the happy path.
George Barnett 4 vuotta sitten
vanhempi
commit
7a75c81f9a
2 muutettua tiedostoa jossa 17 lisäystä ja 6 poistoa
  1. 6 6
      .travis.yml
  2. 11 0
      Sources/GRPC/HTTP2ToRawGRPCStateMachine.swift

+ 6 - 6
.travis.yml

@@ -37,17 +37,17 @@ jobs:
       script: ./.travis-script.sh -t -a # tests with tsan, run allocation tests
       env:
         - SWIFT_VERSION=5.3.3
-        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests=113000
-        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request=68000
-        - MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request=64000
+        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests=112000
+        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request=67000
+        - MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request=63000
     - <<: *tests
       name: "Unit Tests: Ubuntu 18.04 (Swift 5.2)"
       script: ./.travis-script.sh -a # run allocation tests
       env:
         - SWIFT_VERSION=5.2.5
-        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests=113000
-        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request=68000
-        - MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request=64000
+        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests=112000
+        - MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request=67000
+        - MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request=63000
     - <<: *tests
       name: "Unit Tests: Xcode 12.2"
       os: osx

+ 11 - 0
Sources/GRPC/HTTP2ToRawGRPCStateMachine.swift

@@ -1201,6 +1201,13 @@ extension HTTP2ToRawGRPCStateMachine {
     userProvidedHeaders: HPACKHeaders,
     normalizeUserProvidedHeaders: Bool
   ) -> HPACKHeaders {
+    // Most RPCs should end with status code 'ok' (hopefully!), and if the user didn't provide any
+    // additional trailers, then we can use a pre-canned set of headers to avoid an extra
+    // allocation.
+    if status == .ok, userProvidedHeaders.isEmpty {
+      return Self.gRPCStatusOkTrailers
+    }
+
     // 2 because 'grpc-status' is required, we may also send back 'grpc-message'.
     let capacity = 2 + userProvidedHeaders.count
 
@@ -1220,6 +1227,10 @@ extension HTTP2ToRawGRPCStateMachine {
 
     return trailers
   }
+
+  private static let gRPCStatusOkTrailers: HPACKHeaders = [
+    GRPCHeaderName.statusCode: String(describing: GRPCStatus.Code.ok.rawValue),
+  ]
 }
 
 private extension HPACKHeaders {