Răsfoiți Sursa

Merge pull request #1 from grpc/master

update
jeffreyqw 6 ani în urmă
părinte
comite
ab62f1fec0
100 a modificat fișierele cu 2559 adăugiri și 2225 ștergeri
  1. 1 1
      .github/ISSUE_TEMPLATE/bug_report.md
  2. 1 1
      .github/ISSUE_TEMPLATE/cleanup_request.md
  3. 1 1
      .github/ISSUE_TEMPLATE/feature_request.md
  4. 1 1
      .github/pull_request_template.md
  5. 59 0
      .github/stale.yml
  6. 3 0
      .gitmodules
  7. 31 1
      BUILD
  8. 8 0
      BUILD.gn
  9. 81 24
      CMakeLists.txt
  10. 97 24
      Makefile
  11. 1 10
      bazel/grpc_build_system.bzl
  12. 10 11
      bazel/grpc_deps.bzl
  13. 0 9
      bazel/grpc_python_deps.bzl
  14. 0 26
      bazel/python_rules.bzl
  15. 15 0
      build.yaml
  16. 17 12
      config.m4
  17. 20 12
      config.w32
  18. 0 3
      examples/python/auth/BUILD.bazel
  19. 0 3
      examples/python/cancellation/BUILD.bazel
  20. 0 3
      examples/python/compression/BUILD.bazel
  21. 0 3
      examples/python/debug/BUILD.bazel
  22. 0 1
      examples/python/errors/BUILD.bazel
  23. 0 3
      examples/python/multiprocessing/BUILD
  24. 0 1
      examples/python/wait_for_ready/BUILD.bazel
  25. 48 36
      gRPC-Core.podspec
  26. 32 24
      grpc.gemspec
  27. 63 24
      grpc.gyp
  28. 1 1
      include/grpcpp/impl/codegen/async_generic_service.h
  29. 3 3
      include/grpcpp/impl/codegen/async_stream_impl.h
  30. 4 4
      include/grpcpp/impl/codegen/async_unary_call_impl.h
  31. 18 17
      include/grpcpp/impl/codegen/call_op_set.h
  32. 2 2
      include/grpcpp/impl/codegen/callback_common.h
  33. 4 4
      include/grpcpp/impl/codegen/channel_interface.h
  34. 22 22
      include/grpcpp/impl/codegen/client_callback_impl.h
  35. 2 2
      include/grpcpp/impl/codegen/interceptor_common.h
  36. 4 4
      include/grpcpp/impl/codegen/method_handler_impl.h
  37. 2 2
      include/grpcpp/impl/codegen/rpc_service_method.h
  38. 13 12
      include/grpcpp/impl/codegen/server_callback_impl.h
  39. 1 1
      include/grpcpp/impl/codegen/server_interface.h
  40. 1 1
      include/grpcpp/impl/codegen/time.h
  41. 2 2
      include/grpcpp/impl/server_builder_plugin.h
  42. 2 2
      include/grpcpp/security/credentials_impl.h
  43. 4 4
      include/grpcpp/server_impl.h
  44. 1 1
      include/grpcpp/support/channel_arguments_impl.h
  45. 32 24
      package.xml
  46. 45 40
      src/compiler/cpp_generator.cc
  47. 41 59
      src/compiler/csharp_generator.cc
  48. 1 1
      src/compiler/csharp_generator.h
  49. 1 6
      src/compiler/csharp_plugin.cc
  50. 78 0
      src/core/ext/filters/client_channel/backend_metric.cc
  51. 36 0
      src/core/ext/filters/client_channel/backend_metric.h
  52. 99 11
      src/core/ext/filters/client_channel/client_channel.cc
  53. 26 0
      src/core/ext/filters/client_channel/lb_policy.h
  54. 1 1
      src/core/ext/transport/chttp2/server/chttp2_server.cc
  55. 24 25
      src/core/ext/transport/chttp2/transport/hpack_parser.cc
  56. 1 1
      src/core/ext/transport/chttp2/transport/hpack_parser.h
  57. 18 3
      src/core/ext/transport/chttp2/transport/hpack_table.cc
  58. 12 3
      src/core/ext/transport/chttp2/transport/hpack_table.h
  59. 9 4
      src/core/ext/transport/chttp2/transport/parsing.cc
  60. 29 8
      src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
  61. 79 4
      src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h
  62. 37 30
      src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
  63. 60 21
      src/core/ext/upb-generated/envoy/api/v2/cds.upb.h
  64. 34 0
      src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c
  65. 69 0
      src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h
  66. 18 14
      src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
  67. 65 22
      src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h
  68. 32 0
      src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c
  69. 98 0
      src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h
  70. 8 7
      src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
  71. 18 14
      src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h
  72. 35 0
      src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c
  73. 80 0
      src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h
  74. 9 3
      src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
  75. 69 0
      src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h
  76. 58 0
      src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
  77. 144 0
      src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h
  78. 9 2
      src/core/lib/gprpp/map.h
  79. 4 1
      src/core/lib/iomgr/tcp_posix.cc
  80. 5 1
      src/core/lib/slice/slice_intern.cc
  81. 367 362
      src/core/lib/transport/static_metadata.cc
  82. 90 86
      src/core/lib/transport/static_metadata.h
  83. 8 1
      src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc
  84. 0 63
      src/csharp/Grpc.Core.Api/LiteClientBase.cs
  85. 3 7
      src/csharp/Grpc.Core.Tests/TimeoutsTest.cs
  86. 1 3
      src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
  87. 0 759
      src/csharp/Grpc.Examples/MathWithProtocOptions.cs
  88. 0 208
      src/csharp/Grpc.Examples/MathWithProtocOptionsGrpc.cs
  89. 0 65
      src/csharp/Grpc.Examples/math_with_protoc_options.proto
  90. 1 2
      src/csharp/Grpc.IntegrationTesting/InteropClient.cs
  91. 113 24
      src/csharp/Grpc.IntegrationTesting/Messages.cs
  92. 1 1
      src/csharp/Grpc.Microbenchmarks/PingBenchmark.cs
  93. 1 1
      src/csharp/Grpc.Microbenchmarks/UnaryCallOverheadBenchmark.cs
  94. 0 11
      src/csharp/Grpc.Tools/build/_grpc/Grpc.CSharp.xml
  95. 0 3
      src/csharp/Grpc.Tools/build/_grpc/_Grpc.Tools.targets
  96. 1 1
      src/csharp/experimental/build_native_ext_for_ios.sh
  97. 0 2
      src/csharp/generate_proto_csharp.sh
  98. 1 1
      src/proto/grpc/channelz/channelz.proto
  99. 7 0
      src/proto/grpc/lb/v2/BUILD
  100. 6 2
      src/proto/grpc/lb/v2/eds_for_test.proto

+ 1 - 1
.github/ISSUE_TEMPLATE/bug_report.md

@@ -2,7 +2,7 @@
 name: Report a bug
 name: Report a bug
 about: Create a report to help us improve
 about: Create a report to help us improve
 labels: kind/bug, priority/P2
 labels: kind/bug, priority/P2
-assignees: mhaidrygoog
+assignees: nanahpang
 
 
 ---
 ---
 
 

+ 1 - 1
.github/ISSUE_TEMPLATE/cleanup_request.md

@@ -2,7 +2,7 @@
 name: Request a cleanup
 name: Request a cleanup
 about: Suggest a cleanup in our repository
 about: Suggest a cleanup in our repository
 labels: kind/internal cleanup
 labels: kind/internal cleanup
-assignees: mhaidrygoog
+assignees: nanahpang
 
 
 ---
 ---
 
 

+ 1 - 1
.github/ISSUE_TEMPLATE/feature_request.md

@@ -2,7 +2,7 @@
 name: Request a feature
 name: Request a feature
 about: Suggest an idea for this project
 about: Suggest an idea for this project
 labels: kind/enhancement
 labels: kind/enhancement
-assignees: mhaidrygoog
+assignees: nanahpang
 
 
 ---
 ---
 
 

+ 1 - 1
.github/pull_request_template.md

@@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be
 
 
 -->
 -->
 
 
-@mhaidrygoog
+@nanahpang

+ 59 - 0
.github/stale.yml

@@ -0,0 +1,59 @@
+# Configuration for probot-stale - https://github.com/probot/stale
+
+# Number of days of inactivity before an Issue or Pull Request becomes stale
+daysUntilStale: 180
+
+# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
+# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
+daysUntilClose: 1
+
+# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
+onlyLabels: []
+
+# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
+exemptLabels:
+  - "disposition/never stale"
+
+# Set to true to ignore issues in a project (defaults to false)
+exemptProjects: false
+
+# Set to true to ignore issues in a milestone (defaults to false)
+exemptMilestones: false
+
+# Set to true to ignore issues with an assignee (defaults to false)
+exemptAssignees: false
+
+# Label to use when marking as stale
+staleLabel: "disposition/stale"
+
+# Comment to post when marking as stale. Set to `false` to disable
+markComment: >
+  This issue/PR has been automatically marked as stale because it has not had any update (including
+  commits, comments, labels, milestones, etc) for 180 days. It will be closed automatically if no
+  further update occurs in 1 day. Thank you for your contributions!
+
+# Comment to post when removing the stale label.
+# unmarkComment: >
+#   Your comment here.
+
+# Comment to post when closing a stale Issue or Pull Request.
+# closeComment: >
+#   Your comment here.
+
+# Limit the number of actions per hour, from 1-30. Default is 30
+limitPerRun: 30
+
+# Limit to only `issues` or `pulls`
+# only: issues
+
+# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
+# pulls:
+#   daysUntilStale: 30
+#   markComment: >
+#     This pull request has been automatically marked as stale because it has not had
+#     recent activity. It will be closed if no further activity occurs. Thank you
+#     for your contributions.
+
+# issues:
+#   exemptLabels:
+#     - confirmed

+ 3 - 0
.gitmodules

@@ -54,3 +54,6 @@
 [submodule "third_party/upb"]
 [submodule "third_party/upb"]
 	path = third_party/upb
 	path = third_party/upb
 	url = https://github.com/protocolbuffers/upb.git
 	url = https://github.com/protocolbuffers/upb.git
+[submodule "third_party/udpa"]
+	path = third_party/udpa
+	url = https://github.com/cncf/udpa.git

+ 31 - 1
BUILD

@@ -65,7 +65,7 @@ config_setting(
 
 
 config_setting(
 config_setting(
     name = "python3",
     name = "python3",
-    flag_values = {"@bazel_tools//tools/python:python_version": "PY3"},
+    values = {"python_path": "python3"},
 )
 )
 
 
 config_setting(
 config_setting(
@@ -1009,6 +1009,7 @@ grpc_cc_library(
     name = "grpc_client_channel",
     name = "grpc_client_channel",
     srcs = [
     srcs = [
         "src/core/ext/filters/client_channel/backup_poller.cc",
         "src/core/ext/filters/client_channel/backup_poller.cc",
+        "src/core/ext/filters/client_channel/backend_metric.cc",
         "src/core/ext/filters/client_channel/channel_connectivity.cc",
         "src/core/ext/filters/client_channel/channel_connectivity.cc",
         "src/core/ext/filters/client_channel/client_channel.cc",
         "src/core/ext/filters/client_channel/client_channel.cc",
         "src/core/ext/filters/client_channel/client_channel_channelz.cc",
         "src/core/ext/filters/client_channel/client_channel_channelz.cc",
@@ -1037,6 +1038,7 @@ grpc_cc_library(
     ],
     ],
     hdrs = [
     hdrs = [
         "src/core/ext/filters/client_channel/backup_poller.h",
         "src/core/ext/filters/client_channel/backup_poller.h",
+        "src/core/ext/filters/client_channel/backend_metric.h",
         "src/core/ext/filters/client_channel/client_channel.h",
         "src/core/ext/filters/client_channel/client_channel.h",
         "src/core/ext/filters/client_channel/client_channel_channelz.h",
         "src/core/ext/filters/client_channel/client_channel_channelz.h",
         "src/core/ext/filters/client_channel/client_channel_factory.h",
         "src/core/ext/filters/client_channel/client_channel_factory.h",
@@ -1066,6 +1068,7 @@ grpc_cc_library(
     ],
     ],
     language = "c++",
     language = "c++",
     deps = [
     deps = [
+        "envoy_orca_upb",
         "gpr_base",
         "gpr_base",
         "grpc_base",
         "grpc_base",
         "grpc_client_authority_filter",
         "grpc_client_authority_filter",
@@ -2278,6 +2281,7 @@ grpc_cc_library(
         "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c",
+        "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/eds.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/eds.upb.c",
@@ -2290,6 +2294,7 @@ grpc_cc_library(
         "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h",
+        "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/eds.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/eds.upb.h",
@@ -2318,6 +2323,7 @@ grpc_cc_library(
         "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c",
+        "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c",
     ],
     ],
     hdrs = [
     hdrs = [
@@ -2326,6 +2332,7 @@ grpc_cc_library(
         "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h",
+        "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h",
     ],
     ],
     external_deps = [
     external_deps = [
@@ -2378,6 +2385,29 @@ grpc_cc_library(
     ],
     ],
 )
 )
 
 
+# Once upb code-gen issue is resolved, replace envoy_orca_upb with this.
+# grpc_upb_proto_library(
+#     name = "envoy_orca_upb",
+#     deps = ["@envoy_api//udpa/data/orca/v1:orca_load_report"]
+# )
+
+grpc_cc_library(
+    name = "envoy_orca_upb",
+    srcs = [
+        "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c",
+    ],
+    hdrs = [
+        "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h",
+    ],
+    external_deps = [
+        "upb_lib",
+    ],
+    language = "c++",
+    deps = [
+        ":proto_gen_validate_upb",
+    ],
+)
+
 # Once upb code-gen issue is resolved, replace grpc_health_upb with this.
 # Once upb code-gen issue is resolved, replace grpc_health_upb with this.
 # grpc_upb_proto_library(
 # grpc_upb_proto_library(
 #     name = "grpc_health_upb",
 #     name = "grpc_health_upb",

+ 8 - 0
BUILD.gn

@@ -208,6 +208,8 @@ config("grpc_config") {
         "include/grpc/status.h",
         "include/grpc/status.h",
         "include/grpc/support/workaround_list.h",
         "include/grpc/support/workaround_list.h",
         "src/core/ext/filters/census/grpc_context.cc",
         "src/core/ext/filters/census/grpc_context.cc",
+        "src/core/ext/filters/client_channel/backend_metric.cc",
+        "src/core/ext/filters/client_channel/backend_metric.h",
         "src/core/ext/filters/client_channel/backup_poller.cc",
         "src/core/ext/filters/client_channel/backup_poller.cc",
         "src/core/ext/filters/client_channel/backup_poller.h",
         "src/core/ext/filters/client_channel/backup_poller.h",
         "src/core/ext/filters/client_channel/channel_connectivity.cc",
         "src/core/ext/filters/client_channel/channel_connectivity.cc",
@@ -388,6 +390,8 @@ config("grpc_config") {
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h",
+        "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c",
+        "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c",
@@ -400,6 +404,8 @@ config("grpc_config") {
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h",
+        "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c",
+        "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c",
         "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c",
@@ -450,6 +456,8 @@ config("grpc_config") {
         "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h",
         "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h",
         "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c",
         "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c",
         "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h",
         "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h",
+        "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c",
+        "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h",
         "src/core/ext/upb-generated/validate/validate.upb.c",
         "src/core/ext/upb-generated/validate/validate.upb.c",
         "src/core/ext/upb-generated/validate/validate.upb.h",
         "src/core/ext/upb-generated/validate/validate.upb.h",
         "src/core/lib/avl/avl.cc",
         "src/core/lib/avl/avl.cc",

+ 81 - 24
CMakeLists.txt

@@ -1266,6 +1266,7 @@ add_library(grpc
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
   src/core/ext/transport/chttp2/client/authority.cc
   src/core/ext/transport/chttp2/client/authority.cc
   src/core/ext/transport/chttp2/client/chttp2_connector.cc
   src/core/ext/transport/chttp2/client/chttp2_connector.cc
+  src/core/ext/filters/client_channel/backend_metric.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/client_channel.cc
   src/core/ext/filters/client_channel/client_channel.cc
@@ -1294,6 +1295,19 @@ add_library(grpc
   src/core/ext/filters/client_channel/subchannel_pool_interface.cc
   src/core/ext/filters/client_channel/subchannel_pool_interface.cc
   src/core/ext/filters/deadline/deadline_filter.cc
   src/core/ext/filters/deadline/deadline_filter.cc
   src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c
   src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c
+  src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  src/core/ext/upb-generated/gogoproto/gogo.upb.c
+  src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upb-generated/google/api/annotations.upb.c
+  src/core/ext/upb-generated/google/api/http.upb.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/tsi/fake_transport_security.cc
   src/core/tsi/fake_transport_security.cc
   src/core/tsi/local_transport_security.cc
   src/core/tsi/local_transport_security.cc
   src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc
   src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc
@@ -1313,16 +1327,6 @@ add_library(grpc
   src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
   src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c
   src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c
-  src/core/ext/upb-generated/google/api/annotations.upb.c
-  src/core/ext/upb-generated/google/api/http.upb.c
-  src/core/ext/upb-generated/google/protobuf/any.upb.c
-  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
-  src/core/ext/upb-generated/google/protobuf/duration.upb.c
-  src/core/ext/upb-generated/google/protobuf/empty.upb.c
-  src/core/ext/upb-generated/google/protobuf/struct.upb.c
-  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
-  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
-  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
   src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc
@@ -1331,6 +1335,7 @@ add_library(grpc
   src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
+  src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
@@ -1343,11 +1348,10 @@ add_library(grpc
   src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
+  src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   src/core/ext/upb-generated/envoy/type/percent.upb.c
   src/core/ext/upb-generated/envoy/type/percent.upb.c
   src/core/ext/upb-generated/envoy/type/range.upb.c
   src/core/ext/upb-generated/envoy/type/range.upb.c
-  src/core/ext/upb-generated/gogoproto/gogo.upb.c
-  src/core/ext/upb-generated/validate/validate.upb.c
   src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
   src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
   src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
   src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
   src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
   src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
@@ -1667,6 +1671,7 @@ add_library(grpc_cronet
   src/core/ext/filters/http/http_filters_plugin.cc
   src/core/ext/filters/http/http_filters_plugin.cc
   src/core/ext/filters/http/message_compress/message_compress_filter.cc
   src/core/ext/filters/http/message_compress/message_compress_filter.cc
   src/core/ext/filters/http/server/http_server_filter.cc
   src/core/ext/filters/http/server/http_server_filter.cc
+  src/core/ext/filters/client_channel/backend_metric.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/client_channel.cc
   src/core/ext/filters/client_channel/client_channel.cc
@@ -1701,6 +1706,19 @@ add_library(grpc_cronet
   third_party/upb/upb/port.c
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
   third_party/upb/upb/upb.c
+  src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  src/core/ext/upb-generated/gogoproto/gogo.upb.c
+  src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upb-generated/google/api/annotations.upb.c
+  src/core/ext/upb-generated/google/api/http.upb.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/lib/http/httpcli_security_connector.cc
   src/core/lib/http/httpcli_security_connector.cc
   src/core/lib/security/context/security_context.cc
   src/core/lib/security/context/security_context.cc
   src/core/lib/security/credentials/alts/alts_credentials.cc
   src/core/lib/security/credentials/alts/alts_credentials.cc
@@ -2059,6 +2077,7 @@ add_library(grpc_test_util
   src/core/lib/transport/transport_op_string.cc
   src/core/lib/transport/transport_op_string.cc
   src/core/lib/uri/uri_parser.cc
   src/core/lib/uri/uri_parser.cc
   src/core/lib/debug/trace.cc
   src/core/lib/debug/trace.cc
+  src/core/ext/filters/client_channel/backend_metric.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/client_channel.cc
   src/core/ext/filters/client_channel/client_channel.cc
@@ -2093,6 +2112,19 @@ add_library(grpc_test_util
   third_party/upb/upb/port.c
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
   third_party/upb/upb/upb.c
+  src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  src/core/ext/upb-generated/gogoproto/gogo.upb.c
+  src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upb-generated/google/api/annotations.upb.c
+  src/core/ext/upb-generated/google/api/http.upb.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/ext/transport/chttp2/transport/bin_decoder.cc
   src/core/ext/transport/chttp2/transport/bin_decoder.cc
   src/core/ext/transport/chttp2/transport/bin_encoder.cc
   src/core/ext/transport/chttp2/transport/bin_encoder.cc
   src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
   src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
@@ -2399,6 +2431,7 @@ add_library(grpc_test_util_unsecure
   src/core/lib/transport/transport_op_string.cc
   src/core/lib/transport/transport_op_string.cc
   src/core/lib/uri/uri_parser.cc
   src/core/lib/uri/uri_parser.cc
   src/core/lib/debug/trace.cc
   src/core/lib/debug/trace.cc
+  src/core/ext/filters/client_channel/backend_metric.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/client_channel.cc
   src/core/ext/filters/client_channel/client_channel.cc
@@ -2433,6 +2466,19 @@ add_library(grpc_test_util_unsecure
   third_party/upb/upb/port.c
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
   third_party/upb/upb/upb.c
+  src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  src/core/ext/upb-generated/gogoproto/gogo.upb.c
+  src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upb-generated/google/api/annotations.upb.c
+  src/core/ext/upb-generated/google/api/http.upb.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/ext/transport/chttp2/transport/bin_decoder.cc
   src/core/ext/transport/chttp2/transport/bin_decoder.cc
   src/core/ext/transport/chttp2/transport/bin_encoder.cc
   src/core/ext/transport/chttp2/transport/bin_encoder.cc
   src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
   src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
@@ -2750,6 +2796,7 @@ add_library(grpc_unsecure
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
   src/core/ext/transport/chttp2/client/authority.cc
   src/core/ext/transport/chttp2/client/authority.cc
   src/core/ext/transport/chttp2/client/chttp2_connector.cc
   src/core/ext/transport/chttp2/client/chttp2_connector.cc
+  src/core/ext/filters/client_channel/backend_metric.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/backup_poller.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/channel_connectivity.cc
   src/core/ext/filters/client_channel/client_channel.cc
   src/core/ext/filters/client_channel/client_channel.cc
@@ -2784,6 +2831,19 @@ add_library(grpc_unsecure
   third_party/upb/upb/port.c
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
   third_party/upb/upb/upb.c
+  src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  src/core/ext/upb-generated/gogoproto/gogo.upb.c
+  src/core/ext/upb-generated/validate/validate.upb.c
+  src/core/ext/upb-generated/google/api/annotations.upb.c
+  src/core/ext/upb-generated/google/api/http.upb.c
+  src/core/ext/upb-generated/google/protobuf/any.upb.c
+  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
+  src/core/ext/upb-generated/google/protobuf/duration.upb.c
+  src/core/ext/upb-generated/google/protobuf/empty.upb.c
+  src/core/ext/upb-generated/google/protobuf/struct.upb.c
+  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
+  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
+  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/ext/transport/inproc/inproc_plugin.cc
   src/core/ext/transport/inproc/inproc_plugin.cc
   src/core/ext/transport/inproc/inproc_transport.cc
   src/core/ext/transport/inproc/inproc_transport.cc
   src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
   src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
@@ -2807,16 +2867,6 @@ add_library(grpc_unsecure
   src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
   src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
   src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c
   src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c
-  src/core/ext/upb-generated/google/api/annotations.upb.c
-  src/core/ext/upb-generated/google/api/http.upb.c
-  src/core/ext/upb-generated/google/protobuf/any.upb.c
-  src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
-  src/core/ext/upb-generated/google/protobuf/duration.upb.c
-  src/core/ext/upb-generated/google/protobuf/empty.upb.c
-  src/core/ext/upb-generated/google/protobuf/struct.upb.c
-  src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
-  src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
-  src/core/ext/upb-generated/google/rpc/status.upb.c
   src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc
   src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc
@@ -2824,6 +2874,7 @@ add_library(grpc_unsecure
   src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
+  src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
   src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
@@ -2836,11 +2887,10 @@ add_library(grpc_unsecure
   src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
+  src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   src/core/ext/upb-generated/envoy/type/percent.upb.c
   src/core/ext/upb-generated/envoy/type/percent.upb.c
   src/core/ext/upb-generated/envoy/type/range.upb.c
   src/core/ext/upb-generated/envoy/type/range.upb.c
-  src/core/ext/upb-generated/gogoproto/gogo.upb.c
-  src/core/ext/upb-generated/validate/validate.upb.c
   src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
   src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
   src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
   src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
   src/core/ext/filters/census/grpc_context.cc
   src/core/ext/filters/census/grpc_context.cc
@@ -13128,11 +13178,18 @@ endif (gRPC_BUILD_TESTS)
 if (gRPC_BUILD_TESTS)
 if (gRPC_BUILD_TESTS)
 
 
 add_executable(client_lb_end2end_test
 add_executable(client_lb_end2end_test
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.h
   test/cpp/end2end/client_lb_end2end_test.cc
   test/cpp/end2end/client_lb_end2end_test.cc
   third_party/googletest/googletest/src/gtest-all.cc
   third_party/googletest/googletest/src/gtest-all.cc
   third_party/googletest/googlemock/src/gmock-all.cc
   third_party/googletest/googlemock/src/gmock-all.cc
 )
 )
 
 
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/lb/v2/orca_load_report_for_test.proto
+)
 
 
 target_include_directories(client_lb_end2end_test
 target_include_directories(client_lb_end2end_test
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}

+ 97 - 24
Makefile

@@ -2745,6 +2745,22 @@ $(GENDIR)/src/proto/grpc/lb/v2/lrs_for_test.grpc.pb.cc: src/proto/grpc/lb/v2/lrs
 	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
 	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
 endif
 endif
 
 
+ifeq ($(NO_PROTOC),true)
+$(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc: protoc_dep_error
+$(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.cc: protoc_dep_error
+else
+
+$(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc: src/proto/grpc/lb/v2/orca_load_report_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+	$(E) "[PROTOC]  Generating protobuf CC file from $<"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $<
+
+$(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.cc: src/proto/grpc/lb/v2/orca_load_report_for_test.proto $(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) 
+	$(E) "[GRPC]    Generating gRPC's protobuf service CC file from $<"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $<
+endif
+
 ifeq ($(NO_PROTOC),true)
 ifeq ($(NO_PROTOC),true)
 $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc: protoc_dep_error
 $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc: protoc_dep_error
 $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc: protoc_dep_error
 $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc: protoc_dep_error
@@ -3803,6 +3819,7 @@ LIBGRPC_SRC = \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -3831,6 +3848,19 @@ LIBGRPC_SRC = \
     src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
     src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
     src/core/ext/filters/deadline/deadline_filter.cc \
     src/core/ext/filters/deadline/deadline_filter.cc \
     src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
     src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/tsi/fake_transport_security.cc \
     src/core/tsi/fake_transport_security.cc \
     src/core/tsi/local_transport_security.cc \
     src/core/tsi/local_transport_security.cc \
     src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \
     src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \
@@ -3850,16 +3880,6 @@ LIBGRPC_SRC = \
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
-    src/core/ext/upb-generated/google/api/annotations.upb.c \
-    src/core/ext/upb-generated/google/api/http.upb.c \
-    src/core/ext/upb-generated/google/protobuf/any.upb.c \
-    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
-    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
-    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
-    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
-    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
-    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
-    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
     src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc \
@@ -3868,6 +3888,7 @@ LIBGRPC_SRC = \
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
@@ -3880,11 +3901,10 @@ LIBGRPC_SRC = \
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
-    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
-    src/core/ext/upb-generated/validate/validate.upb.c \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
@@ -4193,6 +4213,7 @@ LIBGRPC_CRONET_SRC = \
     src/core/ext/filters/http/http_filters_plugin.cc \
     src/core/ext/filters/http/http_filters_plugin.cc \
     src/core/ext/filters/http/message_compress/message_compress_filter.cc \
     src/core/ext/filters/http/message_compress/message_compress_filter.cc \
     src/core/ext/filters/http/server/http_server_filter.cc \
     src/core/ext/filters/http/server/http_server_filter.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -4227,6 +4248,19 @@ LIBGRPC_CRONET_SRC = \
     third_party/upb/upb/port.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
     third_party/upb/upb/upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/lib/http/httpcli_security_connector.cc \
     src/core/lib/http/httpcli_security_connector.cc \
     src/core/lib/security/context/security_context.cc \
     src/core/lib/security/context/security_context.cc \
     src/core/lib/security/credentials/alts/alts_credentials.cc \
     src/core/lib/security/credentials/alts/alts_credentials.cc \
@@ -4573,6 +4607,7 @@ LIBGRPC_TEST_UTIL_SRC = \
     src/core/lib/transport/transport_op_string.cc \
     src/core/lib/transport/transport_op_string.cc \
     src/core/lib/uri/uri_parser.cc \
     src/core/lib/uri/uri_parser.cc \
     src/core/lib/debug/trace.cc \
     src/core/lib/debug/trace.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -4607,6 +4642,19 @@ LIBGRPC_TEST_UTIL_SRC = \
     third_party/upb/upb/port.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
     third_party/upb/upb/upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/transport/chttp2/transport/bin_decoder.cc \
     src/core/ext/transport/chttp2/transport/bin_decoder.cc \
     src/core/ext/transport/chttp2/transport/bin_encoder.cc \
     src/core/ext/transport/chttp2/transport/bin_encoder.cc \
     src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
     src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
@@ -4895,6 +4943,7 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
     src/core/lib/transport/transport_op_string.cc \
     src/core/lib/transport/transport_op_string.cc \
     src/core/lib/uri/uri_parser.cc \
     src/core/lib/uri/uri_parser.cc \
     src/core/lib/debug/trace.cc \
     src/core/lib/debug/trace.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -4929,6 +4978,19 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
     third_party/upb/upb/port.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
     third_party/upb/upb/upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/transport/chttp2/transport/bin_decoder.cc \
     src/core/ext/transport/chttp2/transport/bin_decoder.cc \
     src/core/ext/transport/chttp2/transport/bin_encoder.cc \
     src/core/ext/transport/chttp2/transport/bin_encoder.cc \
     src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
     src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
@@ -5215,6 +5277,7 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -5249,6 +5312,19 @@ LIBGRPC_UNSECURE_SRC = \
     third_party/upb/upb/port.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
     third_party/upb/upb/upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/transport/inproc/inproc_plugin.cc \
     src/core/ext/transport/inproc/inproc_plugin.cc \
     src/core/ext/transport/inproc/inproc_transport.cc \
     src/core/ext/transport/inproc/inproc_transport.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
@@ -5272,16 +5348,6 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
-    src/core/ext/upb-generated/google/api/annotations.upb.c \
-    src/core/ext/upb-generated/google/api/http.upb.c \
-    src/core/ext/upb-generated/google/protobuf/any.upb.c \
-    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
-    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
-    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
-    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
-    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
-    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
-    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc \
@@ -5289,6 +5355,7 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
@@ -5301,11 +5368,10 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
-    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
-    src/core/ext/upb-generated/validate/validate.upb.c \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/census/grpc_context.cc \
     src/core/ext/filters/census/grpc_context.cc \
@@ -7963,8 +8029,11 @@ endif
 
 
 LIBBENCHMARK_SRC = \
 LIBBENCHMARK_SRC = \
     third_party/benchmark/src/benchmark.cc \
     third_party/benchmark/src/benchmark.cc \
+    third_party/benchmark/src/benchmark_api_internal.cc \
     third_party/benchmark/src/benchmark_main.cc \
     third_party/benchmark/src/benchmark_main.cc \
+    third_party/benchmark/src/benchmark_name.cc \
     third_party/benchmark/src/benchmark_register.cc \
     third_party/benchmark/src/benchmark_register.cc \
+    third_party/benchmark/src/benchmark_runner.cc \
     third_party/benchmark/src/colorprint.cc \
     third_party/benchmark/src/colorprint.cc \
     third_party/benchmark/src/commandlineflags.cc \
     third_party/benchmark/src/commandlineflags.cc \
     third_party/benchmark/src/complexity.cc \
     third_party/benchmark/src/complexity.cc \
@@ -15696,6 +15765,7 @@ endif
 
 
 
 
 CLIENT_LB_END2END_TEST_SRC = \
 CLIENT_LB_END2END_TEST_SRC = \
+    $(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.cc \
     test/cpp/end2end/client_lb_end2end_test.cc \
     test/cpp/end2end/client_lb_end2end_test.cc \
 
 
 CLIENT_LB_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_LB_END2END_TEST_SRC))))
 CLIENT_LB_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_LB_END2END_TEST_SRC))))
@@ -15727,6 +15797,8 @@ endif
 
 
 endif
 endif
 
 
+$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v2/orca_load_report_for_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
+
 $(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_lb_end2end_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
 $(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_lb_end2end_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
 
 
 deps_client_lb_end2end_test: $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep)
 deps_client_lb_end2end_test: $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep)
@@ -15736,6 +15808,7 @@ ifneq ($(NO_DEPS),true)
 -include $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep)
 -include $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep)
 endif
 endif
 endif
 endif
+$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_lb_end2end_test.o: $(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/lb/v2/orca_load_report_for_test.grpc.pb.cc
 
 
 
 
 CODEGEN_TEST_FULL_SRC = \
 CODEGEN_TEST_FULL_SRC = \

+ 1 - 10
bazel/grpc_build_system.bzl

@@ -269,22 +269,13 @@ def grpc_sh_binary(name, srcs, data = []):
         data = data,
         data = data,
     )
     )
 
 
-def grpc_py_binary(name,
-                   srcs,
-                   data = [],
-                   deps = [],
-                   external_deps = [],
-                   testonly = False,
-                   python_version = "PY2",
-                   **kwargs):
+def grpc_py_binary(name, srcs, data = [], deps = [], external_deps = [], testonly = False):
     native.py_binary(
     native.py_binary(
         name = name,
         name = name,
         srcs = srcs,
         srcs = srcs,
         testonly = testonly,
         testonly = testonly,
         data = data,
         data = data,
         deps = deps + _get_external_deps(external_deps),
         deps = deps + _get_external_deps(external_deps),
-        python_version = python_version,
-        **kwargs
     )
     )
 
 
 def grpc_package(name, visibility = "private", features = []):
 def grpc_package(name, visibility = "private", features = []):

+ 10 - 11
bazel/grpc_deps.bzl

@@ -151,9 +151,9 @@ def grpc_deps():
     if "com_github_google_benchmark" not in native.existing_rules():
     if "com_github_google_benchmark" not in native.existing_rules():
         http_archive(
         http_archive(
             name = "com_github_google_benchmark",
             name = "com_github_google_benchmark",
-            sha256 = "c7682e9007ddfd94072647abab3e89ffd9084089460ae47d67060974467b58bf",
-            strip_prefix = "benchmark-e776aa0275e293707b6a0901e0e8d8a8a3679508",
-            url = "https://github.com/google/benchmark/archive/e776aa0275e293707b6a0901e0e8d8a8a3679508.tar.gz",
+            sha256 = "f68aec93154d010324c05bcd8c5cc53468b87af88d87acb5ddcfaa1bba044837",
+            strip_prefix = "benchmark-090faecb454fbd6e6e17a75ef8146acb037118d4",
+            url = "https://github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz",
         )
         )
 
 
     if "com_github_cares_cares" not in native.existing_rules():
     if "com_github_cares_cares" not in native.existing_rules():
@@ -176,11 +176,11 @@ def grpc_deps():
     if "bazel_toolchains" not in native.existing_rules():
     if "bazel_toolchains" not in native.existing_rules():
         http_archive(
         http_archive(
             name = "bazel_toolchains",
             name = "bazel_toolchains",
-            sha256 = "872955b658113924eb1a3594b04d43238da47f4f90c17b76e8785709490dc041",
-            strip_prefix = "bazel-toolchains-1083686fde6032378d52b4c98044922cebde364e",
+            sha256 = "d968b414b32aa99c86977e1171645d31da2b52ac88060de3ac1e49932d5dcbf1",
+            strip_prefix = "bazel-toolchains-4bd5df80d77aa7f4fb943dfdfad5c9056a62fb47",
             urls = [
             urls = [
-                "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/1083686fde6032378d52b4c98044922cebde364e.tar.gz",
-                "https://github.com/bazelbuild/bazel-toolchains/archive/1083686fde6032378d52b4c98044922cebde364e.tar.gz",
+                "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/4bd5df80d77aa7f4fb943dfdfad5c9056a62fb47.tar.gz",
+                "https://github.com/bazelbuild/bazel-toolchains/archive/4bd5df80d77aa7f4fb943dfdfad5c9056a62fb47.tar.gz",
             ],
             ],
         )
         )
 
 
@@ -221,11 +221,10 @@ def grpc_deps():
         )
         )
 
 
     if "build_bazel_rules_apple" not in native.existing_rules():
     if "build_bazel_rules_apple" not in native.existing_rules():
-        http_archive(
+        git_repository(
             name = "build_bazel_rules_apple",
             name = "build_bazel_rules_apple",
-            url = "https://github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz",
-            strip_prefix = "rules_apple-b869b0d3868d78a1d4ffd866ccb304fb68aa12c3",
-            sha256 = "bdc8e66e70b8a75da23b79f1f8c6207356df07d041d96d2189add7ee0780cf4e",
+            remote = "https://github.com/bazelbuild/rules_apple.git",
+            tag = "0.17.2",
         )
         )
 
 
     grpc_python_deps()
     grpc_python_deps()

+ 0 - 9
bazel/grpc_python_deps.bzl

@@ -47,15 +47,6 @@ def grpc_python_deps():
             remote = "https://github.com/bazelbuild/rules_python.git",
             remote = "https://github.com/bazelbuild/rules_python.git",
         )
         )
 
 
-
-    if "rules_python" not in native.existing_rules():
-        http_archive(
-            name = "rules_python",
-            url = "https://github.com/bazelbuild/rules_python/archive/9d68f24659e8ce8b736590ba1e4418af06ec2552.zip",
-            sha256 = "f7402f11691d657161f871e11968a984e5b48b023321935f5a55d7e56cf4758a",
-            strip_prefix = "rules_python-9d68f24659e8ce8b736590ba1e4418af06ec2552",
-        )
-
     python_configure(name = "local_config_python")
     python_configure(name = "local_config_python")
 
 
     native.bind(
     native.bind(

+ 0 - 26
bazel/python_rules.bzl

@@ -178,29 +178,3 @@ def py_grpc_library(
         deps = [Label("//src/python/grpcio/grpc:grpcio")] + deps,
         deps = [Label("//src/python/grpcio/grpc:grpcio")] + deps,
         **kwargs
         **kwargs
     )
     )
-
-
-def py2and3_test(name,
-                 py_test = native.py_test,
-                 **kwargs):
-    if "python_version" in kwargs:
-        fail("Cannot specify 'python_version' in py2and3_test.")
-
-    names = [name + suffix for suffix in (".python2", ".python3")]
-    python_versions = ["PY2", "PY3"]
-    for case_name, python_version in zip(names, python_versions):
-        py_test(
-            name = case_name,
-            python_version = python_version,
-            **kwargs
-        )
-
-    suite_kwargs = {}
-    if "visibility" in kwargs:
-        suite_kwargs["visibility"] = kwargs["visibility"]
-
-    native.test_suite(
-        name = name,
-        tests = names,
-        **suite_kwargs
-    )

+ 15 - 0
build.yaml

@@ -113,6 +113,7 @@ filegroups:
   - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h
+  - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h
@@ -124,6 +125,7 @@ filegroups:
   - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c
+  - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c
@@ -143,6 +145,7 @@ filegroups:
   - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h
+  - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h
   - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h
   src:
   src:
   - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c
@@ -150,11 +153,19 @@ filegroups:
   - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c
+  - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c
   uses:
   uses:
   - envoy_type_upb
   - envoy_type_upb
   - google_api_upb
   - google_api_upb
   - proto_gen_validate_upb
   - proto_gen_validate_upb
+- name: envoy_orca_upb
+  headers:
+  - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h
+  src:
+  - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
+  uses:
+  - proto_gen_validate_upb
 - name: envoy_type_upb
 - name: envoy_type_upb
   headers:
   headers:
   - src/core/ext/upb-generated/envoy/type/percent.upb.h
   - src/core/ext/upb-generated/envoy/type/percent.upb.h
@@ -945,6 +956,7 @@ filegroups:
   - grpc_base
   - grpc_base
 - name: grpc_client_channel
 - name: grpc_client_channel
   headers:
   headers:
+  - src/core/ext/filters/client_channel/backend_metric.h
   - src/core/ext/filters/client_channel/backup_poller.h
   - src/core/ext/filters/client_channel/backup_poller.h
   - src/core/ext/filters/client_channel/client_channel.h
   - src/core/ext/filters/client_channel/client_channel.h
   - src/core/ext/filters/client_channel/client_channel_channelz.h
   - src/core/ext/filters/client_channel/client_channel_channelz.h
@@ -973,6 +985,7 @@ filegroups:
   - src/core/ext/filters/client_channel/subchannel_interface.h
   - src/core/ext/filters/client_channel/subchannel_interface.h
   - src/core/ext/filters/client_channel/subchannel_pool_interface.h
   - src/core/ext/filters/client_channel/subchannel_pool_interface.h
   src:
   src:
+  - src/core/ext/filters/client_channel/backend_metric.cc
   - src/core/ext/filters/client_channel/backup_poller.cc
   - src/core/ext/filters/client_channel/backup_poller.cc
   - src/core/ext/filters/client_channel/channel_connectivity.cc
   - src/core/ext/filters/client_channel/channel_connectivity.cc
   - src/core/ext/filters/client_channel/client_channel.cc
   - src/core/ext/filters/client_channel/client_channel.cc
@@ -1004,6 +1017,7 @@ filegroups:
   - grpc_base
   - grpc_base
   - grpc_deadline_filter
   - grpc_deadline_filter
   - grpc_health_upb
   - grpc_health_upb
+  - envoy_orca_upb
 - name: grpc_client_idle_filter
 - name: grpc_client_idle_filter
   src:
   src:
   - src/core/ext/filters/client_idle/client_idle_filter.cc
   - src/core/ext/filters/client_idle/client_idle_filter.cc
@@ -4741,6 +4755,7 @@ targets:
   build: test
   build: test
   language: c++
   language: c++
   src:
   src:
+  - src/proto/grpc/lb/v2/orca_load_report_for_test.proto
   - test/cpp/end2end/client_lb_end2end_test.cc
   - test/cpp/end2end/client_lb_end2end_test.cc
   deps:
   deps:
   - grpc++_test_util
   - grpc++_test_util

+ 17 - 12
config.m4

@@ -349,6 +349,7 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
     src/core/ext/transport/chttp2/client/chttp2_connector.cc \
+    src/core/ext/filters/client_channel/backend_metric.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/backup_poller.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/channel_connectivity.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
     src/core/ext/filters/client_channel/client_channel.cc \
@@ -377,6 +378,19 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
     src/core/ext/filters/client_channel/subchannel_pool_interface.cc \
     src/core/ext/filters/deadline/deadline_filter.cc \
     src/core/ext/filters/deadline/deadline_filter.cc \
     src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
     src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
+    src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
+    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
+    src/core/ext/upb-generated/validate/validate.upb.c \
+    src/core/ext/upb-generated/google/api/annotations.upb.c \
+    src/core/ext/upb-generated/google/api/http.upb.c \
+    src/core/ext/upb-generated/google/protobuf/any.upb.c \
+    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
+    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
+    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
+    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
+    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
+    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
+    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/tsi/fake_transport_security.cc \
     src/core/tsi/fake_transport_security.cc \
     src/core/tsi/local_transport_security.cc \
     src/core/tsi/local_transport_security.cc \
     src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \
     src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \
@@ -396,16 +410,6 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
     src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
-    src/core/ext/upb-generated/google/api/annotations.upb.c \
-    src/core/ext/upb-generated/google/api/http.upb.c \
-    src/core/ext/upb-generated/google/protobuf/any.upb.c \
-    src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
-    src/core/ext/upb-generated/google/protobuf/duration.upb.c \
-    src/core/ext/upb-generated/google/protobuf/empty.upb.c \
-    src/core/ext/upb-generated/google/protobuf/struct.upb.c \
-    src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
-    src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
-    src/core/ext/upb-generated/google/rpc/status.upb.c \
     src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
     src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc \
     src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc \
@@ -414,6 +418,7 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \
@@ -426,11 +431,10 @@ if test "$PHP_GRPC" != "no"; then
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \
+    src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/percent.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
     src/core/ext/upb-generated/envoy/type/range.upb.c \
-    src/core/ext/upb-generated/gogoproto/gogo.upb.c \
-    src/core/ext/upb-generated/validate/validate.upb.c \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
     src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
@@ -766,6 +770,7 @@ if test "$PHP_GRPC" != "no"; then
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff)

+ 20 - 12
config.w32

@@ -323,6 +323,7 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\chttp2_connector.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\chttp2_connector.cc " +
+    "src\\core\\ext\\filters\\client_channel\\backend_metric.cc " +
     "src\\core\\ext\\filters\\client_channel\\backup_poller.cc " +
     "src\\core\\ext\\filters\\client_channel\\backup_poller.cc " +
     "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " +
     "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " +
     "src\\core\\ext\\filters\\client_channel\\client_channel.cc " +
     "src\\core\\ext\\filters\\client_channel\\client_channel.cc " +
@@ -351,6 +352,19 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " +
     "src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " +
     "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " +
     "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " +
     "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " +
     "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " +
+    "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " +
+    "src\\core\\ext\\upb-generated\\gogoproto\\gogo.upb.c " +
+    "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\api\\annotations.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\api\\http.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\any.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\descriptor.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\duration.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\empty.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\struct.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\timestamp.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\protobuf\\wrappers.upb.c " +
+    "src\\core\\ext\\upb-generated\\google\\rpc\\status.upb.c " +
     "src\\core\\tsi\\fake_transport_security.cc " +
     "src\\core\\tsi\\fake_transport_security.cc " +
     "src\\core\\tsi\\local_transport_security.cc " +
     "src\\core\\tsi\\local_transport_security.cc " +
     "src\\core\\tsi\\ssl\\session_cache\\ssl_session_boringssl.cc " +
     "src\\core\\tsi\\ssl\\session_cache\\ssl_session_boringssl.cc " +
@@ -370,16 +384,6 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " +
     "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " +
     "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\api\\annotations.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\api\\http.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\any.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\descriptor.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\duration.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\empty.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\struct.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\timestamp.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\protobuf\\wrappers.upb.c " +
-    "src\\core\\ext\\upb-generated\\google\\rpc\\status.upb.c " +
     "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " +
     "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_channel_secure.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_channel_secure.cc " +
@@ -388,6 +392,7 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " +
+    "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\filter.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " +
@@ -400,11 +405,10 @@ if (PHP_GRPC != "no") {
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " +
+    "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\http_uri.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\type\\percent.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\type\\percent.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\type\\range.upb.c " +
     "src\\core\\ext\\upb-generated\\envoy\\type\\range.upb.c " +
-    "src\\core\\ext\\upb-generated\\gogoproto\\gogo.upb.c " +
-    "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " +
     "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " +
     "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " +
     "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " +
@@ -785,6 +789,10 @@ if (PHP_GRPC != "no") {
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl");

+ 0 - 3
examples/python/auth/BUILD.bazel

@@ -39,7 +39,6 @@ py_binary(
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2_grpc",
         "//examples:helloworld_py_pb2_grpc",
     ],
     ],
-    python_version = "PY3",
 )
 )
 
 
 py_binary(
 py_binary(
@@ -52,7 +51,6 @@ py_binary(
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2_grpc",
         "//examples:helloworld_py_pb2_grpc",
     ],
     ],
-    python_version = "PY3",
 )
 )
 
 
 py_test(
 py_test(
@@ -65,5 +63,4 @@ py_test(
         ":customized_auth_server",
         ":customized_auth_server",
         ":_credentials",
         ":_credentials",
     ],
     ],
-    python_version = "PY3",
 )
 )

+ 0 - 3
examples/python/cancellation/BUILD.bazel

@@ -45,7 +45,6 @@ py_binary(
         "//external:six"
         "//external:six"
     ],
     ],
     srcs_version = "PY2AND3",
     srcs_version = "PY2AND3",
-    python_version = "PY3",
 )
 )
 
 
 py_library(
 py_library(
@@ -69,7 +68,6 @@ py_binary(
         "//:python3": [],
         "//:python3": [],
     }),
     }),
     srcs_version = "PY2AND3",
     srcs_version = "PY2AND3",
-    python_version = "PY3",
 )
 )
 
 
 py_test(
 py_test(
@@ -80,5 +78,4 @@ py_test(
         ":server"
         ":server"
     ],
     ],
     size = "small",
     size = "small",
-    python_version = "PY3",
 )
 )

+ 0 - 3
examples/python/compression/BUILD.bazel

@@ -21,7 +21,6 @@ py_binary(
         "//examples:helloworld_py_pb2_grpc",
         "//examples:helloworld_py_pb2_grpc",
     ],
     ],
     srcs_version = "PY2AND3",
     srcs_version = "PY2AND3",
-    python_version = "PY3",
 )
 )
 
 
 py_binary(
 py_binary(
@@ -33,7 +32,6 @@ py_binary(
         "//examples:helloworld_py_pb2_grpc",
         "//examples:helloworld_py_pb2_grpc",
     ],
     ],
     srcs_version = "PY2AND3",
     srcs_version = "PY2AND3",
-    python_version = "PY3",
 )
 )
 
 
 py_test(
 py_test(
@@ -45,5 +43,4 @@ py_test(
       ":server",
       ":server",
     ],
     ],
     size = "small",
     size = "small",
-    python_version = "PY3",
 )
 )

+ 0 - 3
examples/python/debug/BUILD.bazel

@@ -35,7 +35,6 @@ py_binary(
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2",
         "//examples:helloworld_py_pb2_grpc",
         "//examples:helloworld_py_pb2_grpc",
     ],
     ],
-    python_version = "PY3",
 )
 )
 
 
 py_binary(
 py_binary(
@@ -46,7 +45,6 @@ py_binary(
         "//src/python/grpcio/grpc:grpcio",
         "//src/python/grpcio/grpc:grpcio",
         "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz",
         "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz",
     ],
     ],
-    python_version = "PY3",
 )
 )
 
 
 py_test(
 py_test(
@@ -61,5 +59,4 @@ py_test(
         ":send_message",
         ":send_message",
         ":get_stats",
         ":get_stats",
     ],
     ],
-    python_version = "PY3",
 )
 )

+ 0 - 1
examples/python/errors/BUILD.bazel

@@ -55,5 +55,4 @@ py_test(
         "../../../src/python/grpcio_status",
         "../../../src/python/grpcio_status",
         "../../../src/python/grpcio_tests",
         "../../../src/python/grpcio_tests",
     ],
     ],
-    python_version = "PY3",
 )
 )

+ 0 - 3
examples/python/multiprocessing/BUILD

@@ -42,7 +42,6 @@ py_binary(
         ":prime_proto_pb2_grpc",
         ":prime_proto_pb2_grpc",
     ],
     ],
     srcs_version = "PY3",
     srcs_version = "PY3",
-    python_version = "PY3",
 )
 )
 
 
 py_binary(
 py_binary(
@@ -58,7 +57,6 @@ py_binary(
         "//:python3": [],
         "//:python3": [],
     }),
     }),
     srcs_version = "PY3",
     srcs_version = "PY3",
-    python_version = "PY3",
 )
 )
 
 
 py_test(
 py_test(
@@ -69,5 +67,4 @@ py_test(
         ":server"
         ":server"
     ],
     ],
     size = "small",
     size = "small",
-    python_version = "PY3",
 )
 )

+ 0 - 1
examples/python/wait_for_ready/BUILD.bazel

@@ -30,5 +30,4 @@ py_test(
     srcs = ["test/_wait_for_ready_example_test.py"],
     srcs = ["test/_wait_for_ready_example_test.py"],
     deps = [":wait_for_ready_example",],
     deps = [":wait_for_ready_example",],
     size = "small",
     size = "small",
-    python_version = "PY3",
 )
 )

+ 48 - 36
gRPC-Core.podspec

@@ -352,6 +352,7 @@ Pod::Spec.new do |s|
                       'src/core/tsi/transport_security_interface.h',
                       'src/core/tsi/transport_security_interface.h',
                       'src/core/ext/transport/chttp2/client/authority.h',
                       'src/core/ext/transport/chttp2/client/authority.h',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.h',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.h',
+                      'src/core/ext/filters/client_channel/backend_metric.h',
                       'src/core/ext/filters/client_channel/backup_poller.h',
                       'src/core/ext/filters/client_channel/backup_poller.h',
                       'src/core/ext/filters/client_channel/client_channel.h',
                       'src/core/ext/filters/client_channel/client_channel.h',
                       'src/core/ext/filters/client_channel/client_channel_channelz.h',
                       'src/core/ext/filters/client_channel/client_channel_channelz.h',
@@ -381,6 +382,19 @@ Pod::Spec.new do |s|
                       'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
                       'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
                       'src/core/ext/filters/deadline/deadline_filter.h',
                       'src/core/ext/filters/deadline/deadline_filter.h',
                       'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h',
                       'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h',
+                      'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
+                      'src/core/ext/upb-generated/gogoproto/gogo.upb.h',
+                      'src/core/ext/upb-generated/validate/validate.upb.h',
+                      'src/core/ext/upb-generated/google/api/annotations.upb.h',
+                      'src/core/ext/upb-generated/google/api/http.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/any.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/duration.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/empty.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/struct.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h',
+                      'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h',
+                      'src/core/ext/upb-generated/google/rpc/status.upb.h',
                       'src/core/tsi/fake_transport_security.h',
                       'src/core/tsi/fake_transport_security.h',
                       'src/core/tsi/local_transport_security.h',
                       'src/core/tsi/local_transport_security.h',
                       'src/core/tsi/ssl/session_cache/ssl_session.h',
                       'src/core/tsi/ssl/session_cache/ssl_session.h',
@@ -540,16 +554,6 @@ Pod::Spec.new do |s|
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
                       'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h',
                       'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h',
-                      'src/core/ext/upb-generated/google/api/annotations.upb.h',
-                      'src/core/ext/upb-generated/google/api/http.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/any.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/duration.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/empty.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/struct.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h',
-                      'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h',
-                      'src/core/ext/upb-generated/google/rpc/status.upb.h',
                       'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
                       'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h',
@@ -557,6 +561,7 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h',
+                      'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h',
@@ -569,11 +574,10 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h',
+                      'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h',
                       'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h',
                       'src/core/ext/upb-generated/envoy/type/percent.upb.h',
                       'src/core/ext/upb-generated/envoy/type/percent.upb.h',
                       'src/core/ext/upb-generated/envoy/type/range.upb.h',
                       'src/core/ext/upb-generated/envoy/type/range.upb.h',
-                      'src/core/ext/upb-generated/gogoproto/gogo.upb.h',
-                      'src/core/ext/upb-generated/validate/validate.upb.h',
                       'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
                       'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',
@@ -847,6 +851,7 @@ Pod::Spec.new do |s|
                       'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
                       'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
                       'src/core/ext/transport/chttp2/client/authority.cc',
                       'src/core/ext/transport/chttp2/client/authority.cc',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
+                      'src/core/ext/filters/client_channel/backend_metric.cc',
                       'src/core/ext/filters/client_channel/backup_poller.cc',
                       'src/core/ext/filters/client_channel/backup_poller.cc',
                       'src/core/ext/filters/client_channel/channel_connectivity.cc',
                       'src/core/ext/filters/client_channel/channel_connectivity.cc',
                       'src/core/ext/filters/client_channel/client_channel.cc',
                       'src/core/ext/filters/client_channel/client_channel.cc',
@@ -875,6 +880,19 @@ Pod::Spec.new do |s|
                       'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
                       'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
                       'src/core/ext/filters/deadline/deadline_filter.cc',
                       'src/core/ext/filters/deadline/deadline_filter.cc',
                       'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c',
                       'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c',
+                      'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
+                      'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
+                      'src/core/ext/upb-generated/validate/validate.upb.c',
+                      'src/core/ext/upb-generated/google/api/annotations.upb.c',
+                      'src/core/ext/upb-generated/google/api/http.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+                      'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+                      'src/core/ext/upb-generated/google/rpc/status.upb.c',
                       'src/core/tsi/fake_transport_security.cc',
                       'src/core/tsi/fake_transport_security.cc',
                       'src/core/tsi/local_transport_security.cc',
                       'src/core/tsi/local_transport_security.cc',
                       'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc',
                       'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc',
@@ -894,16 +912,6 @@ Pod::Spec.new do |s|
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
                       'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
                       'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
                       'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
-                      'src/core/ext/upb-generated/google/api/annotations.upb.c',
-                      'src/core/ext/upb-generated/google/api/http.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/any.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
-                      'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
-                      'src/core/ext/upb-generated/google/rpc/status.upb.c',
                       'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
                       'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc',
                       'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc',
@@ -912,6 +920,7 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
+                      'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
@@ -924,11 +933,10 @@ Pod::Spec.new do |s|
                       'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
+                      'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
                       'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
                       'src/core/ext/upb-generated/envoy/type/percent.upb.c',
                       'src/core/ext/upb-generated/envoy/type/percent.upb.c',
                       'src/core/ext/upb-generated/envoy/type/range.upb.c',
                       'src/core/ext/upb-generated/envoy/type/range.upb.c',
-                      'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
-                      'src/core/ext/upb-generated/validate/validate.upb.c',
                       'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
                       'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
                       'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
                       'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
                       'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
@@ -1078,6 +1086,7 @@ Pod::Spec.new do |s|
                               'src/core/tsi/transport_security_interface.h',
                               'src/core/tsi/transport_security_interface.h',
                               'src/core/ext/transport/chttp2/client/authority.h',
                               'src/core/ext/transport/chttp2/client/authority.h',
                               'src/core/ext/transport/chttp2/client/chttp2_connector.h',
                               'src/core/ext/transport/chttp2/client/chttp2_connector.h',
+                              'src/core/ext/filters/client_channel/backend_metric.h',
                               'src/core/ext/filters/client_channel/backup_poller.h',
                               'src/core/ext/filters/client_channel/backup_poller.h',
                               'src/core/ext/filters/client_channel/client_channel.h',
                               'src/core/ext/filters/client_channel/client_channel.h',
                               'src/core/ext/filters/client_channel/client_channel_channelz.h',
                               'src/core/ext/filters/client_channel/client_channel_channelz.h',
@@ -1107,6 +1116,19 @@ Pod::Spec.new do |s|
                               'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
                               'src/core/ext/filters/client_channel/subchannel_pool_interface.h',
                               'src/core/ext/filters/deadline/deadline_filter.h',
                               'src/core/ext/filters/deadline/deadline_filter.h',
                               'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h',
                               'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h',
+                              'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
+                              'src/core/ext/upb-generated/gogoproto/gogo.upb.h',
+                              'src/core/ext/upb-generated/validate/validate.upb.h',
+                              'src/core/ext/upb-generated/google/api/annotations.upb.h',
+                              'src/core/ext/upb-generated/google/api/http.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/any.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/duration.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/empty.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/struct.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h',
+                              'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h',
+                              'src/core/ext/upb-generated/google/rpc/status.upb.h',
                               'src/core/tsi/fake_transport_security.h',
                               'src/core/tsi/fake_transport_security.h',
                               'src/core/tsi/local_transport_security.h',
                               'src/core/tsi/local_transport_security.h',
                               'src/core/tsi/ssl/session_cache/ssl_session.h',
                               'src/core/tsi/ssl/session_cache/ssl_session.h',
@@ -1266,16 +1288,6 @@ Pod::Spec.new do |s|
                               'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h',
                               'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h',
                               'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
                               'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
                               'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h',
                               'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h',
-                              'src/core/ext/upb-generated/google/api/annotations.upb.h',
-                              'src/core/ext/upb-generated/google/api/http.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/any.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/duration.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/empty.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/struct.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h',
-                              'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h',
-                              'src/core/ext/upb-generated/google/rpc/status.upb.h',
                               'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
                               'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
                               'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h',
                               'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h',
                               'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h',
                               'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h',
@@ -1283,6 +1295,7 @@ Pod::Spec.new do |s|
                               'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h',
+                              'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h',
@@ -1295,11 +1308,10 @@ Pod::Spec.new do |s|
                               'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h',
+                              'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h',
                               'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h',
                               'src/core/ext/upb-generated/envoy/type/percent.upb.h',
                               'src/core/ext/upb-generated/envoy/type/percent.upb.h',
                               'src/core/ext/upb-generated/envoy/type/range.upb.h',
                               'src/core/ext/upb-generated/envoy/type/range.upb.h',
-                              'src/core/ext/upb-generated/gogoproto/gogo.upb.h',
-                              'src/core/ext/upb-generated/validate/validate.upb.h',
                               'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
                               'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
                               'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
                               'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
                               'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',
                               'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',

+ 32 - 24
grpc.gemspec

@@ -282,6 +282,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/tsi/transport_security_interface.h )
   s.files += %w( src/core/tsi/transport_security_interface.h )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.h )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.h )
   s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h )
   s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h )
+  s.files += %w( src/core/ext/filters/client_channel/backend_metric.h )
   s.files += %w( src/core/ext/filters/client_channel/backup_poller.h )
   s.files += %w( src/core/ext/filters/client_channel/backup_poller.h )
   s.files += %w( src/core/ext/filters/client_channel/client_channel.h )
   s.files += %w( src/core/ext/filters/client_channel/client_channel.h )
   s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.h )
   s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.h )
@@ -311,6 +312,19 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h )
   s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h )
   s.files += %w( src/core/ext/filters/deadline/deadline_filter.h )
   s.files += %w( src/core/ext/filters/deadline/deadline_filter.h )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h )
+  s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h )
+  s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.h )
+  s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/api/http.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.h )
+  s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.h )
   s.files += %w( src/core/tsi/fake_transport_security.h )
   s.files += %w( src/core/tsi/fake_transport_security.h )
   s.files += %w( src/core/tsi/local_transport_security.h )
   s.files += %w( src/core/tsi/local_transport_security.h )
   s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h )
   s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h )
@@ -470,16 +484,6 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/api/http.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.h )
-  s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h )
@@ -487,6 +491,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h )
+  s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.h )
@@ -499,11 +504,10 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h )
+  s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.h )
   s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.h )
-  s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.h )
-  s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h )
@@ -777,6 +781,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.cc )
+  s.files += %w( src/core/ext/filters/client_channel/backend_metric.cc )
   s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc )
   s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc )
   s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc )
   s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc )
   s.files += %w( src/core/ext/filters/client_channel/client_channel.cc )
   s.files += %w( src/core/ext/filters/client_channel/client_channel.cc )
@@ -805,6 +810,19 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.cc )
   s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.cc )
   s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc )
   s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c )
+  s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c )
+  s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.c )
+  s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/api/http.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.c )
+  s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.c )
   s.files += %w( src/core/tsi/fake_transport_security.cc )
   s.files += %w( src/core/tsi/fake_transport_security.cc )
   s.files += %w( src/core/tsi/local_transport_security.cc )
   s.files += %w( src/core/tsi/local_transport_security.cc )
   s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc )
   s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc )
@@ -824,16 +842,6 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c )
   s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/api/http.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.c )
-  s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.c )
   s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc )
   s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc )
@@ -842,6 +850,7 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c )
+  s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c )
@@ -854,11 +863,10 @@ Gem::Specification.new do |s|
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c )
+  s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.c )
   s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.c )
-  s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.c )
-  s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc )
   s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc )
   s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc )

+ 63 - 24
grpc.gyp

@@ -553,6 +553,7 @@
         'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
         'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
         'src/core/ext/transport/chttp2/client/authority.cc',
         'src/core/ext/transport/chttp2/client/authority.cc',
         'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
         'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
+        'src/core/ext/filters/client_channel/backend_metric.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
@@ -581,6 +582,19 @@
         'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
         'src/core/ext/filters/client_channel/subchannel_pool_interface.cc',
         'src/core/ext/filters/deadline/deadline_filter.cc',
         'src/core/ext/filters/deadline/deadline_filter.cc',
         'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c',
         'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c',
+        'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
+        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
+        'src/core/ext/upb-generated/validate/validate.upb.c',
+        'src/core/ext/upb-generated/google/api/annotations.upb.c',
+        'src/core/ext/upb-generated/google/api/http.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/tsi/fake_transport_security.cc',
         'src/core/tsi/fake_transport_security.cc',
         'src/core/tsi/local_transport_security.cc',
         'src/core/tsi/local_transport_security.cc',
         'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc',
         'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc',
@@ -600,16 +614,6 @@
         'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
         'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
         'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
-        'src/core/ext/upb-generated/google/api/annotations.upb.c',
-        'src/core/ext/upb-generated/google/api/http.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
-        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
         'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc',
@@ -618,6 +622,7 @@
         'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
+        'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
@@ -630,11 +635,10 @@
         'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
+        'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
         'src/core/ext/upb-generated/envoy/type/percent.upb.c',
         'src/core/ext/upb-generated/envoy/type/percent.upb.c',
         'src/core/ext/upb-generated/envoy/type/range.upb.c',
         'src/core/ext/upb-generated/envoy/type/range.upb.c',
-        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
-        'src/core/ext/upb-generated/validate/validate.upb.c',
         'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
         'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
         'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
         'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
         'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
         'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
@@ -857,6 +861,7 @@
         'src/core/lib/transport/transport_op_string.cc',
         'src/core/lib/transport/transport_op_string.cc',
         'src/core/lib/uri/uri_parser.cc',
         'src/core/lib/uri/uri_parser.cc',
         'src/core/lib/debug/trace.cc',
         'src/core/lib/debug/trace.cc',
+        'src/core/ext/filters/client_channel/backend_metric.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
@@ -891,6 +896,19 @@
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/upb.c',
         'third_party/upb/upb/upb.c',
+        'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
+        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
+        'src/core/ext/upb-generated/validate/validate.upb.c',
+        'src/core/ext/upb-generated/google/api/annotations.upb.c',
+        'src/core/ext/upb-generated/google/api/http.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
         'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
         'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
@@ -1112,6 +1130,7 @@
         'src/core/lib/transport/transport_op_string.cc',
         'src/core/lib/transport/transport_op_string.cc',
         'src/core/lib/uri/uri_parser.cc',
         'src/core/lib/uri/uri_parser.cc',
         'src/core/lib/debug/trace.cc',
         'src/core/lib/debug/trace.cc',
+        'src/core/ext/filters/client_channel/backend_metric.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
@@ -1146,6 +1165,19 @@
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/upb.c',
         'third_party/upb/upb/upb.c',
+        'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
+        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
+        'src/core/ext/upb-generated/validate/validate.upb.c',
+        'src/core/ext/upb-generated/google/api/annotations.upb.c',
+        'src/core/ext/upb-generated/google/api/http.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
         'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
         'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
         'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
@@ -1378,6 +1410,7 @@
         'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
         'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
         'src/core/ext/transport/chttp2/client/authority.cc',
         'src/core/ext/transport/chttp2/client/authority.cc',
         'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
         'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
+        'src/core/ext/filters/client_channel/backend_metric.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/backup_poller.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/channel_connectivity.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
         'src/core/ext/filters/client_channel/client_channel.cc',
@@ -1412,6 +1445,19 @@
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/upb.c',
         'third_party/upb/upb/upb.c',
+        'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
+        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
+        'src/core/ext/upb-generated/validate/validate.upb.c',
+        'src/core/ext/upb-generated/google/api/annotations.upb.c',
+        'src/core/ext/upb-generated/google/api/http.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
+        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
+        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/ext/transport/inproc/inproc_plugin.cc',
         'src/core/ext/transport/inproc/inproc_plugin.cc',
         'src/core/ext/transport/inproc/inproc_transport.cc',
         'src/core/ext/transport/inproc/inproc_transport.cc',
         'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
         'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
@@ -1435,16 +1481,6 @@
         'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
         'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
         'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
         'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c',
-        'src/core/ext/upb-generated/google/api/annotations.upb.c',
-        'src/core/ext/upb-generated/google/api/http.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/any.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
-        'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
-        'src/core/ext/upb-generated/google/rpc/status.upb.c',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc',
         'src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc',
@@ -1452,6 +1488,7 @@
         'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c',
+        'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c',
@@ -1464,11 +1501,10 @@
         'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c',
+        'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
         'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c',
         'src/core/ext/upb-generated/envoy/type/percent.upb.c',
         'src/core/ext/upb-generated/envoy/type/percent.upb.c',
         'src/core/ext/upb-generated/envoy/type/range.upb.c',
         'src/core/ext/upb-generated/envoy/type/range.upb.c',
-        'src/core/ext/upb-generated/gogoproto/gogo.upb.c',
-        'src/core/ext/upb-generated/validate/validate.upb.c',
         'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
         'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
         'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
         'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
         'src/core/ext/filters/census/grpc_context.cc',
         'src/core/ext/filters/census/grpc_context.cc',
@@ -2234,8 +2270,11 @@
       ],
       ],
       'sources': [
       'sources': [
         'third_party/benchmark/src/benchmark.cc',
         'third_party/benchmark/src/benchmark.cc',
+        'third_party/benchmark/src/benchmark_api_internal.cc',
         'third_party/benchmark/src/benchmark_main.cc',
         'third_party/benchmark/src/benchmark_main.cc',
+        'third_party/benchmark/src/benchmark_name.cc',
         'third_party/benchmark/src/benchmark_register.cc',
         'third_party/benchmark/src/benchmark_register.cc',
+        'third_party/benchmark/src/benchmark_runner.cc',
         'third_party/benchmark/src/colorprint.cc',
         'third_party/benchmark/src/colorprint.cc',
         'third_party/benchmark/src/commandlineflags.cc',
         'third_party/benchmark/src/commandlineflags.cc',
         'third_party/benchmark/src/complexity.cc',
         'third_party/benchmark/src/complexity.cc',

+ 1 - 1
include/grpcpp/impl/codegen/async_generic_service.h

@@ -100,7 +100,7 @@ class ServerGenericBidiReactor
   /// Similar to ServerBidiReactor::OnStarted except for argument type.
   /// Similar to ServerBidiReactor::OnStarted except for argument type.
   ///
   ///
   /// \param[in] context The context object associated with this RPC.
   /// \param[in] context The context object associated with this RPC.
-  virtual void OnStarted(GenericServerContext* context) {}
+  virtual void OnStarted(GenericServerContext* /*context*/) {}
 
 
  private:
  private:
   void OnStarted(::grpc_impl::ServerContext* ctx) final {
   void OnStarted(::grpc_impl::ServerContext* ctx) final {

+ 3 - 3
include/grpcpp/impl/codegen/async_stream_impl.h

@@ -197,7 +197,7 @@ template <class R>
 class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
 class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientAsyncReader));
     assert(size == sizeof(ClientAsyncReader));
   }
   }
 
 
@@ -346,7 +346,7 @@ template <class W>
 class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
 class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientAsyncWriter));
     assert(size == sizeof(ClientAsyncWriter));
   }
   }
 
 
@@ -514,7 +514,7 @@ class ClientAsyncReaderWriter final
     : public ClientAsyncReaderWriterInterface<W, R> {
     : public ClientAsyncReaderWriterInterface<W, R> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientAsyncReaderWriter));
     assert(size == sizeof(ClientAsyncReaderWriter));
   }
   }
 
 

+ 4 - 4
include/grpcpp/impl/codegen/async_unary_call_impl.h

@@ -96,7 +96,7 @@ class ClientAsyncResponseReader final
     : public ClientAsyncResponseReaderInterface<R> {
     : public ClientAsyncResponseReaderInterface<R> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientAsyncResponseReader));
     assert(size == sizeof(ClientAsyncResponseReader));
   }
   }
 
 
@@ -178,7 +178,7 @@ class ClientAsyncResponseReader final
 
 
   // disable operator new
   // disable operator new
   static void* operator new(std::size_t size);
   static void* operator new(std::size_t size);
-  static void* operator new(std::size_t size, void* p) { return p; }
+  static void* operator new(std::size_t /*size*/, void* p) { return p; }
 
 
   ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
   ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
                               ::grpc::internal::CallOpSendMessage,
                               ::grpc::internal::CallOpSendMessage,
@@ -303,12 +303,12 @@ namespace std {
 template <class R>
 template <class R>
 class default_delete<::grpc_impl::ClientAsyncResponseReader<R>> {
 class default_delete<::grpc_impl::ClientAsyncResponseReader<R>> {
  public:
  public:
-  void operator()(void* p) {}
+  void operator()(void* /*p*/) {}
 };
 };
 template <class R>
 template <class R>
 class default_delete<::grpc_impl::ClientAsyncResponseReaderInterface<R>> {
 class default_delete<::grpc_impl::ClientAsyncResponseReaderInterface<R>> {
  public:
  public:
-  void operator()(void* p) {}
+  void operator()(void* /*p*/) {}
 };
 };
 }  // namespace std
 }  // namespace std
 
 

+ 18 - 17
include/grpcpp/impl/codegen/call_op_set.h

@@ -206,13 +206,14 @@ namespace internal {
 template <int I>
 template <int I>
 class CallNoOp {
 class CallNoOp {
  protected:
  protected:
-  void AddOp(grpc_op* ops, size_t* nops) {}
-  void FinishOp(bool* status) {}
+  void AddOp(grpc_op* /*ops*/, size_t* /*nops*/) {}
+  void FinishOp(bool* /*status*/) {}
   void SetInterceptionHookPoint(
   void SetInterceptionHookPoint(
-      InterceptorBatchMethodsImpl* interceptor_methods) {}
+      InterceptorBatchMethodsImpl* /*interceptor_methods*/) {}
   void SetFinishInterceptionHookPoint(
   void SetFinishInterceptionHookPoint(
-      InterceptorBatchMethodsImpl* interceptor_methods) {}
-  void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {}
+      InterceptorBatchMethodsImpl* /*interceptor_methods*/) {}
+  void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) {
+  }
 };
 };
 
 
 class CallOpSendInitialMetadata {
 class CallOpSendInitialMetadata {
@@ -252,7 +253,7 @@ class CallOpSendInitialMetadata {
           maybe_compression_level_.level;
           maybe_compression_level_.level;
     }
     }
   }
   }
-  void FinishOp(bool* status) {
+  void FinishOp(bool* /*status*/) {
     if (!send_ || hijacked_) return;
     if (!send_ || hijacked_) return;
     g_core_codegen_interface->gpr_free(initial_metadata_);
     g_core_codegen_interface->gpr_free(initial_metadata_);
     send_ = false;
     send_ = false;
@@ -267,9 +268,9 @@ class CallOpSendInitialMetadata {
   }
   }
 
 
   void SetFinishInterceptionHookPoint(
   void SetFinishInterceptionHookPoint(
-      InterceptorBatchMethodsImpl* interceptor_methods) {}
+      InterceptorBatchMethodsImpl* /*interceptor_methods*/) {}
 
 
-  void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
+  void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) {
     hijacked_ = true;
     hijacked_ = true;
   }
   }
 
 
@@ -363,7 +364,7 @@ class CallOpSendMessage {
                                         nullptr);
                                         nullptr);
   }
   }
 
 
-  void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
+  void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) {
     hijacked_ = true;
     hijacked_ = true;
   }
   }
 
 
@@ -605,7 +606,7 @@ class CallOpClientSendClose {
     op->flags = 0;
     op->flags = 0;
     op->reserved = NULL;
     op->reserved = NULL;
   }
   }
-  void FinishOp(bool* status) { send_ = false; }
+  void FinishOp(bool* /*status*/) { send_ = false; }
 
 
   void SetInterceptionHookPoint(
   void SetInterceptionHookPoint(
       InterceptorBatchMethodsImpl* interceptor_methods) {
       InterceptorBatchMethodsImpl* interceptor_methods) {
@@ -615,9 +616,9 @@ class CallOpClientSendClose {
   }
   }
 
 
   void SetFinishInterceptionHookPoint(
   void SetFinishInterceptionHookPoint(
-      InterceptorBatchMethodsImpl* interceptor_methods) {}
+      InterceptorBatchMethodsImpl* /*interceptor_methods*/) {}
 
 
-  void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
+  void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) {
     hijacked_ = true;
     hijacked_ = true;
   }
   }
 
 
@@ -658,7 +659,7 @@ class CallOpServerSendStatus {
     op->reserved = NULL;
     op->reserved = NULL;
   }
   }
 
 
-  void FinishOp(bool* status) {
+  void FinishOp(bool* /*status*/) {
     if (!send_status_available_ || hijacked_) return;
     if (!send_status_available_ || hijacked_) return;
     g_core_codegen_interface->gpr_free(trailing_metadata_);
     g_core_codegen_interface->gpr_free(trailing_metadata_);
     send_status_available_ = false;
     send_status_available_ = false;
@@ -675,9 +676,9 @@ class CallOpServerSendStatus {
   }
   }
 
 
   void SetFinishInterceptionHookPoint(
   void SetFinishInterceptionHookPoint(
-      InterceptorBatchMethodsImpl* interceptor_methods) {}
+      InterceptorBatchMethodsImpl* /*interceptor_methods*/) {}
 
 
-  void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
+  void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) {
     hijacked_ = true;
     hijacked_ = true;
   }
   }
 
 
@@ -712,7 +713,7 @@ class CallOpRecvInitialMetadata {
     op->reserved = NULL;
     op->reserved = NULL;
   }
   }
 
 
-  void FinishOp(bool* status) {
+  void FinishOp(bool* /*status*/) {
     if (metadata_map_ == nullptr || hijacked_) return;
     if (metadata_map_ == nullptr || hijacked_) return;
   }
   }
 
 
@@ -766,7 +767,7 @@ class CallOpClientRecvStatus {
     op->reserved = NULL;
     op->reserved = NULL;
   }
   }
 
 
-  void FinishOp(bool* status) {
+  void FinishOp(bool* /*status*/) {
     if (recv_status_ == nullptr || hijacked_) return;
     if (recv_status_ == nullptr || hijacked_) return;
     grpc::string binary_error_details = metadata_map_->GetBinaryErrorDetails();
     grpc::string binary_error_details = metadata_map_->GetBinaryErrorDetails();
     *recv_status_ =
     *recv_status_ =

+ 2 - 2
include/grpcpp/impl/codegen/callback_common.h

@@ -69,7 +69,7 @@ class CallbackWithStatusTag
     : public grpc_experimental_completion_queue_functor {
     : public grpc_experimental_completion_queue_functor {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(CallbackWithStatusTag));
     assert(size == sizeof(CallbackWithStatusTag));
   }
   }
 
 
@@ -133,7 +133,7 @@ class CallbackWithSuccessTag
     : public grpc_experimental_completion_queue_functor {
     : public grpc_experimental_completion_queue_functor {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(CallbackWithSuccessTag));
     assert(size == sizeof(CallbackWithSuccessTag));
   }
   }
 
 

+ 4 - 4
include/grpcpp/impl/codegen/channel_interface.h

@@ -154,10 +154,10 @@ class ChannelInterface {
   // Returns an empty Call object (rather than being pure) since this is a new
   // Returns an empty Call object (rather than being pure) since this is a new
   // method and adding a new pure method to an interface would be a breaking
   // method and adding a new pure method to an interface would be a breaking
   // change (even though this is private and non-API)
   // change (even though this is private and non-API)
-  virtual internal::Call CreateCallInternal(const internal::RpcMethod& method,
-                                            ::grpc_impl::ClientContext* context,
-                                            ::grpc_impl::CompletionQueue* cq,
-                                            size_t interceptor_pos) {
+  virtual internal::Call CreateCallInternal(
+      const internal::RpcMethod& /*method*/,
+      ::grpc_impl::ClientContext* /*context*/,
+      ::grpc_impl::CompletionQueue* /*cq*/, size_t /*interceptor_pos*/) {
     return internal::Call();
     return internal::Call();
   }
   }
 
 

+ 22 - 22
include/grpcpp/impl/codegen/client_callback_impl.h

@@ -272,7 +272,7 @@ class ClientBidiReactor {
   /// have completed and provides the RPC status outcome.
   /// have completed and provides the RPC status outcome.
   ///
   ///
   /// \param[in] s The status outcome of this RPC
   /// \param[in] s The status outcome of this RPC
-  virtual void OnDone(const ::grpc::Status& s) {}
+  virtual void OnDone(const ::grpc::Status& /*s*/) {}
 
 
   /// Notifies the application that a read of initial metadata from the
   /// Notifies the application that a read of initial metadata from the
   /// server is done. If the application chooses not to implement this method,
   /// server is done. If the application chooses not to implement this method,
@@ -281,19 +281,19 @@ class ClientBidiReactor {
   ///
   ///
   /// \param[in] ok Was the initial metadata read successfully? If false, no
   /// \param[in] ok Was the initial metadata read successfully? If false, no
   ///               further read-side operation will succeed.
   ///               further read-side operation will succeed.
-  virtual void OnReadInitialMetadataDone(bool ok) {}
+  virtual void OnReadInitialMetadataDone(bool /*ok*/) {}
 
 
   /// Notifies the application that a StartRead operation completed.
   /// Notifies the application that a StartRead operation completed.
   ///
   ///
   /// \param[in] ok Was it successful? If false, no further read-side operation
   /// \param[in] ok Was it successful? If false, no further read-side operation
   ///               will succeed.
   ///               will succeed.
-  virtual void OnReadDone(bool ok) {}
+  virtual void OnReadDone(bool /*ok*/) {}
 
 
   /// Notifies the application that a StartWrite operation completed.
   /// Notifies the application that a StartWrite operation completed.
   ///
   ///
   /// \param[in] ok Was it successful? If false, no further write-side operation
   /// \param[in] ok Was it successful? If false, no further write-side operation
   ///               will succeed.
   ///               will succeed.
-  virtual void OnWriteDone(bool ok) {}
+  virtual void OnWriteDone(bool /*ok*/) {}
 
 
   /// Notifies the application that a StartWritesDone operation completed. Note
   /// Notifies the application that a StartWritesDone operation completed. Note
   /// that this is only used on explicit StartWritesDone operations and not for
   /// that this is only used on explicit StartWritesDone operations and not for
@@ -301,7 +301,7 @@ class ClientBidiReactor {
   ///
   ///
   /// \param[in] ok Was it successful? If false, the application will later see
   /// \param[in] ok Was it successful? If false, the application will later see
   ///               the failure reflected as a bad status in OnDone.
   ///               the failure reflected as a bad status in OnDone.
-  virtual void OnWritesDoneDone(bool ok) {}
+  virtual void OnWritesDoneDone(bool /*ok*/) {}
 
 
  private:
  private:
   friend class ClientCallbackReaderWriter<Request, Response>;
   friend class ClientCallbackReaderWriter<Request, Response>;
@@ -325,9 +325,9 @@ class ClientReadReactor {
   void AddMultipleHolds(int holds) { reader_->AddHold(holds); }
   void AddMultipleHolds(int holds) { reader_->AddHold(holds); }
   void RemoveHold() { reader_->RemoveHold(); }
   void RemoveHold() { reader_->RemoveHold(); }
 
 
-  virtual void OnDone(const ::grpc::Status& s) {}
-  virtual void OnReadInitialMetadataDone(bool ok) {}
-  virtual void OnReadDone(bool ok) {}
+  virtual void OnDone(const ::grpc::Status& /*s*/) {}
+  virtual void OnReadInitialMetadataDone(bool /*ok*/) {}
+  virtual void OnReadDone(bool /*ok*/) {}
 
 
  private:
  private:
   friend class ClientCallbackReader<Response>;
   friend class ClientCallbackReader<Response>;
@@ -358,10 +358,10 @@ class ClientWriteReactor {
   void AddMultipleHolds(int holds) { writer_->AddHold(holds); }
   void AddMultipleHolds(int holds) { writer_->AddHold(holds); }
   void RemoveHold() { writer_->RemoveHold(); }
   void RemoveHold() { writer_->RemoveHold(); }
 
 
-  virtual void OnDone(const ::grpc::Status& s) {}
-  virtual void OnReadInitialMetadataDone(bool ok) {}
-  virtual void OnWriteDone(bool ok) {}
-  virtual void OnWritesDoneDone(bool ok) {}
+  virtual void OnDone(const ::grpc::Status& /*s*/) {}
+  virtual void OnReadInitialMetadataDone(bool /*ok*/) {}
+  virtual void OnWriteDone(bool /*ok*/) {}
+  virtual void OnWritesDoneDone(bool /*ok*/) {}
 
 
  private:
  private:
   friend class ClientCallbackWriter<Request>;
   friend class ClientCallbackWriter<Request>;
@@ -385,8 +385,8 @@ class ClientUnaryReactor {
   virtual ~ClientUnaryReactor() {}
   virtual ~ClientUnaryReactor() {}
 
 
   void StartCall() { call_->StartCall(); }
   void StartCall() { call_->StartCall(); }
-  virtual void OnDone(const ::grpc::Status& s) {}
-  virtual void OnReadInitialMetadataDone(bool ok) {}
+  virtual void OnDone(const ::grpc::Status& /*s*/) {}
+  virtual void OnReadInitialMetadataDone(bool /*ok*/) {}
 
 
  private:
  private:
   friend class ClientCallbackUnary;
   friend class ClientCallbackUnary;
@@ -416,7 +416,7 @@ class ClientCallbackReaderWriterImpl
     : public experimental::ClientCallbackReaderWriter<Request, Response> {
     : public experimental::ClientCallbackReaderWriter<Request, Response> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientCallbackReaderWriterImpl));
     assert(size == sizeof(ClientCallbackReaderWriterImpl));
   }
   }
 
 
@@ -490,7 +490,7 @@ class ClientCallbackReaderWriterImpl
       call_.PerformOps(&writes_done_ops_);
       call_.PerformOps(&writes_done_ops_);
     }
     }
 
 
-    finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
+    finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); },
                     &finish_ops_);
                     &finish_ops_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
@@ -628,7 +628,7 @@ class ClientCallbackReaderImpl
     : public experimental::ClientCallbackReader<Response> {
     : public experimental::ClientCallbackReader<Response> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientCallbackReaderImpl));
     assert(size == sizeof(ClientCallbackReaderImpl));
   }
   }
 
 
@@ -682,7 +682,7 @@ class ClientCallbackReaderImpl
       call_.PerformOps(&read_ops_);
       call_.PerformOps(&read_ops_);
     }
     }
 
 
-    finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
+    finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); },
                     &finish_ops_);
                     &finish_ops_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
@@ -768,7 +768,7 @@ class ClientCallbackWriterImpl
     : public experimental::ClientCallbackWriter<Request> {
     : public experimental::ClientCallbackWriter<Request> {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientCallbackWriterImpl));
     assert(size == sizeof(ClientCallbackWriterImpl));
   }
   }
 
 
@@ -830,7 +830,7 @@ class ClientCallbackWriterImpl
       call_.PerformOps(&writes_done_ops_);
       call_.PerformOps(&writes_done_ops_);
     }
     }
 
 
-    finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
+    finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); },
                     &finish_ops_);
                     &finish_ops_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
@@ -956,7 +956,7 @@ class ClientCallbackWriterFactory {
 class ClientCallbackUnaryImpl final : public experimental::ClientCallbackUnary {
 class ClientCallbackUnaryImpl final : public experimental::ClientCallbackUnary {
  public:
  public:
   // always allocated against a call arena, no memory free required
   // always allocated against a call arena, no memory free required
-  static void operator delete(void* ptr, std::size_t size) {
+  static void operator delete(void* /*ptr*/, std::size_t size) {
     assert(size == sizeof(ClientCallbackUnaryImpl));
     assert(size == sizeof(ClientCallbackUnaryImpl));
   }
   }
 
 
@@ -985,7 +985,7 @@ class ClientCallbackUnaryImpl final : public experimental::ClientCallbackUnary {
     start_ops_.set_core_cq_tag(&start_tag_);
     start_ops_.set_core_cq_tag(&start_tag_);
     call_.PerformOps(&start_ops_);
     call_.PerformOps(&start_ops_);
 
 
-    finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
+    finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); },
                     &finish_ops_);
                     &finish_ops_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.ClientRecvStatus(context_, &finish_status_);
     finish_ops_.set_core_cq_tag(&finish_tag_);
     finish_ops_.set_core_cq_tag(&finish_tag_);

+ 2 - 2
include/grpcpp/impl/codegen/interceptor_common.h

@@ -465,7 +465,7 @@ class CancelInterceptorBatchMethods
     return nullptr;
     return nullptr;
   }
   }
 
 
-  void ModifySendMessage(const void* message) override {
+  void ModifySendMessage(const void* /*message*/) override {
     GPR_CODEGEN_ASSERT(
     GPR_CODEGEN_ASSERT(
         false &&
         false &&
         "It is illegal to call ModifySendMessage on a method which "
         "It is illegal to call ModifySendMessage on a method which "
@@ -486,7 +486,7 @@ class CancelInterceptorBatchMethods
     return Status();
     return Status();
   }
   }
 
 
-  void ModifySendStatus(const Status& status) override {
+  void ModifySendStatus(const Status& /*status*/) override {
     GPR_CODEGEN_ASSERT(false &&
     GPR_CODEGEN_ASSERT(false &&
                        "It is illegal to call ModifySendStatus on a method "
                        "It is illegal to call ModifySendStatus on a method "
                        "which has a Cancel notification");
                        "which has a Cancel notification");

+ 4 - 4
include/grpcpp/impl/codegen/method_handler_impl.h

@@ -88,7 +88,7 @@ class RpcMethodHandler : public MethodHandler {
   }
   }
 
 
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req, Status* status,
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req, Status* status,
-                    void** handler_data) final {
+                    void** /*handler_data*/) final {
     ByteBuffer buf;
     ByteBuffer buf;
     buf.set_buffer(req);
     buf.set_buffer(req);
     auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
     auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
@@ -193,7 +193,7 @@ class ServerStreamingHandler : public MethodHandler {
   }
   }
 
 
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req, Status* status,
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req, Status* status,
-                    void** handler_data) final {
+                    void** /*handler_data*/) final {
     ByteBuffer buf;
     ByteBuffer buf;
     buf.set_buffer(req);
     buf.set_buffer(req);
     auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
     auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
@@ -328,8 +328,8 @@ class ErrorMethodHandler : public MethodHandler {
     param.call->cq()->Pluck(&ops);
     param.call->cq()->Pluck(&ops);
   }
   }
 
 
-  void* Deserialize(grpc_call* call, grpc_byte_buffer* req, Status* status,
-                    void** handler_data) final {
+  void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req,
+                    Status* /*status*/, void** /*handler_data*/) final {
     // We have to destroy any request payload
     // We have to destroy any request payload
     if (req != nullptr) {
     if (req != nullptr) {
       g_core_codegen_interface->grpc_byte_buffer_destroy(req);
       g_core_codegen_interface->grpc_byte_buffer_destroy(req);

+ 2 - 2
include/grpcpp/impl/codegen/rpc_service_method.h

@@ -76,8 +76,8 @@ class MethodHandler {
      a HandlerParameter and passed to RunHandler. It is illegal to access the
      a HandlerParameter and passed to RunHandler. It is illegal to access the
      pointer after calling RunHandler. Ownership of the deserialized request is
      pointer after calling RunHandler. Ownership of the deserialized request is
      retained by the handler. Returns nullptr if deserialization failed. */
      retained by the handler. Returns nullptr if deserialization failed. */
-  virtual void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
-                            Status* status, void** handler_data) {
+  virtual void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req,
+                            Status* /*status*/, void** /*handler_data*/) {
     GPR_CODEGEN_ASSERT(req == nullptr);
     GPR_CODEGEN_ASSERT(req == nullptr);
     return nullptr;
     return nullptr;
   }
   }

+ 13 - 12
include/grpcpp/impl/codegen/server_callback_impl.h

@@ -314,7 +314,7 @@ class ServerBidiReactor : public internal::ServerReactor {
   /// is a result of the client calling StartCall().
   /// is a result of the client calling StartCall().
   ///
   ///
   /// \param[in] context The context object now associated with this RPC
   /// \param[in] context The context object now associated with this RPC
-  virtual void OnStarted(::grpc_impl::ServerContext* context) {}
+  virtual void OnStarted(::grpc_impl::ServerContext* /*context*/) {}
 
 
   /// Notifies the application that an explicit StartSendInitialMetadata
   /// Notifies the application that an explicit StartSendInitialMetadata
   /// operation completed. Not used when the sending of initial metadata
   /// operation completed. Not used when the sending of initial metadata
@@ -322,20 +322,20 @@ class ServerBidiReactor : public internal::ServerReactor {
   ///
   ///
   /// \param[in] ok Was it successful? If false, no further write-side operation
   /// \param[in] ok Was it successful? If false, no further write-side operation
   ///               will succeed.
   ///               will succeed.
-  virtual void OnSendInitialMetadataDone(bool ok) {}
+  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
 
 
   /// Notifies the application that a StartRead operation completed.
   /// Notifies the application that a StartRead operation completed.
   ///
   ///
   /// \param[in] ok Was it successful? If false, no further read-side operation
   /// \param[in] ok Was it successful? If false, no further read-side operation
   ///               will succeed.
   ///               will succeed.
-  virtual void OnReadDone(bool ok) {}
+  virtual void OnReadDone(bool /*ok*/) {}
 
 
   /// Notifies the application that a StartWrite (or StartWriteLast) operation
   /// Notifies the application that a StartWrite (or StartWriteLast) operation
   /// completed.
   /// completed.
   ///
   ///
   /// \param[in] ok Was it successful? If false, no further write-side operation
   /// \param[in] ok Was it successful? If false, no further write-side operation
   ///               will succeed.
   ///               will succeed.
-  virtual void OnWriteDone(bool ok) {}
+  virtual void OnWriteDone(bool /*ok*/) {}
 
 
   /// Notifies the application that all operations associated with this RPC
   /// Notifies the application that all operations associated with this RPC
   /// have completed. This is an override (from the internal base class) but not
   /// have completed. This is an override (from the internal base class) but not
@@ -376,11 +376,12 @@ class ServerReadReactor : public internal::ServerReactor {
   ///
   ///
   /// \param[in] context The context object now associated with this RPC
   /// \param[in] context The context object now associated with this RPC
   /// \param[in] resp The response object to be used by this RPC
   /// \param[in] resp The response object to be used by this RPC
-  virtual void OnStarted(::grpc_impl::ServerContext* context, Response* resp) {}
+  virtual void OnStarted(::grpc_impl::ServerContext* /*context*/,
+                         Response* /*resp*/) {}
 
 
   /// The following notifications are exactly like ServerBidiReactor.
   /// The following notifications are exactly like ServerBidiReactor.
-  virtual void OnSendInitialMetadataDone(bool ok) {}
-  virtual void OnReadDone(bool ok) {}
+  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
+  virtual void OnReadDone(bool /*ok*/) {}
   void OnDone() override {}
   void OnDone() override {}
   void OnCancel() override {}
   void OnCancel() override {}
 
 
@@ -423,12 +424,12 @@ class ServerWriteReactor : public internal::ServerReactor {
   ///
   ///
   /// \param[in] context The context object now associated with this RPC
   /// \param[in] context The context object now associated with this RPC
   /// \param[in] req The request object sent by the client
   /// \param[in] req The request object sent by the client
-  virtual void OnStarted(::grpc_impl::ServerContext* context,
-                         const Request* req) {}
+  virtual void OnStarted(::grpc_impl::ServerContext* /*context*/,
+                         const Request* /*req*/) {}
 
 
   /// The following notifications are exactly like ServerBidiReactor.
   /// The following notifications are exactly like ServerBidiReactor.
-  virtual void OnSendInitialMetadataDone(bool ok) {}
-  virtual void OnWriteDone(bool ok) {}
+  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
+  virtual void OnWriteDone(bool /*ok*/) {}
   void OnDone() override {}
   void OnDone() override {}
   void OnCancel() override {}
   void OnCancel() override {}
 
 
@@ -849,7 +850,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler {
   }
   }
 
 
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
   void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
-                    ::grpc::Status* status, void** handler_data) final {
+                    ::grpc::Status* status, void** /*handler_data*/) final {
     ::grpc::ByteBuffer buf;
     ::grpc::ByteBuffer buf;
     buf.set_buffer(req);
     buf.set_buffer(req);
     auto* request =
     auto* request =

+ 1 - 1
include/grpcpp/impl/codegen/server_interface.h

@@ -130,7 +130,7 @@ class ServerInterface : public internal::CallHook {
     virtual ~experimental_registration_interface() {}
     virtual ~experimental_registration_interface() {}
     /// May not be abstract since this is a post-1.0 API addition
     /// May not be abstract since this is a post-1.0 API addition
     virtual void RegisterCallbackGenericService(
     virtual void RegisterCallbackGenericService(
-        experimental::CallbackGenericService* service) {}
+        experimental::CallbackGenericService* /*service*/) {}
   };
   };
 
 
   /// NOTE: The function experimental_registration() is not stable public API.
   /// NOTE: The function experimental_registration() is not stable public API.

+ 1 - 1
include/grpcpp/impl/codegen/time.h

@@ -39,7 +39,7 @@ namespace grpc {
 template <typename T>
 template <typename T>
 class TimePoint {
 class TimePoint {
  public:
  public:
-  TimePoint(const T& time) { you_need_a_specialization_of_TimePoint(); }
+  TimePoint(const T& /*time*/) { you_need_a_specialization_of_TimePoint(); }
   gpr_timespec raw_time() {
   gpr_timespec raw_time() {
     gpr_timespec t;
     gpr_timespec t;
     return t;
     return t;

+ 2 - 2
include/grpcpp/impl/server_builder_plugin.h

@@ -42,7 +42,7 @@ class ServerBuilderPlugin {
   /// UpdateServerBuilder will be called at an early stage in
   /// UpdateServerBuilder will be called at an early stage in
   /// ServerBuilder::BuildAndStart(), right after the ServerBuilderOptions have
   /// ServerBuilder::BuildAndStart(), right after the ServerBuilderOptions have
   /// done their updates.
   /// done their updates.
-  virtual void UpdateServerBuilder(grpc_impl::ServerBuilder* builder) {}
+  virtual void UpdateServerBuilder(grpc_impl::ServerBuilder* /*builder*/) {}
 
 
   /// InitServer will be called in ServerBuilder::BuildAndStart(), after the
   /// InitServer will be called in ServerBuilder::BuildAndStart(), after the
   /// Server instance is created.
   /// Server instance is created.
@@ -57,7 +57,7 @@ class ServerBuilderPlugin {
 
 
   /// UpdateChannelArguments will be called in ServerBuilder::BuildAndStart(),
   /// UpdateChannelArguments will be called in ServerBuilder::BuildAndStart(),
   /// before the Server instance is created.
   /// before the Server instance is created.
-  virtual void UpdateChannelArguments(ChannelArguments* args) {}
+  virtual void UpdateChannelArguments(ChannelArguments* /*args*/) {}
 
 
   virtual bool has_sync_methods() const { return false; }
   virtual bool has_sync_methods() const { return false; }
   virtual bool has_async_methods() const { return false; }
   virtual bool has_async_methods() const { return false; }

+ 2 - 2
include/grpcpp/security/credentials_impl.h

@@ -95,10 +95,10 @@ class ChannelCredentials : private grpc::GrpcLibraryCodegen {
   // This function should have been a pure virtual function, but it is
   // This function should have been a pure virtual function, but it is
   // implemented as a virtual function so that it does not break API.
   // implemented as a virtual function so that it does not break API.
   virtual std::shared_ptr<Channel> CreateChannelWithInterceptors(
   virtual std::shared_ptr<Channel> CreateChannelWithInterceptors(
-      const grpc::string& target, const ChannelArguments& args,
+      const grpc::string& /*target*/, const ChannelArguments& /*args*/,
       std::vector<std::unique_ptr<
       std::vector<std::unique_ptr<
           grpc::experimental::ClientInterceptorFactoryInterface>>
           grpc::experimental::ClientInterceptorFactoryInterface>>
-          interceptor_creators) {
+      /*interceptor_creators*/) {
     return nullptr;
     return nullptr;
   }
   }
 };
 };

+ 4 - 4
include/grpcpp/server_impl.h

@@ -81,16 +81,16 @@ class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen {
    public:
    public:
     virtual ~GlobalCallbacks() {}
     virtual ~GlobalCallbacks() {}
     /// Called before server is created.
     /// Called before server is created.
-    virtual void UpdateArguments(ChannelArguments* args) {}
+    virtual void UpdateArguments(ChannelArguments* /*args*/) {}
     /// Called before application callback for each synchronous server request
     /// Called before application callback for each synchronous server request
     virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0;
     virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0;
     /// Called after application callback for each synchronous server request
     /// Called after application callback for each synchronous server request
     virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0;
     virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0;
     /// Called before server is started.
     /// Called before server is started.
-    virtual void PreServerStart(Server* server) {}
+    virtual void PreServerStart(Server* /*server*/) {}
     /// Called after a server port is added.
     /// Called after a server port is added.
-    virtual void AddPort(Server* server, const grpc::string& addr,
-                         grpc::ServerCredentials* creds, int port) {}
+    virtual void AddPort(Server* /*server*/, const grpc::string& /*addr*/,
+                         grpc::ServerCredentials* /*creds*/, int /*port*/) {}
   };
   };
   /// Set the global callback object. Can only be called once per application.
   /// Set the global callback object. Can only be called once per application.
   /// Does not take ownership of callbacks, and expects the pointed to object
   /// Does not take ownership of callbacks, and expects the pointed to object

+ 1 - 1
include/grpcpp/support/channel_arguments_impl.h

@@ -132,7 +132,7 @@ class ChannelArguments {
   /// Default pointer argument operations.
   /// Default pointer argument operations.
   struct PointerVtableMembers {
   struct PointerVtableMembers {
     static void* Copy(void* in) { return in; }
     static void* Copy(void* in) { return in; }
-    static void Destroy(void* in) {}
+    static void Destroy(void* /*in*/) {}
     static int Compare(void* a, void* b) {
     static int Compare(void* a, void* b) {
       if (a < b) return -1;
       if (a < b) return -1;
       if (a > b) return 1;
       if (a > b) return 1;

+ 32 - 24
package.xml

@@ -287,6 +287,7 @@
     <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/chttp2_connector.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/chttp2_connector.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backend_metric.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_channelz.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_channelz.h" role="src" />
@@ -316,6 +317,19 @@
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/subchannel_pool_interface.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/subchannel_pool_interface.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/deadline/deadline_filter.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/deadline/deadline_filter.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/gogoproto/gogo.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/annotations.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/http.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/any.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/descriptor.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/duration.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/empty.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/struct.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/timestamp.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/wrappers.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/rpc/status.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/local_transport_security.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/local_transport_security.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/ssl/session_cache/ssl_session.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/ssl/session_cache/ssl_session.h" role="src" />
@@ -475,16 +489,6 @@
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/annotations.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/http.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/any.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/descriptor.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/duration.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/empty.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/struct.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/timestamp.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/wrappers.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/rpc/status.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h" role="src" />
@@ -492,6 +496,7 @@
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cds.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cds.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/eds.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/eds.upb.h" role="src" />
@@ -504,11 +509,10 @@
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/percent.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/percent.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/range.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/range.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/gogoproto/gogo.upb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/subchannel_list.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/subchannel_list.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" role="src" />
@@ -782,6 +786,7 @@
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/chttp2_connector.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/chttp2_connector.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backend_metric.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/channel_connectivity.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/channel_connectivity.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.cc" role="src" />
@@ -810,6 +815,19 @@
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/subchannel_pool_interface.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/subchannel_pool_interface.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/deadline/deadline_filter.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/deadline/deadline_filter.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/gogoproto/gogo.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/annotations.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/http.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/any.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/descriptor.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/duration.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/empty.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/struct.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/timestamp.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/wrappers.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/rpc/status.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/local_transport_security.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/local_transport_security.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc" role="src" />
@@ -829,16 +847,6 @@
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/annotations.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/api/http.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/any.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/descriptor.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/duration.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/empty.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/struct.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/timestamp.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/protobuf/wrappers.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/google/rpc/status.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc" role="src" />
@@ -847,6 +855,7 @@
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cds.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cds.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/eds.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/eds.upb.c" role="src" />
@@ -859,11 +868,10 @@
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/percent.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/percent.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/range.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/range.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/gogoproto/gogo.upb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc" role="src" />

+ 45 - 40
src/compiler/cpp_generator.cc

@@ -794,8 +794,8 @@ void PrintHeaderServerAsyncMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -815,9 +815,9 @@ void PrintHeaderServerAsyncMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReader< $Request$>* reader, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReader< $Request$>* /*reader*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -837,8 +837,8 @@ void PrintHeaderServerAsyncMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "::grpc::ServerWriter< $Response$>* writer) override "
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "::grpc::ServerWriter< $Response$>* /*writer*/) override "
         "{\n"
         "{\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -860,8 +860,8 @@ void PrintHeaderServerAsyncMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) "
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
         " override {\n"
         " override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -896,7 +896,8 @@ void PrintHeaderServerMethodAsync(grpc_generator::Printer* printer,
                  "class WithAsyncMethod_$Method$ : public BaseClass {\n");
                  "class WithAsyncMethod_$Method$ : public BaseClass {\n");
   printer->Print(
   printer->Print(
       " private:\n"
       " private:\n"
-      "  void BaseClassMustBeDerivedFromService(const Service *service) {}\n");
+      "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
+      "{}\n");
   printer->Print(" public:\n");
   printer->Print(" public:\n");
   printer->Indent();
   printer->Indent();
   printer->Print(*vars,
   printer->Print(*vars,
@@ -923,16 +924,16 @@ void PrintHeaderServerCallbackMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
     printer->Print(
     printer->Print(
         *vars,
         *vars,
         "virtual void $Method$("
         "virtual void $Method$("
-        "::grpc::ServerContext* context, const $RealRequest$* request, "
-        "$RealResponse$* response, "
+        "::grpc::ServerContext* /*context*/, const $RealRequest$* /*request*/, "
+        "$RealResponse$* /*response*/, "
         "::grpc::experimental::ServerCallbackRpcController* "
         "::grpc::experimental::ServerCallbackRpcController* "
         "controller) { controller->Finish(::grpc::Status("
         "controller) { controller->Finish(::grpc::Status("
         "::grpc::StatusCode::UNIMPLEMENTED, \"\")); }\n");
         "::grpc::StatusCode::UNIMPLEMENTED, \"\")); }\n");
@@ -941,9 +942,9 @@ void PrintHeaderServerCallbackMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReader< $Request$>* reader, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReader< $Request$>* /*reader*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -958,8 +959,8 @@ void PrintHeaderServerCallbackMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "::grpc::ServerWriter< $Response$>* writer) override "
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "::grpc::ServerWriter< $Response$>* /*writer*/) override "
         "{\n"
         "{\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -975,8 +976,8 @@ void PrintHeaderServerCallbackMethodsHelper(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) "
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
         " override {\n"
         " override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -1006,7 +1007,8 @@ void PrintHeaderServerMethodCallback(
       "class ExperimentalWithCallbackMethod_$Method$ : public BaseClass {\n");
       "class ExperimentalWithCallbackMethod_$Method$ : public BaseClass {\n");
   printer->Print(
   printer->Print(
       " private:\n"
       " private:\n"
-      "  void BaseClassMustBeDerivedFromService(const Service *service) {}\n");
+      "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
+      "{}\n");
   printer->Print(" public:\n");
   printer->Print(" public:\n");
   printer->Indent();
   printer->Indent();
   printer->Print(*vars, "ExperimentalWithCallbackMethod_$Method$() {\n");
   printer->Print(*vars, "ExperimentalWithCallbackMethod_$Method$() {\n");
@@ -1080,7 +1082,8 @@ void PrintHeaderServerMethodRawCallback(
                  "BaseClass {\n");
                  "BaseClass {\n");
   printer->Print(
   printer->Print(
       " private:\n"
       " private:\n"
-      "  void BaseClassMustBeDerivedFromService(const Service *service) {}\n");
+      "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
+      "{}\n");
   printer->Print(" public:\n");
   printer->Print(" public:\n");
   printer->Indent();
   printer->Indent();
   printer->Print(*vars, "ExperimentalWithRawCallbackMethod_$Method$() {\n");
   printer->Print(*vars, "ExperimentalWithRawCallbackMethod_$Method$() {\n");
@@ -1143,7 +1146,7 @@ void PrintHeaderServerMethodStreamedUnary(
                    "public BaseClass {\n");
                    "public BaseClass {\n");
     printer->Print(
     printer->Print(
         " private:\n"
         " private:\n"
-        "  void BaseClassMustBeDerivedFromService(const Service *service) "
+        "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
         "{}\n");
         "{}\n");
     printer->Print(" public:\n");
     printer->Print(" public:\n");
     printer->Indent();
     printer->Indent();
@@ -1164,8 +1167,8 @@ void PrintHeaderServerMethodStreamedUnary(
         *vars,
         *vars,
         "// disable regular version of this method\n"
         "// disable regular version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -1194,7 +1197,7 @@ void PrintHeaderServerMethodSplitStreaming(
                    "public BaseClass {\n");
                    "public BaseClass {\n");
     printer->Print(
     printer->Print(
         " private:\n"
         " private:\n"
-        "  void BaseClassMustBeDerivedFromService(const Service *service) "
+        "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
         "{}\n");
         "{}\n");
     printer->Print(" public:\n");
     printer->Print(" public:\n");
     printer->Indent();
     printer->Indent();
@@ -1216,8 +1219,8 @@ void PrintHeaderServerMethodSplitStreaming(
         *vars,
         *vars,
         "// disable regular version of this method\n"
         "// disable regular version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "::grpc::ServerWriter< $Response$>* writer) override "
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "::grpc::ServerWriter< $Response$>* /*writer*/) override "
         "{\n"
         "{\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -1245,7 +1248,8 @@ void PrintHeaderServerMethodGeneric(
                  "class WithGenericMethod_$Method$ : public BaseClass {\n");
                  "class WithGenericMethod_$Method$ : public BaseClass {\n");
   printer->Print(
   printer->Print(
       " private:\n"
       " private:\n"
-      "  void BaseClassMustBeDerivedFromService(const Service *service) {}\n");
+      "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
+      "{}\n");
   printer->Print(" public:\n");
   printer->Print(" public:\n");
   printer->Indent();
   printer->Indent();
   printer->Print(*vars,
   printer->Print(*vars,
@@ -1261,8 +1265,8 @@ void PrintHeaderServerMethodGeneric(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -1271,9 +1275,9 @@ void PrintHeaderServerMethodGeneric(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReader< $Request$>* reader, "
-        "$Response$* response) override {\n"
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReader< $Request$>* /*reader*/, "
+        "$Response$* /*response*/) override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "}\n");
         "}\n");
@@ -1282,8 +1286,8 @@ void PrintHeaderServerMethodGeneric(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, const $Request$* request, "
-        "::grpc::ServerWriter< $Response$>* writer) override "
+        "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
+        "::grpc::ServerWriter< $Response$>* /*writer*/) override "
         "{\n"
         "{\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -1293,8 +1297,8 @@ void PrintHeaderServerMethodGeneric(
         *vars,
         *vars,
         "// disable synchronous version of this method\n"
         "// disable synchronous version of this method\n"
         "::grpc::Status $Method$("
         "::grpc::Status $Method$("
-        "::grpc::ServerContext* context, "
-        "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) "
+        "::grpc::ServerContext* /*context*/, "
+        "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
         " override {\n"
         " override {\n"
         "  abort();\n"
         "  abort();\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
         "  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
@@ -1318,7 +1322,8 @@ void PrintHeaderServerMethodRaw(grpc_generator::Printer* printer,
   printer->Print(*vars, "class WithRawMethod_$Method$ : public BaseClass {\n");
   printer->Print(*vars, "class WithRawMethod_$Method$ : public BaseClass {\n");
   printer->Print(
   printer->Print(
       " private:\n"
       " private:\n"
-      "  void BaseClassMustBeDerivedFromService(const Service *service) {}\n");
+      "  void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
+      "{}\n");
   printer->Print(" public:\n");
   printer->Print(" public:\n");
   printer->Indent();
   printer->Indent();
   printer->Print(*vars,
   printer->Print(*vars,

+ 41 - 59
src/compiler/csharp_generator.cc

@@ -414,34 +414,24 @@ void GenerateServerClass(Printer* out, const ServiceDescriptor* service) {
   out->Print("\n");
   out->Print("\n");
 }
 }
 
 
-void GenerateClientStub(Printer* out, const ServiceDescriptor* service,
-                        bool lite_client) {
-  if (!lite_client) {
-    out->Print("/// <summary>Client for $servicename$</summary>\n",
-               "servicename", GetServiceClassName(service));
-    out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n",
-               "name", GetClientClassName(service));
-  } else {
-    out->Print("/// <summary>Lite client for $servicename$</summary>\n",
-               "servicename", GetServiceClassName(service));
-    out->Print("public partial class $name$ : grpc::LiteClientBase\n", "name",
-               GetClientClassName(service));
-  }
+void GenerateClientStub(Printer* out, const ServiceDescriptor* service) {
+  out->Print("/// <summary>Client for $servicename$</summary>\n", "servicename",
+             GetServiceClassName(service));
+  out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n", "name",
+             GetClientClassName(service));
   out->Print("{\n");
   out->Print("{\n");
   out->Indent();
   out->Indent();
 
 
   // constructors
   // constructors
-  if (!lite_client) {
-    out->Print(
-        "/// <summary>Creates a new client for $servicename$</summary>\n"
-        "/// <param name=\"channel\">The channel to use to make remote "
-        "calls.</param>\n",
-        "servicename", GetServiceClassName(service));
-    out->Print("public $name$(grpc::ChannelBase channel) : base(channel)\n",
-               "name", GetClientClassName(service));
-    out->Print("{\n");
-    out->Print("}\n");
-  }
+  out->Print(
+      "/// <summary>Creates a new client for $servicename$</summary>\n"
+      "/// <param name=\"channel\">The channel to use to make remote "
+      "calls.</param>\n",
+      "servicename", GetServiceClassName(service));
+  out->Print("public $name$(grpc::ChannelBase channel) : base(channel)\n",
+             "name", GetClientClassName(service));
+  out->Print("{\n");
+  out->Print("}\n");
   out->Print(
   out->Print(
       "/// <summary>Creates a new client for $servicename$ that uses a custom "
       "/// <summary>Creates a new client for $servicename$ that uses a custom "
       "<c>CallInvoker</c>.</summary>\n"
       "<c>CallInvoker</c>.</summary>\n"
@@ -460,20 +450,16 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor* service,
              GetClientClassName(service));
              GetClientClassName(service));
   out->Print("{\n");
   out->Print("{\n");
   out->Print("}\n");
   out->Print("}\n");
-  if (!lite_client) {
-    out->Print(
-        "/// <summary>Protected constructor to allow creation of configured "
-        "clients.</summary>\n"
-        "/// <param name=\"configuration\">The client "
-        "configuration.</param>\n");
-    out->Print(
-        "protected $name$(ClientBaseConfiguration configuration)"
-        " : base(configuration)\n",
-        "name", GetClientClassName(service));
-    out->Print("{\n");
-    out->Print("}\n");
-  }
-  out->Print("\n");
+  out->Print(
+      "/// <summary>Protected constructor to allow creation of configured "
+      "clients.</summary>\n"
+      "/// <param name=\"configuration\">The client configuration.</param>\n");
+  out->Print(
+      "protected $name$(ClientBaseConfiguration configuration)"
+      " : base(configuration)\n",
+      "name", GetClientClassName(service));
+  out->Print("{\n");
+  out->Print("}\n\n");
 
 
   for (int i = 0; i < service->method_count(); i++) {
   for (int i = 0; i < service->method_count(); i++) {
     const MethodDescriptor* method = service->method(i);
     const MethodDescriptor* method = service->method(i);
@@ -591,21 +577,19 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor* service,
   }
   }
 
 
   // override NewInstance method
   // override NewInstance method
-  if (!lite_client) {
-    out->Print(
-        "/// <summary>Creates a new instance of client from given "
-        "<c>ClientBaseConfiguration</c>.</summary>\n");
-    out->Print(
-        "protected override $name$ NewInstance(ClientBaseConfiguration "
-        "configuration)\n",
-        "name", GetClientClassName(service));
-    out->Print("{\n");
-    out->Indent();
-    out->Print("return new $name$(configuration);\n", "name",
-               GetClientClassName(service));
-    out->Outdent();
-    out->Print("}\n");
-  }
+  out->Print(
+      "/// <summary>Creates a new instance of client from given "
+      "<c>ClientBaseConfiguration</c>.</summary>\n");
+  out->Print(
+      "protected override $name$ NewInstance(ClientBaseConfiguration "
+      "configuration)\n",
+      "name", GetClientClassName(service));
+  out->Print("{\n");
+  out->Indent();
+  out->Print("return new $name$(configuration);\n", "name",
+             GetClientClassName(service));
+  out->Outdent();
+  out->Print("}\n");
 
 
   out->Outdent();
   out->Outdent();
   out->Print("}\n");
   out->Print("}\n");
@@ -687,7 +671,7 @@ void GenerateBindServiceWithBinderMethod(Printer* out,
 
 
 void GenerateService(Printer* out, const ServiceDescriptor* service,
 void GenerateService(Printer* out, const ServiceDescriptor* service,
                      bool generate_client, bool generate_server,
                      bool generate_client, bool generate_server,
-                     bool internal_access, bool lite_client) {
+                     bool internal_access) {
   GenerateDocCommentBody(out, service);
   GenerateDocCommentBody(out, service);
   out->Print("$access_level$ static partial class $classname$\n",
   out->Print("$access_level$ static partial class $classname$\n",
              "access_level", GetAccessLevel(internal_access), "classname",
              "access_level", GetAccessLevel(internal_access), "classname",
@@ -709,9 +693,8 @@ void GenerateService(Printer* out, const ServiceDescriptor* service,
     GenerateServerClass(out, service);
     GenerateServerClass(out, service);
   }
   }
   if (generate_client) {
   if (generate_client) {
-    GenerateClientStub(out, service, lite_client);
+    GenerateClientStub(out, service);
   }
   }
-
   if (generate_server) {
   if (generate_server) {
     GenerateBindServiceMethod(out, service);
     GenerateBindServiceMethod(out, service);
     GenerateBindServiceWithBinderMethod(out, service);
     GenerateBindServiceWithBinderMethod(out, service);
@@ -724,8 +707,7 @@ void GenerateService(Printer* out, const ServiceDescriptor* service,
 }  // anonymous namespace
 }  // anonymous namespace
 
 
 grpc::string GetServices(const FileDescriptor* file, bool generate_client,
 grpc::string GetServices(const FileDescriptor* file, bool generate_client,
-                         bool generate_server, bool internal_access,
-                         bool lite_client) {
+                         bool generate_server, bool internal_access) {
   grpc::string output;
   grpc::string output;
   {
   {
     // Scope the output stream so it closes and finalizes output to the string.
     // Scope the output stream so it closes and finalizes output to the string.
@@ -767,7 +749,7 @@ grpc::string GetServices(const FileDescriptor* file, bool generate_client,
     }
     }
     for (int i = 0; i < file->service_count(); i++) {
     for (int i = 0; i < file->service_count(); i++) {
       GenerateService(&out, file->service(i), generate_client, generate_server,
       GenerateService(&out, file->service(i), generate_client, generate_server,
-                      internal_access, lite_client);
+                      internal_access);
     }
     }
     if (file_namespace != "") {
     if (file_namespace != "") {
       out.Outdent();
       out.Outdent();

+ 1 - 1
src/compiler/csharp_generator.h

@@ -27,7 +27,7 @@ namespace grpc_csharp_generator {
 
 
 grpc::string GetServices(const grpc::protobuf::FileDescriptor* file,
 grpc::string GetServices(const grpc::protobuf::FileDescriptor* file,
                          bool generate_client, bool generate_server,
                          bool generate_client, bool generate_server,
-                         bool internal_access, bool lite_client);
+                         bool internal_access);
 
 
 }  // namespace grpc_csharp_generator
 }  // namespace grpc_csharp_generator
 
 

+ 1 - 6
src/compiler/csharp_plugin.cc

@@ -39,7 +39,6 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
     bool generate_client = true;
     bool generate_client = true;
     bool generate_server = true;
     bool generate_server = true;
     bool internal_access = false;
     bool internal_access = false;
-    bool lite_client = false;
     for (size_t i = 0; i < options.size(); i++) {
     for (size_t i = 0; i < options.size(); i++) {
       if (options[i].first == "no_client") {
       if (options[i].first == "no_client") {
         generate_client = false;
         generate_client = false;
@@ -47,10 +46,6 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
         generate_server = false;
         generate_server = false;
       } else if (options[i].first == "internal_access") {
       } else if (options[i].first == "internal_access") {
         internal_access = true;
         internal_access = true;
-      } else if (options[i].first == "lite_client") {
-        // will only be used if generate_client is true.
-        // NOTE: experimental option, can be removed in future release
-        lite_client = true;
       } else {
       } else {
         *error = "Unknown generator option: " + options[i].first;
         *error = "Unknown generator option: " + options[i].first;
         return false;
         return false;
@@ -58,7 +53,7 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
     }
     }
 
 
     grpc::string code = grpc_csharp_generator::GetServices(
     grpc::string code = grpc_csharp_generator::GetServices(
-        file, generate_client, generate_server, internal_access, lite_client);
+        file, generate_client, generate_server, internal_access);
     if (code.size() == 0) {
     if (code.size() == 0) {
       return true;  // don't generate a file if there are no services
       return true;  // don't generate a file if there are no services
     }
     }

+ 78 - 0
src/core/ext/filters/client_channel/backend_metric.cc

@@ -0,0 +1,78 @@
+//
+// Copyright 2019 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/filters/client_channel/backend_metric.h"
+
+#include "src/core/lib/gprpp/string_view.h"
+#include "udpa/data/orca/v1/orca_load_report.upb.h"
+
+namespace grpc_core {
+
+namespace {
+
+template <typename EntryType>
+Map<StringView, double, StringLess> ParseMap(
+    udpa_data_orca_v1_OrcaLoadReport* msg,
+    EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*),
+    upb_strview (*key_func)(const EntryType*),
+    double (*value_func)(const EntryType*), Arena* arena) {
+  Map<StringView, double, StringLess> result;
+  size_t size;
+  const auto* const* entries = entry_func(msg, &size);
+  for (size_t i = 0; i < size; ++i) {
+    upb_strview key_view = key_func(entries[i]);
+    char* key = static_cast<char*>(arena->Alloc(key_view.size + 1));
+    memcpy(key, key_view.data, key_view.size);
+    result[StringView(key, key_view.size)] = value_func(entries[i]);
+  }
+  return result;
+}
+
+}  // namespace
+
+const LoadBalancingPolicy::BackendMetricData* ParseBackendMetricData(
+    const grpc_slice& serialized_load_report, Arena* arena) {
+  upb::Arena upb_arena;
+  udpa_data_orca_v1_OrcaLoadReport* msg =
+      udpa_data_orca_v1_OrcaLoadReport_parse(
+          reinterpret_cast<const char*>(
+              GRPC_SLICE_START_PTR(serialized_load_report)),
+          GRPC_SLICE_LENGTH(serialized_load_report), upb_arena.ptr());
+  if (msg == nullptr) return nullptr;
+  LoadBalancingPolicy::BackendMetricData* backend_metric_data =
+      arena->New<LoadBalancingPolicy::BackendMetricData>();
+  backend_metric_data->cpu_utilization =
+      udpa_data_orca_v1_OrcaLoadReport_cpu_utilization(msg);
+  backend_metric_data->mem_utilization =
+      udpa_data_orca_v1_OrcaLoadReport_mem_utilization(msg);
+  backend_metric_data->requests_per_second =
+      udpa_data_orca_v1_OrcaLoadReport_rps(msg);
+  backend_metric_data->request_cost =
+      ParseMap<udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry>(
+          msg, udpa_data_orca_v1_OrcaLoadReport_mutable_request_cost,
+          udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_key,
+          udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_value, arena);
+  backend_metric_data->utilization =
+      ParseMap<udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry>(
+          msg, udpa_data_orca_v1_OrcaLoadReport_mutable_utilization,
+          udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_key,
+          udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_value, arena);
+  return backend_metric_data;
+}
+
+}  // namespace grpc_core

+ 36 - 0
src/core/ext/filters/client_channel/backend_metric.h

@@ -0,0 +1,36 @@
+//
+// Copyright 2019 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKEND_METRIC_H
+#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKEND_METRIC_H
+
+#include <grpc/support/port_platform.h>
+
+#include <grpc/slice.h>
+
+#include "src/core/ext/filters/client_channel/lb_policy.h"
+#include "src/core/lib/gprpp/arena.h"
+
+namespace grpc_core {
+
+// Parses the serialized load report and allocates a BackendMetricData
+// object on the arena.
+const LoadBalancingPolicy::BackendMetricData* ParseBackendMetricData(
+    const grpc_slice& serialized_load_report, Arena* arena);
+
+}  // namespace grpc_core
+
+#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKEND_METRIC_H */

+ 99 - 11
src/core/ext/filters/client_channel/client_channel.cc

@@ -31,6 +31,7 @@
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/sync.h>
 
 
+#include "src/core/ext/filters/client_channel/backend_metric.h"
 #include "src/core/ext/filters/client_channel/backup_poller.h"
 #include "src/core/ext/filters/client_channel/backup_poller.h"
 #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
 #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
 #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
 #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
@@ -273,6 +274,12 @@ class ChannelData {
   bool received_first_resolver_result_ = false;
   bool received_first_resolver_result_ = false;
   // The number of SubchannelWrapper instances referencing a given Subchannel.
   // The number of SubchannelWrapper instances referencing a given Subchannel.
   Map<Subchannel*, int> subchannel_refcount_map_;
   Map<Subchannel*, int> subchannel_refcount_map_;
+  // The set of SubchannelWrappers that currently exist.
+  // No need to hold a ref, since the map is updated in the control-plane
+  // combiner when the SubchannelWrappers are created and destroyed.
+  // TODO(roth): We really want to use a set here, not a map.  Since we don't
+  // currently have a set implementation, we use a map and ignore the value.
+  Map<SubchannelWrapper*, bool> subchannel_wrappers_;
   // Pending ConnectedSubchannel updates for each SubchannelWrapper.
   // Pending ConnectedSubchannel updates for each SubchannelWrapper.
   // Updates are queued here in the control plane combiner and then applied
   // Updates are queued here in the control plane combiner and then applied
   // in the data plane combiner when the picker is updated.
   // in the data plane combiner when the picker is updated.
@@ -374,6 +381,19 @@ class CallData {
 
 
     void* Alloc(size_t size) override { return calld_->arena_->Alloc(size); }
     void* Alloc(size_t size) override { return calld_->arena_->Alloc(size); }
 
 
+    const LoadBalancingPolicy::BackendMetricData* GetBackendMetricData()
+        override {
+      if (calld_->backend_metric_data_ == nullptr) {
+        grpc_linked_mdelem* md = calld_->recv_trailing_metadata_->idx.named
+                                     .x_endpoint_load_metrics_bin;
+        if (md != nullptr) {
+          calld_->backend_metric_data_ =
+              ParseBackendMetricData(GRPC_MDVALUE(md->md), calld_->arena_);
+        }
+      }
+      return calld_->backend_metric_data_;
+    }
+
    private:
    private:
     CallData* calld_;
     CallData* calld_;
   };
   };
@@ -706,6 +726,7 @@ class CallData {
   bool service_config_applied_ = false;
   bool service_config_applied_ = false;
   QueuedPickCanceller* pick_canceller_ = nullptr;
   QueuedPickCanceller* pick_canceller_ = nullptr;
   LbCallState lb_call_state_;
   LbCallState lb_call_state_;
+  const LoadBalancingPolicy::BackendMetricData* backend_metric_data_ = nullptr;
   RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
   RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
   void (*lb_recv_trailing_metadata_ready_)(
   void (*lb_recv_trailing_metadata_ready_)(
       void* user_data, grpc_error* error,
       void* user_data, grpc_error* error,
@@ -799,14 +820,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "SubchannelWrapper");
     GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "SubchannelWrapper");
     auto* subchannel_node = subchannel_->channelz_node();
     auto* subchannel_node = subchannel_->channelz_node();
     if (subchannel_node != nullptr) {
     if (subchannel_node != nullptr) {
-      intptr_t subchannel_uuid = subchannel_node->uuid();
       auto it = chand_->subchannel_refcount_map_.find(subchannel_);
       auto it = chand_->subchannel_refcount_map_.find(subchannel_);
       if (it == chand_->subchannel_refcount_map_.end()) {
       if (it == chand_->subchannel_refcount_map_.end()) {
-        chand_->channelz_node_->AddChildSubchannel(subchannel_uuid);
+        chand_->channelz_node_->AddChildSubchannel(subchannel_node->uuid());
         it = chand_->subchannel_refcount_map_.emplace(subchannel_, 0).first;
         it = chand_->subchannel_refcount_map_.emplace(subchannel_, 0).first;
       }
       }
       ++it->second;
       ++it->second;
     }
     }
+    chand_->subchannel_wrappers_[this] = true;
   }
   }
 
 
   ~SubchannelWrapper() {
   ~SubchannelWrapper() {
@@ -815,14 +836,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
               "chand=%p: destroying subchannel wrapper %p for subchannel %p",
               "chand=%p: destroying subchannel wrapper %p for subchannel %p",
               chand_, this, subchannel_);
               chand_, this, subchannel_);
     }
     }
+    chand_->subchannel_wrappers_.erase(this);
     auto* subchannel_node = subchannel_->channelz_node();
     auto* subchannel_node = subchannel_->channelz_node();
     if (subchannel_node != nullptr) {
     if (subchannel_node != nullptr) {
-      intptr_t subchannel_uuid = subchannel_node->uuid();
       auto it = chand_->subchannel_refcount_map_.find(subchannel_);
       auto it = chand_->subchannel_refcount_map_.find(subchannel_);
       GPR_ASSERT(it != chand_->subchannel_refcount_map_.end());
       GPR_ASSERT(it != chand_->subchannel_refcount_map_.end());
       --it->second;
       --it->second;
       if (it->second == 0) {
       if (it->second == 0) {
-        chand_->channelz_node_->RemoveChildSubchannel(subchannel_uuid);
+        chand_->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid());
         chand_->subchannel_refcount_map_.erase(it);
         chand_->subchannel_refcount_map_.erase(it);
       }
       }
     }
     }
@@ -844,8 +865,9 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
       UniquePtr<ConnectivityStateWatcherInterface> watcher) override {
       UniquePtr<ConnectivityStateWatcherInterface> watcher) override {
     auto& watcher_wrapper = watcher_map_[watcher.get()];
     auto& watcher_wrapper = watcher_map_[watcher.get()];
     GPR_ASSERT(watcher_wrapper == nullptr);
     GPR_ASSERT(watcher_wrapper == nullptr);
-    watcher_wrapper = New<WatcherWrapper>(
-        std::move(watcher), Ref(DEBUG_LOCATION, "WatcherWrapper"));
+    watcher_wrapper = New<WatcherWrapper>(std::move(watcher),
+                                          Ref(DEBUG_LOCATION, "WatcherWrapper"),
+                                          initial_state);
     subchannel_->WatchConnectivityState(
     subchannel_->WatchConnectivityState(
         initial_state,
         initial_state,
         UniquePtr<char>(gpr_strdup(health_check_service_name_.get())),
         UniquePtr<char>(gpr_strdup(health_check_service_name_.get())),
@@ -870,6 +892,40 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     return subchannel_->channel_args();
     return subchannel_->channel_args();
   }
   }
 
 
+  void UpdateHealthCheckServiceName(UniquePtr<char> health_check_service_name) {
+    if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+      gpr_log(GPR_INFO,
+              "chand=%p: subchannel wrapper %p: updating health check service "
+              "name from \"%s\" to \"%s\"",
+              chand_, this, health_check_service_name_.get(),
+              health_check_service_name.get());
+    }
+    for (auto& p : watcher_map_) {
+      WatcherWrapper*& watcher_wrapper = p.second;
+      // Cancel the current watcher and create a new one using the new
+      // health check service name.
+      // TODO(roth): If there is not already an existing health watch
+      // call for the new name, then the watcher will initially report
+      // state CONNECTING.  If the LB policy is currently reporting
+      // state READY, this may cause it to switch to CONNECTING before
+      // switching back to READY.  This could cause a small delay for
+      // RPCs being started on the channel.  If/when this becomes a
+      // problem, we may be able to handle it by waiting for the new
+      // watcher to report READY before we use it to replace the old one.
+      WatcherWrapper* replacement = watcher_wrapper->MakeReplacement();
+      subchannel_->CancelConnectivityStateWatch(
+          health_check_service_name_.get(), watcher_wrapper);
+      watcher_wrapper = replacement;
+      subchannel_->WatchConnectivityState(
+          replacement->last_seen_state(),
+          UniquePtr<char>(gpr_strdup(health_check_service_name.get())),
+          OrphanablePtr<Subchannel::ConnectivityStateWatcherInterface>(
+              replacement));
+    }
+    // Save the new health check service name.
+    health_check_service_name_ = std::move(health_check_service_name);
+  }
+
   // Caller must be holding the control-plane combiner.
   // Caller must be holding the control-plane combiner.
   ConnectedSubchannel* connected_subchannel() const {
   ConnectedSubchannel* connected_subchannel() const {
     return connected_subchannel_.get();
     return connected_subchannel_.get();
@@ -904,8 +960,11 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     WatcherWrapper(
     WatcherWrapper(
         UniquePtr<SubchannelInterface::ConnectivityStateWatcherInterface>
         UniquePtr<SubchannelInterface::ConnectivityStateWatcherInterface>
             watcher,
             watcher,
-        RefCountedPtr<SubchannelWrapper> parent)
-        : watcher_(std::move(watcher)), parent_(std::move(parent)) {}
+        RefCountedPtr<SubchannelWrapper> parent,
+        grpc_connectivity_state initial_state)
+        : watcher_(std::move(watcher)),
+          parent_(std::move(parent)),
+          last_seen_state_(initial_state) {}
 
 
     ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); }
     ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); }
 
 
@@ -928,9 +987,21 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
     }
     }
 
 
     grpc_pollset_set* interested_parties() override {
     grpc_pollset_set* interested_parties() override {
-      return watcher_->interested_parties();
+      SubchannelInterface::ConnectivityStateWatcherInterface* watcher =
+          watcher_.get();
+      if (watcher_ == nullptr) watcher = replacement_->watcher_.get();
+      return watcher->interested_parties();
+    }
+
+    WatcherWrapper* MakeReplacement() {
+      auto* replacement =
+          New<WatcherWrapper>(std::move(watcher_), parent_, last_seen_state_);
+      replacement_ = replacement;
+      return replacement;
     }
     }
 
 
+    grpc_connectivity_state last_seen_state() const { return last_seen_state_; }
+
    private:
    private:
     class Updater {
     class Updater {
      public:
      public:
@@ -954,12 +1025,17 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
           gpr_log(GPR_INFO,
           gpr_log(GPR_INFO,
                   "chand=%p: processing connectivity change in combiner "
                   "chand=%p: processing connectivity change in combiner "
                   "for subchannel wrapper %p subchannel %p "
                   "for subchannel wrapper %p subchannel %p "
-                  "(connected_subchannel=%p state=%s)",
+                  "(connected_subchannel=%p state=%s): watcher=%p",
                   self->parent_->parent_->chand_, self->parent_->parent_.get(),
                   self->parent_->parent_->chand_, self->parent_->parent_.get(),
                   self->parent_->parent_->subchannel_,
                   self->parent_->parent_->subchannel_,
                   self->connected_subchannel_.get(),
                   self->connected_subchannel_.get(),
-                  grpc_connectivity_state_name(self->state_));
+                  grpc_connectivity_state_name(self->state_),
+                  self->parent_->watcher_.get());
         }
         }
+        // Ignore update if the parent WatcherWrapper has been replaced
+        // since this callback was scheduled.
+        if (self->parent_->watcher_ == nullptr) return;
+        self->parent_->last_seen_state_ = self->state_;
         self->parent_->parent_->MaybeUpdateConnectedSubchannel(
         self->parent_->parent_->MaybeUpdateConnectedSubchannel(
             std::move(self->connected_subchannel_));
             std::move(self->connected_subchannel_));
         self->parent_->watcher_->OnConnectivityStateChange(self->state_);
         self->parent_->watcher_->OnConnectivityStateChange(self->state_);
@@ -974,6 +1050,8 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
 
 
     UniquePtr<SubchannelInterface::ConnectivityStateWatcherInterface> watcher_;
     UniquePtr<SubchannelInterface::ConnectivityStateWatcherInterface> watcher_;
     RefCountedPtr<SubchannelWrapper> parent_;
     RefCountedPtr<SubchannelWrapper> parent_;
+    grpc_connectivity_state last_seen_state_;
+    WatcherWrapper* replacement_ = nullptr;
   };
   };
 
 
   void MaybeUpdateConnectedSubchannel(
   void MaybeUpdateConnectedSubchannel(
@@ -1655,6 +1733,11 @@ bool ChannelData::ProcessResolverResultLocked(
     } else {
     } else {
       chand->health_check_service_name_.reset();
       chand->health_check_service_name_.reset();
     }
     }
+    // Update health check service name used by existing subchannel wrappers.
+    for (const auto& p : chand->subchannel_wrappers_) {
+      p.first->UpdateHealthCheckServiceName(
+          UniquePtr<char>(gpr_strdup(chand->health_check_service_name_.get())));
+    }
     // Save service config.
     // Save service config.
     chand->saved_service_config_ = std::move(service_config);
     chand->saved_service_config_ = std::move(service_config);
   }
   }
@@ -1927,6 +2010,10 @@ CallData::CallData(grpc_call_element* elem, const ChannelData& chand,
 CallData::~CallData() {
 CallData::~CallData() {
   grpc_slice_unref_internal(path_);
   grpc_slice_unref_internal(path_);
   GRPC_ERROR_UNREF(cancel_error_);
   GRPC_ERROR_UNREF(cancel_error_);
+  if (backend_metric_data_ != nullptr) {
+    backend_metric_data_
+        ->LoadBalancingPolicy::BackendMetricData::~BackendMetricData();
+  }
   // Make sure there are no remaining pending batches.
   // Make sure there are no remaining pending batches.
   for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
   for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
     GPR_ASSERT(pending_batches_[i].batch == nullptr);
     GPR_ASSERT(pending_batches_[i].batch == nullptr);
@@ -3794,6 +3881,7 @@ void CallData::StartPickLocked(void* arg, grpc_error* error) {
         GRPC_ERROR_UNREF(result.error);
         GRPC_ERROR_UNREF(result.error);
         GRPC_CLOSURE_SCHED(&calld->pick_closure_,
         GRPC_CLOSURE_SCHED(&calld->pick_closure_,
                            GRPC_ERROR_REF(disconnect_error));
                            GRPC_ERROR_REF(disconnect_error));
+        if (calld->pick_queued_) calld->RemoveCallFromQueuedPicksLocked(elem);
         break;
         break;
       }
       }
       // If wait_for_ready is false, then the error indicates the RPC
       // If wait_for_ready is false, then the error indicates the RPC

+ 26 - 0
src/core/ext/filters/client_channel/lb_policy.h

@@ -25,6 +25,7 @@
 #include "src/core/ext/filters/client_channel/service_config.h"
 #include "src/core/ext/filters/client_channel/service_config.h"
 #include "src/core/ext/filters/client_channel/subchannel_interface.h"
 #include "src/core/ext/filters/client_channel/subchannel_interface.h"
 #include "src/core/lib/gprpp/abstract.h"
 #include "src/core/lib/gprpp/abstract.h"
+#include "src/core/lib/gprpp/map.h"
 #include "src/core/lib/gprpp/orphanable.h"
 #include "src/core/lib/gprpp/orphanable.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/gprpp/string_view.h"
 #include "src/core/lib/gprpp/string_view.h"
@@ -77,6 +78,26 @@ extern DebugOnlyTraceFlag grpc_trace_lb_policy_refcount;
 // interested_parties() hooks from the API.
 // interested_parties() hooks from the API.
 class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
 class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
  public:
  public:
+  // Represents backend metrics reported by the backend to the client.
+  struct BackendMetricData {
+    /// CPU utilization expressed as a fraction of available CPU resources.
+    double cpu_utilization;
+    /// Memory utilization expressed as a fraction of available memory
+    /// resources.
+    double mem_utilization;
+    /// Total requests per second being served by the backend.  This
+    /// should include all services that a backend is responsible for.
+    uint64_t requests_per_second;
+    /// Application-specific requests cost metrics.  Metric names are
+    /// determined by the application.  Each value is an absolute cost
+    /// (e.g. 3487 bytes of storage) associated with the request.
+    Map<StringView, double, StringLess> request_cost;
+    /// Application-specific resource utilization metrics.  Metric names
+    /// are determined by the application.  Each value is expressed as a
+    /// fraction of total resources available.
+    Map<StringView, double, StringLess> utilization;
+  };
+
   /// Interface for accessing per-call state.
   /// Interface for accessing per-call state.
   /// Implemented by the client channel and used by the SubchannelPicker.
   /// Implemented by the client channel and used by the SubchannelPicker.
   class CallState {
   class CallState {
@@ -90,6 +111,10 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
     /// for allocations that need to be made on a per-call basis.
     /// for allocations that need to be made on a per-call basis.
     virtual void* Alloc(size_t size) GRPC_ABSTRACT;
     virtual void* Alloc(size_t size) GRPC_ABSTRACT;
 
 
+    /// Returns the backend metric data returned by the server for the call,
+    /// or null if no backend metric data was returned.
+    virtual const BackendMetricData* GetBackendMetricData() GRPC_ABSTRACT;
+
     GRPC_ABSTRACT_BASE_CLASS
     GRPC_ABSTRACT_BASE_CLASS
   };
   };
 
 
@@ -175,6 +200,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
     /// modified by the callback.  The callback does not take ownership,
     /// modified by the callback.  The callback does not take ownership,
     /// however, so any data that needs to be used after returning must
     /// however, so any data that needs to be used after returning must
     /// be copied.
     /// be copied.
+    /// call_state can be used to obtain backend metric data.
     // TODO(roth): Replace grpc_error with something better before we allow
     // TODO(roth): Replace grpc_error with something better before we allow
     // people outside of gRPC team to use this API.
     // people outside of gRPC team to use this API.
     void (*recv_trailing_metadata_ready)(
     void (*recv_trailing_metadata_ready)(

+ 1 - 1
src/core/ext/transport/chttp2/server/chttp2_server.cc

@@ -266,7 +266,7 @@ static void tcp_server_shutdown_complete(void* arg, grpc_error* error) {
   // may do a synchronous unref.
   // may do a synchronous unref.
   grpc_core::ExecCtx::Get()->Flush();
   grpc_core::ExecCtx::Get()->Flush();
   if (destroy_done != nullptr) {
   if (destroy_done != nullptr) {
-    destroy_done->cb(destroy_done->cb_arg, GRPC_ERROR_REF(error));
+    GRPC_CLOSURE_SCHED(destroy_done, GRPC_ERROR_REF(error));
     grpc_core::ExecCtx::Get()->Flush();
     grpc_core::ExecCtx::Get()->Flush();
   }
   }
   grpc_channel_args_destroy(state->args);
   grpc_channel_args_destroy(state->args);

+ 24 - 25
src/core/ext/transport/chttp2/transport/hpack_parser.cc

@@ -655,12 +655,7 @@ static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
     grpc_error* err = grpc_chttp2_hptbl_add(&p->table, md);
     grpc_error* err = grpc_chttp2_hptbl_add(&p->table, md);
     if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
     if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
   }
   }
-  if (GPR_UNLIKELY(p->on_header == nullptr)) {
-    GRPC_MDELEM_UNREF(md);
-    return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
-  }
-  p->on_header(p->on_header_user_data, md);
-  return GRPC_ERROR_NONE;
+  return p->on_header(p->on_header_user_data, md);
 }
 }
 
 
 static grpc_core::UnmanagedMemorySlice take_string_extern(
 static grpc_core::UnmanagedMemorySlice take_string_extern(
@@ -765,23 +760,26 @@ static grpc_error* parse_stream_dep0(grpc_chttp2_hpack_parser* p,
   return parse_stream_dep1(p, cur + 1, end);
   return parse_stream_dep1(p, cur + 1, end);
 }
 }
 
 
+static grpc_error* GPR_ATTRIBUTE_NOINLINE
+on_invalid_hpack_idx(grpc_chttp2_hpack_parser* p) {
+  return grpc_error_set_int(
+      grpc_error_set_int(
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
+          GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(p->index)),
+      GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
+}
+
 /* emit an indexed field; jumps to begin the next field on completion */
 /* emit an indexed field; jumps to begin the next field on completion */
 static grpc_error* finish_indexed_field(grpc_chttp2_hpack_parser* p,
 static grpc_error* finish_indexed_field(grpc_chttp2_hpack_parser* p,
                                         const uint8_t* cur,
                                         const uint8_t* cur,
                                         const uint8_t* end) {
                                         const uint8_t* end) {
-  grpc_mdelem md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
-  if (GRPC_MDISNULL(md)) {
-    return grpc_error_set_int(
-        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                               "Invalid HPACK index received"),
-                           GRPC_ERROR_INT_INDEX,
-                           static_cast<intptr_t>(p->index)),
-        GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
+  grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&p->table, p->index);
+  if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
+    return on_invalid_hpack_idx(p);
   }
   }
-  GRPC_MDELEM_REF(md);
   GRPC_STATS_INC_HPACK_RECV_INDEXED();
   GRPC_STATS_INC_HPACK_RECV_INDEXED();
   grpc_error* err = on_hdr<false>(p, md);
   grpc_error* err = on_hdr<false>(p, md);
-  if (err != GRPC_ERROR_NONE) return err;
+  if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
   return parse_begin(p, cur, end);
   return parse_begin(p, cur, end);
 }
 }
 
 
@@ -1557,13 +1555,8 @@ static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
 static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
 static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
                                             bool* is) {
                                             bool* is) {
   grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
   grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
-  if (GRPC_MDISNULL(elem)) {
-    return grpc_error_set_int(
-        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                               "Invalid HPACK index received"),
-                           GRPC_ERROR_INT_INDEX,
-                           static_cast<intptr_t>(p->index)),
-        GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
+  if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
+    return on_invalid_hpack_idx(p);
   }
   }
   /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
   /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
    * 1. elem was a result of grpc_chttp2_hptbl_lookup
    * 1. elem was a result of grpc_chttp2_hptbl_lookup
@@ -1599,10 +1592,16 @@ static grpc_error* parse_value_string_with_literal_key(
   return parse_value_string(p, cur, end, is_binary_literal_header(p));
   return parse_value_string(p, cur, end, is_binary_literal_header(p));
 }
 }
 
 
+/* "Uninitialized" header parser to save us a branch in on_hdr().  */
+static grpc_error* on_header_uninitialized(void* user_data, grpc_mdelem md) {
+  GRPC_MDELEM_UNREF(md);
+  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
+}
+
 /* PUBLIC INTERFACE */
 /* PUBLIC INTERFACE */
 
 
 void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
 void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
-  p->on_header = nullptr;
+  p->on_header = on_header_uninitialized;
   p->on_header_user_data = nullptr;
   p->on_header_user_data = nullptr;
   p->state = parse_begin;
   p->state = parse_begin;
   p->key.data.referenced = grpc_empty_slice();
   p->key.data.referenced = grpc_empty_slice();
@@ -1750,7 +1749,7 @@ grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
         grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
         grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
       }
       }
     }
     }
-    parser->on_header = nullptr;
+    parser->on_header = on_header_uninitialized;
     parser->on_header_user_data = nullptr;
     parser->on_header_user_data = nullptr;
     parser->is_boundary = 0xde;
     parser->is_boundary = 0xde;
     parser->is_eof = 0xde;
     parser->is_eof = 0xde;

+ 1 - 1
src/core/ext/transport/chttp2/transport/hpack_parser.h

@@ -46,7 +46,7 @@ typedef struct {
 
 
 struct grpc_chttp2_hpack_parser {
 struct grpc_chttp2_hpack_parser {
   /* user specified callback for each header output */
   /* user specified callback for each header output */
-  void (*on_header)(void* user_data, grpc_mdelem md);
+  grpc_error* (*on_header)(void* user_data, grpc_mdelem md);
   void* on_header_user_data;
   void* on_header_user_data;
 
 
   grpc_error* last_error;
   grpc_error* last_error;

+ 18 - 3
src/core/ext/transport/chttp2/transport/hpack_table.cc

@@ -44,19 +44,34 @@ void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl* tbl) {
   tbl->ents = nullptr;
   tbl->ents = nullptr;
 }
 }
 
 
-grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
-                                                   uint32_t tbl_index) {
+template <bool take_ref>
+static grpc_mdelem lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
+                                        uint32_t tbl_index) {
   /* Not static - find the value in the list of valid entries */
   /* Not static - find the value in the list of valid entries */
   tbl_index -= (GRPC_CHTTP2_LAST_STATIC_ENTRY + 1);
   tbl_index -= (GRPC_CHTTP2_LAST_STATIC_ENTRY + 1);
   if (tbl_index < tbl->num_ents) {
   if (tbl_index < tbl->num_ents) {
     uint32_t offset =
     uint32_t offset =
         (tbl->num_ents - 1u - tbl_index + tbl->first_ent) % tbl->cap_entries;
         (tbl->num_ents - 1u - tbl_index + tbl->first_ent) % tbl->cap_entries;
-    return tbl->ents[offset];
+    grpc_mdelem md = tbl->ents[offset];
+    if (take_ref) {
+      GRPC_MDELEM_REF(md);
+    }
+    return md;
   }
   }
   /* Invalid entry: return error */
   /* Invalid entry: return error */
   return GRPC_MDNULL;
   return GRPC_MDNULL;
 }
 }
 
 
+grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
+                                                   uint32_t tbl_index) {
+  return lookup_dynamic_index<false>(tbl, tbl_index);
+}
+
+grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
+    const grpc_chttp2_hptbl* tbl, uint32_t tbl_index) {
+  return lookup_dynamic_index<true>(tbl, tbl_index);
+}
+
 /* Evict one element from the table */
 /* Evict one element from the table */
 static void evict1(grpc_chttp2_hptbl* tbl) {
 static void evict1(grpc_chttp2_hptbl* tbl) {
   grpc_mdelem first_ent = tbl->ents[tbl->first_ent];
   grpc_mdelem first_ent = tbl->ents[tbl->first_ent];

+ 12 - 3
src/core/ext/transport/chttp2/transport/hpack_table.h

@@ -95,6 +95,9 @@ grpc_error* grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl* tbl,
 /* lookup a table entry based on its hpack index */
 /* lookup a table entry based on its hpack index */
 grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
 grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
                                                    uint32_t tbl_index);
                                                    uint32_t tbl_index);
+grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
+    const grpc_chttp2_hptbl* tbl, uint32_t tbl_index);
+template <bool take_ref = false>
 inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
 inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
                                             uint32_t index) {
                                             uint32_t index) {
   /* Static table comes first, just return an entry from it.
   /* Static table comes first, just return an entry from it.
@@ -103,9 +106,15 @@ inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
      must follow the hpack standard. If that changes, we *must* not rely on
      must follow the hpack standard. If that changes, we *must* not rely on
      reading the core static metadata table here; at that point we'd need our
      reading the core static metadata table here; at that point we'd need our
      own singleton static metadata in the correct order. */
      own singleton static metadata in the correct order. */
-  return index <= GRPC_CHTTP2_LAST_STATIC_ENTRY
-             ? grpc_static_mdelem_manifested()[index - 1]
-             : grpc_chttp2_hptbl_lookup_dynamic_index(tbl, index);
+  if (index <= GRPC_CHTTP2_LAST_STATIC_ENTRY) {
+    return grpc_static_mdelem_manifested()[index - 1];
+  } else {
+    if (take_ref) {
+      return grpc_chttp2_hptbl_lookup_ref_dynamic_index(tbl, index);
+    } else {
+      return grpc_chttp2_hptbl_lookup_dynamic_index(tbl, index);
+    }
+  }
 }
 }
 /* add a table entry to the index */
 /* add a table entry to the index */
 grpc_error* grpc_chttp2_hptbl_add(grpc_chttp2_hptbl* tbl,
 grpc_error* grpc_chttp2_hptbl_add(grpc_chttp2_hptbl* tbl,

+ 9 - 4
src/core/ext/transport/chttp2/transport/parsing.cc

@@ -318,7 +318,10 @@ static grpc_error* skip_parser(void* parser, grpc_chttp2_transport* t,
   return GRPC_ERROR_NONE;
   return GRPC_ERROR_NONE;
 }
 }
 
 
-static void skip_header(void* tp, grpc_mdelem md) { GRPC_MDELEM_UNREF(md); }
+static grpc_error* skip_header(void* tp, grpc_mdelem md) {
+  GRPC_MDELEM_UNREF(md);
+  return GRPC_ERROR_NONE;
+}
 
 
 static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
 static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
                                           int is_header) {
                                           int is_header) {
@@ -419,7 +422,7 @@ static bool is_nonzero_status(grpc_mdelem md) {
          !md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS);
          !md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS);
 }
 }
 
 
-static void on_initial_header(void* tp, grpc_mdelem md) {
+static grpc_error* on_initial_header(void* tp, grpc_mdelem md) {
   GPR_TIMER_SCOPE("on_initial_header", 0);
   GPR_TIMER_SCOPE("on_initial_header", 0);
 
 
   grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
   grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
@@ -465,7 +468,7 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
           &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
           &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
     }
     }
     GRPC_MDELEM_UNREF(md);
     GRPC_MDELEM_UNREF(md);
-    return;
+    return GRPC_ERROR_NONE;
   }
   }
 
 
   const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
   const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
@@ -496,9 +499,10 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
       GRPC_MDELEM_UNREF(md);
       GRPC_MDELEM_UNREF(md);
     }
     }
   }
   }
+  return GRPC_ERROR_NONE;
 }
 }
 
 
-static void on_trailing_header(void* tp, grpc_mdelem md) {
+static grpc_error* on_trailing_header(void* tp, grpc_mdelem md) {
   GPR_TIMER_SCOPE("on_trailing_header", 0);
   GPR_TIMER_SCOPE("on_trailing_header", 0);
 
 
   grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
   grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
@@ -547,6 +551,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
       GRPC_MDELEM_UNREF(md);
       GRPC_MDELEM_UNREF(md);
     }
     }
   }
   }
+  return GRPC_ERROR_NONE;
 }
 }
 
 
 static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
 static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,

+ 29 - 8
src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c

@@ -11,6 +11,8 @@
 #include "envoy/api/v2/auth/cert.upb.h"
 #include "envoy/api/v2/auth/cert.upb.h"
 #include "envoy/api/v2/core/base.upb.h"
 #include "envoy/api/v2/core/base.upb.h"
 #include "envoy/api/v2/core/config_source.upb.h"
 #include "envoy/api/v2/core/config_source.upb.h"
+#include "google/protobuf/any.upb.h"
+#include "google/protobuf/struct.upb.h"
 #include "google/protobuf/wrappers.upb.h"
 #include "google/protobuf/wrappers.upb.h"
 #include "validate/validate.upb.h"
 #include "validate/validate.upb.h"
 #include "gogoproto/gogo.upb.h"
 #include "gogoproto/gogo.upb.h"
@@ -30,22 +32,41 @@ const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit = {
   UPB_SIZE(24, 32), 4, false,
   UPB_SIZE(24, 32), 4, false,
 };
 };
 
 
-static const upb_msglayout *const envoy_api_v2_auth_TlsCertificate_submsgs[5] = {
+static const upb_msglayout *const envoy_api_v2_auth_PrivateKeyProvider_submsgs[2] = {
+  &google_protobuf_Any_msginit,
+  &google_protobuf_Struct_msginit,
+};
+
+static const upb_msglayout_field envoy_api_v2_auth_PrivateKeyProvider__fields[3] = {
+  {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+  {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1},
+  {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1},
+};
+
+const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit = {
+  &envoy_api_v2_auth_PrivateKeyProvider_submsgs[0],
+  &envoy_api_v2_auth_PrivateKeyProvider__fields[0],
+  UPB_SIZE(16, 32), 3, false,
+};
+
+static const upb_msglayout *const envoy_api_v2_auth_TlsCertificate_submsgs[6] = {
+  &envoy_api_v2_auth_PrivateKeyProvider_msginit,
   &envoy_api_v2_core_DataSource_msginit,
   &envoy_api_v2_core_DataSource_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_auth_TlsCertificate__fields[5] = {
-  {1, UPB_SIZE(0, 0), 0, 0, 11, 1},
-  {2, UPB_SIZE(4, 8), 0, 0, 11, 1},
-  {3, UPB_SIZE(8, 16), 0, 0, 11, 1},
-  {4, UPB_SIZE(12, 24), 0, 0, 11, 1},
-  {5, UPB_SIZE(16, 32), 0, 0, 11, 3},
+static const upb_msglayout_field envoy_api_v2_auth_TlsCertificate__fields[6] = {
+  {1, UPB_SIZE(0, 0), 0, 1, 11, 1},
+  {2, UPB_SIZE(4, 8), 0, 1, 11, 1},
+  {3, UPB_SIZE(8, 16), 0, 1, 11, 1},
+  {4, UPB_SIZE(12, 24), 0, 1, 11, 1},
+  {5, UPB_SIZE(20, 40), 0, 1, 11, 3},
+  {6, UPB_SIZE(16, 32), 0, 0, 11, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit = {
 const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit = {
   &envoy_api_v2_auth_TlsCertificate_submsgs[0],
   &envoy_api_v2_auth_TlsCertificate_submsgs[0],
   &envoy_api_v2_auth_TlsCertificate__fields[0],
   &envoy_api_v2_auth_TlsCertificate__fields[0],
-  UPB_SIZE(20, 40), 5, false,
+  UPB_SIZE(24, 48), 6, false,
 };
 };
 
 
 static const upb_msglayout *const envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[1] = {
 static const upb_msglayout *const envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[1] = {

+ 79 - 4
src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h

@@ -21,6 +21,7 @@ extern "C" {
 #endif
 #endif
 
 
 struct envoy_api_v2_auth_TlsParameters;
 struct envoy_api_v2_auth_TlsParameters;
+struct envoy_api_v2_auth_PrivateKeyProvider;
 struct envoy_api_v2_auth_TlsCertificate;
 struct envoy_api_v2_auth_TlsCertificate;
 struct envoy_api_v2_auth_TlsSessionTicketKeys;
 struct envoy_api_v2_auth_TlsSessionTicketKeys;
 struct envoy_api_v2_auth_CertificateValidationContext;
 struct envoy_api_v2_auth_CertificateValidationContext;
@@ -31,6 +32,7 @@ struct envoy_api_v2_auth_DownstreamTlsContext;
 struct envoy_api_v2_auth_SdsSecretConfig;
 struct envoy_api_v2_auth_SdsSecretConfig;
 struct envoy_api_v2_auth_Secret;
 struct envoy_api_v2_auth_Secret;
 typedef struct envoy_api_v2_auth_TlsParameters envoy_api_v2_auth_TlsParameters;
 typedef struct envoy_api_v2_auth_TlsParameters envoy_api_v2_auth_TlsParameters;
+typedef struct envoy_api_v2_auth_PrivateKeyProvider envoy_api_v2_auth_PrivateKeyProvider;
 typedef struct envoy_api_v2_auth_TlsCertificate envoy_api_v2_auth_TlsCertificate;
 typedef struct envoy_api_v2_auth_TlsCertificate envoy_api_v2_auth_TlsCertificate;
 typedef struct envoy_api_v2_auth_TlsSessionTicketKeys envoy_api_v2_auth_TlsSessionTicketKeys;
 typedef struct envoy_api_v2_auth_TlsSessionTicketKeys envoy_api_v2_auth_TlsSessionTicketKeys;
 typedef struct envoy_api_v2_auth_CertificateValidationContext envoy_api_v2_auth_CertificateValidationContext;
 typedef struct envoy_api_v2_auth_CertificateValidationContext envoy_api_v2_auth_CertificateValidationContext;
@@ -41,6 +43,7 @@ typedef struct envoy_api_v2_auth_DownstreamTlsContext envoy_api_v2_auth_Downstre
 typedef struct envoy_api_v2_auth_SdsSecretConfig envoy_api_v2_auth_SdsSecretConfig;
 typedef struct envoy_api_v2_auth_SdsSecretConfig envoy_api_v2_auth_SdsSecretConfig;
 typedef struct envoy_api_v2_auth_Secret envoy_api_v2_auth_Secret;
 typedef struct envoy_api_v2_auth_Secret envoy_api_v2_auth_Secret;
 extern const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit;
 extern const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit;
+extern const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit;
 extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit;
 extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit;
 extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit;
 extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit;
 extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit;
 extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit;
@@ -52,11 +55,15 @@ extern const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit;
 extern const upb_msglayout envoy_api_v2_auth_Secret_msginit;
 extern const upb_msglayout envoy_api_v2_auth_Secret_msginit;
 struct envoy_api_v2_core_ConfigSource;
 struct envoy_api_v2_core_ConfigSource;
 struct envoy_api_v2_core_DataSource;
 struct envoy_api_v2_core_DataSource;
+struct google_protobuf_Any;
 struct google_protobuf_BoolValue;
 struct google_protobuf_BoolValue;
+struct google_protobuf_Struct;
 struct google_protobuf_UInt32Value;
 struct google_protobuf_UInt32Value;
 extern const upb_msglayout envoy_api_v2_core_ConfigSource_msginit;
 extern const upb_msglayout envoy_api_v2_core_ConfigSource_msginit;
 extern const upb_msglayout envoy_api_v2_core_DataSource_msginit;
 extern const upb_msglayout envoy_api_v2_core_DataSource_msginit;
+extern const upb_msglayout google_protobuf_Any_msginit;
 extern const upb_msglayout google_protobuf_BoolValue_msginit;
 extern const upb_msglayout google_protobuf_BoolValue_msginit;
+extern const upb_msglayout google_protobuf_Struct_msginit;
 extern const upb_msglayout google_protobuf_UInt32Value_msginit;
 extern const upb_msglayout google_protobuf_UInt32Value_msginit;
 
 
 typedef enum {
 typedef enum {
@@ -114,6 +121,61 @@ UPB_INLINE bool envoy_api_v2_auth_TlsParameters_add_ecdh_curves(envoy_api_v2_aut
       msg, UPB_SIZE(20, 24), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
       msg, UPB_SIZE(20, 24), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
 }
 }
 
 
+/* envoy.api.v2.auth.PrivateKeyProvider */
+
+UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_new(upb_arena *arena) {
+  return (envoy_api_v2_auth_PrivateKeyProvider *)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena);
+}
+UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  envoy_api_v2_auth_PrivateKeyProvider *ret = envoy_api_v2_auth_PrivateKeyProvider_new(arena);
+  return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *envoy_api_v2_auth_PrivateKeyProvider_serialize(const envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena, len);
+}
+
+typedef enum {
+  envoy_api_v2_auth_PrivateKeyProvider_config_type_config = 2,
+  envoy_api_v2_auth_PrivateKeyProvider_config_type_typed_config = 3,
+  envoy_api_v2_auth_PrivateKeyProvider_config_type_NOT_SET = 0
+} envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases;
+UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases envoy_api_v2_auth_PrivateKeyProvider_config_type_case(const envoy_api_v2_auth_PrivateKeyProvider* msg) { return (envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); }
+
+UPB_INLINE upb_strview envoy_api_v2_auth_PrivateKeyProvider_provider_name(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); }
+UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); }
+UPB_INLINE const struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); }
+UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); }
+UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); }
+
+UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_provider_name(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value;
+}
+UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Struct* value) {
+  UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2);
+}
+UPB_INLINE struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_mutable_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) {
+  struct google_protobuf_Struct* sub = (struct google_protobuf_Struct*)envoy_api_v2_auth_PrivateKeyProvider_config(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_Struct*)upb_msg_new(&google_protobuf_Struct_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_auth_PrivateKeyProvider_set_config(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Any* value) {
+  UPB_WRITE_ONEOF(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3);
+}
+UPB_INLINE struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_mutable_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) {
+  struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_auth_PrivateKeyProvider_typed_config(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(msg, sub);
+  }
+  return sub;
+}
+
 /* envoy.api.v2.auth.TlsCertificate */
 /* envoy.api.v2.auth.TlsCertificate */
 
 
 UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_new(upb_arena *arena) {
 UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_new(upb_arena *arena) {
@@ -132,7 +194,8 @@ UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCerti
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_private_key(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)); }
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_private_key(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)); }
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_password(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)); }
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_password(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)); }
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_ocsp_staple(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)); }
 UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_ocsp_staple(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)); }
-UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsCertificate_signed_certificate_timestamp(const envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(16, 32), len); }
+UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsCertificate_signed_certificate_timestamp(const envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(20, 40), len); }
+UPB_INLINE const envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_private_key_provider(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)); }
 
 
 UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) {
 UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) {
   UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value;
   UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value;
@@ -183,18 +246,30 @@ UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate
   return sub;
   return sub;
 }
 }
 UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_mutable_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t *len) {
 UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_mutable_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t *len) {
-  return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(16, 32), len);
+  return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 40), len);
 }
 }
 UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_resize_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t len, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_resize_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t len, upb_arena *arena) {
-  return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(16, 32), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
+  return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(20, 40), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
 }
 }
 UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_add_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_add_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) {
   struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena);
   struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena);
   bool ok = _upb_array_append_accessor(
   bool ok = _upb_array_append_accessor(
-      msg, UPB_SIZE(16, 32), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
+      msg, UPB_SIZE(20, 40), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
   if (!ok) return NULL;
   if (!ok) return NULL;
   return sub;
   return sub;
 }
 }
+UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, envoy_api_v2_auth_PrivateKeyProvider* value) {
+  UPB_FIELD_AT(msg, envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)) = value;
+}
+UPB_INLINE struct envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_mutable_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) {
+  struct envoy_api_v2_auth_PrivateKeyProvider* sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)envoy_api_v2_auth_TlsCertificate_private_key_provider(msg);
+  if (sub == NULL) {
+    sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_auth_TlsCertificate_set_private_key_provider(msg, sub);
+  }
+  return sub;
+}
 
 
 /* envoy.api.v2.auth.TlsSessionTicketKeys */
 /* envoy.api.v2.auth.TlsSessionTicketKeys */
 
 

+ 37 - 30
src/core/ext/upb-generated/envoy/api/v2/cds.upb.c

@@ -17,6 +17,7 @@
 #include "envoy/api/v2/core/health_check.upb.h"
 #include "envoy/api/v2/core/health_check.upb.h"
 #include "envoy/api/v2/core/protocol.upb.h"
 #include "envoy/api/v2/core/protocol.upb.h"
 #include "envoy/api/v2/cluster/circuit_breaker.upb.h"
 #include "envoy/api/v2/cluster/circuit_breaker.upb.h"
+#include "envoy/api/v2/cluster/filter.upb.h"
 #include "envoy/api/v2/cluster/outlier_detection.upb.h"
 #include "envoy/api/v2/cluster/outlier_detection.upb.h"
 #include "envoy/api/v2/eds.upb.h"
 #include "envoy/api/v2/eds.upb.h"
 #include "envoy/type/percent.upb.h"
 #include "envoy/type/percent.upb.h"
@@ -30,7 +31,7 @@
 
 
 #include "upb/port_def.inc"
 #include "upb/port_def.inc"
 
 
-static const upb_msglayout *const envoy_api_v2_Cluster_submsgs[28] = {
+static const upb_msglayout *const envoy_api_v2_Cluster_submsgs[29] = {
   &envoy_api_v2_Cluster_CommonLbConfig_msginit,
   &envoy_api_v2_Cluster_CommonLbConfig_msginit,
   &envoy_api_v2_Cluster_CustomClusterType_msginit,
   &envoy_api_v2_Cluster_CustomClusterType_msginit,
   &envoy_api_v2_Cluster_EdsClusterConfig_msginit,
   &envoy_api_v2_Cluster_EdsClusterConfig_msginit,
@@ -44,6 +45,7 @@ static const upb_msglayout *const envoy_api_v2_Cluster_submsgs[28] = {
   &envoy_api_v2_UpstreamConnectionOptions_msginit,
   &envoy_api_v2_UpstreamConnectionOptions_msginit,
   &envoy_api_v2_auth_UpstreamTlsContext_msginit,
   &envoy_api_v2_auth_UpstreamTlsContext_msginit,
   &envoy_api_v2_cluster_CircuitBreakers_msginit,
   &envoy_api_v2_cluster_CircuitBreakers_msginit,
+  &envoy_api_v2_cluster_Filter_msginit,
   &envoy_api_v2_cluster_OutlierDetection_msginit,
   &envoy_api_v2_cluster_OutlierDetection_msginit,
   &envoy_api_v2_core_Address_msginit,
   &envoy_api_v2_core_Address_msginit,
   &envoy_api_v2_core_BindConfig_msginit,
   &envoy_api_v2_core_BindConfig_msginit,
@@ -57,49 +59,51 @@ static const upb_msglayout *const envoy_api_v2_Cluster_submsgs[28] = {
   &google_protobuf_UInt32Value_msginit,
   &google_protobuf_UInt32Value_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_Cluster__fields[36] = {
+static const upb_msglayout_field envoy_api_v2_Cluster__fields[38] = {
   {1, UPB_SIZE(28, 32), 0, 0, 9, 1},
   {1, UPB_SIZE(28, 32), 0, 0, 9, 1},
-  {2, UPB_SIZE(144, 256), UPB_SIZE(-153, -265), 0, 14, 1},
+  {2, UPB_SIZE(144, 264), UPB_SIZE(-153, -273), 0, 14, 1},
   {3, UPB_SIZE(44, 64), 0, 2, 11, 1},
   {3, UPB_SIZE(44, 64), 0, 2, 11, 1},
-  {4, UPB_SIZE(48, 72), 0, 22, 11, 1},
-  {5, UPB_SIZE(52, 80), 0, 23, 11, 1},
+  {4, UPB_SIZE(48, 72), 0, 23, 11, 1},
+  {5, UPB_SIZE(52, 80), 0, 24, 11, 1},
   {6, UPB_SIZE(0, 0), 0, 0, 14, 1},
   {6, UPB_SIZE(0, 0), 0, 0, 14, 1},
-  {7, UPB_SIZE(120, 216), 0, 14, 11, 3},
-  {8, UPB_SIZE(124, 224), 0, 16, 11, 3},
-  {9, UPB_SIZE(56, 88), 0, 23, 11, 1},
+  {7, UPB_SIZE(120, 216), 0, 15, 11, 3},
+  {8, UPB_SIZE(124, 224), 0, 17, 11, 3},
+  {9, UPB_SIZE(56, 88), 0, 24, 11, 1},
   {10, UPB_SIZE(60, 96), 0, 12, 11, 1},
   {10, UPB_SIZE(60, 96), 0, 12, 11, 1},
   {11, UPB_SIZE(64, 104), 0, 11, 11, 1},
   {11, UPB_SIZE(64, 104), 0, 11, 11, 1},
-  {13, UPB_SIZE(68, 112), 0, 17, 11, 1},
-  {14, UPB_SIZE(72, 120), 0, 18, 11, 1},
-  {16, UPB_SIZE(76, 128), 0, 22, 11, 1},
+  {13, UPB_SIZE(68, 112), 0, 18, 11, 1},
+  {14, UPB_SIZE(72, 120), 0, 19, 11, 1},
+  {16, UPB_SIZE(76, 128), 0, 23, 11, 1},
   {17, UPB_SIZE(8, 8), 0, 0, 14, 1},
   {17, UPB_SIZE(8, 8), 0, 0, 14, 1},
-  {18, UPB_SIZE(128, 232), 0, 14, 11, 3},
-  {19, UPB_SIZE(80, 136), 0, 13, 11, 1},
-  {20, UPB_SIZE(84, 144), 0, 22, 11, 1},
-  {21, UPB_SIZE(88, 152), 0, 15, 11, 1},
+  {18, UPB_SIZE(128, 232), 0, 15, 11, 3},
+  {19, UPB_SIZE(80, 136), 0, 14, 11, 1},
+  {20, UPB_SIZE(84, 144), 0, 23, 11, 1},
+  {21, UPB_SIZE(88, 152), 0, 16, 11, 1},
   {22, UPB_SIZE(92, 160), 0, 4, 11, 1},
   {22, UPB_SIZE(92, 160), 0, 4, 11, 1},
-  {23, UPB_SIZE(156, 272), UPB_SIZE(-161, -281), 7, 11, 1},
-  {24, UPB_SIZE(96, 168), 0, 21, 11, 1},
-  {25, UPB_SIZE(100, 176), 0, 20, 11, 1},
+  {23, UPB_SIZE(156, 280), UPB_SIZE(-161, -289), 7, 11, 1},
+  {24, UPB_SIZE(96, 168), 0, 22, 11, 1},
+  {25, UPB_SIZE(100, 176), 0, 21, 11, 1},
   {26, UPB_SIZE(16, 16), 0, 0, 14, 1},
   {26, UPB_SIZE(16, 16), 0, 0, 14, 1},
   {27, UPB_SIZE(104, 184), 0, 0, 11, 1},
   {27, UPB_SIZE(104, 184), 0, 0, 11, 1},
   {28, UPB_SIZE(36, 48), 0, 0, 9, 1},
   {28, UPB_SIZE(36, 48), 0, 0, 9, 1},
-  {29, UPB_SIZE(108, 192), 0, 19, 11, 1},
+  {29, UPB_SIZE(108, 192), 0, 20, 11, 1},
   {30, UPB_SIZE(112, 200), 0, 10, 11, 1},
   {30, UPB_SIZE(112, 200), 0, 10, 11, 1},
   {31, UPB_SIZE(24, 24), 0, 0, 8, 1},
   {31, UPB_SIZE(24, 24), 0, 0, 8, 1},
   {32, UPB_SIZE(25, 25), 0, 0, 8, 1},
   {32, UPB_SIZE(25, 25), 0, 0, 8, 1},
   {33, UPB_SIZE(116, 208), 0, 9, 11, 1},
   {33, UPB_SIZE(116, 208), 0, 9, 11, 1},
-  {34, UPB_SIZE(156, 272), UPB_SIZE(-161, -281), 6, 11, 1},
+  {34, UPB_SIZE(156, 280), UPB_SIZE(-161, -289), 6, 11, 1},
   {35, UPB_SIZE(132, 240), 0, 3, 11, 3},
   {35, UPB_SIZE(132, 240), 0, 3, 11, 3},
   {36, UPB_SIZE(136, 248), 0, 8, 11, 3},
   {36, UPB_SIZE(136, 248), 0, 8, 11, 3},
-  {37, UPB_SIZE(156, 272), UPB_SIZE(-161, -281), 5, 11, 1},
-  {38, UPB_SIZE(144, 256), UPB_SIZE(-153, -265), 1, 11, 1},
+  {37, UPB_SIZE(156, 280), UPB_SIZE(-161, -289), 5, 11, 1},
+  {38, UPB_SIZE(144, 264), UPB_SIZE(-153, -273), 1, 11, 1},
+  {39, UPB_SIZE(26, 26), 0, 0, 8, 1},
+  {40, UPB_SIZE(140, 256), 0, 13, 11, 3},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_Cluster_msginit = {
 const upb_msglayout envoy_api_v2_Cluster_msginit = {
   &envoy_api_v2_Cluster_submsgs[0],
   &envoy_api_v2_Cluster_submsgs[0],
   &envoy_api_v2_Cluster__fields[0],
   &envoy_api_v2_Cluster__fields[0],
-  UPB_SIZE(168, 288), 36, false,
+  UPB_SIZE(168, 304), 38, false,
 };
 };
 
 
 static const upb_msglayout *const envoy_api_v2_Cluster_CustomClusterType_submsgs[1] = {
 static const upb_msglayout *const envoy_api_v2_Cluster_CustomClusterType_submsgs[1] = {
@@ -167,29 +171,31 @@ static const upb_msglayout *const envoy_api_v2_Cluster_LbSubsetConfig_submsgs[2]
   &google_protobuf_Struct_msginit,
   &google_protobuf_Struct_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_Cluster_LbSubsetConfig__fields[6] = {
+static const upb_msglayout_field envoy_api_v2_Cluster_LbSubsetConfig__fields[7] = {
   {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
   {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
   {2, UPB_SIZE(12, 16), 0, 1, 11, 1},
   {2, UPB_SIZE(12, 16), 0, 1, 11, 1},
   {3, UPB_SIZE(16, 24), 0, 0, 11, 3},
   {3, UPB_SIZE(16, 24), 0, 0, 11, 3},
   {4, UPB_SIZE(8, 8), 0, 0, 8, 1},
   {4, UPB_SIZE(8, 8), 0, 0, 8, 1},
   {5, UPB_SIZE(9, 9), 0, 0, 8, 1},
   {5, UPB_SIZE(9, 9), 0, 0, 8, 1},
   {6, UPB_SIZE(10, 10), 0, 0, 8, 1},
   {6, UPB_SIZE(10, 10), 0, 0, 8, 1},
+  {7, UPB_SIZE(11, 11), 0, 0, 8, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_Cluster_LbSubsetConfig_msginit = {
 const upb_msglayout envoy_api_v2_Cluster_LbSubsetConfig_msginit = {
   &envoy_api_v2_Cluster_LbSubsetConfig_submsgs[0],
   &envoy_api_v2_Cluster_LbSubsetConfig_submsgs[0],
   &envoy_api_v2_Cluster_LbSubsetConfig__fields[0],
   &envoy_api_v2_Cluster_LbSubsetConfig__fields[0],
-  UPB_SIZE(24, 32), 6, false,
+  UPB_SIZE(24, 32), 7, false,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector__fields[1] = {
-  {1, UPB_SIZE(0, 0), 0, 0, 9, 3},
+static const upb_msglayout_field envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector__fields[2] = {
+  {1, UPB_SIZE(8, 8), 0, 0, 9, 3},
+  {2, UPB_SIZE(0, 0), 0, 0, 14, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_msginit = {
 const upb_msglayout envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_msginit = {
   NULL,
   NULL,
   &envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector__fields[0],
   &envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector__fields[0],
-  UPB_SIZE(4, 8), 1, false,
+  UPB_SIZE(16, 16), 2, false,
 };
 };
 
 
 static const upb_msglayout *const envoy_api_v2_Cluster_LeastRequestLbConfig_submsgs[1] = {
 static const upb_msglayout *const envoy_api_v2_Cluster_LeastRequestLbConfig_submsgs[1] = {
@@ -239,18 +245,19 @@ static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_submsgs[4]
   &google_protobuf_Duration_msginit,
   &google_protobuf_Duration_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_Cluster_CommonLbConfig__fields[5] = {
+static const upb_msglayout_field envoy_api_v2_Cluster_CommonLbConfig__fields[6] = {
   {1, UPB_SIZE(4, 8), 0, 2, 11, 1},
   {1, UPB_SIZE(4, 8), 0, 2, 11, 1},
   {2, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 1, 11, 1},
   {2, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 1, 11, 1},
   {3, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 0, 11, 1},
   {3, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 0, 11, 1},
   {4, UPB_SIZE(8, 16), 0, 3, 11, 1},
   {4, UPB_SIZE(8, 16), 0, 3, 11, 1},
   {5, UPB_SIZE(0, 0), 0, 0, 8, 1},
   {5, UPB_SIZE(0, 0), 0, 0, 8, 1},
+  {6, UPB_SIZE(1, 1), 0, 0, 8, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_msginit = {
 const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_msginit = {
   &envoy_api_v2_Cluster_CommonLbConfig_submsgs[0],
   &envoy_api_v2_Cluster_CommonLbConfig_submsgs[0],
   &envoy_api_v2_Cluster_CommonLbConfig__fields[0],
   &envoy_api_v2_Cluster_CommonLbConfig__fields[0],
-  UPB_SIZE(20, 40), 5, false,
+  UPB_SIZE(20, 40), 6, false,
 };
 };
 
 
 static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig_submsgs[2] = {
 static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig_submsgs[2] = {

+ 60 - 21
src/core/ext/upb-generated/envoy/api/v2/cds.upb.h

@@ -68,6 +68,7 @@ extern const upb_msglayout envoy_api_v2_UpstreamConnectionOptions_msginit;
 struct envoy_api_v2_ClusterLoadAssignment;
 struct envoy_api_v2_ClusterLoadAssignment;
 struct envoy_api_v2_auth_UpstreamTlsContext;
 struct envoy_api_v2_auth_UpstreamTlsContext;
 struct envoy_api_v2_cluster_CircuitBreakers;
 struct envoy_api_v2_cluster_CircuitBreakers;
+struct envoy_api_v2_cluster_Filter;
 struct envoy_api_v2_cluster_OutlierDetection;
 struct envoy_api_v2_cluster_OutlierDetection;
 struct envoy_api_v2_core_Address;
 struct envoy_api_v2_core_Address;
 struct envoy_api_v2_core_BindConfig;
 struct envoy_api_v2_core_BindConfig;
@@ -88,6 +89,7 @@ struct google_protobuf_UInt64Value;
 extern const upb_msglayout envoy_api_v2_ClusterLoadAssignment_msginit;
 extern const upb_msglayout envoy_api_v2_ClusterLoadAssignment_msginit;
 extern const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit;
 extern const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit;
 extern const upb_msglayout envoy_api_v2_cluster_CircuitBreakers_msginit;
 extern const upb_msglayout envoy_api_v2_cluster_CircuitBreakers_msginit;
+extern const upb_msglayout envoy_api_v2_cluster_Filter_msginit;
 extern const upb_msglayout envoy_api_v2_cluster_OutlierDetection_msginit;
 extern const upb_msglayout envoy_api_v2_cluster_OutlierDetection_msginit;
 extern const upb_msglayout envoy_api_v2_core_Address_msginit;
 extern const upb_msglayout envoy_api_v2_core_Address_msginit;
 extern const upb_msglayout envoy_api_v2_core_BindConfig_msginit;
 extern const upb_msglayout envoy_api_v2_core_BindConfig_msginit;
@@ -141,6 +143,13 @@ typedef enum {
   envoy_api_v2_Cluster_LbSubsetConfig_DEFAULT_SUBSET = 2
   envoy_api_v2_Cluster_LbSubsetConfig_DEFAULT_SUBSET = 2
 } envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetFallbackPolicy;
 } envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetFallbackPolicy;
 
 
+typedef enum {
+  envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_NOT_DEFINED = 0,
+  envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_NO_FALLBACK = 1,
+  envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_ANY_ENDPOINT = 2,
+  envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_DEFAULT_SUBSET = 3
+} envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_LbSubsetSelectorFallbackPolicy;
+
 typedef enum {
 typedef enum {
   envoy_api_v2_Cluster_RingHashLbConfig_XX_HASH = 0,
   envoy_api_v2_Cluster_RingHashLbConfig_XX_HASH = 0,
   envoy_api_v2_Cluster_RingHashLbConfig_MURMUR_HASH_2 = 1
   envoy_api_v2_Cluster_RingHashLbConfig_MURMUR_HASH_2 = 1
@@ -166,7 +175,7 @@ typedef enum {
   envoy_api_v2_Cluster_cluster_discovery_type_cluster_type = 38,
   envoy_api_v2_Cluster_cluster_discovery_type_cluster_type = 38,
   envoy_api_v2_Cluster_cluster_discovery_type_NOT_SET = 0
   envoy_api_v2_Cluster_cluster_discovery_type_NOT_SET = 0
 } envoy_api_v2_Cluster_cluster_discovery_type_oneofcases;
 } envoy_api_v2_Cluster_cluster_discovery_type_oneofcases;
-UPB_INLINE envoy_api_v2_Cluster_cluster_discovery_type_oneofcases envoy_api_v2_Cluster_cluster_discovery_type_case(const envoy_api_v2_Cluster* msg) { return (envoy_api_v2_Cluster_cluster_discovery_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(152, 264)); }
+UPB_INLINE envoy_api_v2_Cluster_cluster_discovery_type_oneofcases envoy_api_v2_Cluster_cluster_discovery_type_case(const envoy_api_v2_Cluster* msg) { return (envoy_api_v2_Cluster_cluster_discovery_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(152, 272)); }
 
 
 typedef enum {
 typedef enum {
   envoy_api_v2_Cluster_lb_config_ring_hash_lb_config = 23,
   envoy_api_v2_Cluster_lb_config_ring_hash_lb_config = 23,
@@ -174,11 +183,11 @@ typedef enum {
   envoy_api_v2_Cluster_lb_config_least_request_lb_config = 37,
   envoy_api_v2_Cluster_lb_config_least_request_lb_config = 37,
   envoy_api_v2_Cluster_lb_config_NOT_SET = 0
   envoy_api_v2_Cluster_lb_config_NOT_SET = 0
 } envoy_api_v2_Cluster_lb_config_oneofcases;
 } envoy_api_v2_Cluster_lb_config_oneofcases;
-UPB_INLINE envoy_api_v2_Cluster_lb_config_oneofcases envoy_api_v2_Cluster_lb_config_case(const envoy_api_v2_Cluster* msg) { return (envoy_api_v2_Cluster_lb_config_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(160, 280)); }
+UPB_INLINE envoy_api_v2_Cluster_lb_config_oneofcases envoy_api_v2_Cluster_lb_config_case(const envoy_api_v2_Cluster* msg) { return (envoy_api_v2_Cluster_lb_config_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(160, 288)); }
 
 
 UPB_INLINE upb_strview envoy_api_v2_Cluster_name(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(28, 32)); }
 UPB_INLINE upb_strview envoy_api_v2_Cluster_name(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(28, 32)); }
-UPB_INLINE bool envoy_api_v2_Cluster_has_type(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(152, 264), 2); }
-UPB_INLINE int32_t envoy_api_v2_Cluster_type(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(144, 256), UPB_SIZE(152, 264), 2, envoy_api_v2_Cluster_STATIC); }
+UPB_INLINE bool envoy_api_v2_Cluster_has_type(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(152, 272), 2); }
+UPB_INLINE int32_t envoy_api_v2_Cluster_type(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(144, 264), UPB_SIZE(152, 272), 2, envoy_api_v2_Cluster_STATIC); }
 UPB_INLINE const envoy_api_v2_Cluster_EdsClusterConfig* envoy_api_v2_Cluster_eds_cluster_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Cluster_EdsClusterConfig*, UPB_SIZE(44, 64)); }
 UPB_INLINE const envoy_api_v2_Cluster_EdsClusterConfig* envoy_api_v2_Cluster_eds_cluster_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Cluster_EdsClusterConfig*, UPB_SIZE(44, 64)); }
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_connect_timeout(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(48, 72)); }
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_connect_timeout(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(48, 72)); }
 UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_Cluster_per_connection_buffer_limit_bytes(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(52, 80)); }
 UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_Cluster_per_connection_buffer_limit_bytes(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(52, 80)); }
@@ -197,8 +206,8 @@ UPB_INLINE const struct envoy_api_v2_cluster_OutlierDetection* envoy_api_v2_Clus
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_cleanup_interval(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(84, 144)); }
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_cleanup_interval(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(84, 144)); }
 UPB_INLINE const struct envoy_api_v2_core_BindConfig* envoy_api_v2_Cluster_upstream_bind_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_BindConfig*, UPB_SIZE(88, 152)); }
 UPB_INLINE const struct envoy_api_v2_core_BindConfig* envoy_api_v2_Cluster_upstream_bind_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_BindConfig*, UPB_SIZE(88, 152)); }
 UPB_INLINE const envoy_api_v2_Cluster_LbSubsetConfig* envoy_api_v2_Cluster_lb_subset_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Cluster_LbSubsetConfig*, UPB_SIZE(92, 160)); }
 UPB_INLINE const envoy_api_v2_Cluster_LbSubsetConfig* envoy_api_v2_Cluster_lb_subset_config(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Cluster_LbSubsetConfig*, UPB_SIZE(92, 160)); }
-UPB_INLINE bool envoy_api_v2_Cluster_has_ring_hash_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 280), 23); }
-UPB_INLINE const envoy_api_v2_Cluster_RingHashLbConfig* envoy_api_v2_Cluster_ring_hash_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_RingHashLbConfig*, UPB_SIZE(156, 272), UPB_SIZE(160, 280), 23, NULL); }
+UPB_INLINE bool envoy_api_v2_Cluster_has_ring_hash_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 288), 23); }
+UPB_INLINE const envoy_api_v2_Cluster_RingHashLbConfig* envoy_api_v2_Cluster_ring_hash_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_RingHashLbConfig*, UPB_SIZE(156, 280), UPB_SIZE(160, 288), 23, NULL); }
 UPB_INLINE const struct envoy_api_v2_core_TransportSocket* envoy_api_v2_Cluster_transport_socket(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_TransportSocket*, UPB_SIZE(96, 168)); }
 UPB_INLINE const struct envoy_api_v2_core_TransportSocket* envoy_api_v2_Cluster_transport_socket(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_TransportSocket*, UPB_SIZE(96, 168)); }
 UPB_INLINE const struct envoy_api_v2_core_Metadata* envoy_api_v2_Cluster_metadata(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Metadata*, UPB_SIZE(100, 176)); }
 UPB_INLINE const struct envoy_api_v2_core_Metadata* envoy_api_v2_Cluster_metadata(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Metadata*, UPB_SIZE(100, 176)); }
 UPB_INLINE int32_t envoy_api_v2_Cluster_protocol_selection(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); }
 UPB_INLINE int32_t envoy_api_v2_Cluster_protocol_selection(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); }
@@ -209,20 +218,22 @@ UPB_INLINE const envoy_api_v2_UpstreamConnectionOptions* envoy_api_v2_Cluster_up
 UPB_INLINE bool envoy_api_v2_Cluster_close_connections_on_host_health_failure(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(24, 24)); }
 UPB_INLINE bool envoy_api_v2_Cluster_close_connections_on_host_health_failure(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(24, 24)); }
 UPB_INLINE bool envoy_api_v2_Cluster_drain_connections_on_host_removal(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(25, 25)); }
 UPB_INLINE bool envoy_api_v2_Cluster_drain_connections_on_host_removal(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(25, 25)); }
 UPB_INLINE const struct envoy_api_v2_ClusterLoadAssignment* envoy_api_v2_Cluster_load_assignment(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_ClusterLoadAssignment*, UPB_SIZE(116, 208)); }
 UPB_INLINE const struct envoy_api_v2_ClusterLoadAssignment* envoy_api_v2_Cluster_load_assignment(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_ClusterLoadAssignment*, UPB_SIZE(116, 208)); }
-UPB_INLINE bool envoy_api_v2_Cluster_has_original_dst_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 280), 34); }
-UPB_INLINE const envoy_api_v2_Cluster_OriginalDstLbConfig* envoy_api_v2_Cluster_original_dst_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_OriginalDstLbConfig*, UPB_SIZE(156, 272), UPB_SIZE(160, 280), 34, NULL); }
+UPB_INLINE bool envoy_api_v2_Cluster_has_original_dst_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 288), 34); }
+UPB_INLINE const envoy_api_v2_Cluster_OriginalDstLbConfig* envoy_api_v2_Cluster_original_dst_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_OriginalDstLbConfig*, UPB_SIZE(156, 280), UPB_SIZE(160, 288), 34, NULL); }
 UPB_INLINE const envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry* const* envoy_api_v2_Cluster_extension_protocol_options(const envoy_api_v2_Cluster *msg, size_t *len) { return (const envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry* const*)_upb_array_accessor(msg, UPB_SIZE(132, 240), len); }
 UPB_INLINE const envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry* const* envoy_api_v2_Cluster_extension_protocol_options(const envoy_api_v2_Cluster *msg, size_t *len) { return (const envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry* const*)_upb_array_accessor(msg, UPB_SIZE(132, 240), len); }
 UPB_INLINE const envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry* const* envoy_api_v2_Cluster_typed_extension_protocol_options(const envoy_api_v2_Cluster *msg, size_t *len) { return (const envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry* const*)_upb_array_accessor(msg, UPB_SIZE(136, 248), len); }
 UPB_INLINE const envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry* const* envoy_api_v2_Cluster_typed_extension_protocol_options(const envoy_api_v2_Cluster *msg, size_t *len) { return (const envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry* const*)_upb_array_accessor(msg, UPB_SIZE(136, 248), len); }
-UPB_INLINE bool envoy_api_v2_Cluster_has_least_request_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 280), 37); }
-UPB_INLINE const envoy_api_v2_Cluster_LeastRequestLbConfig* envoy_api_v2_Cluster_least_request_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_LeastRequestLbConfig*, UPB_SIZE(156, 272), UPB_SIZE(160, 280), 37, NULL); }
-UPB_INLINE bool envoy_api_v2_Cluster_has_cluster_type(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(152, 264), 38); }
-UPB_INLINE const envoy_api_v2_Cluster_CustomClusterType* envoy_api_v2_Cluster_cluster_type(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CustomClusterType*, UPB_SIZE(144, 256), UPB_SIZE(152, 264), 38, NULL); }
+UPB_INLINE bool envoy_api_v2_Cluster_has_least_request_lb_config(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(160, 288), 37); }
+UPB_INLINE const envoy_api_v2_Cluster_LeastRequestLbConfig* envoy_api_v2_Cluster_least_request_lb_config(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_LeastRequestLbConfig*, UPB_SIZE(156, 280), UPB_SIZE(160, 288), 37, NULL); }
+UPB_INLINE bool envoy_api_v2_Cluster_has_cluster_type(const envoy_api_v2_Cluster *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(152, 272), 38); }
+UPB_INLINE const envoy_api_v2_Cluster_CustomClusterType* envoy_api_v2_Cluster_cluster_type(const envoy_api_v2_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CustomClusterType*, UPB_SIZE(144, 264), UPB_SIZE(152, 272), 38, NULL); }
+UPB_INLINE bool envoy_api_v2_Cluster_respect_dns_ttl(const envoy_api_v2_Cluster *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(26, 26)); }
+UPB_INLINE const struct envoy_api_v2_cluster_Filter* const* envoy_api_v2_Cluster_filters(const envoy_api_v2_Cluster *msg, size_t *len) { return (const struct envoy_api_v2_cluster_Filter* const*)_upb_array_accessor(msg, UPB_SIZE(140, 256), len); }
 
 
 UPB_INLINE void envoy_api_v2_Cluster_set_name(envoy_api_v2_Cluster *msg, upb_strview value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_name(envoy_api_v2_Cluster *msg, upb_strview value) {
   UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(28, 32)) = value;
   UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(28, 32)) = value;
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_type(envoy_api_v2_Cluster *msg, int32_t value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_type(envoy_api_v2_Cluster *msg, int32_t value) {
-  UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(144, 256), value, UPB_SIZE(152, 264), 2);
+  UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(144, 264), value, UPB_SIZE(152, 272), 2);
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_eds_cluster_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_EdsClusterConfig* value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_eds_cluster_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_EdsClusterConfig* value) {
   UPB_FIELD_AT(msg, envoy_api_v2_Cluster_EdsClusterConfig*, UPB_SIZE(44, 64)) = value;
   UPB_FIELD_AT(msg, envoy_api_v2_Cluster_EdsClusterConfig*, UPB_SIZE(44, 64)) = value;
@@ -426,7 +437,7 @@ UPB_INLINE struct envoy_api_v2_Cluster_LbSubsetConfig* envoy_api_v2_Cluster_muta
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_ring_hash_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_RingHashLbConfig* value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_ring_hash_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_RingHashLbConfig* value) {
-  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_RingHashLbConfig*, UPB_SIZE(156, 272), value, UPB_SIZE(160, 280), 23);
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_RingHashLbConfig*, UPB_SIZE(156, 280), value, UPB_SIZE(160, 288), 23);
 }
 }
 UPB_INLINE struct envoy_api_v2_Cluster_RingHashLbConfig* envoy_api_v2_Cluster_mutable_ring_hash_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_Cluster_RingHashLbConfig* envoy_api_v2_Cluster_mutable_ring_hash_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
   struct envoy_api_v2_Cluster_RingHashLbConfig* sub = (struct envoy_api_v2_Cluster_RingHashLbConfig*)envoy_api_v2_Cluster_ring_hash_lb_config(msg);
   struct envoy_api_v2_Cluster_RingHashLbConfig* sub = (struct envoy_api_v2_Cluster_RingHashLbConfig*)envoy_api_v2_Cluster_ring_hash_lb_config(msg);
@@ -522,7 +533,7 @@ UPB_INLINE struct envoy_api_v2_ClusterLoadAssignment* envoy_api_v2_Cluster_mutab
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_original_dst_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_OriginalDstLbConfig* value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_original_dst_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_OriginalDstLbConfig* value) {
-  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_OriginalDstLbConfig*, UPB_SIZE(156, 272), value, UPB_SIZE(160, 280), 34);
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_OriginalDstLbConfig*, UPB_SIZE(156, 280), value, UPB_SIZE(160, 288), 34);
 }
 }
 UPB_INLINE struct envoy_api_v2_Cluster_OriginalDstLbConfig* envoy_api_v2_Cluster_mutable_original_dst_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_Cluster_OriginalDstLbConfig* envoy_api_v2_Cluster_mutable_original_dst_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
   struct envoy_api_v2_Cluster_OriginalDstLbConfig* sub = (struct envoy_api_v2_Cluster_OriginalDstLbConfig*)envoy_api_v2_Cluster_original_dst_lb_config(msg);
   struct envoy_api_v2_Cluster_OriginalDstLbConfig* sub = (struct envoy_api_v2_Cluster_OriginalDstLbConfig*)envoy_api_v2_Cluster_original_dst_lb_config(msg);
@@ -560,7 +571,7 @@ UPB_INLINE struct envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry* envoy
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_least_request_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_LeastRequestLbConfig* value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_least_request_lb_config(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_LeastRequestLbConfig* value) {
-  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_LeastRequestLbConfig*, UPB_SIZE(156, 272), value, UPB_SIZE(160, 280), 37);
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_LeastRequestLbConfig*, UPB_SIZE(156, 280), value, UPB_SIZE(160, 288), 37);
 }
 }
 UPB_INLINE struct envoy_api_v2_Cluster_LeastRequestLbConfig* envoy_api_v2_Cluster_mutable_least_request_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_Cluster_LeastRequestLbConfig* envoy_api_v2_Cluster_mutable_least_request_lb_config(envoy_api_v2_Cluster *msg, upb_arena *arena) {
   struct envoy_api_v2_Cluster_LeastRequestLbConfig* sub = (struct envoy_api_v2_Cluster_LeastRequestLbConfig*)envoy_api_v2_Cluster_least_request_lb_config(msg);
   struct envoy_api_v2_Cluster_LeastRequestLbConfig* sub = (struct envoy_api_v2_Cluster_LeastRequestLbConfig*)envoy_api_v2_Cluster_least_request_lb_config(msg);
@@ -572,7 +583,7 @@ UPB_INLINE struct envoy_api_v2_Cluster_LeastRequestLbConfig* envoy_api_v2_Cluste
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_Cluster_set_cluster_type(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_CustomClusterType* value) {
 UPB_INLINE void envoy_api_v2_Cluster_set_cluster_type(envoy_api_v2_Cluster *msg, envoy_api_v2_Cluster_CustomClusterType* value) {
-  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CustomClusterType*, UPB_SIZE(144, 256), value, UPB_SIZE(152, 264), 38);
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CustomClusterType*, UPB_SIZE(144, 264), value, UPB_SIZE(152, 272), 38);
 }
 }
 UPB_INLINE struct envoy_api_v2_Cluster_CustomClusterType* envoy_api_v2_Cluster_mutable_cluster_type(envoy_api_v2_Cluster *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_Cluster_CustomClusterType* envoy_api_v2_Cluster_mutable_cluster_type(envoy_api_v2_Cluster *msg, upb_arena *arena) {
   struct envoy_api_v2_Cluster_CustomClusterType* sub = (struct envoy_api_v2_Cluster_CustomClusterType*)envoy_api_v2_Cluster_cluster_type(msg);
   struct envoy_api_v2_Cluster_CustomClusterType* sub = (struct envoy_api_v2_Cluster_CustomClusterType*)envoy_api_v2_Cluster_cluster_type(msg);
@@ -583,6 +594,22 @@ UPB_INLINE struct envoy_api_v2_Cluster_CustomClusterType* envoy_api_v2_Cluster_m
   }
   }
   return sub;
   return sub;
 }
 }
+UPB_INLINE void envoy_api_v2_Cluster_set_respect_dns_ttl(envoy_api_v2_Cluster *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(26, 26)) = value;
+}
+UPB_INLINE struct envoy_api_v2_cluster_Filter** envoy_api_v2_Cluster_mutable_filters(envoy_api_v2_Cluster *msg, size_t *len) {
+  return (struct envoy_api_v2_cluster_Filter**)_upb_array_mutable_accessor(msg, UPB_SIZE(140, 256), len);
+}
+UPB_INLINE struct envoy_api_v2_cluster_Filter** envoy_api_v2_Cluster_resize_filters(envoy_api_v2_Cluster *msg, size_t len, upb_arena *arena) {
+  return (struct envoy_api_v2_cluster_Filter**)_upb_array_resize_accessor(msg, UPB_SIZE(140, 256), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
+}
+UPB_INLINE struct envoy_api_v2_cluster_Filter* envoy_api_v2_Cluster_add_filters(envoy_api_v2_Cluster *msg, upb_arena *arena) {
+  struct envoy_api_v2_cluster_Filter* sub = (struct envoy_api_v2_cluster_Filter*)upb_msg_new(&envoy_api_v2_cluster_Filter_msginit, arena);
+  bool ok = _upb_array_append_accessor(
+      msg, UPB_SIZE(140, 256), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
+  if (!ok) return NULL;
+  return sub;
+}
 
 
 /* envoy.api.v2.Cluster.CustomClusterType */
 /* envoy.api.v2.Cluster.CustomClusterType */
 
 
@@ -736,6 +763,7 @@ UPB_INLINE const envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector* const* en
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_locality_weight_aware(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_locality_weight_aware(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_scale_locality_weight(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(9, 9)); }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_scale_locality_weight(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(9, 9)); }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_panic_mode_any(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(10, 10)); }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_panic_mode_any(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(10, 10)); }
+UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_list_as_any(const envoy_api_v2_Cluster_LbSubsetConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(11, 11)); }
 
 
 UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_fallback_policy(envoy_api_v2_Cluster_LbSubsetConfig *msg, int32_t value) {
 UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_fallback_policy(envoy_api_v2_Cluster_LbSubsetConfig *msg, int32_t value) {
   UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value;
   UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value;
@@ -774,6 +802,9 @@ UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_scale_locality_weight(en
 UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_panic_mode_any(envoy_api_v2_Cluster_LbSubsetConfig *msg, bool value) {
 UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_panic_mode_any(envoy_api_v2_Cluster_LbSubsetConfig *msg, bool value) {
   UPB_FIELD_AT(msg, bool, UPB_SIZE(10, 10)) = value;
   UPB_FIELD_AT(msg, bool, UPB_SIZE(10, 10)) = value;
 }
 }
+UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_set_list_as_any(envoy_api_v2_Cluster_LbSubsetConfig *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(11, 11)) = value;
+}
 
 
 /* envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector */
 /* envoy.api.v2.Cluster.LbSubsetConfig.LbSubsetSelector */
 
 
@@ -789,17 +820,21 @@ UPB_INLINE char *envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_serialize(
   return upb_encode(msg, &envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_msginit, arena, len);
   return upb_encode(msg, &envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_msginit, arena, len);
 }
 }
 
 
-UPB_INLINE upb_strview const* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_keys(const envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+UPB_INLINE upb_strview const* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_keys(const envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(8, 8), len); }
+UPB_INLINE int32_t envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_fallback_policy(const envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); }
 
 
 UPB_INLINE upb_strview* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_mutable_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t *len) {
 UPB_INLINE upb_strview* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_mutable_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t *len) {
-  return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+  return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 8), len);
 }
 }
 UPB_INLINE upb_strview* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_resize_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t len, upb_arena *arena) {
 UPB_INLINE upb_strview* envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_resize_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, size_t len, upb_arena *arena) {
-  return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(0, 0), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena);
+  return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(8, 8), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena);
 }
 }
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_add_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, upb_strview val, upb_arena *arena) {
 UPB_INLINE bool envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_add_keys(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, upb_strview val, upb_arena *arena) {
   return _upb_array_append_accessor(
   return _upb_array_append_accessor(
-      msg, UPB_SIZE(0, 0), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
+      msg, UPB_SIZE(8, 8), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
+}
+UPB_INLINE void envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector_set_fallback_policy(envoy_api_v2_Cluster_LbSubsetConfig_LbSubsetSelector *msg, int32_t value) {
+  UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value;
 }
 }
 
 
 /* envoy.api.v2.Cluster.LeastRequestLbConfig */
 /* envoy.api.v2.Cluster.LeastRequestLbConfig */
@@ -925,6 +960,7 @@ UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_has_locality_weighted_lb_con
 UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* envoy_api_v2_Cluster_CommonLbConfig_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(12, 24), UPB_SIZE(16, 32), 3, NULL); }
 UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* envoy_api_v2_Cluster_CommonLbConfig_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(12, 24), UPB_SIZE(16, 32), 3, NULL); }
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_CommonLbConfig_update_merge_window(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); }
 UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_CommonLbConfig_update_merge_window(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); }
 UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_ignore_new_hosts_until_first_hc(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); }
 UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_ignore_new_hosts_until_first_hc(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); }
+UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_close_connections_on_host_set_change(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)); }
 
 
 UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_healthy_panic_threshold(envoy_api_v2_Cluster_CommonLbConfig *msg, struct envoy_type_Percent* value) {
 UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_healthy_panic_threshold(envoy_api_v2_Cluster_CommonLbConfig *msg, struct envoy_type_Percent* value) {
   UPB_FIELD_AT(msg, struct envoy_type_Percent*, UPB_SIZE(4, 8)) = value;
   UPB_FIELD_AT(msg, struct envoy_type_Percent*, UPB_SIZE(4, 8)) = value;
@@ -977,6 +1013,9 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_Cluster_CommonLbConfig_
 UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_ignore_new_hosts_until_first_hc(envoy_api_v2_Cluster_CommonLbConfig *msg, bool value) {
 UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_ignore_new_hosts_until_first_hc(envoy_api_v2_Cluster_CommonLbConfig *msg, bool value) {
   UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value;
   UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value;
 }
 }
+UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_close_connections_on_host_set_change(envoy_api_v2_Cluster_CommonLbConfig *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)) = value;
+}
 
 
 /* envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig */
 /* envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig */
 
 

+ 34 - 0
src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c

@@ -0,0 +1,34 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     envoy/api/v2/cluster/filter.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/api/v2/cluster/filter.upb.h"
+#include "google/protobuf/any.upb.h"
+#include "validate/validate.upb.h"
+#include "gogoproto/gogo.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const envoy_api_v2_cluster_Filter_submsgs[1] = {
+  &google_protobuf_Any_msginit,
+};
+
+static const upb_msglayout_field envoy_api_v2_cluster_Filter__fields[2] = {
+  {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+  {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
+};
+
+const upb_msglayout envoy_api_v2_cluster_Filter_msginit = {
+  &envoy_api_v2_cluster_Filter_submsgs[0],
+  &envoy_api_v2_cluster_Filter__fields[0],
+  UPB_SIZE(16, 32), 2, false,
+};
+
+#include "upb/port_undef.inc"
+

+ 69 - 0
src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h

@@ -0,0 +1,69 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     envoy/api/v2/cluster/filter.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_API_V2_CLUSTER_FILTER_PROTO_UPB_H_
+#define ENVOY_API_V2_CLUSTER_FILTER_PROTO_UPB_H_
+
+#include "upb/generated_util.h"
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_api_v2_cluster_Filter;
+typedef struct envoy_api_v2_cluster_Filter envoy_api_v2_cluster_Filter;
+extern const upb_msglayout envoy_api_v2_cluster_Filter_msginit;
+struct google_protobuf_Any;
+extern const upb_msglayout google_protobuf_Any_msginit;
+
+
+/* envoy.api.v2.cluster.Filter */
+
+UPB_INLINE envoy_api_v2_cluster_Filter *envoy_api_v2_cluster_Filter_new(upb_arena *arena) {
+  return (envoy_api_v2_cluster_Filter *)upb_msg_new(&envoy_api_v2_cluster_Filter_msginit, arena);
+}
+UPB_INLINE envoy_api_v2_cluster_Filter *envoy_api_v2_cluster_Filter_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  envoy_api_v2_cluster_Filter *ret = envoy_api_v2_cluster_Filter_new(arena);
+  return (ret && upb_decode(buf, size, ret, &envoy_api_v2_cluster_Filter_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *envoy_api_v2_cluster_Filter_serialize(const envoy_api_v2_cluster_Filter *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &envoy_api_v2_cluster_Filter_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_api_v2_cluster_Filter_name(const envoy_api_v2_cluster_Filter *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); }
+UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_cluster_Filter_typed_config(const envoy_api_v2_cluster_Filter *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16)); }
+
+UPB_INLINE void envoy_api_v2_cluster_Filter_set_name(envoy_api_v2_cluster_Filter *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value;
+}
+UPB_INLINE void envoy_api_v2_cluster_Filter_set_typed_config(envoy_api_v2_cluster_Filter *msg, struct google_protobuf_Any* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16)) = value;
+}
+UPB_INLINE struct google_protobuf_Any* envoy_api_v2_cluster_Filter_mutable_typed_config(envoy_api_v2_cluster_Filter *msg, upb_arena *arena) {
+  struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_cluster_Filter_typed_config(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_cluster_Filter_set_typed_config(msg, sub);
+  }
+  return sub;
+}
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif  /* ENVOY_API_V2_CLUSTER_FILTER_PROTO_UPB_H_ */

+ 18 - 14
src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c

@@ -16,29 +16,33 @@
 
 
 #include "upb/port_def.inc"
 #include "upb/port_def.inc"
 
 
-static const upb_msglayout *const envoy_api_v2_cluster_OutlierDetection_submsgs[11] = {
+static const upb_msglayout *const envoy_api_v2_cluster_OutlierDetection_submsgs[14] = {
   &google_protobuf_Duration_msginit,
   &google_protobuf_Duration_msginit,
   &google_protobuf_UInt32Value_msginit,
   &google_protobuf_UInt32Value_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_cluster_OutlierDetection__fields[11] = {
-  {1, UPB_SIZE(0, 0), 0, 1, 11, 1},
-  {2, UPB_SIZE(4, 8), 0, 0, 11, 1},
-  {3, UPB_SIZE(8, 16), 0, 0, 11, 1},
-  {4, UPB_SIZE(12, 24), 0, 1, 11, 1},
-  {5, UPB_SIZE(16, 32), 0, 1, 11, 1},
-  {6, UPB_SIZE(20, 40), 0, 1, 11, 1},
-  {7, UPB_SIZE(24, 48), 0, 1, 11, 1},
-  {8, UPB_SIZE(28, 56), 0, 1, 11, 1},
-  {9, UPB_SIZE(32, 64), 0, 1, 11, 1},
-  {10, UPB_SIZE(36, 72), 0, 1, 11, 1},
-  {11, UPB_SIZE(40, 80), 0, 1, 11, 1},
+static const upb_msglayout_field envoy_api_v2_cluster_OutlierDetection__fields[15] = {
+  {1, UPB_SIZE(4, 8), 0, 1, 11, 1},
+  {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
+  {3, UPB_SIZE(12, 24), 0, 0, 11, 1},
+  {4, UPB_SIZE(16, 32), 0, 1, 11, 1},
+  {5, UPB_SIZE(20, 40), 0, 1, 11, 1},
+  {6, UPB_SIZE(24, 48), 0, 1, 11, 1},
+  {7, UPB_SIZE(28, 56), 0, 1, 11, 1},
+  {8, UPB_SIZE(32, 64), 0, 1, 11, 1},
+  {9, UPB_SIZE(36, 72), 0, 1, 11, 1},
+  {10, UPB_SIZE(40, 80), 0, 1, 11, 1},
+  {11, UPB_SIZE(44, 88), 0, 1, 11, 1},
+  {12, UPB_SIZE(0, 0), 0, 0, 8, 1},
+  {13, UPB_SIZE(48, 96), 0, 1, 11, 1},
+  {14, UPB_SIZE(52, 104), 0, 1, 11, 1},
+  {15, UPB_SIZE(56, 112), 0, 1, 11, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_cluster_OutlierDetection_msginit = {
 const upb_msglayout envoy_api_v2_cluster_OutlierDetection_msginit = {
   &envoy_api_v2_cluster_OutlierDetection_submsgs[0],
   &envoy_api_v2_cluster_OutlierDetection_submsgs[0],
   &envoy_api_v2_cluster_OutlierDetection__fields[0],
   &envoy_api_v2_cluster_OutlierDetection__fields[0],
-  UPB_SIZE(44, 88), 11, false,
+  UPB_SIZE(60, 120), 15, false,
 };
 };
 
 
 #include "upb/port_undef.inc"
 #include "upb/port_undef.inc"

+ 65 - 22
src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h

@@ -43,20 +43,24 @@ UPB_INLINE char *envoy_api_v2_cluster_OutlierDetection_serialize(const envoy_api
   return upb_encode(msg, &envoy_api_v2_cluster_OutlierDetection_msginit, arena, len);
   return upb_encode(msg, &envoy_api_v2_cluster_OutlierDetection_msginit, arena, len);
 }
 }
 
 
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_consecutive_5xx(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(0, 0)); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_interval(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(4, 8)); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_base_ejection_time(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_max_ejection_percent(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(12, 24)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_5xx(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_success_rate(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_minimum_hosts(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_request_volume(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_stdev_factor(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_consecutive_gateway_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_gateway_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(40, 80)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_consecutive_5xx(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_interval(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_base_ejection_time(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(12, 24)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_max_ejection_percent(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_5xx(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_success_rate(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_minimum_hosts(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_request_volume(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_success_rate_stdev_factor(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_consecutive_gateway_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(40, 80)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_gateway_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(44, 88)); }
+UPB_INLINE bool envoy_api_v2_cluster_OutlierDetection_split_external_local_origin_errors(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_consecutive_local_origin_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(48, 96)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_local_origin_failure(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(52, 104)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_enforcing_local_origin_success_rate(const envoy_api_v2_cluster_OutlierDetection *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(56, 112)); }
 
 
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(0, 0)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_consecutive_5xx(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_consecutive_5xx(msg);
@@ -68,7 +72,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_interval(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_Duration* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_interval(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_Duration* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(4, 8)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 16)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_mutable_interval(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_mutable_interval(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_cluster_OutlierDetection_interval(msg);
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_cluster_OutlierDetection_interval(msg);
@@ -80,7 +84,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetectio
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_base_ejection_time(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_Duration* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_base_ejection_time(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_Duration* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 16)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(12, 24)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_mutable_base_ejection_time(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetection_mutable_base_ejection_time(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_cluster_OutlierDetection_base_ejection_time(msg);
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_cluster_OutlierDetection_base_ejection_time(msg);
@@ -92,7 +96,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_cluster_OutlierDetectio
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_max_ejection_percent(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_max_ejection_percent(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(12, 24)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_max_ejection_percent(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_max_ejection_percent(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_max_ejection_percent(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_max_ejection_percent(msg);
@@ -104,7 +108,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_consecutive_5xx(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_5xx(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_5xx(msg);
@@ -116,7 +120,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_success_rate(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_success_rate(msg);
@@ -128,7 +132,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_minimum_hosts(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_minimum_hosts(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_minimum_hosts(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_minimum_hosts(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_minimum_hosts(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_minimum_hosts(msg);
@@ -140,7 +144,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_request_volume(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_request_volume(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_request_volume(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_request_volume(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_request_volume(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_request_volume(msg);
@@ -152,7 +156,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_stdev_factor(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_success_rate_stdev_factor(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_stdev_factor(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_success_rate_stdev_factor(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_stdev_factor(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_success_rate_stdev_factor(msg);
@@ -164,7 +168,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(40, 80)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_consecutive_gateway_failure(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_consecutive_gateway_failure(msg);
@@ -176,7 +180,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(40, 80)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(44, 88)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_consecutive_gateway_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_gateway_failure(msg);
   struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_gateway_failure(msg);
@@ -187,6 +191,45 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetec
   }
   }
   return sub;
   return sub;
 }
 }
+UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_split_external_local_origin_errors(envoy_api_v2_cluster_OutlierDetection *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value;
+}
+UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_consecutive_local_origin_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(48, 96)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_consecutive_local_origin_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_consecutive_local_origin_failure(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_cluster_OutlierDetection_set_consecutive_local_origin_failure(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_local_origin_failure(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(52, 104)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_consecutive_local_origin_failure(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_consecutive_local_origin_failure(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_cluster_OutlierDetection_set_enforcing_consecutive_local_origin_failure(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_cluster_OutlierDetection_set_enforcing_local_origin_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(56, 112)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_cluster_OutlierDetection_mutable_enforcing_local_origin_success_rate(envoy_api_v2_cluster_OutlierDetection *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_cluster_OutlierDetection_enforcing_local_origin_success_rate(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_cluster_OutlierDetection_set_enforcing_local_origin_success_rate(msg, sub);
+  }
+  return sub;
+}
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }  /* extern "C" */
 }  /* extern "C" */

+ 32 - 0
src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c

@@ -9,6 +9,7 @@
 #include <stddef.h>
 #include <stddef.h>
 #include "upb/msg.h"
 #include "upb/msg.h"
 #include "envoy/api/v2/core/base.upb.h"
 #include "envoy/api/v2/core/base.upb.h"
+#include "envoy/api/v2/core/http_uri.upb.h"
 #include "google/protobuf/any.upb.h"
 #include "google/protobuf/any.upb.h"
 #include "google/protobuf/struct.upb.h"
 #include "google/protobuf/struct.upb.h"
 #include "google/protobuf/wrappers.upb.h"
 #include "google/protobuf/wrappers.upb.h"
@@ -142,6 +143,37 @@ const upb_msglayout envoy_api_v2_core_DataSource_msginit = {
   UPB_SIZE(16, 32), 3, false,
   UPB_SIZE(16, 32), 3, false,
 };
 };
 
 
+static const upb_msglayout *const envoy_api_v2_core_RemoteDataSource_submsgs[1] = {
+  &envoy_api_v2_core_HttpUri_msginit,
+};
+
+static const upb_msglayout_field envoy_api_v2_core_RemoteDataSource__fields[2] = {
+  {1, UPB_SIZE(8, 16), 0, 0, 11, 1},
+  {2, UPB_SIZE(0, 0), 0, 0, 9, 1},
+};
+
+const upb_msglayout envoy_api_v2_core_RemoteDataSource_msginit = {
+  &envoy_api_v2_core_RemoteDataSource_submsgs[0],
+  &envoy_api_v2_core_RemoteDataSource__fields[0],
+  UPB_SIZE(16, 32), 2, false,
+};
+
+static const upb_msglayout *const envoy_api_v2_core_AsyncDataSource_submsgs[2] = {
+  &envoy_api_v2_core_DataSource_msginit,
+  &envoy_api_v2_core_RemoteDataSource_msginit,
+};
+
+static const upb_msglayout_field envoy_api_v2_core_AsyncDataSource__fields[2] = {
+  {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
+  {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
+};
+
+const upb_msglayout envoy_api_v2_core_AsyncDataSource_msginit = {
+  &envoy_api_v2_core_AsyncDataSource_submsgs[0],
+  &envoy_api_v2_core_AsyncDataSource__fields[0],
+  UPB_SIZE(8, 16), 2, false,
+};
+
 static const upb_msglayout *const envoy_api_v2_core_TransportSocket_submsgs[2] = {
 static const upb_msglayout *const envoy_api_v2_core_TransportSocket_submsgs[2] = {
   &google_protobuf_Any_msginit,
   &google_protobuf_Any_msginit,
   &google_protobuf_Struct_msginit,
   &google_protobuf_Struct_msginit,

+ 98 - 0
src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h

@@ -29,6 +29,8 @@ struct envoy_api_v2_core_HeaderValue;
 struct envoy_api_v2_core_HeaderValueOption;
 struct envoy_api_v2_core_HeaderValueOption;
 struct envoy_api_v2_core_HeaderMap;
 struct envoy_api_v2_core_HeaderMap;
 struct envoy_api_v2_core_DataSource;
 struct envoy_api_v2_core_DataSource;
+struct envoy_api_v2_core_RemoteDataSource;
+struct envoy_api_v2_core_AsyncDataSource;
 struct envoy_api_v2_core_TransportSocket;
 struct envoy_api_v2_core_TransportSocket;
 struct envoy_api_v2_core_SocketOption;
 struct envoy_api_v2_core_SocketOption;
 struct envoy_api_v2_core_RuntimeFractionalPercent;
 struct envoy_api_v2_core_RuntimeFractionalPercent;
@@ -42,6 +44,8 @@ typedef struct envoy_api_v2_core_HeaderValue envoy_api_v2_core_HeaderValue;
 typedef struct envoy_api_v2_core_HeaderValueOption envoy_api_v2_core_HeaderValueOption;
 typedef struct envoy_api_v2_core_HeaderValueOption envoy_api_v2_core_HeaderValueOption;
 typedef struct envoy_api_v2_core_HeaderMap envoy_api_v2_core_HeaderMap;
 typedef struct envoy_api_v2_core_HeaderMap envoy_api_v2_core_HeaderMap;
 typedef struct envoy_api_v2_core_DataSource envoy_api_v2_core_DataSource;
 typedef struct envoy_api_v2_core_DataSource envoy_api_v2_core_DataSource;
+typedef struct envoy_api_v2_core_RemoteDataSource envoy_api_v2_core_RemoteDataSource;
+typedef struct envoy_api_v2_core_AsyncDataSource envoy_api_v2_core_AsyncDataSource;
 typedef struct envoy_api_v2_core_TransportSocket envoy_api_v2_core_TransportSocket;
 typedef struct envoy_api_v2_core_TransportSocket envoy_api_v2_core_TransportSocket;
 typedef struct envoy_api_v2_core_SocketOption envoy_api_v2_core_SocketOption;
 typedef struct envoy_api_v2_core_SocketOption envoy_api_v2_core_SocketOption;
 typedef struct envoy_api_v2_core_RuntimeFractionalPercent envoy_api_v2_core_RuntimeFractionalPercent;
 typedef struct envoy_api_v2_core_RuntimeFractionalPercent envoy_api_v2_core_RuntimeFractionalPercent;
@@ -55,14 +59,18 @@ extern const upb_msglayout envoy_api_v2_core_HeaderValue_msginit;
 extern const upb_msglayout envoy_api_v2_core_HeaderValueOption_msginit;
 extern const upb_msglayout envoy_api_v2_core_HeaderValueOption_msginit;
 extern const upb_msglayout envoy_api_v2_core_HeaderMap_msginit;
 extern const upb_msglayout envoy_api_v2_core_HeaderMap_msginit;
 extern const upb_msglayout envoy_api_v2_core_DataSource_msginit;
 extern const upb_msglayout envoy_api_v2_core_DataSource_msginit;
+extern const upb_msglayout envoy_api_v2_core_RemoteDataSource_msginit;
+extern const upb_msglayout envoy_api_v2_core_AsyncDataSource_msginit;
 extern const upb_msglayout envoy_api_v2_core_TransportSocket_msginit;
 extern const upb_msglayout envoy_api_v2_core_TransportSocket_msginit;
 extern const upb_msglayout envoy_api_v2_core_SocketOption_msginit;
 extern const upb_msglayout envoy_api_v2_core_SocketOption_msginit;
 extern const upb_msglayout envoy_api_v2_core_RuntimeFractionalPercent_msginit;
 extern const upb_msglayout envoy_api_v2_core_RuntimeFractionalPercent_msginit;
 extern const upb_msglayout envoy_api_v2_core_ControlPlane_msginit;
 extern const upb_msglayout envoy_api_v2_core_ControlPlane_msginit;
+struct envoy_api_v2_core_HttpUri;
 struct envoy_type_FractionalPercent;
 struct envoy_type_FractionalPercent;
 struct google_protobuf_Any;
 struct google_protobuf_Any;
 struct google_protobuf_BoolValue;
 struct google_protobuf_BoolValue;
 struct google_protobuf_Struct;
 struct google_protobuf_Struct;
+extern const upb_msglayout envoy_api_v2_core_HttpUri_msginit;
 extern const upb_msglayout envoy_type_FractionalPercent_msginit;
 extern const upb_msglayout envoy_type_FractionalPercent_msginit;
 extern const upb_msglayout google_protobuf_Any_msginit;
 extern const upb_msglayout google_protobuf_Any_msginit;
 extern const upb_msglayout google_protobuf_BoolValue_msginit;
 extern const upb_msglayout google_protobuf_BoolValue_msginit;
@@ -92,6 +100,12 @@ typedef enum {
   envoy_api_v2_core_SocketOption_STATE_LISTENING = 2
   envoy_api_v2_core_SocketOption_STATE_LISTENING = 2
 } envoy_api_v2_core_SocketOption_SocketState;
 } envoy_api_v2_core_SocketOption_SocketState;
 
 
+typedef enum {
+  envoy_api_v2_core_UNSPECIFIED = 0,
+  envoy_api_v2_core_INBOUND = 1,
+  envoy_api_v2_core_OUTBOUND = 2
+} envoy_api_v2_core_TrafficDirection;
+
 
 
 /* envoy.api.v2.core.Locality */
 /* envoy.api.v2.core.Locality */
 
 
@@ -397,6 +411,90 @@ UPB_INLINE void envoy_api_v2_core_DataSource_set_inline_string(envoy_api_v2_core
   UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 3);
   UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 3);
 }
 }
 
 
+/* envoy.api.v2.core.RemoteDataSource */
+
+UPB_INLINE envoy_api_v2_core_RemoteDataSource *envoy_api_v2_core_RemoteDataSource_new(upb_arena *arena) {
+  return (envoy_api_v2_core_RemoteDataSource *)upb_msg_new(&envoy_api_v2_core_RemoteDataSource_msginit, arena);
+}
+UPB_INLINE envoy_api_v2_core_RemoteDataSource *envoy_api_v2_core_RemoteDataSource_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  envoy_api_v2_core_RemoteDataSource *ret = envoy_api_v2_core_RemoteDataSource_new(arena);
+  return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_RemoteDataSource_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *envoy_api_v2_core_RemoteDataSource_serialize(const envoy_api_v2_core_RemoteDataSource *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &envoy_api_v2_core_RemoteDataSource_msginit, arena, len);
+}
+
+UPB_INLINE const struct envoy_api_v2_core_HttpUri* envoy_api_v2_core_RemoteDataSource_http_uri(const envoy_api_v2_core_RemoteDataSource *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_HttpUri*, UPB_SIZE(8, 16)); }
+UPB_INLINE upb_strview envoy_api_v2_core_RemoteDataSource_sha256(const envoy_api_v2_core_RemoteDataSource *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); }
+
+UPB_INLINE void envoy_api_v2_core_RemoteDataSource_set_http_uri(envoy_api_v2_core_RemoteDataSource *msg, struct envoy_api_v2_core_HttpUri* value) {
+  UPB_FIELD_AT(msg, struct envoy_api_v2_core_HttpUri*, UPB_SIZE(8, 16)) = value;
+}
+UPB_INLINE struct envoy_api_v2_core_HttpUri* envoy_api_v2_core_RemoteDataSource_mutable_http_uri(envoy_api_v2_core_RemoteDataSource *msg, upb_arena *arena) {
+  struct envoy_api_v2_core_HttpUri* sub = (struct envoy_api_v2_core_HttpUri*)envoy_api_v2_core_RemoteDataSource_http_uri(msg);
+  if (sub == NULL) {
+    sub = (struct envoy_api_v2_core_HttpUri*)upb_msg_new(&envoy_api_v2_core_HttpUri_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_RemoteDataSource_set_http_uri(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_RemoteDataSource_set_sha256(envoy_api_v2_core_RemoteDataSource *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value;
+}
+
+/* envoy.api.v2.core.AsyncDataSource */
+
+UPB_INLINE envoy_api_v2_core_AsyncDataSource *envoy_api_v2_core_AsyncDataSource_new(upb_arena *arena) {
+  return (envoy_api_v2_core_AsyncDataSource *)upb_msg_new(&envoy_api_v2_core_AsyncDataSource_msginit, arena);
+}
+UPB_INLINE envoy_api_v2_core_AsyncDataSource *envoy_api_v2_core_AsyncDataSource_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  envoy_api_v2_core_AsyncDataSource *ret = envoy_api_v2_core_AsyncDataSource_new(arena);
+  return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_AsyncDataSource_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *envoy_api_v2_core_AsyncDataSource_serialize(const envoy_api_v2_core_AsyncDataSource *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &envoy_api_v2_core_AsyncDataSource_msginit, arena, len);
+}
+
+typedef enum {
+  envoy_api_v2_core_AsyncDataSource_specifier_local = 1,
+  envoy_api_v2_core_AsyncDataSource_specifier_remote = 2,
+  envoy_api_v2_core_AsyncDataSource_specifier_NOT_SET = 0
+} envoy_api_v2_core_AsyncDataSource_specifier_oneofcases;
+UPB_INLINE envoy_api_v2_core_AsyncDataSource_specifier_oneofcases envoy_api_v2_core_AsyncDataSource_specifier_case(const envoy_api_v2_core_AsyncDataSource* msg) { return (envoy_api_v2_core_AsyncDataSource_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(4, 8)); }
+
+UPB_INLINE bool envoy_api_v2_core_AsyncDataSource_has_local(const envoy_api_v2_core_AsyncDataSource *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(4, 8), 1); }
+UPB_INLINE const envoy_api_v2_core_DataSource* envoy_api_v2_core_AsyncDataSource_local(const envoy_api_v2_core_AsyncDataSource *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 1, NULL); }
+UPB_INLINE bool envoy_api_v2_core_AsyncDataSource_has_remote(const envoy_api_v2_core_AsyncDataSource *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(4, 8), 2); }
+UPB_INLINE const envoy_api_v2_core_RemoteDataSource* envoy_api_v2_core_AsyncDataSource_remote(const envoy_api_v2_core_AsyncDataSource *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_RemoteDataSource*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 2, NULL); }
+
+UPB_INLINE void envoy_api_v2_core_AsyncDataSource_set_local(envoy_api_v2_core_AsyncDataSource *msg, envoy_api_v2_core_DataSource* value) {
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1);
+}
+UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_core_AsyncDataSource_mutable_local(envoy_api_v2_core_AsyncDataSource *msg, upb_arena *arena) {
+  struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_core_AsyncDataSource_local(msg);
+  if (sub == NULL) {
+    sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_AsyncDataSource_set_local(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_AsyncDataSource_set_remote(envoy_api_v2_core_AsyncDataSource *msg, envoy_api_v2_core_RemoteDataSource* value) {
+  UPB_WRITE_ONEOF(msg, envoy_api_v2_core_RemoteDataSource*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 2);
+}
+UPB_INLINE struct envoy_api_v2_core_RemoteDataSource* envoy_api_v2_core_AsyncDataSource_mutable_remote(envoy_api_v2_core_AsyncDataSource *msg, upb_arena *arena) {
+  struct envoy_api_v2_core_RemoteDataSource* sub = (struct envoy_api_v2_core_RemoteDataSource*)envoy_api_v2_core_AsyncDataSource_remote(msg);
+  if (sub == NULL) {
+    sub = (struct envoy_api_v2_core_RemoteDataSource*)upb_msg_new(&envoy_api_v2_core_RemoteDataSource_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_AsyncDataSource_set_remote(msg, sub);
+  }
+  return sub;
+}
+
 /* envoy.api.v2.core.TransportSocket */
 /* envoy.api.v2.core.TransportSocket */
 
 
 UPB_INLINE envoy_api_v2_core_TransportSocket *envoy_api_v2_core_TransportSocket_new(upb_arena *arena) {
 UPB_INLINE envoy_api_v2_core_TransportSocket *envoy_api_v2_core_TransportSocket_new(upb_arena *arena) {

+ 8 - 7
src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c

@@ -23,19 +23,20 @@ static const upb_msglayout *const envoy_api_v2_core_ApiConfigSource_submsgs[4] =
   &google_protobuf_Duration_msginit,
   &google_protobuf_Duration_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_core_ApiConfigSource__fields[6] = {
+static const upb_msglayout_field envoy_api_v2_core_ApiConfigSource__fields[7] = {
   {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
   {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
-  {2, UPB_SIZE(20, 32), 0, 0, 9, 3},
-  {3, UPB_SIZE(8, 8), 0, 2, 11, 1},
-  {4, UPB_SIZE(24, 40), 0, 0, 11, 3},
-  {5, UPB_SIZE(12, 16), 0, 2, 11, 1},
-  {6, UPB_SIZE(16, 24), 0, 1, 11, 1},
+  {2, UPB_SIZE(24, 40), 0, 0, 9, 3},
+  {3, UPB_SIZE(12, 16), 0, 2, 11, 1},
+  {4, UPB_SIZE(28, 48), 0, 0, 11, 3},
+  {5, UPB_SIZE(16, 24), 0, 2, 11, 1},
+  {6, UPB_SIZE(20, 32), 0, 1, 11, 1},
+  {7, UPB_SIZE(8, 8), 0, 0, 8, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_core_ApiConfigSource_msginit = {
 const upb_msglayout envoy_api_v2_core_ApiConfigSource_msginit = {
   &envoy_api_v2_core_ApiConfigSource_submsgs[0],
   &envoy_api_v2_core_ApiConfigSource_submsgs[0],
   &envoy_api_v2_core_ApiConfigSource__fields[0],
   &envoy_api_v2_core_ApiConfigSource__fields[0],
-  UPB_SIZE(32, 48), 6, false,
+  UPB_SIZE(32, 56), 7, false,
 };
 };
 
 
 const upb_msglayout envoy_api_v2_core_AggregatedConfigSource_msginit = {
 const upb_msglayout envoy_api_v2_core_AggregatedConfigSource_msginit = {

+ 18 - 14
src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h

@@ -64,27 +64,28 @@ UPB_INLINE char *envoy_api_v2_core_ApiConfigSource_serialize(const envoy_api_v2_
 }
 }
 
 
 UPB_INLINE int32_t envoy_api_v2_core_ApiConfigSource_api_type(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); }
 UPB_INLINE int32_t envoy_api_v2_core_ApiConfigSource_api_type(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); }
-UPB_INLINE upb_strview const* envoy_api_v2_core_ApiConfigSource_cluster_names(const envoy_api_v2_core_ApiConfigSource *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(20, 32), len); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_refresh_delay(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 8)); }
-UPB_INLINE const struct envoy_api_v2_core_GrpcService* const* envoy_api_v2_core_ApiConfigSource_grpc_services(const envoy_api_v2_core_ApiConfigSource *msg, size_t *len) { return (const struct envoy_api_v2_core_GrpcService* const*)_upb_array_accessor(msg, UPB_SIZE(24, 40), len); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_request_timeout(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(12, 16)); }
-UPB_INLINE const envoy_api_v2_core_RateLimitSettings* envoy_api_v2_core_ApiConfigSource_rate_limit_settings(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_core_RateLimitSettings*, UPB_SIZE(16, 24)); }
+UPB_INLINE upb_strview const* envoy_api_v2_core_ApiConfigSource_cluster_names(const envoy_api_v2_core_ApiConfigSource *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(24, 40), len); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_refresh_delay(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(12, 16)); }
+UPB_INLINE const struct envoy_api_v2_core_GrpcService* const* envoy_api_v2_core_ApiConfigSource_grpc_services(const envoy_api_v2_core_ApiConfigSource *msg, size_t *len) { return (const struct envoy_api_v2_core_GrpcService* const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_request_timeout(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(16, 24)); }
+UPB_INLINE const envoy_api_v2_core_RateLimitSettings* envoy_api_v2_core_ApiConfigSource_rate_limit_settings(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_core_RateLimitSettings*, UPB_SIZE(20, 32)); }
+UPB_INLINE bool envoy_api_v2_core_ApiConfigSource_set_node_on_first_message_only(const envoy_api_v2_core_ApiConfigSource *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); }
 
 
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_api_type(envoy_api_v2_core_ApiConfigSource *msg, int32_t value) {
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_api_type(envoy_api_v2_core_ApiConfigSource *msg, int32_t value) {
   UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value;
   UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value;
 }
 }
 UPB_INLINE upb_strview* envoy_api_v2_core_ApiConfigSource_mutable_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, size_t *len) {
 UPB_INLINE upb_strview* envoy_api_v2_core_ApiConfigSource_mutable_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, size_t *len) {
-  return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 32), len);
+  return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 40), len);
 }
 }
 UPB_INLINE upb_strview* envoy_api_v2_core_ApiConfigSource_resize_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, size_t len, upb_arena *arena) {
 UPB_INLINE upb_strview* envoy_api_v2_core_ApiConfigSource_resize_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, size_t len, upb_arena *arena) {
-  return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(20, 32), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena);
+  return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(24, 40), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena);
 }
 }
 UPB_INLINE bool envoy_api_v2_core_ApiConfigSource_add_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, upb_strview val, upb_arena *arena) {
 UPB_INLINE bool envoy_api_v2_core_ApiConfigSource_add_cluster_names(envoy_api_v2_core_ApiConfigSource *msg, upb_strview val, upb_arena *arena) {
   return _upb_array_append_accessor(
   return _upb_array_append_accessor(
-      msg, UPB_SIZE(20, 32), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
+      msg, UPB_SIZE(24, 40), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena);
 }
 }
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_refresh_delay(envoy_api_v2_core_ApiConfigSource *msg, struct google_protobuf_Duration* value) {
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_refresh_delay(envoy_api_v2_core_ApiConfigSource *msg, struct google_protobuf_Duration* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 8)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(12, 16)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mutable_refresh_delay(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mutable_refresh_delay(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_ApiConfigSource_refresh_delay(msg);
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_ApiConfigSource_refresh_delay(msg);
@@ -96,20 +97,20 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mu
   return sub;
   return sub;
 }
 }
 UPB_INLINE struct envoy_api_v2_core_GrpcService** envoy_api_v2_core_ApiConfigSource_mutable_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, size_t *len) {
 UPB_INLINE struct envoy_api_v2_core_GrpcService** envoy_api_v2_core_ApiConfigSource_mutable_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, size_t *len) {
-  return (struct envoy_api_v2_core_GrpcService**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 40), len);
+  return (struct envoy_api_v2_core_GrpcService**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len);
 }
 }
 UPB_INLINE struct envoy_api_v2_core_GrpcService** envoy_api_v2_core_ApiConfigSource_resize_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, size_t len, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_core_GrpcService** envoy_api_v2_core_ApiConfigSource_resize_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, size_t len, upb_arena *arena) {
-  return (struct envoy_api_v2_core_GrpcService**)_upb_array_resize_accessor(msg, UPB_SIZE(24, 40), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
+  return (struct envoy_api_v2_core_GrpcService**)_upb_array_resize_accessor(msg, UPB_SIZE(28, 48), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
 }
 }
 UPB_INLINE struct envoy_api_v2_core_GrpcService* envoy_api_v2_core_ApiConfigSource_add_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_core_GrpcService* envoy_api_v2_core_ApiConfigSource_add_grpc_services(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
   struct envoy_api_v2_core_GrpcService* sub = (struct envoy_api_v2_core_GrpcService*)upb_msg_new(&envoy_api_v2_core_GrpcService_msginit, arena);
   struct envoy_api_v2_core_GrpcService* sub = (struct envoy_api_v2_core_GrpcService*)upb_msg_new(&envoy_api_v2_core_GrpcService_msginit, arena);
   bool ok = _upb_array_append_accessor(
   bool ok = _upb_array_append_accessor(
-      msg, UPB_SIZE(24, 40), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
+      msg, UPB_SIZE(28, 48), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
   if (!ok) return NULL;
   if (!ok) return NULL;
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_request_timeout(envoy_api_v2_core_ApiConfigSource *msg, struct google_protobuf_Duration* value) {
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_request_timeout(envoy_api_v2_core_ApiConfigSource *msg, struct google_protobuf_Duration* value) {
-  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(12, 16)) = value;
+  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(16, 24)) = value;
 }
 }
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mutable_request_timeout(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
 UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mutable_request_timeout(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_ApiConfigSource_request_timeout(msg);
   struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_ApiConfigSource_request_timeout(msg);
@@ -121,7 +122,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_ApiConfigSource_mu
   return sub;
   return sub;
 }
 }
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_rate_limit_settings(envoy_api_v2_core_ApiConfigSource *msg, envoy_api_v2_core_RateLimitSettings* value) {
 UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_rate_limit_settings(envoy_api_v2_core_ApiConfigSource *msg, envoy_api_v2_core_RateLimitSettings* value) {
-  UPB_FIELD_AT(msg, envoy_api_v2_core_RateLimitSettings*, UPB_SIZE(16, 24)) = value;
+  UPB_FIELD_AT(msg, envoy_api_v2_core_RateLimitSettings*, UPB_SIZE(20, 32)) = value;
 }
 }
 UPB_INLINE struct envoy_api_v2_core_RateLimitSettings* envoy_api_v2_core_ApiConfigSource_mutable_rate_limit_settings(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
 UPB_INLINE struct envoy_api_v2_core_RateLimitSettings* envoy_api_v2_core_ApiConfigSource_mutable_rate_limit_settings(envoy_api_v2_core_ApiConfigSource *msg, upb_arena *arena) {
   struct envoy_api_v2_core_RateLimitSettings* sub = (struct envoy_api_v2_core_RateLimitSettings*)envoy_api_v2_core_ApiConfigSource_rate_limit_settings(msg);
   struct envoy_api_v2_core_RateLimitSettings* sub = (struct envoy_api_v2_core_RateLimitSettings*)envoy_api_v2_core_ApiConfigSource_rate_limit_settings(msg);
@@ -132,6 +133,9 @@ UPB_INLINE struct envoy_api_v2_core_RateLimitSettings* envoy_api_v2_core_ApiConf
   }
   }
   return sub;
   return sub;
 }
 }
+UPB_INLINE void envoy_api_v2_core_ApiConfigSource_set_set_node_on_first_message_only(envoy_api_v2_core_ApiConfigSource *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)) = value;
+}
 
 
 /* envoy.api.v2.core.AggregatedConfigSource */
 /* envoy.api.v2.core.AggregatedConfigSource */
 
 

+ 35 - 0
src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c

@@ -0,0 +1,35 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     envoy/api/v2/core/http_uri.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/api/v2/core/http_uri.upb.h"
+#include "google/protobuf/duration.upb.h"
+#include "gogoproto/gogo.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const envoy_api_v2_core_HttpUri_submsgs[1] = {
+  &google_protobuf_Duration_msginit,
+};
+
+static const upb_msglayout_field envoy_api_v2_core_HttpUri__fields[3] = {
+  {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+  {2, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
+  {3, UPB_SIZE(8, 16), 0, 0, 11, 1},
+};
+
+const upb_msglayout envoy_api_v2_core_HttpUri_msginit = {
+  &envoy_api_v2_core_HttpUri_submsgs[0],
+  &envoy_api_v2_core_HttpUri__fields[0],
+  UPB_SIZE(24, 48), 3, false,
+};
+
+#include "upb/port_undef.inc"
+

+ 80 - 0
src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h

@@ -0,0 +1,80 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     envoy/api/v2/core/http_uri.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_API_V2_CORE_HTTP_URI_PROTO_UPB_H_
+#define ENVOY_API_V2_CORE_HTTP_URI_PROTO_UPB_H_
+
+#include "upb/generated_util.h"
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_api_v2_core_HttpUri;
+typedef struct envoy_api_v2_core_HttpUri envoy_api_v2_core_HttpUri;
+extern const upb_msglayout envoy_api_v2_core_HttpUri_msginit;
+struct google_protobuf_Duration;
+extern const upb_msglayout google_protobuf_Duration_msginit;
+
+
+/* envoy.api.v2.core.HttpUri */
+
+UPB_INLINE envoy_api_v2_core_HttpUri *envoy_api_v2_core_HttpUri_new(upb_arena *arena) {
+  return (envoy_api_v2_core_HttpUri *)upb_msg_new(&envoy_api_v2_core_HttpUri_msginit, arena);
+}
+UPB_INLINE envoy_api_v2_core_HttpUri *envoy_api_v2_core_HttpUri_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  envoy_api_v2_core_HttpUri *ret = envoy_api_v2_core_HttpUri_new(arena);
+  return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_HttpUri_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *envoy_api_v2_core_HttpUri_serialize(const envoy_api_v2_core_HttpUri *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &envoy_api_v2_core_HttpUri_msginit, arena, len);
+}
+
+typedef enum {
+  envoy_api_v2_core_HttpUri_http_upstream_type_cluster = 2,
+  envoy_api_v2_core_HttpUri_http_upstream_type_NOT_SET = 0
+} envoy_api_v2_core_HttpUri_http_upstream_type_oneofcases;
+UPB_INLINE envoy_api_v2_core_HttpUri_http_upstream_type_oneofcases envoy_api_v2_core_HttpUri_http_upstream_type_case(const envoy_api_v2_core_HttpUri* msg) { return (envoy_api_v2_core_HttpUri_http_upstream_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); }
+
+UPB_INLINE upb_strview envoy_api_v2_core_HttpUri_uri(const envoy_api_v2_core_HttpUri *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); }
+UPB_INLINE bool envoy_api_v2_core_HttpUri_has_cluster(const envoy_api_v2_core_HttpUri *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 2); }
+UPB_INLINE upb_strview envoy_api_v2_core_HttpUri_cluster(const envoy_api_v2_core_HttpUri *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 2, upb_strview_make("", strlen(""))); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpUri_timeout(const envoy_api_v2_core_HttpUri *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); }
+
+UPB_INLINE void envoy_api_v2_core_HttpUri_set_uri(envoy_api_v2_core_HttpUri *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value;
+}
+UPB_INLINE void envoy_api_v2_core_HttpUri_set_cluster(envoy_api_v2_core_HttpUri *msg, upb_strview value) {
+  UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), value, UPB_SIZE(20, 40), 2);
+}
+UPB_INLINE void envoy_api_v2_core_HttpUri_set_timeout(envoy_api_v2_core_HttpUri *msg, struct google_protobuf_Duration* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 16)) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpUri_mutable_timeout(envoy_api_v2_core_HttpUri *msg, upb_arena *arena) {
+  struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_HttpUri_timeout(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_HttpUri_set_timeout(msg, sub);
+  }
+  return sub;
+}
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif  /* ENVOY_API_V2_CORE_HTTP_URI_PROTO_UPB_H_ */

+ 9 - 3
src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c

@@ -52,23 +52,29 @@ const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_msginit = {
   UPB_SIZE(16, 32), 3, false,
   UPB_SIZE(16, 32), 3, false,
 };
 };
 
 
-static const upb_msglayout *const envoy_api_v2_core_Http2ProtocolOptions_submsgs[4] = {
+static const upb_msglayout *const envoy_api_v2_core_Http2ProtocolOptions_submsgs[9] = {
   &google_protobuf_UInt32Value_msginit,
   &google_protobuf_UInt32Value_msginit,
 };
 };
 
 
-static const upb_msglayout_field envoy_api_v2_core_Http2ProtocolOptions__fields[6] = {
+static const upb_msglayout_field envoy_api_v2_core_Http2ProtocolOptions__fields[12] = {
   {1, UPB_SIZE(4, 8), 0, 0, 11, 1},
   {1, UPB_SIZE(4, 8), 0, 0, 11, 1},
   {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
   {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
   {3, UPB_SIZE(12, 24), 0, 0, 11, 1},
   {3, UPB_SIZE(12, 24), 0, 0, 11, 1},
   {4, UPB_SIZE(16, 32), 0, 0, 11, 1},
   {4, UPB_SIZE(16, 32), 0, 0, 11, 1},
   {5, UPB_SIZE(0, 0), 0, 0, 8, 1},
   {5, UPB_SIZE(0, 0), 0, 0, 8, 1},
   {6, UPB_SIZE(1, 1), 0, 0, 8, 1},
   {6, UPB_SIZE(1, 1), 0, 0, 8, 1},
+  {7, UPB_SIZE(20, 40), 0, 0, 11, 1},
+  {8, UPB_SIZE(24, 48), 0, 0, 11, 1},
+  {9, UPB_SIZE(28, 56), 0, 0, 11, 1},
+  {10, UPB_SIZE(32, 64), 0, 0, 11, 1},
+  {11, UPB_SIZE(36, 72), 0, 0, 11, 1},
+  {12, UPB_SIZE(2, 2), 0, 0, 8, 1},
 };
 };
 
 
 const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_msginit = {
 const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_msginit = {
   &envoy_api_v2_core_Http2ProtocolOptions_submsgs[0],
   &envoy_api_v2_core_Http2ProtocolOptions_submsgs[0],
   &envoy_api_v2_core_Http2ProtocolOptions__fields[0],
   &envoy_api_v2_core_Http2ProtocolOptions__fields[0],
-  UPB_SIZE(20, 40), 6, false,
+  UPB_SIZE(40, 80), 12, false,
 };
 };
 
 
 static const upb_msglayout *const envoy_api_v2_core_GrpcProtocolOptions_submsgs[1] = {
 static const upb_msglayout *const envoy_api_v2_core_GrpcProtocolOptions_submsgs[1] = {

+ 69 - 0
src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h

@@ -145,6 +145,12 @@ UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2Prot
 UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_initial_connection_window_size(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); }
 UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_initial_connection_window_size(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); }
 UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_allow_connect(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); }
 UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_allow_connect(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); }
 UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_allow_metadata(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)); }
 UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_allow_metadata(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_outbound_frames(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_outbound_control_frames(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_consecutive_inbound_frames_with_empty_payload(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_inbound_priority_frames_per_stream(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_inbound_window_update_frames_per_data_frame_sent(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)); }
+UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_stream_error_on_invalid_http_messaging(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(2, 2)); }
 
 
 UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_hpack_table_size(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
 UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_hpack_table_size(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
   UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value;
   UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value;
@@ -200,6 +206,69 @@ UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_allow_connect(envoy_a
 UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_allow_metadata(envoy_api_v2_core_Http2ProtocolOptions *msg, bool value) {
 UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_allow_metadata(envoy_api_v2_core_Http2ProtocolOptions *msg, bool value) {
   UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)) = value;
   UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)) = value;
 }
 }
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_max_outbound_frames(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(20, 40)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_mutable_max_outbound_frames(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_max_outbound_frames(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_Http2ProtocolOptions_set_max_outbound_frames(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_max_outbound_control_frames(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(24, 48)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_mutable_max_outbound_control_frames(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_max_outbound_control_frames(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_Http2ProtocolOptions_set_max_outbound_control_frames(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_max_consecutive_inbound_frames_with_empty_payload(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(28, 56)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_mutable_max_consecutive_inbound_frames_with_empty_payload(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_max_consecutive_inbound_frames_with_empty_payload(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_Http2ProtocolOptions_set_max_consecutive_inbound_frames_with_empty_payload(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_max_inbound_priority_frames_per_stream(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_mutable_max_inbound_priority_frames_per_stream(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_max_inbound_priority_frames_per_stream(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_Http2ProtocolOptions_set_max_inbound_priority_frames_per_stream(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_max_inbound_window_update_frames_per_data_frame_sent(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+  UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_mutable_max_inbound_window_update_frames_per_data_frame_sent(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) {
+  struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_max_inbound_window_update_frames_per_data_frame_sent(msg);
+  if (sub == NULL) {
+    sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+    if (!sub) return NULL;
+    envoy_api_v2_core_Http2ProtocolOptions_set_max_inbound_window_update_frames_per_data_frame_sent(msg, sub);
+  }
+  return sub;
+}
+UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_stream_error_on_invalid_http_messaging(envoy_api_v2_core_Http2ProtocolOptions *msg, bool value) {
+  UPB_FIELD_AT(msg, bool, UPB_SIZE(2, 2)) = value;
+}
 
 
 /* envoy.api.v2.core.GrpcProtocolOptions */
 /* envoy.api.v2.core.GrpcProtocolOptions */
 
 

+ 58 - 0
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c

@@ -0,0 +1,58 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     udpa/data/orca/v1/orca_load_report.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "udpa/data/orca/v1/orca_load_report.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const udpa_data_orca_v1_OrcaLoadReport_submsgs[2] = {
+  &udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit,
+  &udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit,
+};
+
+static const upb_msglayout_field udpa_data_orca_v1_OrcaLoadReport__fields[5] = {
+  {1, UPB_SIZE(0, 0), 0, 0, 1, 1},
+  {2, UPB_SIZE(8, 8), 0, 0, 1, 1},
+  {3, UPB_SIZE(16, 16), 0, 0, 4, 1},
+  {4, UPB_SIZE(24, 24), 0, 0, 11, 3},
+  {5, UPB_SIZE(28, 32), 0, 1, 11, 3},
+};
+
+const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_msginit = {
+  &udpa_data_orca_v1_OrcaLoadReport_submsgs[0],
+  &udpa_data_orca_v1_OrcaLoadReport__fields[0],
+  UPB_SIZE(32, 40), 5, false,
+};
+
+static const upb_msglayout_field udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry__fields[2] = {
+  {1, UPB_SIZE(8, 8), 0, 0, 9, 1},
+  {2, UPB_SIZE(0, 0), 0, 0, 1, 1},
+};
+
+const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit = {
+  NULL,
+  &udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry__fields[0],
+  UPB_SIZE(16, 32), 2, false,
+};
+
+static const upb_msglayout_field udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry__fields[2] = {
+  {1, UPB_SIZE(8, 8), 0, 0, 9, 1},
+  {2, UPB_SIZE(0, 0), 0, 0, 1, 1},
+};
+
+const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit = {
+  NULL,
+  &udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry__fields[0],
+  UPB_SIZE(16, 32), 2, false,
+};
+
+#include "upb/port_undef.inc"
+

+ 144 - 0
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h

@@ -0,0 +1,144 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ *     udpa/data/orca/v1/orca_load_report.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef UDPA_DATA_ORCA_V1_ORCA_LOAD_REPORT_PROTO_UPB_H_
+#define UDPA_DATA_ORCA_V1_ORCA_LOAD_REPORT_PROTO_UPB_H_
+
+#include "upb/generated_util.h"
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct udpa_data_orca_v1_OrcaLoadReport;
+struct udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry;
+struct udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry;
+typedef struct udpa_data_orca_v1_OrcaLoadReport udpa_data_orca_v1_OrcaLoadReport;
+typedef struct udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry;
+typedef struct udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry;
+extern const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_msginit;
+extern const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit;
+extern const upb_msglayout udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit;
+
+
+/* udpa.data.orca.v1.OrcaLoadReport */
+
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport *udpa_data_orca_v1_OrcaLoadReport_new(upb_arena *arena) {
+  return (udpa_data_orca_v1_OrcaLoadReport *)upb_msg_new(&udpa_data_orca_v1_OrcaLoadReport_msginit, arena);
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport *udpa_data_orca_v1_OrcaLoadReport_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  udpa_data_orca_v1_OrcaLoadReport *ret = udpa_data_orca_v1_OrcaLoadReport_new(arena);
+  return (ret && upb_decode(buf, size, ret, &udpa_data_orca_v1_OrcaLoadReport_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *udpa_data_orca_v1_OrcaLoadReport_serialize(const udpa_data_orca_v1_OrcaLoadReport *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &udpa_data_orca_v1_OrcaLoadReport_msginit, arena, len);
+}
+
+UPB_INLINE double udpa_data_orca_v1_OrcaLoadReport_cpu_utilization(const udpa_data_orca_v1_OrcaLoadReport *msg) { return UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)); }
+UPB_INLINE double udpa_data_orca_v1_OrcaLoadReport_mem_utilization(const udpa_data_orca_v1_OrcaLoadReport *msg) { return UPB_FIELD_AT(msg, double, UPB_SIZE(8, 8)); }
+UPB_INLINE uint64_t udpa_data_orca_v1_OrcaLoadReport_rps(const udpa_data_orca_v1_OrcaLoadReport *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(16, 16)); }
+UPB_INLINE const udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry* const* udpa_data_orca_v1_OrcaLoadReport_request_cost(const udpa_data_orca_v1_OrcaLoadReport *msg, size_t *len) { return (const udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry* const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
+UPB_INLINE const udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry* const* udpa_data_orca_v1_OrcaLoadReport_utilization(const udpa_data_orca_v1_OrcaLoadReport *msg, size_t *len) { return (const udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry* const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_set_cpu_utilization(udpa_data_orca_v1_OrcaLoadReport *msg, double value) {
+  UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)) = value;
+}
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_set_mem_utilization(udpa_data_orca_v1_OrcaLoadReport *msg, double value) {
+  UPB_FIELD_AT(msg, double, UPB_SIZE(8, 8)) = value;
+}
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_set_rps(udpa_data_orca_v1_OrcaLoadReport *msg, uint64_t value) {
+  UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(16, 16)) = value;
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry** udpa_data_orca_v1_OrcaLoadReport_mutable_request_cost(udpa_data_orca_v1_OrcaLoadReport *msg, size_t *len) {
+  return (udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry** udpa_data_orca_v1_OrcaLoadReport_resize_request_cost(udpa_data_orca_v1_OrcaLoadReport *msg, size_t len, upb_arena *arena) {
+  return (udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(24, 24), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
+}
+UPB_INLINE struct udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry* udpa_data_orca_v1_OrcaLoadReport_add_request_cost(udpa_data_orca_v1_OrcaLoadReport *msg, upb_arena *arena) {
+  struct udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry* sub = (struct udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry*)upb_msg_new(&udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit, arena);
+  bool ok = _upb_array_append_accessor(
+      msg, UPB_SIZE(24, 24), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
+  if (!ok) return NULL;
+  return sub;
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry** udpa_data_orca_v1_OrcaLoadReport_mutable_utilization(udpa_data_orca_v1_OrcaLoadReport *msg, size_t *len) {
+  return (udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry** udpa_data_orca_v1_OrcaLoadReport_resize_utilization(udpa_data_orca_v1_OrcaLoadReport *msg, size_t len, upb_arena *arena) {
+  return (udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(28, 32), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena);
+}
+UPB_INLINE struct udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry* udpa_data_orca_v1_OrcaLoadReport_add_utilization(udpa_data_orca_v1_OrcaLoadReport *msg, upb_arena *arena) {
+  struct udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry* sub = (struct udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry*)upb_msg_new(&udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit, arena);
+  bool ok = _upb_array_append_accessor(
+      msg, UPB_SIZE(28, 32), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena);
+  if (!ok) return NULL;
+  return sub;
+}
+
+/* udpa.data.orca.v1.OrcaLoadReport.RequestCostEntry */
+
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_new(upb_arena *arena) {
+  return (udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *)upb_msg_new(&udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit, arena);
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *ret = udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_new(arena);
+  return (ret && upb_decode(buf, size, ret, &udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_serialize(const udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_key(const udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)); }
+UPB_INLINE double udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_value(const udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *msg) { return UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)); }
+
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_set_key(udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)) = value;
+}
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry_set_value(udpa_data_orca_v1_OrcaLoadReport_RequestCostEntry *msg, double value) {
+  UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)) = value;
+}
+
+/* udpa.data.orca.v1.OrcaLoadReport.UtilizationEntry */
+
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_new(upb_arena *arena) {
+  return (udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *)upb_msg_new(&udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit, arena);
+}
+UPB_INLINE udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_parse(const char *buf, size_t size,
+                        upb_arena *arena) {
+  udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *ret = udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_new(arena);
+  return (ret && upb_decode(buf, size, ret, &udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE char *udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_serialize(const udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *msg, upb_arena *arena, size_t *len) {
+  return upb_encode(msg, &udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_key(const udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)); }
+UPB_INLINE double udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_value(const udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *msg) { return UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)); }
+
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_set_key(udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *msg, upb_strview value) {
+  UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)) = value;
+}
+UPB_INLINE void udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry_set_value(udpa_data_orca_v1_OrcaLoadReport_UtilizationEntry *msg, double value) {
+  UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)) = value;
+}
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif  /* UDPA_DATA_ORCA_V1_ORCA_LOAD_REPORT_PROTO_UPB_H_ */

+ 9 - 2
src/core/lib/gprpp/map.h

@@ -35,6 +35,7 @@
 #include "src/core/lib/gprpp/memory.h"
 #include "src/core/lib/gprpp/memory.h"
 #include "src/core/lib/gprpp/pair.h"
 #include "src/core/lib/gprpp/pair.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
+#include "src/core/lib/gprpp/string_view.h"
 
 
 namespace grpc_core {
 namespace grpc_core {
 
 
@@ -42,8 +43,14 @@ struct StringLess {
   bool operator()(const char* a, const char* b) const {
   bool operator()(const char* a, const char* b) const {
     return strcmp(a, b) < 0;
     return strcmp(a, b) < 0;
   }
   }
-  bool operator()(const UniquePtr<char>& k1, const UniquePtr<char>& k2) const {
-    return strcmp(k1.get(), k2.get()) < 0;
+  bool operator()(const UniquePtr<char>& a, const UniquePtr<char>& b) const {
+    return strcmp(a.get(), b.get()) < 0;
+  }
+  bool operator()(const StringView& a, const StringView& b) const {
+    const size_t min_size = std::min(a.size(), b.size());
+    int c = strncmp(a.data(), b.data(), min_size);
+    if (c != 0) return c < 0;
+    return a.size() < b.size();
   }
   }
 };
 };
 
 

+ 4 - 1
src/core/lib/iomgr/tcp_posix.cc

@@ -1020,7 +1020,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
   if (error != GRPC_ERROR_NONE) {
   if (error != GRPC_ERROR_NONE) {
     cb = tcp->write_cb;
     cb = tcp->write_cb;
     tcp->write_cb = nullptr;
     tcp->write_cb = nullptr;
-    cb->cb(cb->cb_arg, error);
+    GRPC_CLOSURE_SCHED(cb, GRPC_ERROR_REF(error));
     TCP_UNREF(tcp, "write");
     TCP_UNREF(tcp, "write");
     return;
     return;
   }
   }
@@ -1030,6 +1030,8 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
       gpr_log(GPR_INFO, "write: delayed");
       gpr_log(GPR_INFO, "write: delayed");
     }
     }
     notify_on_write(tcp);
     notify_on_write(tcp);
+    // tcp_flush does not populate error if it has returned false.
+    GPR_DEBUG_ASSERT(error == GRPC_ERROR_NONE);
   } else {
   } else {
     cb = tcp->write_cb;
     cb = tcp->write_cb;
     tcp->write_cb = nullptr;
     tcp->write_cb = nullptr;
@@ -1037,6 +1039,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
       const char* str = grpc_error_string(error);
       const char* str = grpc_error_string(error);
       gpr_log(GPR_INFO, "write: %s", str);
       gpr_log(GPR_INFO, "write: %s", str);
     }
     }
+    // No need to take a ref on error since tcp_flush provides a ref.
     GRPC_CLOSURE_SCHED(cb, error);
     GRPC_CLOSURE_SCHED(cb, error);
     TCP_UNREF(tcp, "write");
     TCP_UNREF(tcp, "write");
   }
   }

+ 5 - 1
src/core/lib/slice/slice_intern.cc

@@ -208,7 +208,11 @@ static InternedSliceRefcount* InternNewStringLocked(slice_shard* shard,
   InternedSliceRefcount* s =
   InternedSliceRefcount* s =
       static_cast<InternedSliceRefcount*>(gpr_malloc(sizeof(*s) + len));
       static_cast<InternedSliceRefcount*>(gpr_malloc(sizeof(*s) + len));
   new (s) grpc_core::InternedSliceRefcount(len, hash, shard->strs[shard_idx]);
   new (s) grpc_core::InternedSliceRefcount(len, hash, shard->strs[shard_idx]);
-  memcpy(reinterpret_cast<char*>(s + 1), buffer, len);
+  // TODO(arjunroy): Investigate why hpack tried to intern the nullptr string.
+  // https://github.com/grpc/grpc/pull/20110#issuecomment-526729282
+  if (len > 0) {
+    memcpy(reinterpret_cast<char*>(s + 1), buffer, len);
+  }
   shard->strs[shard_idx] = s;
   shard->strs[shard_idx] = s;
   shard->count++;
   shard->count++;
   if (shard->count > shard->capacity * 2) {
   if (shard->count > shard->capacity * 2) {

+ 367 - 362
src/core/lib/transport/static_metadata.cc

@@ -53,76 +53,77 @@ static constexpr uint8_t g_bytes[] = {
     99,  45,  112, 114, 101, 118, 105, 111, 117, 115, 45,  114, 112, 99,  45,
     99,  45,  112, 114, 101, 118, 105, 111, 117, 115, 45,  114, 112, 99,  45,
     97,  116, 116, 101, 109, 112, 116, 115, 103, 114, 112, 99,  45,  114, 101,
     97,  116, 116, 101, 109, 112, 116, 115, 103, 114, 112, 99,  45,  114, 101,
     116, 114, 121, 45,  112, 117, 115, 104, 98,  97,  99,  107, 45,  109, 115,
     116, 114, 121, 45,  112, 117, 115, 104, 98,  97,  99,  107, 45,  109, 115,
-    103, 114, 112, 99,  45,  116, 105, 109, 101, 111, 117, 116, 49,  50,  51,
-    52,  103, 114, 112, 99,  46,  119, 97,  105, 116, 95,  102, 111, 114, 95,
-    114, 101, 97,  100, 121, 103, 114, 112, 99,  46,  116, 105, 109, 101, 111,
-    117, 116, 103, 114, 112, 99,  46,  109, 97,  120, 95,  114, 101, 113, 117,
-    101, 115, 116, 95,  109, 101, 115, 115, 97,  103, 101, 95,  98,  121, 116,
-    101, 115, 103, 114, 112, 99,  46,  109, 97,  120, 95,  114, 101, 115, 112,
-    111, 110, 115, 101, 95,  109, 101, 115, 115, 97,  103, 101, 95,  98,  121,
-    116, 101, 115, 47,  103, 114, 112, 99,  46,  108, 98,  46,  118, 49,  46,
-    76,  111, 97,  100, 66,  97,  108, 97,  110, 99,  101, 114, 47,  66,  97,
-    108, 97,  110, 99,  101, 76,  111, 97,  100, 47,  101, 110, 118, 111, 121,
-    46,  115, 101, 114, 118, 105, 99,  101, 46,  108, 111, 97,  100, 95,  115,
-    116, 97,  116, 115, 46,  118, 50,  46,  76,  111, 97,  100, 82,  101, 112,
-    111, 114, 116, 105, 110, 103, 83,  101, 114, 118, 105, 99,  101, 47,  83,
-    116, 114, 101, 97,  109, 76,  111, 97,  100, 83,  116, 97,  116, 115, 47,
-    101, 110, 118, 111, 121, 46,  97,  112, 105, 46,  118, 50,  46,  69,  110,
-    100, 112, 111, 105, 110, 116, 68,  105, 115, 99,  111, 118, 101, 114, 121,
-    83,  101, 114, 118, 105, 99,  101, 47,  83,  116, 114, 101, 97,  109, 69,
-    110, 100, 112, 111, 105, 110, 116, 115, 47,  103, 114, 112, 99,  46,  104,
-    101, 97,  108, 116, 104, 46,  118, 49,  46,  72,  101, 97,  108, 116, 104,
-    47,  87,  97,  116, 99,  104, 47,  101, 110, 118, 111, 121, 46,  115, 101,
-    114, 118, 105, 99,  101, 46,  100, 105, 115, 99,  111, 118, 101, 114, 121,
-    46,  118, 50,  46,  65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 68,
-    105, 115, 99,  111, 118, 101, 114, 121, 83,  101, 114, 118, 105, 99,  101,
-    47,  83,  116, 114, 101, 97,  109, 65,  103, 103, 114, 101, 103, 97,  116,
-    101, 100, 82,  101, 115, 111, 117, 114, 99,  101, 115, 100, 101, 102, 108,
-    97,  116, 101, 103, 122, 105, 112, 115, 116, 114, 101, 97,  109, 47,  103,
-    122, 105, 112, 71,  69,  84,  80,  79,  83,  84,  47,  47,  105, 110, 100,
-    101, 120, 46,  104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112,
-    115, 50,  48,  48,  50,  48,  52,  50,  48,  54,  51,  48,  52,  52,  48,
-    48,  52,  48,  52,  53,  48,  48,  97,  99,  99,  101, 112, 116, 45,  99,
-    104, 97,  114, 115, 101, 116, 103, 122, 105, 112, 44,  32,  100, 101, 102,
-    108, 97,  116, 101, 97,  99,  99,  101, 112, 116, 45,  108, 97,  110, 103,
-    117, 97,  103, 101, 97,  99,  99,  101, 112, 116, 45,  114, 97,  110, 103,
-    101, 115, 97,  99,  99,  101, 112, 116, 97,  99,  99,  101, 115, 115, 45,
-    99,  111, 110, 116, 114, 111, 108, 45,  97,  108, 108, 111, 119, 45,  111,
-    114, 105, 103, 105, 110, 97,  103, 101, 97,  108, 108, 111, 119, 97,  117,
-    116, 104, 111, 114, 105, 122, 97,  116, 105, 111, 110, 99,  97,  99,  104,
-    101, 45,  99,  111, 110, 116, 114, 111, 108, 99,  111, 110, 116, 101, 110,
-    116, 45,  100, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99,  111,
-    110, 116, 101, 110, 116, 45,  108, 97,  110, 103, 117, 97,  103, 101, 99,
-    111, 110, 116, 101, 110, 116, 45,  108, 101, 110, 103, 116, 104, 99,  111,
-    110, 116, 101, 110, 116, 45,  108, 111, 99,  97,  116, 105, 111, 110, 99,
-    111, 110, 116, 101, 110, 116, 45,  114, 97,  110, 103, 101, 99,  111, 111,
-    107, 105, 101, 100, 97,  116, 101, 101, 116, 97,  103, 101, 120, 112, 101,
-    99,  116, 101, 120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 105, 102,
-    45,  109, 97,  116, 99,  104, 105, 102, 45,  109, 111, 100, 105, 102, 105,
-    101, 100, 45,  115, 105, 110, 99,  101, 105, 102, 45,  110, 111, 110, 101,
-    45,  109, 97,  116, 99,  104, 105, 102, 45,  114, 97,  110, 103, 101, 105,
-    102, 45,  117, 110, 109, 111, 100, 105, 102, 105, 101, 100, 45,  115, 105,
-    110, 99,  101, 108, 97,  115, 116, 45,  109, 111, 100, 105, 102, 105, 101,
-    100, 108, 105, 110, 107, 108, 111, 99,  97,  116, 105, 111, 110, 109, 97,
-    120, 45,  102, 111, 114, 119, 97,  114, 100, 115, 112, 114, 111, 120, 121,
-    45,  97,  117, 116, 104, 101, 110, 116, 105, 99,  97,  116, 101, 112, 114,
-    111, 120, 121, 45,  97,  117, 116, 104, 111, 114, 105, 122, 97,  116, 105,
-    111, 110, 114, 97,  110, 103, 101, 114, 101, 102, 101, 114, 101, 114, 114,
-    101, 102, 114, 101, 115, 104, 114, 101, 116, 114, 121, 45,  97,  102, 116,
-    101, 114, 115, 101, 114, 118, 101, 114, 115, 101, 116, 45,  99,  111, 111,
-    107, 105, 101, 115, 116, 114, 105, 99,  116, 45,  116, 114, 97,  110, 115,
-    112, 111, 114, 116, 45,  115, 101, 99,  117, 114, 105, 116, 121, 116, 114,
-    97,  110, 115, 102, 101, 114, 45,  101, 110, 99,  111, 100, 105, 110, 103,
-    118, 97,  114, 121, 118, 105, 97,  119, 119, 119, 45,  97,  117, 116, 104,
-    101, 110, 116, 105, 99,  97,  116, 101, 48,  105, 100, 101, 110, 116, 105,
-    116, 121, 116, 114, 97,  105, 108, 101, 114, 115, 97,  112, 112, 108, 105,
-    99,  97,  116, 105, 111, 110, 47,  103, 114, 112, 99,  103, 114, 112, 99,
-    80,  85,  84,  108, 98,  45,  99,  111, 115, 116, 45,  98,  105, 110, 105,
-    100, 101, 110, 116, 105, 116, 121, 44,  100, 101, 102, 108, 97,  116, 101,
-    105, 100, 101, 110, 116, 105, 116, 121, 44,  103, 122, 105, 112, 100, 101,
-    102, 108, 97,  116, 101, 44,  103, 122, 105, 112, 105, 100, 101, 110, 116,
-    105, 116, 121, 44,  100, 101, 102, 108, 97,  116, 101, 44,  103, 122, 105,
-    112};
+    120, 45,  101, 110, 100, 112, 111, 105, 110, 116, 45,  108, 111, 97,  100,
+    45,  109, 101, 116, 114, 105, 99,  115, 45,  98,  105, 110, 103, 114, 112,
+    99,  45,  116, 105, 109, 101, 111, 117, 116, 49,  50,  51,  52,  103, 114,
+    112, 99,  46,  119, 97,  105, 116, 95,  102, 111, 114, 95,  114, 101, 97,
+    100, 121, 103, 114, 112, 99,  46,  116, 105, 109, 101, 111, 117, 116, 103,
+    114, 112, 99,  46,  109, 97,  120, 95,  114, 101, 113, 117, 101, 115, 116,
+    95,  109, 101, 115, 115, 97,  103, 101, 95,  98,  121, 116, 101, 115, 103,
+    114, 112, 99,  46,  109, 97,  120, 95,  114, 101, 115, 112, 111, 110, 115,
+    101, 95,  109, 101, 115, 115, 97,  103, 101, 95,  98,  121, 116, 101, 115,
+    47,  103, 114, 112, 99,  46,  108, 98,  46,  118, 49,  46,  76,  111, 97,
+    100, 66,  97,  108, 97,  110, 99,  101, 114, 47,  66,  97,  108, 97,  110,
+    99,  101, 76,  111, 97,  100, 47,  101, 110, 118, 111, 121, 46,  115, 101,
+    114, 118, 105, 99,  101, 46,  108, 111, 97,  100, 95,  115, 116, 97,  116,
+    115, 46,  118, 50,  46,  76,  111, 97,  100, 82,  101, 112, 111, 114, 116,
+    105, 110, 103, 83,  101, 114, 118, 105, 99,  101, 47,  83,  116, 114, 101,
+    97,  109, 76,  111, 97,  100, 83,  116, 97,  116, 115, 47,  101, 110, 118,
+    111, 121, 46,  97,  112, 105, 46,  118, 50,  46,  69,  110, 100, 112, 111,
+    105, 110, 116, 68,  105, 115, 99,  111, 118, 101, 114, 121, 83,  101, 114,
+    118, 105, 99,  101, 47,  83,  116, 114, 101, 97,  109, 69,  110, 100, 112,
+    111, 105, 110, 116, 115, 47,  103, 114, 112, 99,  46,  104, 101, 97,  108,
+    116, 104, 46,  118, 49,  46,  72,  101, 97,  108, 116, 104, 47,  87,  97,
+    116, 99,  104, 47,  101, 110, 118, 111, 121, 46,  115, 101, 114, 118, 105,
+    99,  101, 46,  100, 105, 115, 99,  111, 118, 101, 114, 121, 46,  118, 50,
+    46,  65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 68,  105, 115, 99,
+    111, 118, 101, 114, 121, 83,  101, 114, 118, 105, 99,  101, 47,  83,  116,
+    114, 101, 97,  109, 65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 82,
+    101, 115, 111, 117, 114, 99,  101, 115, 100, 101, 102, 108, 97,  116, 101,
+    103, 122, 105, 112, 115, 116, 114, 101, 97,  109, 47,  103, 122, 105, 112,
+    71,  69,  84,  80,  79,  83,  84,  47,  47,  105, 110, 100, 101, 120, 46,
+    104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112, 115, 50,  48,
+    48,  50,  48,  52,  50,  48,  54,  51,  48,  52,  52,  48,  48,  52,  48,
+    52,  53,  48,  48,  97,  99,  99,  101, 112, 116, 45,  99,  104, 97,  114,
+    115, 101, 116, 103, 122, 105, 112, 44,  32,  100, 101, 102, 108, 97,  116,
+    101, 97,  99,  99,  101, 112, 116, 45,  108, 97,  110, 103, 117, 97,  103,
+    101, 97,  99,  99,  101, 112, 116, 45,  114, 97,  110, 103, 101, 115, 97,
+    99,  99,  101, 112, 116, 97,  99,  99,  101, 115, 115, 45,  99,  111, 110,
+    116, 114, 111, 108, 45,  97,  108, 108, 111, 119, 45,  111, 114, 105, 103,
+    105, 110, 97,  103, 101, 97,  108, 108, 111, 119, 97,  117, 116, 104, 111,
+    114, 105, 122, 97,  116, 105, 111, 110, 99,  97,  99,  104, 101, 45,  99,
+    111, 110, 116, 114, 111, 108, 99,  111, 110, 116, 101, 110, 116, 45,  100,
+    105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99,  111, 110, 116, 101,
+    110, 116, 45,  108, 97,  110, 103, 117, 97,  103, 101, 99,  111, 110, 116,
+    101, 110, 116, 45,  108, 101, 110, 103, 116, 104, 99,  111, 110, 116, 101,
+    110, 116, 45,  108, 111, 99,  97,  116, 105, 111, 110, 99,  111, 110, 116,
+    101, 110, 116, 45,  114, 97,  110, 103, 101, 99,  111, 111, 107, 105, 101,
+    100, 97,  116, 101, 101, 116, 97,  103, 101, 120, 112, 101, 99,  116, 101,
+    120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 105, 102, 45,  109, 97,
+    116, 99,  104, 105, 102, 45,  109, 111, 100, 105, 102, 105, 101, 100, 45,
+    115, 105, 110, 99,  101, 105, 102, 45,  110, 111, 110, 101, 45,  109, 97,
+    116, 99,  104, 105, 102, 45,  114, 97,  110, 103, 101, 105, 102, 45,  117,
+    110, 109, 111, 100, 105, 102, 105, 101, 100, 45,  115, 105, 110, 99,  101,
+    108, 97,  115, 116, 45,  109, 111, 100, 105, 102, 105, 101, 100, 108, 105,
+    110, 107, 108, 111, 99,  97,  116, 105, 111, 110, 109, 97,  120, 45,  102,
+    111, 114, 119, 97,  114, 100, 115, 112, 114, 111, 120, 121, 45,  97,  117,
+    116, 104, 101, 110, 116, 105, 99,  97,  116, 101, 112, 114, 111, 120, 121,
+    45,  97,  117, 116, 104, 111, 114, 105, 122, 97,  116, 105, 111, 110, 114,
+    97,  110, 103, 101, 114, 101, 102, 101, 114, 101, 114, 114, 101, 102, 114,
+    101, 115, 104, 114, 101, 116, 114, 121, 45,  97,  102, 116, 101, 114, 115,
+    101, 114, 118, 101, 114, 115, 101, 116, 45,  99,  111, 111, 107, 105, 101,
+    115, 116, 114, 105, 99,  116, 45,  116, 114, 97,  110, 115, 112, 111, 114,
+    116, 45,  115, 101, 99,  117, 114, 105, 116, 121, 116, 114, 97,  110, 115,
+    102, 101, 114, 45,  101, 110, 99,  111, 100, 105, 110, 103, 118, 97,  114,
+    121, 118, 105, 97,  119, 119, 119, 45,  97,  117, 116, 104, 101, 110, 116,
+    105, 99,  97,  116, 101, 48,  105, 100, 101, 110, 116, 105, 116, 121, 116,
+    114, 97,  105, 108, 101, 114, 115, 97,  112, 112, 108, 105, 99,  97,  116,
+    105, 111, 110, 47,  103, 114, 112, 99,  103, 114, 112, 99,  80,  85,  84,
+    108, 98,  45,  99,  111, 115, 116, 45,  98,  105, 110, 105, 100, 101, 110,
+    116, 105, 116, 121, 44,  100, 101, 102, 108, 97,  116, 101, 105, 100, 101,
+    110, 116, 105, 116, 121, 44,  103, 122, 105, 112, 100, 101, 102, 108, 97,
+    116, 101, 44,  103, 122, 105, 112, 105, 100, 101, 110, 116, 105, 116, 121,
+    44,  100, 101, 102, 108, 97,  116, 101, 44,  103, 122, 105, 112};
 
 
 grpc_slice_refcount grpc_core::StaticSliceRefcount::kStaticSubRefcount;
 grpc_slice_refcount grpc_core::StaticSliceRefcount::kStaticSubRefcount;
 
 
@@ -187,6 +188,7 @@ struct StaticMetadataCtx {
       StaticSliceRefcount(102), StaticSliceRefcount(103),
       StaticSliceRefcount(102), StaticSliceRefcount(103),
       StaticSliceRefcount(104), StaticSliceRefcount(105),
       StaticSliceRefcount(104), StaticSliceRefcount(105),
       StaticSliceRefcount(106), StaticSliceRefcount(107),
       StaticSliceRefcount(106), StaticSliceRefcount(107),
+      StaticSliceRefcount(108),
   };
   };
 
 
   const StaticMetadataSlice slices[GRPC_STATIC_MDSTR_COUNT] = {
   const StaticMetadataSlice slices[GRPC_STATIC_MDSTR_COUNT] = {
@@ -214,488 +216,494 @@ struct StaticMetadataCtx {
       grpc_core::StaticMetadataSlice(&refcounts[20].base, 4, g_bytes + 278),
       grpc_core::StaticMetadataSlice(&refcounts[20].base, 4, g_bytes + 278),
       grpc_core::StaticMetadataSlice(&refcounts[21].base, 26, g_bytes + 282),
       grpc_core::StaticMetadataSlice(&refcounts[21].base, 26, g_bytes + 282),
       grpc_core::StaticMetadataSlice(&refcounts[22].base, 22, g_bytes + 308),
       grpc_core::StaticMetadataSlice(&refcounts[22].base, 22, g_bytes + 308),
-      grpc_core::StaticMetadataSlice(&refcounts[23].base, 12, g_bytes + 330),
-      grpc_core::StaticMetadataSlice(&refcounts[24].base, 1, g_bytes + 342),
-      grpc_core::StaticMetadataSlice(&refcounts[25].base, 1, g_bytes + 343),
-      grpc_core::StaticMetadataSlice(&refcounts[26].base, 1, g_bytes + 344),
-      grpc_core::StaticMetadataSlice(&refcounts[27].base, 1, g_bytes + 345),
-      grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
-      grpc_core::StaticMetadataSlice(&refcounts[29].base, 19, g_bytes + 346),
-      grpc_core::StaticMetadataSlice(&refcounts[30].base, 12, g_bytes + 365),
-      grpc_core::StaticMetadataSlice(&refcounts[31].base, 30, g_bytes + 377),
-      grpc_core::StaticMetadataSlice(&refcounts[32].base, 31, g_bytes + 407),
-      grpc_core::StaticMetadataSlice(&refcounts[33].base, 36, g_bytes + 438),
-      grpc_core::StaticMetadataSlice(&refcounts[34].base, 65, g_bytes + 474),
-      grpc_core::StaticMetadataSlice(&refcounts[35].base, 54, g_bytes + 539),
-      grpc_core::StaticMetadataSlice(&refcounts[36].base, 28, g_bytes + 593),
-      grpc_core::StaticMetadataSlice(&refcounts[37].base, 80, g_bytes + 621),
-      grpc_core::StaticMetadataSlice(&refcounts[38].base, 7, g_bytes + 701),
-      grpc_core::StaticMetadataSlice(&refcounts[39].base, 4, g_bytes + 708),
-      grpc_core::StaticMetadataSlice(&refcounts[40].base, 11, g_bytes + 712),
-      grpc_core::StaticMetadataSlice(&refcounts[41].base, 3, g_bytes + 723),
-      grpc_core::StaticMetadataSlice(&refcounts[42].base, 4, g_bytes + 726),
-      grpc_core::StaticMetadataSlice(&refcounts[43].base, 1, g_bytes + 730),
-      grpc_core::StaticMetadataSlice(&refcounts[44].base, 11, g_bytes + 731),
-      grpc_core::StaticMetadataSlice(&refcounts[45].base, 4, g_bytes + 742),
-      grpc_core::StaticMetadataSlice(&refcounts[46].base, 5, g_bytes + 746),
-      grpc_core::StaticMetadataSlice(&refcounts[47].base, 3, g_bytes + 751),
-      grpc_core::StaticMetadataSlice(&refcounts[48].base, 3, g_bytes + 754),
-      grpc_core::StaticMetadataSlice(&refcounts[49].base, 3, g_bytes + 757),
-      grpc_core::StaticMetadataSlice(&refcounts[50].base, 3, g_bytes + 760),
-      grpc_core::StaticMetadataSlice(&refcounts[51].base, 3, g_bytes + 763),
-      grpc_core::StaticMetadataSlice(&refcounts[52].base, 3, g_bytes + 766),
-      grpc_core::StaticMetadataSlice(&refcounts[53].base, 3, g_bytes + 769),
-      grpc_core::StaticMetadataSlice(&refcounts[54].base, 14, g_bytes + 772),
-      grpc_core::StaticMetadataSlice(&refcounts[55].base, 13, g_bytes + 786),
-      grpc_core::StaticMetadataSlice(&refcounts[56].base, 15, g_bytes + 799),
-      grpc_core::StaticMetadataSlice(&refcounts[57].base, 13, g_bytes + 814),
-      grpc_core::StaticMetadataSlice(&refcounts[58].base, 6, g_bytes + 827),
-      grpc_core::StaticMetadataSlice(&refcounts[59].base, 27, g_bytes + 833),
-      grpc_core::StaticMetadataSlice(&refcounts[60].base, 3, g_bytes + 860),
-      grpc_core::StaticMetadataSlice(&refcounts[61].base, 5, g_bytes + 863),
-      grpc_core::StaticMetadataSlice(&refcounts[62].base, 13, g_bytes + 868),
-      grpc_core::StaticMetadataSlice(&refcounts[63].base, 13, g_bytes + 881),
-      grpc_core::StaticMetadataSlice(&refcounts[64].base, 19, g_bytes + 894),
-      grpc_core::StaticMetadataSlice(&refcounts[65].base, 16, g_bytes + 913),
-      grpc_core::StaticMetadataSlice(&refcounts[66].base, 14, g_bytes + 929),
-      grpc_core::StaticMetadataSlice(&refcounts[67].base, 16, g_bytes + 943),
-      grpc_core::StaticMetadataSlice(&refcounts[68].base, 13, g_bytes + 959),
-      grpc_core::StaticMetadataSlice(&refcounts[69].base, 6, g_bytes + 972),
-      grpc_core::StaticMetadataSlice(&refcounts[70].base, 4, g_bytes + 978),
-      grpc_core::StaticMetadataSlice(&refcounts[71].base, 4, g_bytes + 982),
-      grpc_core::StaticMetadataSlice(&refcounts[72].base, 6, g_bytes + 986),
-      grpc_core::StaticMetadataSlice(&refcounts[73].base, 7, g_bytes + 992),
-      grpc_core::StaticMetadataSlice(&refcounts[74].base, 4, g_bytes + 999),
-      grpc_core::StaticMetadataSlice(&refcounts[75].base, 8, g_bytes + 1003),
-      grpc_core::StaticMetadataSlice(&refcounts[76].base, 17, g_bytes + 1011),
-      grpc_core::StaticMetadataSlice(&refcounts[77].base, 13, g_bytes + 1028),
-      grpc_core::StaticMetadataSlice(&refcounts[78].base, 8, g_bytes + 1041),
-      grpc_core::StaticMetadataSlice(&refcounts[79].base, 19, g_bytes + 1049),
-      grpc_core::StaticMetadataSlice(&refcounts[80].base, 13, g_bytes + 1068),
-      grpc_core::StaticMetadataSlice(&refcounts[81].base, 4, g_bytes + 1081),
-      grpc_core::StaticMetadataSlice(&refcounts[82].base, 8, g_bytes + 1085),
-      grpc_core::StaticMetadataSlice(&refcounts[83].base, 12, g_bytes + 1093),
-      grpc_core::StaticMetadataSlice(&refcounts[84].base, 18, g_bytes + 1105),
-      grpc_core::StaticMetadataSlice(&refcounts[85].base, 19, g_bytes + 1123),
-      grpc_core::StaticMetadataSlice(&refcounts[86].base, 5, g_bytes + 1142),
-      grpc_core::StaticMetadataSlice(&refcounts[87].base, 7, g_bytes + 1147),
-      grpc_core::StaticMetadataSlice(&refcounts[88].base, 7, g_bytes + 1154),
-      grpc_core::StaticMetadataSlice(&refcounts[89].base, 11, g_bytes + 1161),
-      grpc_core::StaticMetadataSlice(&refcounts[90].base, 6, g_bytes + 1172),
-      grpc_core::StaticMetadataSlice(&refcounts[91].base, 10, g_bytes + 1178),
-      grpc_core::StaticMetadataSlice(&refcounts[92].base, 25, g_bytes + 1188),
-      grpc_core::StaticMetadataSlice(&refcounts[93].base, 17, g_bytes + 1213),
-      grpc_core::StaticMetadataSlice(&refcounts[94].base, 4, g_bytes + 1230),
-      grpc_core::StaticMetadataSlice(&refcounts[95].base, 3, g_bytes + 1234),
-      grpc_core::StaticMetadataSlice(&refcounts[96].base, 16, g_bytes + 1237),
-      grpc_core::StaticMetadataSlice(&refcounts[97].base, 1, g_bytes + 1253),
-      grpc_core::StaticMetadataSlice(&refcounts[98].base, 8, g_bytes + 1254),
-      grpc_core::StaticMetadataSlice(&refcounts[99].base, 8, g_bytes + 1262),
-      grpc_core::StaticMetadataSlice(&refcounts[100].base, 16, g_bytes + 1270),
-      grpc_core::StaticMetadataSlice(&refcounts[101].base, 4, g_bytes + 1286),
-      grpc_core::StaticMetadataSlice(&refcounts[102].base, 3, g_bytes + 1290),
-      grpc_core::StaticMetadataSlice(&refcounts[103].base, 11, g_bytes + 1293),
-      grpc_core::StaticMetadataSlice(&refcounts[104].base, 16, g_bytes + 1304),
-      grpc_core::StaticMetadataSlice(&refcounts[105].base, 13, g_bytes + 1320),
-      grpc_core::StaticMetadataSlice(&refcounts[106].base, 12, g_bytes + 1333),
-      grpc_core::StaticMetadataSlice(&refcounts[107].base, 21, g_bytes + 1345),
+      grpc_core::StaticMetadataSlice(&refcounts[23].base, 27, g_bytes + 330),
+      grpc_core::StaticMetadataSlice(&refcounts[24].base, 12, g_bytes + 357),
+      grpc_core::StaticMetadataSlice(&refcounts[25].base, 1, g_bytes + 369),
+      grpc_core::StaticMetadataSlice(&refcounts[26].base, 1, g_bytes + 370),
+      grpc_core::StaticMetadataSlice(&refcounts[27].base, 1, g_bytes + 371),
+      grpc_core::StaticMetadataSlice(&refcounts[28].base, 1, g_bytes + 372),
+      grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
+      grpc_core::StaticMetadataSlice(&refcounts[30].base, 19, g_bytes + 373),
+      grpc_core::StaticMetadataSlice(&refcounts[31].base, 12, g_bytes + 392),
+      grpc_core::StaticMetadataSlice(&refcounts[32].base, 30, g_bytes + 404),
+      grpc_core::StaticMetadataSlice(&refcounts[33].base, 31, g_bytes + 434),
+      grpc_core::StaticMetadataSlice(&refcounts[34].base, 36, g_bytes + 465),
+      grpc_core::StaticMetadataSlice(&refcounts[35].base, 65, g_bytes + 501),
+      grpc_core::StaticMetadataSlice(&refcounts[36].base, 54, g_bytes + 566),
+      grpc_core::StaticMetadataSlice(&refcounts[37].base, 28, g_bytes + 620),
+      grpc_core::StaticMetadataSlice(&refcounts[38].base, 80, g_bytes + 648),
+      grpc_core::StaticMetadataSlice(&refcounts[39].base, 7, g_bytes + 728),
+      grpc_core::StaticMetadataSlice(&refcounts[40].base, 4, g_bytes + 735),
+      grpc_core::StaticMetadataSlice(&refcounts[41].base, 11, g_bytes + 739),
+      grpc_core::StaticMetadataSlice(&refcounts[42].base, 3, g_bytes + 750),
+      grpc_core::StaticMetadataSlice(&refcounts[43].base, 4, g_bytes + 753),
+      grpc_core::StaticMetadataSlice(&refcounts[44].base, 1, g_bytes + 757),
+      grpc_core::StaticMetadataSlice(&refcounts[45].base, 11, g_bytes + 758),
+      grpc_core::StaticMetadataSlice(&refcounts[46].base, 4, g_bytes + 769),
+      grpc_core::StaticMetadataSlice(&refcounts[47].base, 5, g_bytes + 773),
+      grpc_core::StaticMetadataSlice(&refcounts[48].base, 3, g_bytes + 778),
+      grpc_core::StaticMetadataSlice(&refcounts[49].base, 3, g_bytes + 781),
+      grpc_core::StaticMetadataSlice(&refcounts[50].base, 3, g_bytes + 784),
+      grpc_core::StaticMetadataSlice(&refcounts[51].base, 3, g_bytes + 787),
+      grpc_core::StaticMetadataSlice(&refcounts[52].base, 3, g_bytes + 790),
+      grpc_core::StaticMetadataSlice(&refcounts[53].base, 3, g_bytes + 793),
+      grpc_core::StaticMetadataSlice(&refcounts[54].base, 3, g_bytes + 796),
+      grpc_core::StaticMetadataSlice(&refcounts[55].base, 14, g_bytes + 799),
+      grpc_core::StaticMetadataSlice(&refcounts[56].base, 13, g_bytes + 813),
+      grpc_core::StaticMetadataSlice(&refcounts[57].base, 15, g_bytes + 826),
+      grpc_core::StaticMetadataSlice(&refcounts[58].base, 13, g_bytes + 841),
+      grpc_core::StaticMetadataSlice(&refcounts[59].base, 6, g_bytes + 854),
+      grpc_core::StaticMetadataSlice(&refcounts[60].base, 27, g_bytes + 860),
+      grpc_core::StaticMetadataSlice(&refcounts[61].base, 3, g_bytes + 887),
+      grpc_core::StaticMetadataSlice(&refcounts[62].base, 5, g_bytes + 890),
+      grpc_core::StaticMetadataSlice(&refcounts[63].base, 13, g_bytes + 895),
+      grpc_core::StaticMetadataSlice(&refcounts[64].base, 13, g_bytes + 908),
+      grpc_core::StaticMetadataSlice(&refcounts[65].base, 19, g_bytes + 921),
+      grpc_core::StaticMetadataSlice(&refcounts[66].base, 16, g_bytes + 940),
+      grpc_core::StaticMetadataSlice(&refcounts[67].base, 14, g_bytes + 956),
+      grpc_core::StaticMetadataSlice(&refcounts[68].base, 16, g_bytes + 970),
+      grpc_core::StaticMetadataSlice(&refcounts[69].base, 13, g_bytes + 986),
+      grpc_core::StaticMetadataSlice(&refcounts[70].base, 6, g_bytes + 999),
+      grpc_core::StaticMetadataSlice(&refcounts[71].base, 4, g_bytes + 1005),
+      grpc_core::StaticMetadataSlice(&refcounts[72].base, 4, g_bytes + 1009),
+      grpc_core::StaticMetadataSlice(&refcounts[73].base, 6, g_bytes + 1013),
+      grpc_core::StaticMetadataSlice(&refcounts[74].base, 7, g_bytes + 1019),
+      grpc_core::StaticMetadataSlice(&refcounts[75].base, 4, g_bytes + 1026),
+      grpc_core::StaticMetadataSlice(&refcounts[76].base, 8, g_bytes + 1030),
+      grpc_core::StaticMetadataSlice(&refcounts[77].base, 17, g_bytes + 1038),
+      grpc_core::StaticMetadataSlice(&refcounts[78].base, 13, g_bytes + 1055),
+      grpc_core::StaticMetadataSlice(&refcounts[79].base, 8, g_bytes + 1068),
+      grpc_core::StaticMetadataSlice(&refcounts[80].base, 19, g_bytes + 1076),
+      grpc_core::StaticMetadataSlice(&refcounts[81].base, 13, g_bytes + 1095),
+      grpc_core::StaticMetadataSlice(&refcounts[82].base, 4, g_bytes + 1108),
+      grpc_core::StaticMetadataSlice(&refcounts[83].base, 8, g_bytes + 1112),
+      grpc_core::StaticMetadataSlice(&refcounts[84].base, 12, g_bytes + 1120),
+      grpc_core::StaticMetadataSlice(&refcounts[85].base, 18, g_bytes + 1132),
+      grpc_core::StaticMetadataSlice(&refcounts[86].base, 19, g_bytes + 1150),
+      grpc_core::StaticMetadataSlice(&refcounts[87].base, 5, g_bytes + 1169),
+      grpc_core::StaticMetadataSlice(&refcounts[88].base, 7, g_bytes + 1174),
+      grpc_core::StaticMetadataSlice(&refcounts[89].base, 7, g_bytes + 1181),
+      grpc_core::StaticMetadataSlice(&refcounts[90].base, 11, g_bytes + 1188),
+      grpc_core::StaticMetadataSlice(&refcounts[91].base, 6, g_bytes + 1199),
+      grpc_core::StaticMetadataSlice(&refcounts[92].base, 10, g_bytes + 1205),
+      grpc_core::StaticMetadataSlice(&refcounts[93].base, 25, g_bytes + 1215),
+      grpc_core::StaticMetadataSlice(&refcounts[94].base, 17, g_bytes + 1240),
+      grpc_core::StaticMetadataSlice(&refcounts[95].base, 4, g_bytes + 1257),
+      grpc_core::StaticMetadataSlice(&refcounts[96].base, 3, g_bytes + 1261),
+      grpc_core::StaticMetadataSlice(&refcounts[97].base, 16, g_bytes + 1264),
+      grpc_core::StaticMetadataSlice(&refcounts[98].base, 1, g_bytes + 1280),
+      grpc_core::StaticMetadataSlice(&refcounts[99].base, 8, g_bytes + 1281),
+      grpc_core::StaticMetadataSlice(&refcounts[100].base, 8, g_bytes + 1289),
+      grpc_core::StaticMetadataSlice(&refcounts[101].base, 16, g_bytes + 1297),
+      grpc_core::StaticMetadataSlice(&refcounts[102].base, 4, g_bytes + 1313),
+      grpc_core::StaticMetadataSlice(&refcounts[103].base, 3, g_bytes + 1317),
+      grpc_core::StaticMetadataSlice(&refcounts[104].base, 11, g_bytes + 1320),
+      grpc_core::StaticMetadataSlice(&refcounts[105].base, 16, g_bytes + 1331),
+      grpc_core::StaticMetadataSlice(&refcounts[106].base, 13, g_bytes + 1347),
+      grpc_core::StaticMetadataSlice(&refcounts[107].base, 12, g_bytes + 1360),
+      grpc_core::StaticMetadataSlice(&refcounts[108].base, 21, g_bytes + 1372),
   };
   };
   StaticMetadata static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = {
   StaticMetadata static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = {
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[3].base, 10, g_bytes + 19),
           grpc_core::StaticMetadataSlice(&refcounts[3].base, 10, g_bytes + 19),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           0),
           0),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
-          grpc_core::StaticMetadataSlice(&refcounts[41].base, 3, g_bytes + 723),
+          grpc_core::StaticMetadataSlice(&refcounts[42].base, 3, g_bytes + 750),
           1),
           1),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
-          grpc_core::StaticMetadataSlice(&refcounts[42].base, 4, g_bytes + 726),
+          grpc_core::StaticMetadataSlice(&refcounts[43].base, 4, g_bytes + 753),
           2),
           2),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[0].base, 5, g_bytes + 0),
           grpc_core::StaticMetadataSlice(&refcounts[0].base, 5, g_bytes + 0),
-          grpc_core::StaticMetadataSlice(&refcounts[43].base, 1, g_bytes + 730),
+          grpc_core::StaticMetadataSlice(&refcounts[44].base, 1, g_bytes + 757),
           3),
           3),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[0].base, 5, g_bytes + 0),
           grpc_core::StaticMetadataSlice(&refcounts[0].base, 5, g_bytes + 0),
-          grpc_core::StaticMetadataSlice(&refcounts[44].base, 11,
-                                         g_bytes + 731),
+          grpc_core::StaticMetadataSlice(&refcounts[45].base, 11,
+                                         g_bytes + 758),
           4),
           4),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
-          grpc_core::StaticMetadataSlice(&refcounts[45].base, 4, g_bytes + 742),
+          grpc_core::StaticMetadataSlice(&refcounts[46].base, 4, g_bytes + 769),
           5),
           5),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
-          grpc_core::StaticMetadataSlice(&refcounts[46].base, 5, g_bytes + 746),
+          grpc_core::StaticMetadataSlice(&refcounts[47].base, 5, g_bytes + 773),
           6),
           6),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[47].base, 3, g_bytes + 751),
+          grpc_core::StaticMetadataSlice(&refcounts[48].base, 3, g_bytes + 778),
           7),
           7),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[48].base, 3, g_bytes + 754),
+          grpc_core::StaticMetadataSlice(&refcounts[49].base, 3, g_bytes + 781),
           8),
           8),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[49].base, 3, g_bytes + 757),
+          grpc_core::StaticMetadataSlice(&refcounts[50].base, 3, g_bytes + 784),
           9),
           9),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[50].base, 3, g_bytes + 760),
+          grpc_core::StaticMetadataSlice(&refcounts[51].base, 3, g_bytes + 787),
           10),
           10),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[51].base, 3, g_bytes + 763),
+          grpc_core::StaticMetadataSlice(&refcounts[52].base, 3, g_bytes + 790),
           11),
           11),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[52].base, 3, g_bytes + 766),
+          grpc_core::StaticMetadataSlice(&refcounts[53].base, 3, g_bytes + 793),
           12),
           12),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
           grpc_core::StaticMetadataSlice(&refcounts[2].base, 7, g_bytes + 12),
-          grpc_core::StaticMetadataSlice(&refcounts[53].base, 3, g_bytes + 769),
+          grpc_core::StaticMetadataSlice(&refcounts[54].base, 3, g_bytes + 796),
           13),
           13),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[54].base, 14,
-                                         g_bytes + 772),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[55].base, 14,
+                                         g_bytes + 799),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           14),
           14),
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
                                                     g_bytes + 186),
                                                     g_bytes + 186),
-                     grpc_core::StaticMetadataSlice(&refcounts[55].base, 13,
-                                                    g_bytes + 786),
+                     grpc_core::StaticMetadataSlice(&refcounts[56].base, 13,
+                                                    g_bytes + 813),
                      15),
                      15),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[56].base, 15,
-                                         g_bytes + 799),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[57].base, 15,
+                                         g_bytes + 826),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           16),
           16),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[57].base, 13,
-                                         g_bytes + 814),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[58].base, 13,
+                                         g_bytes + 841),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           17),
           17),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[58].base, 6, g_bytes + 827),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[59].base, 6, g_bytes + 854),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           18),
           18),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[59].base, 27,
-                                         g_bytes + 833),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[60].base, 27,
+                                         g_bytes + 860),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           19),
           19),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[60].base, 3, g_bytes + 860),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[61].base, 3, g_bytes + 887),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           20),
           20),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[61].base, 5, g_bytes + 863),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[62].base, 5, g_bytes + 890),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           21),
           21),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[62].base, 13,
-                                         g_bytes + 868),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[63].base, 13,
+                                         g_bytes + 895),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           22),
           22),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[63].base, 13,
-                                         g_bytes + 881),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[64].base, 13,
+                                         g_bytes + 908),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           23),
           23),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[64].base, 19,
-                                         g_bytes + 894),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[65].base, 19,
+                                         g_bytes + 921),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           24),
           24),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
           grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
                                          g_bytes + 170),
                                          g_bytes + 170),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           25),
           25),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[65].base, 16,
-                                         g_bytes + 913),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[66].base, 16,
+                                         g_bytes + 940),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           26),
           26),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[66].base, 14,
-                                         g_bytes + 929),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[67].base, 14,
+                                         g_bytes + 956),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           27),
           27),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[67].base, 16,
-                                         g_bytes + 943),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[68].base, 16,
+                                         g_bytes + 970),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           28),
           28),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[68].base, 13,
-                                         g_bytes + 959),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[69].base, 13,
+                                         g_bytes + 986),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           29),
           29),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[14].base, 12,
           grpc_core::StaticMetadataSlice(&refcounts[14].base, 12,
                                          g_bytes + 158),
                                          g_bytes + 158),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           30),
           30),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[69].base, 6, g_bytes + 972),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[70].base, 6, g_bytes + 999),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           31),
           31),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[70].base, 4, g_bytes + 978),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[71].base, 4,
+                                         g_bytes + 1005),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           32),
           32),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[71].base, 4, g_bytes + 982),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[72].base, 4,
+                                         g_bytes + 1009),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           33),
           33),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[72].base, 6, g_bytes + 986),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[73].base, 6,
+                                         g_bytes + 1013),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           34),
           34),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[73].base, 7, g_bytes + 992),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[74].base, 7,
+                                         g_bytes + 1019),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           35),
           35),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[74].base, 4, g_bytes + 999),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[75].base, 4,
+                                         g_bytes + 1026),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           36),
           36),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[20].base, 4, g_bytes + 278),
           grpc_core::StaticMetadataSlice(&refcounts[20].base, 4, g_bytes + 278),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           37),
           37),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[75].base, 8,
-                                         g_bytes + 1003),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[76].base, 8,
+                                         g_bytes + 1030),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           38),
           38),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[76].base, 17,
-                                         g_bytes + 1011),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[77].base, 17,
+                                         g_bytes + 1038),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           39),
           39),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[77].base, 13,
-                                         g_bytes + 1028),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[78].base, 13,
+                                         g_bytes + 1055),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           40),
           40),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[78].base, 8,
-                                         g_bytes + 1041),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[79].base, 8,
+                                         g_bytes + 1068),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           41),
           41),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[79].base, 19,
-                                         g_bytes + 1049),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[80].base, 19,
+                                         g_bytes + 1076),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           42),
           42),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[80].base, 13,
-                                         g_bytes + 1068),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[81].base, 13,
+                                         g_bytes + 1095),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           43),
           43),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[81].base, 4,
-                                         g_bytes + 1081),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[82].base, 4,
+                                         g_bytes + 1108),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           44),
           44),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[82].base, 8,
-                                         g_bytes + 1085),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[83].base, 8,
+                                         g_bytes + 1112),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           45),
           45),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[83].base, 12,
-                                         g_bytes + 1093),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[84].base, 12,
+                                         g_bytes + 1120),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           46),
           46),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[84].base, 18,
-                                         g_bytes + 1105),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[85].base, 18,
+                                         g_bytes + 1132),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           47),
           47),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[85].base, 19,
-                                         g_bytes + 1123),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[86].base, 19,
+                                         g_bytes + 1150),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           48),
           48),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[86].base, 5,
-                                         g_bytes + 1142),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[87].base, 5,
+                                         g_bytes + 1169),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           49),
           49),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[87].base, 7,
-                                         g_bytes + 1147),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[88].base, 7,
+                                         g_bytes + 1174),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           50),
           50),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[88].base, 7,
-                                         g_bytes + 1154),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[89].base, 7,
+                                         g_bytes + 1181),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           51),
           51),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[89].base, 11,
-                                         g_bytes + 1161),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[90].base, 11,
+                                         g_bytes + 1188),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           52),
           52),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[90].base, 6,
-                                         g_bytes + 1172),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[91].base, 6,
+                                         g_bytes + 1199),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           53),
           53),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[91].base, 10,
-                                         g_bytes + 1178),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[92].base, 10,
+                                         g_bytes + 1205),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           54),
           54),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[92].base, 25,
-                                         g_bytes + 1188),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[93].base, 25,
+                                         g_bytes + 1215),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           55),
           55),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[93].base, 17,
-                                         g_bytes + 1213),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[94].base, 17,
+                                         g_bytes + 1240),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           56),
           56),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[19].base, 10,
           grpc_core::StaticMetadataSlice(&refcounts[19].base, 10,
                                          g_bytes + 268),
                                          g_bytes + 268),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           57),
           57),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[94].base, 4,
-                                         g_bytes + 1230),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[95].base, 4,
+                                         g_bytes + 1257),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           58),
           58),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[95].base, 3,
-                                         g_bytes + 1234),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[96].base, 3,
+                                         g_bytes + 1261),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           59),
           59),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[96].base, 16,
-                                         g_bytes + 1237),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[97].base, 16,
+                                         g_bytes + 1264),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           60),
           60),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
-          grpc_core::StaticMetadataSlice(&refcounts[97].base, 1,
-                                         g_bytes + 1253),
+          grpc_core::StaticMetadataSlice(&refcounts[98].base, 1,
+                                         g_bytes + 1280),
           61),
           61),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
-          grpc_core::StaticMetadataSlice(&refcounts[24].base, 1, g_bytes + 342),
+          grpc_core::StaticMetadataSlice(&refcounts[25].base, 1, g_bytes + 369),
           62),
           62),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
           grpc_core::StaticMetadataSlice(&refcounts[7].base, 11, g_bytes + 50),
-          grpc_core::StaticMetadataSlice(&refcounts[25].base, 1, g_bytes + 343),
+          grpc_core::StaticMetadataSlice(&refcounts[26].base, 1, g_bytes + 370),
           63),
           63),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
-          grpc_core::StaticMetadataSlice(&refcounts[98].base, 8,
-                                         g_bytes + 1254),
+          grpc_core::StaticMetadataSlice(&refcounts[99].base, 8,
+                                         g_bytes + 1281),
           64),
           64),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
-          grpc_core::StaticMetadataSlice(&refcounts[39].base, 4, g_bytes + 708),
+          grpc_core::StaticMetadataSlice(&refcounts[40].base, 4, g_bytes + 735),
           65),
           65),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
           grpc_core::StaticMetadataSlice(&refcounts[9].base, 13, g_bytes + 77),
-          grpc_core::StaticMetadataSlice(&refcounts[38].base, 7, g_bytes + 701),
+          grpc_core::StaticMetadataSlice(&refcounts[39].base, 7, g_bytes + 728),
           66),
           66),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[5].base, 2, g_bytes + 36),
           grpc_core::StaticMetadataSlice(&refcounts[5].base, 2, g_bytes + 36),
-          grpc_core::StaticMetadataSlice(&refcounts[99].base, 8,
-                                         g_bytes + 1262),
+          grpc_core::StaticMetadataSlice(&refcounts[100].base, 8,
+                                         g_bytes + 1289),
           67),
           67),
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[14].base, 12,
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[14].base, 12,
                                                     g_bytes + 158),
                                                     g_bytes + 158),
-                     grpc_core::StaticMetadataSlice(&refcounts[100].base, 16,
-                                                    g_bytes + 1270),
+                     grpc_core::StaticMetadataSlice(&refcounts[101].base, 16,
+                                                    g_bytes + 1297),
                      68),
                      68),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
           grpc_core::StaticMetadataSlice(&refcounts[4].base, 7, g_bytes + 29),
-          grpc_core::StaticMetadataSlice(&refcounts[101].base, 4,
-                                         g_bytes + 1286),
+          grpc_core::StaticMetadataSlice(&refcounts[102].base, 4,
+                                         g_bytes + 1313),
           69),
           69),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
           grpc_core::StaticMetadataSlice(&refcounts[1].base, 7, g_bytes + 5),
-          grpc_core::StaticMetadataSlice(&refcounts[102].base, 3,
-                                         g_bytes + 1290),
+          grpc_core::StaticMetadataSlice(&refcounts[103].base, 3,
+                                         g_bytes + 1317),
           70),
           70),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
           grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
                                          g_bytes + 186),
                                          g_bytes + 186),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           71),
           71),
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
                                                     g_bytes + 170),
                                                     g_bytes + 170),
-                     grpc_core::StaticMetadataSlice(&refcounts[98].base, 8,
-                                                    g_bytes + 1254),
+                     grpc_core::StaticMetadataSlice(&refcounts[99].base, 8,
+                                                    g_bytes + 1281),
                      72),
                      72),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
           grpc_core::StaticMetadataSlice(&refcounts[15].base, 16,
                                          g_bytes + 170),
                                          g_bytes + 170),
-          grpc_core::StaticMetadataSlice(&refcounts[39].base, 4, g_bytes + 708),
+          grpc_core::StaticMetadataSlice(&refcounts[40].base, 4, g_bytes + 735),
           73),
           73),
       StaticMetadata(
       StaticMetadata(
-          grpc_core::StaticMetadataSlice(&refcounts[103].base, 11,
-                                         g_bytes + 1293),
-          grpc_core::StaticMetadataSlice(&refcounts[28].base, 0, g_bytes + 346),
+          grpc_core::StaticMetadataSlice(&refcounts[104].base, 11,
+                                         g_bytes + 1320),
+          grpc_core::StaticMetadataSlice(&refcounts[29].base, 0, g_bytes + 373),
           74),
           74),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[98].base, 8,
-                                         g_bytes + 1254),
+          grpc_core::StaticMetadataSlice(&refcounts[99].base, 8,
+                                         g_bytes + 1281),
           75),
           75),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[38].base, 7, g_bytes + 701),
+          grpc_core::StaticMetadataSlice(&refcounts[39].base, 7, g_bytes + 728),
           76),
           76),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[104].base, 16,
-                                         g_bytes + 1304),
+          grpc_core::StaticMetadataSlice(&refcounts[105].base, 16,
+                                         g_bytes + 1331),
           77),
           77),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[39].base, 4, g_bytes + 708),
+          grpc_core::StaticMetadataSlice(&refcounts[40].base, 4, g_bytes + 735),
           78),
           78),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[105].base, 13,
-                                         g_bytes + 1320),
+          grpc_core::StaticMetadataSlice(&refcounts[106].base, 13,
+                                         g_bytes + 1347),
           79),
           79),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[106].base, 12,
-                                         g_bytes + 1333),
+          grpc_core::StaticMetadataSlice(&refcounts[107].base, 12,
+                                         g_bytes + 1360),
           80),
           80),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
           grpc_core::StaticMetadataSlice(&refcounts[10].base, 20, g_bytes + 90),
-          grpc_core::StaticMetadataSlice(&refcounts[107].base, 21,
-                                         g_bytes + 1345),
+          grpc_core::StaticMetadataSlice(&refcounts[108].base, 21,
+                                         g_bytes + 1372),
           81),
           81),
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
                                                     g_bytes + 186),
                                                     g_bytes + 186),
-                     grpc_core::StaticMetadataSlice(&refcounts[98].base, 8,
-                                                    g_bytes + 1254),
+                     grpc_core::StaticMetadataSlice(&refcounts[99].base, 8,
+                                                    g_bytes + 1281),
                      82),
                      82),
       StaticMetadata(
       StaticMetadata(
           grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
           grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
                                          g_bytes + 186),
                                          g_bytes + 186),
-          grpc_core::StaticMetadataSlice(&refcounts[39].base, 4, g_bytes + 708),
+          grpc_core::StaticMetadataSlice(&refcounts[40].base, 4, g_bytes + 735),
           83),
           83),
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
       StaticMetadata(grpc_core::StaticMetadataSlice(&refcounts[16].base, 15,
                                                     g_bytes + 186),
                                                     g_bytes + 186),
-                     grpc_core::StaticMetadataSlice(&refcounts[105].base, 13,
-                                                    g_bytes + 1320),
+                     grpc_core::StaticMetadataSlice(&refcounts[106].base, 13,
+                                                    g_bytes + 1347),
                      84),
                      84),
   };
   };
 
 
@@ -1181,17 +1189,17 @@ uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4};
     0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4};
 
 
 static const int8_t elems_r[] = {
 static const int8_t elems_r[] = {
-    15, 10, -8, 0,  2,  -43, -80, -44, 0,   4,   -8,  0,   0,   0,  6,  -1,
-    -8, 0,  0,  3,  2,  0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,
-    0,  0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,
-    0,  0,  0,  0,  0,  0,   -65, 0,   -68, -69, -50, -72, -73, 0,  32, 31,
-    30, 30, 29, 28, 27, 26,  25,  24,  23,  22,  21,  20,  19,  18, 17, 17,
-    16, 15, 14, 13, 12, 11,  10,  9,   8,   7,   6,   5,   4,   3,  4,  3,
-    3,  7,  0,  0,  0,  0,   0,   0,   -5,  0};
+    15, 10, -8, 0,  2,  -43, -81, -44, 0,  4,   -8,  0,   0,   0,  6,  -1,
+    -8, 0,  0,  3,  2,  0,   0,   0,   0,  0,   0,   0,   0,   0,  0,  0,
+    0,  0,  0,  0,  0,  0,   0,   0,   0,  0,   0,   0,   0,   0,  0,  0,
+    0,  0,  0,  0,  0,  0,   0,   -67, 0,  -38, -50, -56, -76, 0,  46, 28,
+    27, 26, 25, 24, 23, 23,  22,  21,  20, 19,  24,  16,  15,  14, 13, 15,
+    14, 14, 13, 12, 11, 10,  9,   8,   7,  6,   6,   5,   4,   3,  2,  3,
+    2,  2,  6,  0,  0,  0,   0,   0,   0,  -6,  0};
 static uint32_t elems_phash(uint32_t i) {
 static uint32_t elems_phash(uint32_t i) {
-  i -= 43;
-  uint32_t x = i % 106;
-  uint32_t y = i / 106;
+  i -= 44;
+  uint32_t x = i % 107;
+  uint32_t y = i / 107;
   uint32_t h = x;
   uint32_t h = x;
   if (y < GPR_ARRAY_SIZE(elems_r)) {
   if (y < GPR_ARRAY_SIZE(elems_r)) {
     uint32_t delta = (uint32_t)elems_r[y];
     uint32_t delta = (uint32_t)elems_r[y];
@@ -1201,29 +1209,26 @@ static uint32_t elems_phash(uint32_t i) {
 }
 }
 
 
 static const uint16_t elem_keys[] = {
 static const uint16_t elem_keys[] = {
-    263,   264,  265,  266,  267,  268,  269,   1118, 1119,  1756,  149,   150,
-    477,   478,  1648, 43,   44,   1010, 1011,  1540, 1767,  780,   781,   639,
-    853,   1659, 2080, 2188, 5860, 6076, 6184,  6400, 6508,  6616,  6724,  6832,
-    1783,  6940, 7048, 7156, 7264, 7372, 7480,  7588, 7696,  7804,  7912,  8020,
-    8128,  8236, 8344, 6292, 8452, 8560, 8668,  8776, 8884,  8992,  9100,  9208,
-    9316,  9424, 9532, 9640, 9748, 9856, 9964,  1178, 533,   10072, 10180, 210,
-    10288, 1184, 1185, 1186, 1187, 1070, 10396, 1826, 11152, 0,     0,     0,
-    1718,  0,    1833, 0,    0,    352,  0,     1612, 0,     0,     0,     0,
-    0,     0,    0,    0,    0,    0,    0,     0,    0,     0,     0,     0,
-    0,     0,    0,    0,    0,    0,    0,     0,    0,     0,     0,     0,
-    0,     0,    0,    0,    0,    0,    0,     0,    0,     0,     0,     0,
-    0,     0,    0,    0,    0};
+    266,   267,   268,  269,   270,   271,  272,   1129, 1130, 1773, 151,
+    152,   482,   483,  1664,  44,    45,   1020,  1021, 1555, 1784, 788,
+    789,   645,   861,  1675,  2100,  2209, 6024,  6569, 6787, 6896, 7005,
+    7114,  7223,  7332, 1800,  7441,  7550, 7659,  7768, 7877, 8095, 8204,
+    8313,  8422,  6678, 6460,  7986,  8531, 8640,  6351, 8749, 8858, 8967,
+    9076,  9185,  9294, 9403,  9512,  9621, 6242,  9730, 9839, 9948, 10057,
+    10166, 1189,  538,  10275, 10384, 212,  10493, 1195, 1196, 1197, 1198,
+    1080,  10602, 1843, 11365, 0,     0,    0,     1734, 0,    1850, 0,
+    0,     0,     356,  1627};
 static const uint8_t elem_idxs[] = {
 static const uint8_t elem_idxs[] = {
-    7,  8,   9,   10,  11, 12,  13, 76,  78,  71, 1,   2,  5,  6,  25, 3,
-    4,  66,  65,  30,  83, 62,  63, 67,  61,  73, 57,  37, 14, 16, 17, 19,
-    20, 21,  22,  23,  15, 24,  26, 27,  28,  29, 31,  32, 33, 34, 35, 36,
-    38, 39,  40,  18,  41, 42,  43, 44,  45,  46, 47,  48, 49, 50, 51, 52,
-    53, 54,  55,  75,  69, 56,  58, 70,  59,  77, 79,  80, 81, 64, 60, 82,
-    74, 255, 255, 255, 72, 255, 84, 255, 255, 0,  255, 68};
+    7,  8,   9,   10,  11, 12,  13, 76,  78,  71,  1,  2,  5,  6,  25, 3,
+    4,  66,  65,  30,  83, 62,  63, 67,  61,  73,  57, 37, 14, 19, 21, 22,
+    23, 24,  26,  27,  15, 28,  29, 31,  32,  33,  35, 36, 38, 39, 20, 18,
+    34, 40,  41,  17,  42, 43,  44, 45,  46,  47,  48, 49, 50, 16, 51, 52,
+    53, 54,  55,  75,  69, 56,  58, 70,  59,  77,  79, 80, 81, 64, 60, 82,
+    74, 255, 255, 255, 72, 255, 84, 255, 255, 255, 0,  68};
 
 
 grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b) {
 grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b) {
   if (a == -1 || b == -1) return GRPC_MDNULL;
   if (a == -1 || b == -1) return GRPC_MDNULL;
-  uint32_t k = static_cast<uint32_t>(a * 108 + b);
+  uint32_t k = static_cast<uint32_t>(a * 109 + b);
   uint32_t h = elems_phash(k);
   uint32_t h = elems_phash(k);
   return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k &&
   return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k &&
                  elem_idxs[h] != 255
                  elem_idxs[h] != 255

+ 90 - 86
src/core/lib/transport/static_metadata.h

@@ -36,7 +36,7 @@
 static_assert(
 static_assert(
     std::is_trivially_destructible<grpc_core::StaticMetadataSlice>::value,
     std::is_trivially_destructible<grpc_core::StaticMetadataSlice>::value,
     "grpc_core::StaticMetadataSlice must be trivially destructible.");
     "grpc_core::StaticMetadataSlice must be trivially destructible.");
-#define GRPC_STATIC_MDSTR_COUNT 108
+#define GRPC_STATIC_MDSTR_COUNT 109
 
 
 void grpc_init_static_metadata_ctx(void);
 void grpc_init_static_metadata_ctx(void);
 void grpc_destroy_static_metadata_ctx(void);
 void grpc_destroy_static_metadata_ctx(void);
@@ -102,185 +102,187 @@ inline const grpc_core::StaticMetadataSlice* grpc_static_slice_table() {
 #define GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS (grpc_static_slice_table()[21])
 #define GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS (grpc_static_slice_table()[21])
 /* "grpc-retry-pushback-ms" */
 /* "grpc-retry-pushback-ms" */
 #define GRPC_MDSTR_GRPC_RETRY_PUSHBACK_MS (grpc_static_slice_table()[22])
 #define GRPC_MDSTR_GRPC_RETRY_PUSHBACK_MS (grpc_static_slice_table()[22])
+/* "x-endpoint-load-metrics-bin" */
+#define GRPC_MDSTR_X_ENDPOINT_LOAD_METRICS_BIN (grpc_static_slice_table()[23])
 /* "grpc-timeout" */
 /* "grpc-timeout" */
-#define GRPC_MDSTR_GRPC_TIMEOUT (grpc_static_slice_table()[23])
+#define GRPC_MDSTR_GRPC_TIMEOUT (grpc_static_slice_table()[24])
 /* "1" */
 /* "1" */
-#define GRPC_MDSTR_1 (grpc_static_slice_table()[24])
+#define GRPC_MDSTR_1 (grpc_static_slice_table()[25])
 /* "2" */
 /* "2" */
-#define GRPC_MDSTR_2 (grpc_static_slice_table()[25])
+#define GRPC_MDSTR_2 (grpc_static_slice_table()[26])
 /* "3" */
 /* "3" */
-#define GRPC_MDSTR_3 (grpc_static_slice_table()[26])
+#define GRPC_MDSTR_3 (grpc_static_slice_table()[27])
 /* "4" */
 /* "4" */
-#define GRPC_MDSTR_4 (grpc_static_slice_table()[27])
+#define GRPC_MDSTR_4 (grpc_static_slice_table()[28])
 /* "" */
 /* "" */
-#define GRPC_MDSTR_EMPTY (grpc_static_slice_table()[28])
+#define GRPC_MDSTR_EMPTY (grpc_static_slice_table()[29])
 /* "grpc.wait_for_ready" */
 /* "grpc.wait_for_ready" */
-#define GRPC_MDSTR_GRPC_DOT_WAIT_FOR_READY (grpc_static_slice_table()[29])
+#define GRPC_MDSTR_GRPC_DOT_WAIT_FOR_READY (grpc_static_slice_table()[30])
 /* "grpc.timeout" */
 /* "grpc.timeout" */
-#define GRPC_MDSTR_GRPC_DOT_TIMEOUT (grpc_static_slice_table()[30])
+#define GRPC_MDSTR_GRPC_DOT_TIMEOUT (grpc_static_slice_table()[31])
 /* "grpc.max_request_message_bytes" */
 /* "grpc.max_request_message_bytes" */
 #define GRPC_MDSTR_GRPC_DOT_MAX_REQUEST_MESSAGE_BYTES \
 #define GRPC_MDSTR_GRPC_DOT_MAX_REQUEST_MESSAGE_BYTES \
-  (grpc_static_slice_table()[31])
+  (grpc_static_slice_table()[32])
 /* "grpc.max_response_message_bytes" */
 /* "grpc.max_response_message_bytes" */
 #define GRPC_MDSTR_GRPC_DOT_MAX_RESPONSE_MESSAGE_BYTES \
 #define GRPC_MDSTR_GRPC_DOT_MAX_RESPONSE_MESSAGE_BYTES \
-  (grpc_static_slice_table()[32])
+  (grpc_static_slice_table()[33])
 /* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */
 /* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */
 #define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \
 #define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \
-  (grpc_static_slice_table()[33])
+  (grpc_static_slice_table()[34])
 /* "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats" */
 /* "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats" */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
-  (grpc_static_slice_table()[34])
+  (grpc_static_slice_table()[35])
 /* "/envoy.api.v2.EndpointDiscoveryService/StreamEndpoints" */
 /* "/envoy.api.v2.EndpointDiscoveryService/StreamEndpoints" */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_API_DOT_V2_DOT_ENDPOINTDISCOVERYSERVICE_SLASH_STREAMENDPOINTS \
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_API_DOT_V2_DOT_ENDPOINTDISCOVERYSERVICE_SLASH_STREAMENDPOINTS \
-  (grpc_static_slice_table()[35])
+  (grpc_static_slice_table()[36])
 /* "/grpc.health.v1.Health/Watch" */
 /* "/grpc.health.v1.Health/Watch" */
 #define GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH \
 #define GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH \
-  (grpc_static_slice_table()[36])
+  (grpc_static_slice_table()[37])
 /* "/envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources"
 /* "/envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources"
  */
  */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
-  (grpc_static_slice_table()[37])
+  (grpc_static_slice_table()[38])
 /* "deflate" */
 /* "deflate" */
-#define GRPC_MDSTR_DEFLATE (grpc_static_slice_table()[38])
+#define GRPC_MDSTR_DEFLATE (grpc_static_slice_table()[39])
 /* "gzip" */
 /* "gzip" */
-#define GRPC_MDSTR_GZIP (grpc_static_slice_table()[39])
+#define GRPC_MDSTR_GZIP (grpc_static_slice_table()[40])
 /* "stream/gzip" */
 /* "stream/gzip" */
-#define GRPC_MDSTR_STREAM_SLASH_GZIP (grpc_static_slice_table()[40])
+#define GRPC_MDSTR_STREAM_SLASH_GZIP (grpc_static_slice_table()[41])
 /* "GET" */
 /* "GET" */
-#define GRPC_MDSTR_GET (grpc_static_slice_table()[41])
+#define GRPC_MDSTR_GET (grpc_static_slice_table()[42])
 /* "POST" */
 /* "POST" */
-#define GRPC_MDSTR_POST (grpc_static_slice_table()[42])
+#define GRPC_MDSTR_POST (grpc_static_slice_table()[43])
 /* "/" */
 /* "/" */
-#define GRPC_MDSTR_SLASH (grpc_static_slice_table()[43])
+#define GRPC_MDSTR_SLASH (grpc_static_slice_table()[44])
 /* "/index.html" */
 /* "/index.html" */
-#define GRPC_MDSTR_SLASH_INDEX_DOT_HTML (grpc_static_slice_table()[44])
+#define GRPC_MDSTR_SLASH_INDEX_DOT_HTML (grpc_static_slice_table()[45])
 /* "http" */
 /* "http" */
-#define GRPC_MDSTR_HTTP (grpc_static_slice_table()[45])
+#define GRPC_MDSTR_HTTP (grpc_static_slice_table()[46])
 /* "https" */
 /* "https" */
-#define GRPC_MDSTR_HTTPS (grpc_static_slice_table()[46])
+#define GRPC_MDSTR_HTTPS (grpc_static_slice_table()[47])
 /* "200" */
 /* "200" */
-#define GRPC_MDSTR_200 (grpc_static_slice_table()[47])
+#define GRPC_MDSTR_200 (grpc_static_slice_table()[48])
 /* "204" */
 /* "204" */
-#define GRPC_MDSTR_204 (grpc_static_slice_table()[48])
+#define GRPC_MDSTR_204 (grpc_static_slice_table()[49])
 /* "206" */
 /* "206" */
-#define GRPC_MDSTR_206 (grpc_static_slice_table()[49])
+#define GRPC_MDSTR_206 (grpc_static_slice_table()[50])
 /* "304" */
 /* "304" */
-#define GRPC_MDSTR_304 (grpc_static_slice_table()[50])
+#define GRPC_MDSTR_304 (grpc_static_slice_table()[51])
 /* "400" */
 /* "400" */
-#define GRPC_MDSTR_400 (grpc_static_slice_table()[51])
+#define GRPC_MDSTR_400 (grpc_static_slice_table()[52])
 /* "404" */
 /* "404" */
-#define GRPC_MDSTR_404 (grpc_static_slice_table()[52])
+#define GRPC_MDSTR_404 (grpc_static_slice_table()[53])
 /* "500" */
 /* "500" */
-#define GRPC_MDSTR_500 (grpc_static_slice_table()[53])
+#define GRPC_MDSTR_500 (grpc_static_slice_table()[54])
 /* "accept-charset" */
 /* "accept-charset" */
-#define GRPC_MDSTR_ACCEPT_CHARSET (grpc_static_slice_table()[54])
+#define GRPC_MDSTR_ACCEPT_CHARSET (grpc_static_slice_table()[55])
 /* "gzip, deflate" */
 /* "gzip, deflate" */
-#define GRPC_MDSTR_GZIP_COMMA_DEFLATE (grpc_static_slice_table()[55])
+#define GRPC_MDSTR_GZIP_COMMA_DEFLATE (grpc_static_slice_table()[56])
 /* "accept-language" */
 /* "accept-language" */
-#define GRPC_MDSTR_ACCEPT_LANGUAGE (grpc_static_slice_table()[56])
+#define GRPC_MDSTR_ACCEPT_LANGUAGE (grpc_static_slice_table()[57])
 /* "accept-ranges" */
 /* "accept-ranges" */
-#define GRPC_MDSTR_ACCEPT_RANGES (grpc_static_slice_table()[57])
+#define GRPC_MDSTR_ACCEPT_RANGES (grpc_static_slice_table()[58])
 /* "accept" */
 /* "accept" */
-#define GRPC_MDSTR_ACCEPT (grpc_static_slice_table()[58])
+#define GRPC_MDSTR_ACCEPT (grpc_static_slice_table()[59])
 /* "access-control-allow-origin" */
 /* "access-control-allow-origin" */
-#define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN (grpc_static_slice_table()[59])
+#define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN (grpc_static_slice_table()[60])
 /* "age" */
 /* "age" */
-#define GRPC_MDSTR_AGE (grpc_static_slice_table()[60])
+#define GRPC_MDSTR_AGE (grpc_static_slice_table()[61])
 /* "allow" */
 /* "allow" */
-#define GRPC_MDSTR_ALLOW (grpc_static_slice_table()[61])
+#define GRPC_MDSTR_ALLOW (grpc_static_slice_table()[62])
 /* "authorization" */
 /* "authorization" */
-#define GRPC_MDSTR_AUTHORIZATION (grpc_static_slice_table()[62])
+#define GRPC_MDSTR_AUTHORIZATION (grpc_static_slice_table()[63])
 /* "cache-control" */
 /* "cache-control" */
-#define GRPC_MDSTR_CACHE_CONTROL (grpc_static_slice_table()[63])
+#define GRPC_MDSTR_CACHE_CONTROL (grpc_static_slice_table()[64])
 /* "content-disposition" */
 /* "content-disposition" */
-#define GRPC_MDSTR_CONTENT_DISPOSITION (grpc_static_slice_table()[64])
+#define GRPC_MDSTR_CONTENT_DISPOSITION (grpc_static_slice_table()[65])
 /* "content-language" */
 /* "content-language" */
-#define GRPC_MDSTR_CONTENT_LANGUAGE (grpc_static_slice_table()[65])
+#define GRPC_MDSTR_CONTENT_LANGUAGE (grpc_static_slice_table()[66])
 /* "content-length" */
 /* "content-length" */
-#define GRPC_MDSTR_CONTENT_LENGTH (grpc_static_slice_table()[66])
+#define GRPC_MDSTR_CONTENT_LENGTH (grpc_static_slice_table()[67])
 /* "content-location" */
 /* "content-location" */
-#define GRPC_MDSTR_CONTENT_LOCATION (grpc_static_slice_table()[67])
+#define GRPC_MDSTR_CONTENT_LOCATION (grpc_static_slice_table()[68])
 /* "content-range" */
 /* "content-range" */
-#define GRPC_MDSTR_CONTENT_RANGE (grpc_static_slice_table()[68])
+#define GRPC_MDSTR_CONTENT_RANGE (grpc_static_slice_table()[69])
 /* "cookie" */
 /* "cookie" */
-#define GRPC_MDSTR_COOKIE (grpc_static_slice_table()[69])
+#define GRPC_MDSTR_COOKIE (grpc_static_slice_table()[70])
 /* "date" */
 /* "date" */
-#define GRPC_MDSTR_DATE (grpc_static_slice_table()[70])
+#define GRPC_MDSTR_DATE (grpc_static_slice_table()[71])
 /* "etag" */
 /* "etag" */
-#define GRPC_MDSTR_ETAG (grpc_static_slice_table()[71])
+#define GRPC_MDSTR_ETAG (grpc_static_slice_table()[72])
 /* "expect" */
 /* "expect" */
-#define GRPC_MDSTR_EXPECT (grpc_static_slice_table()[72])
+#define GRPC_MDSTR_EXPECT (grpc_static_slice_table()[73])
 /* "expires" */
 /* "expires" */
-#define GRPC_MDSTR_EXPIRES (grpc_static_slice_table()[73])
+#define GRPC_MDSTR_EXPIRES (grpc_static_slice_table()[74])
 /* "from" */
 /* "from" */
-#define GRPC_MDSTR_FROM (grpc_static_slice_table()[74])
+#define GRPC_MDSTR_FROM (grpc_static_slice_table()[75])
 /* "if-match" */
 /* "if-match" */
-#define GRPC_MDSTR_IF_MATCH (grpc_static_slice_table()[75])
+#define GRPC_MDSTR_IF_MATCH (grpc_static_slice_table()[76])
 /* "if-modified-since" */
 /* "if-modified-since" */
-#define GRPC_MDSTR_IF_MODIFIED_SINCE (grpc_static_slice_table()[76])
+#define GRPC_MDSTR_IF_MODIFIED_SINCE (grpc_static_slice_table()[77])
 /* "if-none-match" */
 /* "if-none-match" */
-#define GRPC_MDSTR_IF_NONE_MATCH (grpc_static_slice_table()[77])
+#define GRPC_MDSTR_IF_NONE_MATCH (grpc_static_slice_table()[78])
 /* "if-range" */
 /* "if-range" */
-#define GRPC_MDSTR_IF_RANGE (grpc_static_slice_table()[78])
+#define GRPC_MDSTR_IF_RANGE (grpc_static_slice_table()[79])
 /* "if-unmodified-since" */
 /* "if-unmodified-since" */
-#define GRPC_MDSTR_IF_UNMODIFIED_SINCE (grpc_static_slice_table()[79])
+#define GRPC_MDSTR_IF_UNMODIFIED_SINCE (grpc_static_slice_table()[80])
 /* "last-modified" */
 /* "last-modified" */
-#define GRPC_MDSTR_LAST_MODIFIED (grpc_static_slice_table()[80])
+#define GRPC_MDSTR_LAST_MODIFIED (grpc_static_slice_table()[81])
 /* "link" */
 /* "link" */
-#define GRPC_MDSTR_LINK (grpc_static_slice_table()[81])
+#define GRPC_MDSTR_LINK (grpc_static_slice_table()[82])
 /* "location" */
 /* "location" */
-#define GRPC_MDSTR_LOCATION (grpc_static_slice_table()[82])
+#define GRPC_MDSTR_LOCATION (grpc_static_slice_table()[83])
 /* "max-forwards" */
 /* "max-forwards" */
-#define GRPC_MDSTR_MAX_FORWARDS (grpc_static_slice_table()[83])
+#define GRPC_MDSTR_MAX_FORWARDS (grpc_static_slice_table()[84])
 /* "proxy-authenticate" */
 /* "proxy-authenticate" */
-#define GRPC_MDSTR_PROXY_AUTHENTICATE (grpc_static_slice_table()[84])
+#define GRPC_MDSTR_PROXY_AUTHENTICATE (grpc_static_slice_table()[85])
 /* "proxy-authorization" */
 /* "proxy-authorization" */
-#define GRPC_MDSTR_PROXY_AUTHORIZATION (grpc_static_slice_table()[85])
+#define GRPC_MDSTR_PROXY_AUTHORIZATION (grpc_static_slice_table()[86])
 /* "range" */
 /* "range" */
-#define GRPC_MDSTR_RANGE (grpc_static_slice_table()[86])
+#define GRPC_MDSTR_RANGE (grpc_static_slice_table()[87])
 /* "referer" */
 /* "referer" */
-#define GRPC_MDSTR_REFERER (grpc_static_slice_table()[87])
+#define GRPC_MDSTR_REFERER (grpc_static_slice_table()[88])
 /* "refresh" */
 /* "refresh" */
-#define GRPC_MDSTR_REFRESH (grpc_static_slice_table()[88])
+#define GRPC_MDSTR_REFRESH (grpc_static_slice_table()[89])
 /* "retry-after" */
 /* "retry-after" */
-#define GRPC_MDSTR_RETRY_AFTER (grpc_static_slice_table()[89])
+#define GRPC_MDSTR_RETRY_AFTER (grpc_static_slice_table()[90])
 /* "server" */
 /* "server" */
-#define GRPC_MDSTR_SERVER (grpc_static_slice_table()[90])
+#define GRPC_MDSTR_SERVER (grpc_static_slice_table()[91])
 /* "set-cookie" */
 /* "set-cookie" */
-#define GRPC_MDSTR_SET_COOKIE (grpc_static_slice_table()[91])
+#define GRPC_MDSTR_SET_COOKIE (grpc_static_slice_table()[92])
 /* "strict-transport-security" */
 /* "strict-transport-security" */
-#define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY (grpc_static_slice_table()[92])
+#define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY (grpc_static_slice_table()[93])
 /* "transfer-encoding" */
 /* "transfer-encoding" */
-#define GRPC_MDSTR_TRANSFER_ENCODING (grpc_static_slice_table()[93])
+#define GRPC_MDSTR_TRANSFER_ENCODING (grpc_static_slice_table()[94])
 /* "vary" */
 /* "vary" */
-#define GRPC_MDSTR_VARY (grpc_static_slice_table()[94])
+#define GRPC_MDSTR_VARY (grpc_static_slice_table()[95])
 /* "via" */
 /* "via" */
-#define GRPC_MDSTR_VIA (grpc_static_slice_table()[95])
+#define GRPC_MDSTR_VIA (grpc_static_slice_table()[96])
 /* "www-authenticate" */
 /* "www-authenticate" */
-#define GRPC_MDSTR_WWW_AUTHENTICATE (grpc_static_slice_table()[96])
+#define GRPC_MDSTR_WWW_AUTHENTICATE (grpc_static_slice_table()[97])
 /* "0" */
 /* "0" */
-#define GRPC_MDSTR_0 (grpc_static_slice_table()[97])
+#define GRPC_MDSTR_0 (grpc_static_slice_table()[98])
 /* "identity" */
 /* "identity" */
-#define GRPC_MDSTR_IDENTITY (grpc_static_slice_table()[98])
+#define GRPC_MDSTR_IDENTITY (grpc_static_slice_table()[99])
 /* "trailers" */
 /* "trailers" */
-#define GRPC_MDSTR_TRAILERS (grpc_static_slice_table()[99])
+#define GRPC_MDSTR_TRAILERS (grpc_static_slice_table()[100])
 /* "application/grpc" */
 /* "application/grpc" */
-#define GRPC_MDSTR_APPLICATION_SLASH_GRPC (grpc_static_slice_table()[100])
+#define GRPC_MDSTR_APPLICATION_SLASH_GRPC (grpc_static_slice_table()[101])
 /* "grpc" */
 /* "grpc" */
-#define GRPC_MDSTR_GRPC (grpc_static_slice_table()[101])
+#define GRPC_MDSTR_GRPC (grpc_static_slice_table()[102])
 /* "PUT" */
 /* "PUT" */
-#define GRPC_MDSTR_PUT (grpc_static_slice_table()[102])
+#define GRPC_MDSTR_PUT (grpc_static_slice_table()[103])
 /* "lb-cost-bin" */
 /* "lb-cost-bin" */
-#define GRPC_MDSTR_LB_COST_BIN (grpc_static_slice_table()[103])
+#define GRPC_MDSTR_LB_COST_BIN (grpc_static_slice_table()[104])
 /* "identity,deflate" */
 /* "identity,deflate" */
-#define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE (grpc_static_slice_table()[104])
+#define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE (grpc_static_slice_table()[105])
 /* "identity,gzip" */
 /* "identity,gzip" */
-#define GRPC_MDSTR_IDENTITY_COMMA_GZIP (grpc_static_slice_table()[105])
+#define GRPC_MDSTR_IDENTITY_COMMA_GZIP (grpc_static_slice_table()[106])
 /* "deflate,gzip" */
 /* "deflate,gzip" */
-#define GRPC_MDSTR_DEFLATE_COMMA_GZIP (grpc_static_slice_table()[106])
+#define GRPC_MDSTR_DEFLATE_COMMA_GZIP (grpc_static_slice_table()[107])
 /* "identity,deflate,gzip" */
 /* "identity,deflate,gzip" */
 #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \
 #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \
-  (grpc_static_slice_table()[107])
+  (grpc_static_slice_table()[108])
 
 
 namespace grpc_core {
 namespace grpc_core {
 struct StaticSliceRefcount;
 struct StaticSliceRefcount;
@@ -538,6 +540,7 @@ typedef enum {
   GRPC_BATCH_HOST,
   GRPC_BATCH_HOST,
   GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS,
   GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS,
   GRPC_BATCH_GRPC_RETRY_PUSHBACK_MS,
   GRPC_BATCH_GRPC_RETRY_PUSHBACK_MS,
+  GRPC_BATCH_X_ENDPOINT_LOAD_METRICS_BIN,
   GRPC_BATCH_CALLOUTS_COUNT
   GRPC_BATCH_CALLOUTS_COUNT
 } grpc_metadata_batch_callouts_index;
 } grpc_metadata_batch_callouts_index;
 
 
@@ -567,6 +570,7 @@ typedef union {
     struct grpc_linked_mdelem* host;
     struct grpc_linked_mdelem* host;
     struct grpc_linked_mdelem* grpc_previous_rpc_attempts;
     struct grpc_linked_mdelem* grpc_previous_rpc_attempts;
     struct grpc_linked_mdelem* grpc_retry_pushback_ms;
     struct grpc_linked_mdelem* grpc_retry_pushback_ms;
+    struct grpc_linked_mdelem* x_endpoint_load_metrics_bin;
   } named;
   } named;
 } grpc_metadata_batch_callouts;
 } grpc_metadata_batch_callouts;
 
 

+ 8 - 1
src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc

@@ -251,7 +251,14 @@ static void on_handshaker_service_resp_recv(void* arg, grpc_error* error) {
     gpr_log(GPR_ERROR, "ALTS handshaker client is nullptr");
     gpr_log(GPR_ERROR, "ALTS handshaker client is nullptr");
     return;
     return;
   }
   }
-  alts_handshaker_client_handle_response(client, true);
+  bool success = true;
+  if (error != GRPC_ERROR_NONE) {
+    gpr_log(GPR_ERROR,
+            "ALTS handshaker on_handshaker_service_resp_recv error: %s",
+            grpc_error_string(error));
+    success = false;
+  }
+  alts_handshaker_client_handle_response(client, success);
 }
 }
 
 
 /* gRPC provided callback used when dedicatd CQ and thread are used.
 /* gRPC provided callback used when dedicatd CQ and thread are used.

+ 0 - 63
src/csharp/Grpc.Core.Api/LiteClientBase.cs

@@ -1,63 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2019 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using Grpc.Core.Internal;
-using Grpc.Core.Utils;
-
-namespace Grpc.Core
-{
-    /// <summary>
-    /// Base class for lightweight client-side stubs.
-    /// All calls are invoked via a <c>CallInvoker</c>.
-    /// Lite client stubs have no configuration knobs, all configuration
-    /// is provided by decorating the call invoker.
-    /// Note: experimental API that can change or be removed without any prior notice.
-    /// </summary>
-    public abstract class LiteClientBase
-    {
-        readonly CallInvoker callInvoker;
-
-        /// <summary>
-        /// Initializes a new instance of <c>LiteClientBase</c> class that
-        /// throws <c>NotImplementedException</c> upon invocation of any RPC.
-        /// This constructor is only provided to allow creation of test doubles
-        /// for client classes (e.g. mocking requires a parameterless constructor).
-        /// </summary>
-        protected LiteClientBase() : this(new UnimplementedCallInvoker())
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of <c>ClientBase</c> class.
-        /// </summary>
-        /// <param name="callInvoker">The <c>CallInvoker</c> for remote call invocation.</param>
-        public LiteClientBase(CallInvoker callInvoker)
-        {
-            this.callInvoker = GrpcPreconditions.CheckNotNull(callInvoker, nameof(callInvoker));
-        }
-
-        /// <summary>
-        /// Gets the call invoker.
-        /// </summary>
-        protected CallInvoker CallInvoker
-        {
-            get { return this.callInvoker; }
-        }
-    }
-}

+ 3 - 7
src/csharp/Grpc.Core.Tests/TimeoutsTest.cs

@@ -96,8 +96,7 @@ namespace Grpc.Core.Tests
             });
             });
 
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.MinValue)), "abc"));
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.MinValue)), "abc"));
-            // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
-            Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal });
+            Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
         }
         }
 
 
         [Test]
         [Test]
@@ -110,8 +109,7 @@ namespace Grpc.Core.Tests
             });
             });
 
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(5)))), "abc"));
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(5)))), "abc"));
-            // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
-            Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal });
+            Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
         }
         }
 
 
         [Test]
         [Test]
@@ -130,9 +128,7 @@ namespace Grpc.Core.Tests
             });
             });
 
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(5)))), "abc"));
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(5)))), "abc"));
-            // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
-            Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal });
-
+            Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
             Assert.IsTrue(await serverReceivedCancellationTcs.Task);
             Assert.IsTrue(await serverReceivedCancellationTcs.Task);
         }
         }
     }
     }

+ 1 - 3
src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs

@@ -136,9 +136,7 @@ namespace Math.Tests
                 deadline: DateTime.UtcNow.AddMilliseconds(500)))
                 deadline: DateTime.UtcNow.AddMilliseconds(500)))
             {
             {
                 var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.ToListAsync());
                 var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.ToListAsync());
-
-                // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
-                Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal });
+                Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
             }
             }
         }
         }
 
 

+ 0 - 759
src/csharp/Grpc.Examples/MathWithProtocOptions.cs

@@ -1,759 +0,0 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: math_with_protoc_options.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace MathWithProtocOptions {
-
-  /// <summary>Holder for reflection information generated from math_with_protoc_options.proto</summary>
-  public static partial class MathWithProtocOptionsReflection {
-
-    #region Descriptor
-    /// <summary>File descriptor for math_with_protoc_options.proto</summary>
-    public static pbr::FileDescriptor Descriptor {
-      get { return descriptor; }
-    }
-    private static pbr::FileDescriptor descriptor;
-
-    static MathWithProtocOptionsReflection() {
-      byte[] descriptorData = global::System.Convert.FromBase64String(
-          string.Concat(
-            "Ch5tYXRoX3dpdGhfcHJvdG9jX29wdGlvbnMucHJvdG8SGG1hdGhfd2l0aF9w",
-            "cm90b2Nfb3B0aW9ucyIsCgdEaXZBcmdzEhAKCGRpdmlkZW5kGAEgASgDEg8K",
-            "B2Rpdmlzb3IYAiABKAMiLwoIRGl2UmVwbHkSEAoIcXVvdGllbnQYASABKAMS",
-            "EQoJcmVtYWluZGVyGAIgASgDIhgKB0ZpYkFyZ3MSDQoFbGltaXQYASABKAMi",
-            "EgoDTnVtEgsKA251bRgBIAEoAyIZCghGaWJSZXBseRINCgVjb3VudBgBIAEo",
-            "AzLEAgoETWF0aBJOCgNEaXYSIS5tYXRoX3dpdGhfcHJvdG9jX29wdGlvbnMu",
-            "RGl2QXJncxoiLm1hdGhfd2l0aF9wcm90b2Nfb3B0aW9ucy5EaXZSZXBseSIA",
-            "ElYKB0Rpdk1hbnkSIS5tYXRoX3dpdGhfcHJvdG9jX29wdGlvbnMuRGl2QXJn",
-            "cxoiLm1hdGhfd2l0aF9wcm90b2Nfb3B0aW9ucy5EaXZSZXBseSIAKAEwARJL",
-            "CgNGaWISIS5tYXRoX3dpdGhfcHJvdG9jX29wdGlvbnMuRmliQXJncxodLm1h",
-            "dGhfd2l0aF9wcm90b2Nfb3B0aW9ucy5OdW0iADABEkcKA1N1bRIdLm1hdGhf",
-            "d2l0aF9wcm90b2Nfb3B0aW9ucy5OdW0aHS5tYXRoX3dpdGhfcHJvdG9jX29w",
-            "dGlvbnMuTnVtIgAoAWIGcHJvdG8z"));
-      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-          new pbr::FileDescriptor[] { },
-          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
-            new pbr::GeneratedClrTypeInfo(typeof(global::MathWithProtocOptions.DivArgs), global::MathWithProtocOptions.DivArgs.Parser, new[]{ "Dividend", "Divisor" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::MathWithProtocOptions.DivReply), global::MathWithProtocOptions.DivReply.Parser, new[]{ "Quotient", "Remainder" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::MathWithProtocOptions.FibArgs), global::MathWithProtocOptions.FibArgs.Parser, new[]{ "Limit" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::MathWithProtocOptions.Num), global::MathWithProtocOptions.Num.Parser, new[]{ "Num_" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::MathWithProtocOptions.FibReply), global::MathWithProtocOptions.FibReply.Parser, new[]{ "Count" }, null, null, null)
-          }));
-    }
-    #endregion
-
-  }
-  #region Messages
-  public sealed partial class DivArgs : pb::IMessage<DivArgs> {
-    private static readonly pb::MessageParser<DivArgs> _parser = new pb::MessageParser<DivArgs>(() => new DivArgs());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<DivArgs> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.MessageTypes[0]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivArgs() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivArgs(DivArgs other) : this() {
-      dividend_ = other.dividend_;
-      divisor_ = other.divisor_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivArgs Clone() {
-      return new DivArgs(this);
-    }
-
-    /// <summary>Field number for the "dividend" field.</summary>
-    public const int DividendFieldNumber = 1;
-    private long dividend_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Dividend {
-      get { return dividend_; }
-      set {
-        dividend_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "divisor" field.</summary>
-    public const int DivisorFieldNumber = 2;
-    private long divisor_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Divisor {
-      get { return divisor_; }
-      set {
-        divisor_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as DivArgs);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(DivArgs other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Dividend != other.Dividend) return false;
-      if (Divisor != other.Divisor) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Dividend != 0L) hash ^= Dividend.GetHashCode();
-      if (Divisor != 0L) hash ^= Divisor.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Dividend != 0L) {
-        output.WriteRawTag(8);
-        output.WriteInt64(Dividend);
-      }
-      if (Divisor != 0L) {
-        output.WriteRawTag(16);
-        output.WriteInt64(Divisor);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Dividend != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Dividend);
-      }
-      if (Divisor != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Divisor);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(DivArgs other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Dividend != 0L) {
-        Dividend = other.Dividend;
-      }
-      if (other.Divisor != 0L) {
-        Divisor = other.Divisor;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Dividend = input.ReadInt64();
-            break;
-          }
-          case 16: {
-            Divisor = input.ReadInt64();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class DivReply : pb::IMessage<DivReply> {
-    private static readonly pb::MessageParser<DivReply> _parser = new pb::MessageParser<DivReply>(() => new DivReply());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<DivReply> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.MessageTypes[1]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivReply() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivReply(DivReply other) : this() {
-      quotient_ = other.quotient_;
-      remainder_ = other.remainder_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DivReply Clone() {
-      return new DivReply(this);
-    }
-
-    /// <summary>Field number for the "quotient" field.</summary>
-    public const int QuotientFieldNumber = 1;
-    private long quotient_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Quotient {
-      get { return quotient_; }
-      set {
-        quotient_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "remainder" field.</summary>
-    public const int RemainderFieldNumber = 2;
-    private long remainder_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Remainder {
-      get { return remainder_; }
-      set {
-        remainder_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as DivReply);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(DivReply other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Quotient != other.Quotient) return false;
-      if (Remainder != other.Remainder) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Quotient != 0L) hash ^= Quotient.GetHashCode();
-      if (Remainder != 0L) hash ^= Remainder.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Quotient != 0L) {
-        output.WriteRawTag(8);
-        output.WriteInt64(Quotient);
-      }
-      if (Remainder != 0L) {
-        output.WriteRawTag(16);
-        output.WriteInt64(Remainder);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Quotient != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Quotient);
-      }
-      if (Remainder != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Remainder);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(DivReply other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Quotient != 0L) {
-        Quotient = other.Quotient;
-      }
-      if (other.Remainder != 0L) {
-        Remainder = other.Remainder;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Quotient = input.ReadInt64();
-            break;
-          }
-          case 16: {
-            Remainder = input.ReadInt64();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class FibArgs : pb::IMessage<FibArgs> {
-    private static readonly pb::MessageParser<FibArgs> _parser = new pb::MessageParser<FibArgs>(() => new FibArgs());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<FibArgs> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.MessageTypes[2]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibArgs() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibArgs(FibArgs other) : this() {
-      limit_ = other.limit_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibArgs Clone() {
-      return new FibArgs(this);
-    }
-
-    /// <summary>Field number for the "limit" field.</summary>
-    public const int LimitFieldNumber = 1;
-    private long limit_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Limit {
-      get { return limit_; }
-      set {
-        limit_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as FibArgs);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(FibArgs other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Limit != other.Limit) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Limit != 0L) hash ^= Limit.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Limit != 0L) {
-        output.WriteRawTag(8);
-        output.WriteInt64(Limit);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Limit != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Limit);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(FibArgs other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Limit != 0L) {
-        Limit = other.Limit;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Limit = input.ReadInt64();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class Num : pb::IMessage<Num> {
-    private static readonly pb::MessageParser<Num> _parser = new pb::MessageParser<Num>(() => new Num());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<Num> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.MessageTypes[3]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Num() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Num(Num other) : this() {
-      num_ = other.num_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Num Clone() {
-      return new Num(this);
-    }
-
-    /// <summary>Field number for the "num" field.</summary>
-    public const int Num_FieldNumber = 1;
-    private long num_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Num_ {
-      get { return num_; }
-      set {
-        num_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as Num);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(Num other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Num_ != other.Num_) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Num_ != 0L) hash ^= Num_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Num_ != 0L) {
-        output.WriteRawTag(8);
-        output.WriteInt64(Num_);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Num_ != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Num_);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(Num other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Num_ != 0L) {
-        Num_ = other.Num_;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Num_ = input.ReadInt64();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class FibReply : pb::IMessage<FibReply> {
-    private static readonly pb::MessageParser<FibReply> _parser = new pb::MessageParser<FibReply>(() => new FibReply());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<FibReply> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.MessageTypes[4]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibReply() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibReply(FibReply other) : this() {
-      count_ = other.count_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public FibReply Clone() {
-      return new FibReply(this);
-    }
-
-    /// <summary>Field number for the "count" field.</summary>
-    public const int CountFieldNumber = 1;
-    private long count_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long Count {
-      get { return count_; }
-      set {
-        count_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as FibReply);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(FibReply other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Count != other.Count) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Count != 0L) hash ^= Count.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Count != 0L) {
-        output.WriteRawTag(8);
-        output.WriteInt64(Count);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Count != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Count);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(FibReply other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Count != 0L) {
-        Count = other.Count;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Count = input.ReadInt64();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  #endregion
-
-}
-
-#endregion Designer generated code

+ 0 - 208
src/csharp/Grpc.Examples/MathWithProtocOptionsGrpc.cs

@@ -1,208 +0,0 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: math_with_protoc_options.proto
-// </auto-generated>
-// Original file comments:
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#pragma warning disable 0414, 1591
-#region Designer generated code
-
-using grpc = global::Grpc.Core;
-
-namespace MathWithProtocOptions {
-  public static partial class Math
-  {
-    static readonly string __ServiceName = "math_with_protoc_options.Math";
-
-    static readonly grpc::Marshaller<global::MathWithProtocOptions.DivArgs> __Marshaller_math_with_protoc_options_DivArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::MathWithProtocOptions.DivArgs.Parser.ParseFrom);
-    static readonly grpc::Marshaller<global::MathWithProtocOptions.DivReply> __Marshaller_math_with_protoc_options_DivReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::MathWithProtocOptions.DivReply.Parser.ParseFrom);
-    static readonly grpc::Marshaller<global::MathWithProtocOptions.FibArgs> __Marshaller_math_with_protoc_options_FibArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::MathWithProtocOptions.FibArgs.Parser.ParseFrom);
-    static readonly grpc::Marshaller<global::MathWithProtocOptions.Num> __Marshaller_math_with_protoc_options_Num = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::MathWithProtocOptions.Num.Parser.ParseFrom);
-
-    static readonly grpc::Method<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply> __Method_Div = new grpc::Method<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply>(
-        grpc::MethodType.Unary,
-        __ServiceName,
-        "Div",
-        __Marshaller_math_with_protoc_options_DivArgs,
-        __Marshaller_math_with_protoc_options_DivReply);
-
-    static readonly grpc::Method<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply> __Method_DivMany = new grpc::Method<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply>(
-        grpc::MethodType.DuplexStreaming,
-        __ServiceName,
-        "DivMany",
-        __Marshaller_math_with_protoc_options_DivArgs,
-        __Marshaller_math_with_protoc_options_DivReply);
-
-    static readonly grpc::Method<global::MathWithProtocOptions.FibArgs, global::MathWithProtocOptions.Num> __Method_Fib = new grpc::Method<global::MathWithProtocOptions.FibArgs, global::MathWithProtocOptions.Num>(
-        grpc::MethodType.ServerStreaming,
-        __ServiceName,
-        "Fib",
-        __Marshaller_math_with_protoc_options_FibArgs,
-        __Marshaller_math_with_protoc_options_Num);
-
-    static readonly grpc::Method<global::MathWithProtocOptions.Num, global::MathWithProtocOptions.Num> __Method_Sum = new grpc::Method<global::MathWithProtocOptions.Num, global::MathWithProtocOptions.Num>(
-        grpc::MethodType.ClientStreaming,
-        __ServiceName,
-        "Sum",
-        __Marshaller_math_with_protoc_options_Num,
-        __Marshaller_math_with_protoc_options_Num);
-
-    /// <summary>Service descriptor</summary>
-    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
-    {
-      get { return global::MathWithProtocOptions.MathWithProtocOptionsReflection.Descriptor.Services[0]; }
-    }
-
-    /// <summary>Lite client for Math</summary>
-    public partial class MathClient : grpc::LiteClientBase
-    {
-      /// <summary>Creates a new client for Math that uses a custom <c>CallInvoker</c>.</summary>
-      /// <param name="callInvoker">The callInvoker to use to make remote calls.</param>
-      public MathClient(grpc::CallInvoker callInvoker) : base(callInvoker)
-      {
-      }
-      /// <summary>Protected parameterless constructor to allow creation of test doubles.</summary>
-      protected MathClient() : base()
-      {
-      }
-
-      /// <summary>
-      /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient
-      /// and remainder.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
-      /// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
-      /// <param name="cancellationToken">An optional token for canceling the call.</param>
-      /// <returns>The response received from the server.</returns>
-      public virtual global::MathWithProtocOptions.DivReply Div(global::MathWithProtocOptions.DivArgs request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
-      {
-        return Div(request, new grpc::CallOptions(headers, deadline, cancellationToken));
-      }
-      /// <summary>
-      /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient
-      /// and remainder.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="options">The options for the call.</param>
-      /// <returns>The response received from the server.</returns>
-      public virtual global::MathWithProtocOptions.DivReply Div(global::MathWithProtocOptions.DivArgs request, grpc::CallOptions options)
-      {
-        return CallInvoker.BlockingUnaryCall(__Method_Div, null, options, request);
-      }
-      /// <summary>
-      /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient
-      /// and remainder.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
-      /// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
-      /// <param name="cancellationToken">An optional token for canceling the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncUnaryCall<global::MathWithProtocOptions.DivReply> DivAsync(global::MathWithProtocOptions.DivArgs request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
-      {
-        return DivAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
-      }
-      /// <summary>
-      /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient
-      /// and remainder.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="options">The options for the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncUnaryCall<global::MathWithProtocOptions.DivReply> DivAsync(global::MathWithProtocOptions.DivArgs request, grpc::CallOptions options)
-      {
-        return CallInvoker.AsyncUnaryCall(__Method_Div, null, options, request);
-      }
-      /// <summary>
-      /// DivMany accepts an arbitrary number of division args from the client stream
-      /// and sends back the results in the reply stream.  The stream continues until
-      /// the client closes its end; the server does the same after sending all the
-      /// replies.  The stream ends immediately if either end aborts.
-      /// </summary>
-      /// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
-      /// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
-      /// <param name="cancellationToken">An optional token for canceling the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncDuplexStreamingCall<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply> DivMany(grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
-      {
-        return DivMany(new grpc::CallOptions(headers, deadline, cancellationToken));
-      }
-      /// <summary>
-      /// DivMany accepts an arbitrary number of division args from the client stream
-      /// and sends back the results in the reply stream.  The stream continues until
-      /// the client closes its end; the server does the same after sending all the
-      /// replies.  The stream ends immediately if either end aborts.
-      /// </summary>
-      /// <param name="options">The options for the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncDuplexStreamingCall<global::MathWithProtocOptions.DivArgs, global::MathWithProtocOptions.DivReply> DivMany(grpc::CallOptions options)
-      {
-        return CallInvoker.AsyncDuplexStreamingCall(__Method_DivMany, null, options);
-      }
-      /// <summary>
-      /// Fib generates numbers in the Fibonacci sequence.  If FibArgs.limit > 0, Fib
-      /// generates up to limit numbers; otherwise it continues until the call is
-      /// canceled.  Unlike Fib above, Fib has no final FibReply.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
-      /// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
-      /// <param name="cancellationToken">An optional token for canceling the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncServerStreamingCall<global::MathWithProtocOptions.Num> Fib(global::MathWithProtocOptions.FibArgs request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
-      {
-        return Fib(request, new grpc::CallOptions(headers, deadline, cancellationToken));
-      }
-      /// <summary>
-      /// Fib generates numbers in the Fibonacci sequence.  If FibArgs.limit > 0, Fib
-      /// generates up to limit numbers; otherwise it continues until the call is
-      /// canceled.  Unlike Fib above, Fib has no final FibReply.
-      /// </summary>
-      /// <param name="request">The request to send to the server.</param>
-      /// <param name="options">The options for the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncServerStreamingCall<global::MathWithProtocOptions.Num> Fib(global::MathWithProtocOptions.FibArgs request, grpc::CallOptions options)
-      {
-        return CallInvoker.AsyncServerStreamingCall(__Method_Fib, null, options, request);
-      }
-      /// <summary>
-      /// Sum sums a stream of numbers, returning the final result once the stream
-      /// is closed.
-      /// </summary>
-      /// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
-      /// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
-      /// <param name="cancellationToken">An optional token for canceling the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncClientStreamingCall<global::MathWithProtocOptions.Num, global::MathWithProtocOptions.Num> Sum(grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
-      {
-        return Sum(new grpc::CallOptions(headers, deadline, cancellationToken));
-      }
-      /// <summary>
-      /// Sum sums a stream of numbers, returning the final result once the stream
-      /// is closed.
-      /// </summary>
-      /// <param name="options">The options for the call.</param>
-      /// <returns>The call object.</returns>
-      public virtual grpc::AsyncClientStreamingCall<global::MathWithProtocOptions.Num, global::MathWithProtocOptions.Num> Sum(grpc::CallOptions options)
-      {
-        return CallInvoker.AsyncClientStreamingCall(__Method_Sum, null, options);
-      }
-    }
-
-  }
-}
-#endregion

+ 0 - 65
src/csharp/Grpc.Examples/math_with_protoc_options.proto

@@ -1,65 +0,0 @@
-
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package math_with_protoc_options;
-
-message DivArgs {
-  int64 dividend = 1;
-  int64 divisor = 2;
-}
-
-message DivReply {
-  int64 quotient = 1;
-  int64 remainder = 2;
-}
-
-message FibArgs {
-  int64 limit = 1;
-}
-
-message Num {
-  int64 num = 1;
-}
-
-message FibReply {
-  int64 count = 1;
-}
-
-service Math {
-  // Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient
-  // and remainder.
-  rpc Div (DivArgs) returns (DivReply) {
-  }
-
-  // DivMany accepts an arbitrary number of division args from the client stream
-  // and sends back the results in the reply stream.  The stream continues until
-  // the client closes its end; the server does the same after sending all the
-  // replies.  The stream ends immediately if either end aborts.
-  rpc DivMany (stream DivArgs) returns (stream DivReply) {
-  }
-
-  // Fib generates numbers in the Fibonacci sequence.  If FibArgs.limit > 0, Fib
-  // generates up to limit numbers; otherwise it continues until the call is
-  // canceled.  Unlike Fib above, Fib has no final FibReply.
-  rpc Fib (FibArgs) returns (stream Num) {
-  }
-
-  // Sum sums a stream of numbers, returning the final result once the stream
-  // is closed.
-  rpc Sum (stream Num) returns (Num) {
-  }
-}

+ 1 - 2
src/csharp/Grpc.IntegrationTesting/InteropClient.cs

@@ -476,8 +476,7 @@ namespace Grpc.IntegrationTesting
                 }
                 }
                 catch (RpcException ex)
                 catch (RpcException ex)
                 {
                 {
-                    // We can't guarantee the status code always DeadlineExceeded. See issue #2685.
-                    Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal });
+                    Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
                 }
                 }
             }
             }
             Console.WriteLine("Passed!");
             Console.WriteLine("Passed!");

+ 113 - 24
src/csharp/Grpc.IntegrationTesting/Messages.cs

@@ -28,7 +28,7 @@ namespace Grpc.Testing {
             "LnRlc3RpbmciGgoJQm9vbFZhbHVlEg0KBXZhbHVlGAEgASgIIkAKB1BheWxv",
             "LnRlc3RpbmciGgoJQm9vbFZhbHVlEg0KBXZhbHVlGAEgASgIIkAKB1BheWxv",
             "YWQSJwoEdHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlwZRIM",
             "YWQSJwoEdHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlwZRIM",
             "CgRib2R5GAIgASgMIisKCkVjaG9TdGF0dXMSDAoEY29kZRgBIAEoBRIPCgdt",
             "CgRib2R5GAIgASgMIisKCkVjaG9TdGF0dXMSDAoEY29kZRgBIAEoBRIPCgdt",
-            "ZXNzYWdlGAIgASgJIuYCCg1TaW1wbGVSZXF1ZXN0EjAKDXJlc3BvbnNlX3R5",
+            "ZXNzYWdlGAIgASgJIoYDCg1TaW1wbGVSZXF1ZXN0EjAKDXJlc3BvbnNlX3R5",
             "cGUYASABKA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5cGUSFQoNcmVzcG9u",
             "cGUYASABKA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5cGUSFQoNcmVzcG9u",
             "c2Vfc2l6ZRgCIAEoBRImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50ZXN0aW5n",
             "c2Vfc2l6ZRgCIAEoBRImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50ZXN0aW5n",
             "LlBheWxvYWQSFQoNZmlsbF91c2VybmFtZRgEIAEoCBIYChBmaWxsX29hdXRo",
             "LlBheWxvYWQSFQoNZmlsbF91c2VybmFtZRgEIAEoCBIYChBmaWxsX29hdXRo",
@@ -36,34 +36,38 @@ namespace Grpc.Testing {
             "cnBjLnRlc3RpbmcuQm9vbFZhbHVlEjEKD3Jlc3BvbnNlX3N0YXR1cxgHIAEo",
             "cnBjLnRlc3RpbmcuQm9vbFZhbHVlEjEKD3Jlc3BvbnNlX3N0YXR1cxgHIAEo",
             "CzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzEjIKEWV4cGVjdF9jb21wcmVz",
             "CzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzEjIKEWV4cGVjdF9jb21wcmVz",
             "c2VkGAggASgLMhcuZ3JwYy50ZXN0aW5nLkJvb2xWYWx1ZRIWCg5maWxsX3Nl",
             "c2VkGAggASgLMhcuZ3JwYy50ZXN0aW5nLkJvb2xWYWx1ZRIWCg5maWxsX3Nl",
-            "cnZlcl9pZBgJIAEoCCJyCg5TaW1wbGVSZXNwb25zZRImCgdwYXlsb2FkGAEg",
-            "ASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxvYWQSEAoIdXNlcm5hbWUYAiABKAkS",
-            "EwoLb2F1dGhfc2NvcGUYAyABKAkSEQoJc2VydmVyX2lkGAQgASgJIncKGVN0",
-            "cmVhbWluZ0lucHV0Q2FsbFJlcXVlc3QSJgoHcGF5bG9hZBgBIAEoCzIVLmdy",
-            "cGMudGVzdGluZy5QYXlsb2FkEjIKEWV4cGVjdF9jb21wcmVzc2VkGAIgASgL",
-            "MhcuZ3JwYy50ZXN0aW5nLkJvb2xWYWx1ZSI9ChpTdHJlYW1pbmdJbnB1dENh",
-            "bGxSZXNwb25zZRIfChdhZ2dyZWdhdGVkX3BheWxvYWRfc2l6ZRgBIAEoBSJk",
-            "ChJSZXNwb25zZVBhcmFtZXRlcnMSDAoEc2l6ZRgBIAEoBRITCgtpbnRlcnZh",
-            "bF91cxgCIAEoBRIrCgpjb21wcmVzc2VkGAMgASgLMhcuZ3JwYy50ZXN0aW5n",
-            "LkJvb2xWYWx1ZSLoAQoaU3RyZWFtaW5nT3V0cHV0Q2FsbFJlcXVlc3QSMAoN",
-            "cmVzcG9uc2VfdHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlw",
-            "ZRI9ChNyZXNwb25zZV9wYXJhbWV0ZXJzGAIgAygLMiAuZ3JwYy50ZXN0aW5n",
-            "LlJlc3BvbnNlUGFyYW1ldGVycxImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50",
-            "ZXN0aW5nLlBheWxvYWQSMQoPcmVzcG9uc2Vfc3RhdHVzGAcgASgLMhguZ3Jw",
-            "Yy50ZXN0aW5nLkVjaG9TdGF0dXMiRQobU3RyZWFtaW5nT3V0cHV0Q2FsbFJl",
-            "c3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3RpbmcuUGF5bG9h",
-            "ZCIzCg9SZWNvbm5lY3RQYXJhbXMSIAoYbWF4X3JlY29ubmVjdF9iYWNrb2Zm",
-            "X21zGAEgASgFIjMKDVJlY29ubmVjdEluZm8SDgoGcGFzc2VkGAEgASgIEhIK",
-            "CmJhY2tvZmZfbXMYAiADKAUqHwoLUGF5bG9hZFR5cGUSEAoMQ09NUFJFU1NB",
-            "QkxFEABiBnByb3RvMw=="));
+            "cnZlcl9pZBgJIAEoCBIeChZmaWxsX2dycGNsYl9yb3V0ZV90eXBlGAogASgI",
+            "IqwBCg5TaW1wbGVSZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3JwYy50",
+            "ZXN0aW5nLlBheWxvYWQSEAoIdXNlcm5hbWUYAiABKAkSEwoLb2F1dGhfc2Nv",
+            "cGUYAyABKAkSEQoJc2VydmVyX2lkGAQgASgJEjgKEWdycGNsYl9yb3V0ZV90",
+            "eXBlGAUgASgOMh0uZ3JwYy50ZXN0aW5nLkdycGNsYlJvdXRlVHlwZSJ3ChlT",
+            "dHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYKB3BheWxvYWQYASABKAsyFS5n",
+            "cnBjLnRlc3RpbmcuUGF5bG9hZBIyChFleHBlY3RfY29tcHJlc3NlZBgCIAEo",
+            "CzIXLmdycGMudGVzdGluZy5Cb29sVmFsdWUiPQoaU3RyZWFtaW5nSW5wdXRD",
+            "YWxsUmVzcG9uc2USHwoXYWdncmVnYXRlZF9wYXlsb2FkX3NpemUYASABKAUi",
+            "ZAoSUmVzcG9uc2VQYXJhbWV0ZXJzEgwKBHNpemUYASABKAUSEwoLaW50ZXJ2",
+            "YWxfdXMYAiABKAUSKwoKY29tcHJlc3NlZBgDIAEoCzIXLmdycGMudGVzdGlu",
+            "Zy5Cb29sVmFsdWUi6AEKGlN0cmVhbWluZ091dHB1dENhbGxSZXF1ZXN0EjAK",
+            "DXJlc3BvbnNlX3R5cGUYASABKA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5",
+            "cGUSPQoTcmVzcG9uc2VfcGFyYW1ldGVycxgCIAMoCzIgLmdycGMudGVzdGlu",
+            "Zy5SZXNwb25zZVBhcmFtZXRlcnMSJgoHcGF5bG9hZBgDIAEoCzIVLmdycGMu",
+            "dGVzdGluZy5QYXlsb2FkEjEKD3Jlc3BvbnNlX3N0YXR1cxgHIAEoCzIYLmdy",
+            "cGMudGVzdGluZy5FY2hvU3RhdHVzIkUKG1N0cmVhbWluZ091dHB1dENhbGxS",
+            "ZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxv",
+            "YWQiMwoPUmVjb25uZWN0UGFyYW1zEiAKGG1heF9yZWNvbm5lY3RfYmFja29m",
+            "Zl9tcxgBIAEoBSIzCg1SZWNvbm5lY3RJbmZvEg4KBnBhc3NlZBgBIAEoCBIS",
+            "CgpiYWNrb2ZmX21zGAIgAygFKh8KC1BheWxvYWRUeXBlEhAKDENPTVBSRVNT",
+            "QUJMRRAAKm8KD0dycGNsYlJvdXRlVHlwZRIdChlHUlBDTEJfUk9VVEVfVFlQ",
+            "RV9VTktOT1dOEAASHgoaR1JQQ0xCX1JPVVRFX1RZUEVfRkFMTEJBQ0sQARId",
+            "ChlHUlBDTEJfUk9VVEVfVFlQRV9CQUNLRU5EEAJiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::FileDescriptor[] { },
-          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.PayloadType), }, new pbr::GeneratedClrTypeInfo[] {
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.PayloadType), typeof(global::Grpc.Testing.GrpclbRouteType), }, new pbr::GeneratedClrTypeInfo[] {
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.BoolValue), global::Grpc.Testing.BoolValue.Parser, new[]{ "Value" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.BoolValue), global::Grpc.Testing.BoolValue.Parser, new[]{ "Value" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Payload), global::Grpc.Testing.Payload.Parser, new[]{ "Type", "Body" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Payload), global::Grpc.Testing.Payload.Parser, new[]{ "Type", "Body" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.EchoStatus), global::Grpc.Testing.EchoStatus.Parser, new[]{ "Code", "Message" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.EchoStatus), global::Grpc.Testing.EchoStatus.Parser, new[]{ "Code", "Message" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleRequest), global::Grpc.Testing.SimpleRequest.Parser, new[]{ "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope", "ResponseCompressed", "ResponseStatus", "ExpectCompressed", "FillServerId" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleResponse), global::Grpc.Testing.SimpleResponse.Parser, new[]{ "Payload", "Username", "OauthScope", "ServerId" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleRequest), global::Grpc.Testing.SimpleRequest.Parser, new[]{ "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope", "ResponseCompressed", "ResponseStatus", "ExpectCompressed", "FillServerId", "FillGrpclbRouteType" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleResponse), global::Grpc.Testing.SimpleResponse.Parser, new[]{ "Payload", "Username", "OauthScope", "ServerId", "GrpclbRouteType" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallRequest), global::Grpc.Testing.StreamingInputCallRequest.Parser, new[]{ "Payload", "ExpectCompressed" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallRequest), global::Grpc.Testing.StreamingInputCallRequest.Parser, new[]{ "Payload", "ExpectCompressed" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallResponse), global::Grpc.Testing.StreamingInputCallResponse.Parser, new[]{ "AggregatedPayloadSize" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallResponse), global::Grpc.Testing.StreamingInputCallResponse.Parser, new[]{ "AggregatedPayloadSize" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ResponseParameters), global::Grpc.Testing.ResponseParameters.Parser, new[]{ "Size", "IntervalUs", "Compressed" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ResponseParameters), global::Grpc.Testing.ResponseParameters.Parser, new[]{ "Size", "IntervalUs", "Compressed" }, null, null, null),
@@ -87,6 +91,29 @@ namespace Grpc.Testing {
     [pbr::OriginalName("COMPRESSABLE")] Compressable = 0,
     [pbr::OriginalName("COMPRESSABLE")] Compressable = 0,
   }
   }
 
 
+  /// <summary>
+  /// The type of route that a client took to reach a server w.r.t. gRPCLB.
+  /// The server must fill in "fallback" if it detects that the RPC reached
+  /// the server via the "gRPCLB fallback" path, and "backend" if it detects
+  /// that the RPC reached the server via "gRPCLB backend" path (i.e. if it got
+  /// the address of this server from the gRPCLB server BalanceLoad RPC). Exactly
+  /// how this detection is done is context and server dependant.
+  /// </summary>
+  public enum GrpclbRouteType {
+    /// <summary>
+    /// Server didn't detect the route that a client took to reach it.
+    /// </summary>
+    [pbr::OriginalName("GRPCLB_ROUTE_TYPE_UNKNOWN")] Unknown = 0,
+    /// <summary>
+    /// Indicates that a client reached a server via gRPCLB fallback.
+    /// </summary>
+    [pbr::OriginalName("GRPCLB_ROUTE_TYPE_FALLBACK")] Fallback = 1,
+    /// <summary>
+    /// Indicates that a client reached a server as a gRPCLB-given backend.
+    /// </summary>
+    [pbr::OriginalName("GRPCLB_ROUTE_TYPE_BACKEND")] Backend = 2,
+  }
+
   #endregion
   #endregion
 
 
   #region Messages
   #region Messages
@@ -591,6 +618,7 @@ namespace Grpc.Testing {
       responseStatus_ = other.responseStatus_ != null ? other.responseStatus_.Clone() : null;
       responseStatus_ = other.responseStatus_ != null ? other.responseStatus_.Clone() : null;
       expectCompressed_ = other.expectCompressed_ != null ? other.expectCompressed_.Clone() : null;
       expectCompressed_ = other.expectCompressed_ != null ? other.expectCompressed_.Clone() : null;
       fillServerId_ = other.fillServerId_;
       fillServerId_ = other.fillServerId_;
+      fillGrpclbRouteType_ = other.fillGrpclbRouteType_;
       _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
       _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
     }
 
 
@@ -729,6 +757,20 @@ namespace Grpc.Testing {
       }
       }
     }
     }
 
 
+    /// <summary>Field number for the "fill_grpclb_route_type" field.</summary>
+    public const int FillGrpclbRouteTypeFieldNumber = 10;
+    private bool fillGrpclbRouteType_;
+    /// <summary>
+    /// Whether SimpleResponse should include grpclb_route_type.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public bool FillGrpclbRouteType {
+      get { return fillGrpclbRouteType_; }
+      set {
+        fillGrpclbRouteType_ = value;
+      }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
     public override bool Equals(object other) {
       return Equals(other as SimpleRequest);
       return Equals(other as SimpleRequest);
@@ -751,6 +793,7 @@ namespace Grpc.Testing {
       if (!object.Equals(ResponseStatus, other.ResponseStatus)) return false;
       if (!object.Equals(ResponseStatus, other.ResponseStatus)) return false;
       if (!object.Equals(ExpectCompressed, other.ExpectCompressed)) return false;
       if (!object.Equals(ExpectCompressed, other.ExpectCompressed)) return false;
       if (FillServerId != other.FillServerId) return false;
       if (FillServerId != other.FillServerId) return false;
+      if (FillGrpclbRouteType != other.FillGrpclbRouteType) return false;
       return Equals(_unknownFields, other._unknownFields);
       return Equals(_unknownFields, other._unknownFields);
     }
     }
 
 
@@ -766,6 +809,7 @@ namespace Grpc.Testing {
       if (responseStatus_ != null) hash ^= ResponseStatus.GetHashCode();
       if (responseStatus_ != null) hash ^= ResponseStatus.GetHashCode();
       if (expectCompressed_ != null) hash ^= ExpectCompressed.GetHashCode();
       if (expectCompressed_ != null) hash ^= ExpectCompressed.GetHashCode();
       if (FillServerId != false) hash ^= FillServerId.GetHashCode();
       if (FillServerId != false) hash ^= FillServerId.GetHashCode();
+      if (FillGrpclbRouteType != false) hash ^= FillGrpclbRouteType.GetHashCode();
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         hash ^= _unknownFields.GetHashCode();
         hash ^= _unknownFields.GetHashCode();
       }
       }
@@ -815,6 +859,10 @@ namespace Grpc.Testing {
         output.WriteRawTag(72);
         output.WriteRawTag(72);
         output.WriteBool(FillServerId);
         output.WriteBool(FillServerId);
       }
       }
+      if (FillGrpclbRouteType != false) {
+        output.WriteRawTag(80);
+        output.WriteBool(FillGrpclbRouteType);
+      }
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         _unknownFields.WriteTo(output);
         _unknownFields.WriteTo(output);
       }
       }
@@ -850,6 +898,9 @@ namespace Grpc.Testing {
       if (FillServerId != false) {
       if (FillServerId != false) {
         size += 1 + 1;
         size += 1 + 1;
       }
       }
+      if (FillGrpclbRouteType != false) {
+        size += 1 + 1;
+      }
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         size += _unknownFields.CalculateSize();
         size += _unknownFields.CalculateSize();
       }
       }
@@ -900,6 +951,9 @@ namespace Grpc.Testing {
       if (other.FillServerId != false) {
       if (other.FillServerId != false) {
         FillServerId = other.FillServerId;
         FillServerId = other.FillServerId;
       }
       }
+      if (other.FillGrpclbRouteType != false) {
+        FillGrpclbRouteType = other.FillGrpclbRouteType;
+      }
       _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
       _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
     }
 
 
@@ -959,6 +1013,10 @@ namespace Grpc.Testing {
             FillServerId = input.ReadBool();
             FillServerId = input.ReadBool();
             break;
             break;
           }
           }
+          case 80: {
+            FillGrpclbRouteType = input.ReadBool();
+            break;
+          }
         }
         }
       }
       }
     }
     }
@@ -997,6 +1055,7 @@ namespace Grpc.Testing {
       username_ = other.username_;
       username_ = other.username_;
       oauthScope_ = other.oauthScope_;
       oauthScope_ = other.oauthScope_;
       serverId_ = other.serverId_;
       serverId_ = other.serverId_;
+      grpclbRouteType_ = other.grpclbRouteType_;
       _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
       _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
     }
 
 
@@ -1063,6 +1122,20 @@ namespace Grpc.Testing {
       }
       }
     }
     }
 
 
+    /// <summary>Field number for the "grpclb_route_type" field.</summary>
+    public const int GrpclbRouteTypeFieldNumber = 5;
+    private global::Grpc.Testing.GrpclbRouteType grpclbRouteType_ = 0;
+    /// <summary>
+    /// gRPCLB Path.
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public global::Grpc.Testing.GrpclbRouteType GrpclbRouteType {
+      get { return grpclbRouteType_; }
+      set {
+        grpclbRouteType_ = value;
+      }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
     public override bool Equals(object other) {
       return Equals(other as SimpleResponse);
       return Equals(other as SimpleResponse);
@@ -1080,6 +1153,7 @@ namespace Grpc.Testing {
       if (Username != other.Username) return false;
       if (Username != other.Username) return false;
       if (OauthScope != other.OauthScope) return false;
       if (OauthScope != other.OauthScope) return false;
       if (ServerId != other.ServerId) return false;
       if (ServerId != other.ServerId) return false;
+      if (GrpclbRouteType != other.GrpclbRouteType) return false;
       return Equals(_unknownFields, other._unknownFields);
       return Equals(_unknownFields, other._unknownFields);
     }
     }
 
 
@@ -1090,6 +1164,7 @@ namespace Grpc.Testing {
       if (Username.Length != 0) hash ^= Username.GetHashCode();
       if (Username.Length != 0) hash ^= Username.GetHashCode();
       if (OauthScope.Length != 0) hash ^= OauthScope.GetHashCode();
       if (OauthScope.Length != 0) hash ^= OauthScope.GetHashCode();
       if (ServerId.Length != 0) hash ^= ServerId.GetHashCode();
       if (ServerId.Length != 0) hash ^= ServerId.GetHashCode();
+      if (GrpclbRouteType != 0) hash ^= GrpclbRouteType.GetHashCode();
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         hash ^= _unknownFields.GetHashCode();
         hash ^= _unknownFields.GetHashCode();
       }
       }
@@ -1119,6 +1194,10 @@ namespace Grpc.Testing {
         output.WriteRawTag(34);
         output.WriteRawTag(34);
         output.WriteString(ServerId);
         output.WriteString(ServerId);
       }
       }
+      if (GrpclbRouteType != 0) {
+        output.WriteRawTag(40);
+        output.WriteEnum((int) GrpclbRouteType);
+      }
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         _unknownFields.WriteTo(output);
         _unknownFields.WriteTo(output);
       }
       }
@@ -1139,6 +1218,9 @@ namespace Grpc.Testing {
       if (ServerId.Length != 0) {
       if (ServerId.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(ServerId);
         size += 1 + pb::CodedOutputStream.ComputeStringSize(ServerId);
       }
       }
+      if (GrpclbRouteType != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) GrpclbRouteType);
+      }
       if (_unknownFields != null) {
       if (_unknownFields != null) {
         size += _unknownFields.CalculateSize();
         size += _unknownFields.CalculateSize();
       }
       }
@@ -1165,6 +1247,9 @@ namespace Grpc.Testing {
       if (other.ServerId.Length != 0) {
       if (other.ServerId.Length != 0) {
         ServerId = other.ServerId;
         ServerId = other.ServerId;
       }
       }
+      if (other.GrpclbRouteType != 0) {
+        GrpclbRouteType = other.GrpclbRouteType;
+      }
       _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
       _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
     }
 
 
@@ -1195,6 +1280,10 @@ namespace Grpc.Testing {
             ServerId = input.ReadString();
             ServerId = input.ReadString();
             break;
             break;
           }
           }
+          case 40: {
+            GrpclbRouteType = (global::Grpc.Testing.GrpclbRouteType) input.ReadEnum();
+            break;
+          }
         }
         }
       }
       }
     }
     }

+ 1 - 1
src/csharp/Grpc.Microbenchmarks/PingBenchmark.cs

@@ -86,7 +86,7 @@ namespace Grpc.Microbenchmarks
             await server.ShutdownAsync();
             await server.ShutdownAsync();
         }
         }
 
 
-        class PingClient : LiteClientBase
+        class PingClient : ClientBase
         {
         {
             public PingClient(CallInvoker callInvoker) : base(callInvoker) { }
             public PingClient(CallInvoker callInvoker) : base(callInvoker) { }
             public AsyncUnaryCall<string> PingAsync(string request, CallOptions options)
             public AsyncUnaryCall<string> PingAsync(string request, CallOptions options)

+ 1 - 1
src/csharp/Grpc.Microbenchmarks/UnaryCallOverheadBenchmark.cs

@@ -91,7 +91,7 @@ namespace Grpc.Microbenchmarks
             await channel.ShutdownAsync();
             await channel.ShutdownAsync();
         }
         }
 
 
-        class PingClient : LiteClientBase
+        class PingClient : ClientBase
         {
         {
             public PingClient(CallInvoker callInvoker) : base(callInvoker) { }
             public PingClient(CallInvoker callInvoker) : base(callInvoker) { }
 
 

+ 0 - 11
src/csharp/Grpc.Tools/build/_grpc/Grpc.CSharp.xml

@@ -26,16 +26,5 @@
       </EnumProperty.DataSource>
       </EnumProperty.DataSource>
     </EnumProperty>
     </EnumProperty>
 
 
-    <EnumProperty Name="ClientBaseType" DisplayName="gRPC Client Base Type"
-                  Category="gRPC" Default="ClientBase"
-                  Description="The base type to use for the client. This is an experimental feature.">
-      <EnumValue Name="ClientBase" DisplayName="Use ClientBase" />
-      <EnumValue Name="LiteClientBase" DisplayName="Use LiteClientBase" />
-      <EnumProperty.DataSource>
-        <DataSource ItemType="Protobuf" SourceOfDefaultValue="AfterContext"
-                    PersistenceStyle="Attribute" />
-      </EnumProperty.DataSource>
-    </EnumProperty>
-
   </Rule>
   </Rule>
 </ProjectSchemaDefinitions>
 </ProjectSchemaDefinitions>

+ 0 - 3
src/csharp/Grpc.Tools/build/_grpc/_Grpc.Tools.targets

@@ -42,9 +42,6 @@
       <Protobuf_Compile Condition=" '%(Protobuf_Compile.GrpcServices)' == 'Server' ">
       <Protobuf_Compile Condition=" '%(Protobuf_Compile.GrpcServices)' == 'Server' ">
         <_GrpcOutputOptions>%(Protobuf_Compile._GrpcOutputOptions);no_client</_GrpcOutputOptions>
         <_GrpcOutputOptions>%(Protobuf_Compile._GrpcOutputOptions);no_client</_GrpcOutputOptions>
       </Protobuf_Compile>
       </Protobuf_Compile>
-      <Protobuf_Compile Condition=" '%(Protobuf_Compile.GrpcServices)' == 'Client' or  '%(Protobuf_Compile.GrpcServices)' == 'Both' ">
-        <_GrpcOutputOptions Condition=" '%(Protobuf_Compile.ClientBaseType)' == 'LiteClientBase' ">%(Protobuf_Compile._GrpcOutputOptions);lite_client</_GrpcOutputOptions>
-      </Protobuf_Compile>
     </ItemGroup>
     </ItemGroup>
   </Target>
   </Target>
 </Project>
 </Project>

+ 1 - 1
src/csharp/experimental/build_native_ext_for_ios.sh

@@ -28,7 +28,7 @@ function build {
     PATH_CC="$(xcrun --sdk $SDK --find clang)"
     PATH_CC="$(xcrun --sdk $SDK --find clang)"
     PATH_CXX="$(xcrun --sdk $SDK --find clang++)"
     PATH_CXX="$(xcrun --sdk $SDK --find clang++)"
 
 
-    CPPFLAGS="-O2 -Wframe-larger-than=16384 -arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -mios-version-min=6.0 -DPB_NO_PACKED_STRUCTS=1"
+    CPPFLAGS="-O2 -Wframe-larger-than=16384 -arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -fembed-bitcode -mios-version-min=6.0 -DPB_NO_PACKED_STRUCTS=1"
     LDFLAGS="-arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -Wl,ios_version_min=6.0"
     LDFLAGS="-arch $ARCH -isysroot $(xcrun --sdk $SDK --show-sdk-path) -Wl,ios_version_min=6.0"
 
 
     # TODO(jtattermusch): revisit the build arguments
     # TODO(jtattermusch): revisit the build arguments

+ 0 - 2
src/csharp/generate_proto_csharp.sh

@@ -26,8 +26,6 @@ TESTING_DIR=src/csharp/Grpc.IntegrationTesting
 
 
 $PROTOC --plugin=$PLUGIN --csharp_out=$EXAMPLES_DIR --grpc_out=$EXAMPLES_DIR \
 $PROTOC --plugin=$PLUGIN --csharp_out=$EXAMPLES_DIR --grpc_out=$EXAMPLES_DIR \
     -I src/proto src/proto/math/math.proto
     -I src/proto src/proto/math/math.proto
-$PROTOC --plugin=$PLUGIN --csharp_out=$EXAMPLES_DIR --grpc_out=$EXAMPLES_DIR --grpc_opt=lite_client,no_server \
-    -I src/csharp/Grpc.Examples src/csharp/Grpc.Examples/math_with_protoc_options.proto
 
 
 $PROTOC --plugin=$PLUGIN --csharp_out=$HEALTHCHECK_DIR --grpc_out=$HEALTHCHECK_DIR \
 $PROTOC --plugin=$PLUGIN --csharp_out=$HEALTHCHECK_DIR --grpc_out=$HEALTHCHECK_DIR \
     -I src/proto src/proto/grpc/health/v1/health.proto
     -I src/proto src/proto/grpc/health/v1/health.proto

+ 1 - 1
src/proto/grpc/channelz/channelz.proto

@@ -35,7 +35,7 @@ option java_outer_classname = "ChannelzProto";
 
 
 // Channel is a logical grouping of channels, subchannels, and sockets.
 // Channel is a logical grouping of channels, subchannels, and sockets.
 message Channel {
 message Channel {
-  // The identifier for this channel. This should bet set.
+  // The identifier for this channel. This should be set.
   ChannelRef ref = 1;
   ChannelRef ref = 1;
   // Data specific to this channel.
   // Data specific to this channel.
   ChannelData data = 2;
   ChannelData data = 2;

+ 7 - 0
src/proto/grpc/lb/v2/BUILD

@@ -39,3 +39,10 @@ grpc_proto_library(
     well_known_protos = True,
     well_known_protos = True,
     deps = ["eds_for_test_proto"],
     deps = ["eds_for_test_proto"],
 )
 )
+
+grpc_proto_library(
+    name = "orca_load_report_for_test_proto",
+    srcs = [
+        "orca_load_report_for_test.proto",
+    ],
+)

+ 6 - 2
src/proto/grpc/lb/v2/eds_for_test.proto

@@ -16,8 +16,12 @@
 // the gRPC library; otherwise there can be duplicate definition problems if
 // the gRPC library; otherwise there can be duplicate definition problems if
 // users depend on both gRPC and Envoy. It can only be used by gRPC tests.
 // users depend on both gRPC and Envoy. It can only be used by gRPC tests.
 //
 //
-// TODO(juanlishen): It's a workaround and should be removed once we have a
-//  clean solution to use protobuf and external proto files.
+// TODO(juanlishen): This file is a hack to avoid a problem we're
+// currently having where we can't depend on a proto file in an external
+// repo due to bazel limitations.  Once that's fixed, this should be
+// removed.  Until this, it should be used in the gRPC tests only, or else it
+// will cause a conflict due to the same proto messages being defined in
+// multiple files in the same binary.
 
 
 syntax = "proto3";
 syntax = "proto3";
 
 

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff