pull/34909/head
Craig Tiller 1 year ago
commit cdac34cca7
  1. 6
      .gitattributes
  2. 1
      .github/CODEOWNERS
  3. 6
      .github/labeler.yml
  4. 3
      .github/workflows/pr-auto-fix.yaml
  5. 15
      .github/workflows/pr-auto-tag.yaml
  6. 2
      .gitignore
  7. 18
      BUILD
  8. 1323
      CMakeLists.txt
  9. 1465
      Makefile
  10. 3
      OWNERS
  11. 1517
      Package.swift
  12. 6
      WORKSPACE
  13. 2
      _metadata.py
  14. 45
      bazel/experiments.bzl
  15. 2
      bazel/googleapis.BUILD
  16. 6
      bazel/grpc_build_system.bzl
  17. 61
      bazel/grpc_deps.bzl
  18. 3
      bazel/grpc_extra_deps.bzl
  19. 3141
      build_autogenerated.yaml
  20. 2
      build_config.rb
  21. 12
      build_handwritten.yaml
  22. 2
      cmake/upb.cmake
  23. 846
      config.m4
  24. 1116
      config.w32
  25. 3
      doc/g_stands_for.md
  26. 12
      doc/service_config.md
  27. 1
      examples/cpp/cmake/common.cmake
  28. 42
      examples/cpp/debugging/BUILD
  29. 132
      examples/cpp/debugging/README.md
  30. 92
      examples/cpp/debugging/crashing_greeter_client.cc
  31. 86
      examples/cpp/debugging/greeter_callback_server_admin.cc
  32. 31
      examples/cpp/orca/BUILD
  33. 46
      examples/cpp/orca/README.md
  34. 101
      examples/cpp/orca/orca_server.cc
  35. 24
      examples/cpp/wait_for_ready/BUILD
  36. 70
      examples/cpp/wait_for_ready/CMakeLists.txt
  37. 32
      examples/cpp/wait_for_ready/README.md
  38. 107
      examples/cpp/wait_for_ready/greeter_callback_client.cc
  39. 1748
      gRPC-C++.podspec
  40. 2386
      gRPC-Core.podspec
  41. 2
      gRPC-ProtoRPC.podspec
  42. 2
      gRPC-RxLibrary.podspec
  43. 38
      gRPC.podspec
  44. 2
      grpc.def
  45. 1511
      grpc.gemspec
  46. 805
      grpc.gyp
  47. 71
      include/grpc/event_engine/event_engine.h
  48. 6
      include/grpc/event_engine/internal/memory_allocator_impl.h
  49. 4
      include/grpc/event_engine/memory_allocator.h
  50. 23
      include/grpc/grpc_security.h
  51. 7
      include/grpc/impl/channel_arg_names.h
  52. 2
      include/grpc/impl/slice_type.h
  53. 14
      include/grpcpp/security/tls_credentials_options.h
  54. 4
      include/grpcpp/version_info.h
  55. 1515
      package.xml
  56. 1
      requirements.bazel.txt
  57. 2
      setup.cfg
  58. 6
      setup.py
  59. 226
      src/core/BUILD
  60. 18
      src/core/ext/filters/client_channel/client_channel.cc
  61. 75
      src/core/ext/filters/client_channel/lb_policy/address_filtering.cc
  62. 5
      src/core/ext/filters/client_channel/lb_policy/address_filtering.h
  63. 17
      src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc
  64. 8
      src/core/ext/filters/client_channel/lb_policy/endpoint_list.h
  65. 195
      src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
  66. 5
      src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc
  67. 167
      src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
  68. 3
      src/core/ext/filters/client_channel/lb_policy/priority/priority.cc
  69. 18
      src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc
  70. 27
      src/core/ext/filters/client_channel/lb_policy/rls/rls.cc
  71. 29
      src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
  72. 20
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
  73. 44
      src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc
  74. 15
      src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
  75. 43
      src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
  76. 4
      src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
  77. 5
      src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
  78. 109
      src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
  79. 85
      src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc
  80. 9
      src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc
  81. 1
      src/core/ext/filters/client_channel/retry_filter.cc
  82. 12
      src/core/ext/filters/deadline/deadline_filter.cc
  83. 55
      src/core/ext/filters/http/client/http_client_filter.cc
  84. 15
      src/core/ext/filters/http/client/http_client_filter.h
  85. 82
      src/core/ext/filters/http/server/http_server_filter.cc
  86. 15
      src/core/ext/filters/http/server/http_server_filter.h
  87. 124
      src/core/ext/filters/message_size/message_size_filter.cc
  88. 58
      src/core/ext/filters/message_size/message_size_filter.h
  89. 113
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  90. 9
      src/core/ext/transport/chttp2/transport/chttp2_transport.h
  91. 20
      src/core/ext/transport/chttp2/transport/flow_control.cc
  92. 2
      src/core/ext/transport/chttp2/transport/frame_rst_stream.cc
  93. 32
      src/core/ext/transport/chttp2/transport/internal.h
  94. 6
      src/core/ext/transport/chttp2/transport/parsing.cc
  95. 14
      src/core/ext/transport/chttp2/transport/writing.cc
  96. 88
      src/core/ext/upb-gen/envoy/admin/v3/certs.upb.h
  97. 49
      src/core/ext/upb-gen/envoy/admin/v3/certs.upb_minitable.c
  98. 34
      src/core/ext/upb-gen/envoy/admin/v3/certs.upb_minitable.h
  99. 90
      src/core/ext/upb-gen/envoy/admin/v3/clusters.upb.h
  100. 59
      src/core/ext/upb-gen/envoy/admin/v3/clusters.upb_minitable.c
  101. Some files were not shown because too many files have changed in this diff Show More

6
.gitattributes vendored

@ -1,5 +1,5 @@
src/core/ext/upb-generated/** linguist-generated=true
src/core/ext/upbdefs-generated/** linguist-generated=true
src/core/ext/upb-gen/** linguist-generated=true
src/core/ext/upbdefs-gen/** linguist-generated=true
Makefile linguist-generated=true
BUILD.gn linguist-generated=true
CMakeLists.txt linguist-generated=true
@ -36,4 +36,4 @@ src/core/lib/debug/stats_data.cc linguist-generated=true
src/core/lib/experiments/experiments.h linguist-generated=true
src/core/lib/experiments/experiments.cc linguist-generated=true
bazel/experiments.bzl linguist-generated=true
test/cpp/microbenchmarks/huffman_geometries/** linguist-generated=true
test/cpp/microbenchmarks/huffman_geometries/** linguist-generated=true

@ -10,3 +10,4 @@
/src/core/lib/resolver/** @markdroth
/src/core/lib/service_config/** @markdroth
/tools/dockerfile/** @jtattermusch @apolcyn
/tools/run_tests/xds_k8s_test_driver/** @sergiitk @XuanWang-Amos @gnossen

@ -52,9 +52,3 @@ lang/ruby:
"lang/C#":
- src/compiler/csharp*
- src/csharp/**
"disposition/Needs Internal Changes":
- src/core/lib/event_engine/windows/**
- src/core/lib/gpr/windows/**
- src/core/lib/gprpp/windows/**
- test/core/event_engine/windows/**

@ -48,8 +48,9 @@ jobs:
with:
script: |
// If you'd like not to run this code on your commits, add your github user id here:
NO_AUTOFIX_USERS = []
NO_AUTOFIX_USERS = ["copybara-service[bot]"]
const { owner, repo } = context.repo
console.log("Actor: " + context.actor);
if (NO_AUTOFIX_USERS.includes(context.actor)) {
console.log('Cancelling');
const run_id = "${{ github.run_id }}";

@ -1,4 +1,4 @@
name: PR Title Check & Tag
name: PR Auto Tag
on:
pull_request_target:
types: [opened, reopened, synchronize, edited]
@ -17,16 +17,3 @@ jobs:
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: ""
title-check:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: thehanimo/pr-title-checker@v1.3.5
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
pass_on_octokit_error: false
configuration_path: ".github/pr_title_checker_config.json"

2
.gitignore vendored

@ -17,7 +17,7 @@ cython_debug/
dist/
htmlcov/
py3*/
python_build/
pyb/
python_pylint_venv/
src/python/grpcio_*/=*
src/python/grpcio_*/build/

18
BUILD

@ -30,8 +30,8 @@ licenses(["reciprocal"])
package(
default_visibility = ["//visibility:public"],
features = [
"layering_check",
"-parse_headers",
"layering_check",
],
)
@ -211,11 +211,11 @@ config_setting(
python_config_settings()
# This should be updated along with build_handwritten.yaml
g_stands_for = "gjallarhorn" # @unused
g_stands_for = "grand" # @unused
core_version = "36.0.0" # @unused
core_version = "37.0.0" # @unused
version = "1.60.0-dev" # @unused
version = "1.61.0-dev" # @unused
GPR_PUBLIC_HDRS = [
"include/grpc/support/alloc.h",
@ -1009,6 +1009,7 @@ grpc_cc_library(
"absl/strings",
"absl/types:optional",
"absl/types:span",
"upb_base_lib",
"upb_collections_lib",
"upb_lib",
],
@ -1213,6 +1214,7 @@ grpc_cc_library(
"include/grpcpp/security/alts_util.h",
],
external_deps = [
"upb_base_lib",
"upb_collections_lib",
"upb_lib",
],
@ -1602,6 +1604,7 @@ grpc_cc_library(
"//src/core:slice_refcount",
"//src/core:socket_mutator",
"//src/core:stats_data",
"//src/core:status_flag",
"//src/core:status_helper",
"//src/core:strerror",
"//src/core:thread_quota",
@ -1930,6 +1933,7 @@ grpc_cc_library(
"absl/synchronization",
"absl/memory",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
"protobuf_headers",
"absl/container:inlined_vector",
@ -2004,6 +2008,7 @@ grpc_cc_library(
"absl/synchronization",
"absl/types:optional",
"absl/memory",
"upb_base_lib",
"upb_lib",
"absl/strings:str_format",
"protobuf_headers",
@ -2173,6 +2178,7 @@ grpc_cc_library(
"absl/strings",
"absl/time",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
],
language = "c++",
@ -2936,6 +2942,7 @@ grpc_cc_library(
"//src/core:lib/resolver/endpoint_addresses.h",
],
external_deps = [
"absl/functional:function_ref",
"absl/status",
"absl/status:statusor",
"absl/strings",
@ -3063,6 +3070,7 @@ grpc_cc_library(
"absl/strings:cord",
"absl/types:optional",
"absl/types:variant",
"upb_base_lib",
"upb_collections_lib",
"upb_lib",
],
@ -3673,7 +3681,9 @@ grpc_cc_library(
"absl/strings",
"absl/strings:str_format",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
"upb_mem_lib",
"upb_textformat_lib",
"upb_json_lib",
"upb_reflection",

1323
CMakeLists.txt generated

File diff suppressed because it is too large Load Diff

1465
Makefile generated

File diff suppressed because it is too large Load Diff

@ -1,3 +0,0 @@
# Top level ownership
@markdroth **/OWNERS
@a11r **/OWNERS

1517
Package.swift generated

File diff suppressed because it is too large Load Diff

@ -66,7 +66,7 @@ pip_install(
requirements = "@com_github_grpc_grpc//:requirements.bazel.txt",
)
load("@upb//bazel:system_python.bzl", "system_python")
load("@com_google_protobuf//bazel:system_python.bzl", "system_python")
system_python(
name = "system_python",
@ -77,9 +77,9 @@ load("@system_python//:pip.bzl", "pip_parse")
pip_parse(
name = "pip_deps",
requirements = "@upb//python:requirements.txt",
requirements = "@com_google_protobuf//python:requirements.txt",
requirements_overrides = {
"3.11": "@upb//python:requirements_311.txt",
"3.11": "@com_google_protobuf//python:requirements_311.txt",
},
)

@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/_metadata.py.template`!!!
__version__ = """1.60.0.dev0"""
__version__ = """1.61.0.dev0"""

@ -17,14 +17,10 @@
"""Dictionary of tags to experiments so we know when to test different experiments."""
EXPERIMENT_ENABLES = {
"block_excessive_requests_before_settings_ack": "block_excessive_requests_before_settings_ack",
"call_status_override_on_cancellation": "call_status_override_on_cancellation",
"canary_client_privacy": "canary_client_privacy",
"client_idleness": "client_idleness",
"client_privacy": "client_privacy",
"combiner_offload_to_event_engine": "combiner_offload_to_event_engine",
"chttp2_batch_requests": "chttp2_batch_requests,combiner_offload_to_event_engine",
"chttp2_offload_on_rst_stream": "chttp2_offload_on_rst_stream,combiner_offload_to_event_engine",
"event_engine_client": "event_engine_client",
"event_engine_dns": "event_engine_dns",
"event_engine_listener": "event_engine_listener",
@ -32,7 +28,6 @@ EXPERIMENT_ENABLES = {
"http2_stats_fix": "http2_stats_fix",
"keepalive_fix": "keepalive_fix",
"keepalive_server_fix": "keepalive_server_fix",
"lazier_stream_updates": "lazier_stream_updates",
"memory_pressure_controller": "memory_pressure_controller",
"monitoring_experiment": "monitoring_experiment",
"multiping": "multiping",
@ -40,10 +35,9 @@ EXPERIMENT_ENABLES = {
"peer_state_based_framing": "peer_state_based_framing",
"pending_queue_cap": "pending_queue_cap",
"pick_first_happy_eyeballs": "pick_first_happy_eyeballs",
"ping_on_rst_stream": "ping_on_rst_stream",
"promise_based_client_call": "promise_based_client_call",
"promise_based_inproc_transport": "promise_based_inproc_transport",
"promise_based_server_call": "lazier_stream_updates,promise_based_server_call",
"promise_based_server_call": "promise_based_server_call",
"red_max_concurrent_streams": "red_max_concurrent_streams",
"registered_method_lookup_in_transport": "registered_method_lookup_in_transport",
"registered_methods_map": "registered_methods_map",
@ -51,15 +45,11 @@ EXPERIMENT_ENABLES = {
"round_robin_delegate_to_pick_first": "round_robin_delegate_to_pick_first",
"rstpit": "rstpit",
"schedule_cancellation_over_write": "schedule_cancellation_over_write",
"separate_ping_from_keepalive": "separate_ping_from_keepalive",
"server_privacy": "server_privacy",
"settings_timeout": "settings_timeout",
"tarpit": "tarpit",
"tcp_frame_size_tuning": "tcp_frame_size_tuning",
"tcp_rcv_lowat": "tcp_rcv_lowat",
"trace_record_callops": "trace_record_callops",
"unconstrained_max_quota_buffer_size": "unconstrained_max_quota_buffer_size",
"uniquely_unowned": "uniquely_unowned",
"work_serializer_clears_time_cache": "work_serializer_clears_time_cache",
"work_serializer_dispatch": "work_serializer_dispatch",
"write_size_policy": "write_size_policy",
@ -116,17 +106,9 @@ EXPERIMENTS = {
],
},
"on": {
"bad_client_test": [
"block_excessive_requests_before_settings_ack",
"tarpit",
],
"core_end2end_test": [
"event_engine_listener",
],
"cpp_end2end_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
],
"cpp_lb_end2end_test": [
"pick_first_happy_eyeballs",
"round_robin_delegate_to_pick_first",
@ -136,9 +118,6 @@ EXPERIMENTS = {
"event_engine_listener",
],
"flow_control_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
"lazier_stream_updates",
"overload_protection",
"write_size_cap",
"write_size_policy",
@ -206,23 +185,12 @@ EXPERIMENTS = {
],
},
"on": {
"bad_client_test": [
"block_excessive_requests_before_settings_ack",
"tarpit",
],
"cpp_end2end_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
],
"cpp_lb_end2end_test": [
"pick_first_happy_eyeballs",
"round_robin_delegate_to_pick_first",
"wrr_delegate_to_pick_first",
],
"flow_control_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
"lazier_stream_updates",
"overload_protection",
"write_size_cap",
"write_size_policy",
@ -300,17 +268,9 @@ EXPERIMENTS = {
],
},
"on": {
"bad_client_test": [
"block_excessive_requests_before_settings_ack",
"tarpit",
],
"core_end2end_test": [
"event_engine_listener",
],
"cpp_end2end_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
],
"cpp_lb_end2end_test": [
"pick_first_happy_eyeballs",
"round_robin_delegate_to_pick_first",
@ -320,9 +280,6 @@ EXPERIMENTS = {
"event_engine_listener",
],
"flow_control_test": [
"chttp2_batch_requests",
"chttp2_offload_on_rst_stream",
"lazier_stream_updates",
"overload_protection",
"write_size_cap",
"write_size_policy",

@ -15,7 +15,7 @@
licenses(["notice"])
package(
default_visibility = ["//visibility:public"]
default_visibility = ["//visibility:public"],
)
# This is needed for the dependency on google_cloud_cpp to work.

@ -31,9 +31,9 @@ load("//bazel:cc_grpc_library.bzl", "cc_grpc_library")
load("//bazel:copts.bzl", "GRPC_DEFAULT_COPTS")
load("//bazel:experiments.bzl", "EXPERIMENTS", "EXPERIMENT_ENABLES")
load("//bazel:test_experiments.bzl", "TEST_EXPERIMENTS", "TEST_EXPERIMENT_ENABLES")
load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library", "upb_proto_reflection_library")
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test")
load("@build_bazel_rules_apple//apple/testing/default_runner:ios_test_runner.bzl", "ios_test_runner")
load("@com_google_protobuf//bazel:upb_proto_library.bzl", "upb_proto_library", "upb_proto_reflection_library")
# The set of pollers to test against if a test exercises polling
POLLERS = ["epoll1", "poll"]
@ -204,8 +204,8 @@ def grpc_cc_library(
includes = [
"api/include",
"include",
"src/core/ext/upb-generated", # Once upb code-gen issue is resolved, remove this.
"src/core/ext/upbdefs-generated", # Once upb code-gen issue is resolved, remove this.
"src/core/ext/upb-gen", # Once upb code-gen issue is resolved, remove this.
"src/core/ext/upbdefs-gen", # Once upb code-gen issue is resolved, remove this.
],
alwayslink = alwayslink,
data = data,

@ -22,42 +22,57 @@ def grpc_deps():
native.bind(
name = "upb_lib",
actual = "@upb//:upb",
actual = "@com_google_protobuf//upb",
)
native.bind(
name = "upb_amalgamation_lib",
actual = "@com_google_protobuf//upb:amalgamation",
)
native.bind(
name = "upb_base_lib",
actual = "@com_google_protobuf//upb/base",
)
native.bind(
name = "upb_collections_lib",
actual = "@upb//:collections",
actual = "@com_google_protobuf//upb/collections",
)
native.bind(
name = "upb_mem_lib",
actual = "@com_google_protobuf//upb/mem",
)
native.bind(
name = "upb_reflection",
actual = "@upb//:reflection",
actual = "@com_google_protobuf//upb:reflection",
)
native.bind(
name = "upb_lib_descriptor",
actual = "@upb//:descriptor_upb_proto",
actual = "@com_google_protobuf//upb:descriptor_upb_proto",
)
native.bind(
name = "upb_lib_descriptor_reflection",
actual = "@upb//:descriptor_upb_proto_reflection",
actual = "@com_google_protobuf//upb:descriptor_upb_proto_reflection",
)
native.bind(
name = "upb_textformat_lib",
actual = "@upb//:textformat",
actual = "@com_google_protobuf//upb/text",
)
native.bind(
name = "upb_json_lib",
actual = "@upb//:json",
actual = "@com_google_protobuf//upb/json",
)
native.bind(
name = "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
actual = "@upb//:generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
actual = "@com_google_protobuf//upb:generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
)
native.bind(
@ -243,12 +258,12 @@ def grpc_deps():
if "com_google_protobuf" not in native.existing_rules():
http_archive(
name = "com_google_protobuf",
sha256 = "660ce016f987550bc1ccec4a6ee4199afb871799b696227098e3641476a7d566",
strip_prefix = "protobuf-b2b7a51158418f41cff0520894836c15b1738721",
sha256 = "7ed5fc41fe1614e551025f8e14b79b026a015b3ed337d38920c586f3ea35d818",
strip_prefix = "protobuf-6b5d8db01fe47478e8d400f550e797e6230d464e",
urls = [
# https://github.com/protocolbuffers/protobuf/commits/v24.3
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/protobuf/archive/b2b7a51158418f41cff0520894836c15b1738721.tar.gz",
"https://github.com/protocolbuffers/protobuf/archive/b2b7a51158418f41cff0520894836c15b1738721.tar.gz",
# https://github.com/protocolbuffers/protobuf/commits/v25.0
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/protobuf/archive/6b5d8db01fe47478e8d400f550e797e6230d464e.tar.gz",
"https://github.com/protocolbuffers/protobuf/archive/6b5d8db01fe47478e8d400f550e797e6230d464e.tar.gz",
],
patches = [
"@com_github_grpc_grpc//third_party:protobuf.patch",
@ -380,18 +395,6 @@ def grpc_deps():
],
)
if "upb" not in native.existing_rules():
http_archive(
name = "upb",
sha256 = "5147e0ab6a28421d1e49004f4a205d84f06b924585e15eaa884cfe13289165b7",
strip_prefix = "upb-42cd08932e364a4cde35033b73f15c30250d7c2e",
urls = [
# https://github.com/protocolbuffers/upb/commits/24.x
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/upb/archive/42cd08932e364a4cde35033b73f15c30250d7c2e.tar.gz",
"https://github.com/protocolbuffers/upb/archive/42cd08932e364a4cde35033b73f15c30250d7c2e.tar.gz",
],
)
if "envoy_api" not in native.existing_rules():
http_archive(
name = "envoy_api",
@ -509,11 +512,11 @@ def grpc_deps():
if "io_opentelemetry_cpp" not in native.existing_rules():
http_archive(
name = "io_opentelemetry_cpp",
sha256 = "f30cd88bf898a5726d245eba882b8e81012021eb00df34109f4dfb203f005cea",
strip_prefix = "opentelemetry-cpp-1.11.0",
sha256 = "149f076cc7a79bbd3a3c34fb3ab61d3a3e8dcfe2b9596f79153e17123c32f897",
strip_prefix = "opentelemetry-cpp-064fef0d871c57ffac6739d3311659a5770a9db4",
urls = [
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/refs/tags/v1.11.0.tar.gz",
"https://github.com/open-telemetry/opentelemetry-cpp/archive/refs/tags/v1.11.0.tar.gz",
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/064fef0d871c57ffac6739d3311659a5770a9db4.tar.gz",
"https://github.com/open-telemetry/opentelemetry-cpp/archive/064fef0d871c57ffac6739d3311659a5770a9db4.tar.gz",
],
)

@ -22,7 +22,6 @@ load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
load("@envoy_api//bazel:repositories.bzl", "api_dependencies")
load("@google_cloud_cpp//bazel:google_cloud_cpp_deps.bzl", "google_cloud_cpp_deps")
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@upb//bazel:workspace_deps.bzl", "upb_deps")
def grpc_extra_deps(ignore_version_differences = False):
"""Loads the extra dependencies.
@ -49,8 +48,6 @@ def grpc_extra_deps(ignore_version_differences = False):
"""
protobuf_deps()
upb_deps()
api_dependencies()
go_rules_dependencies()

File diff suppressed because it is too large Load Diff

@ -13,5 +13,5 @@
# limitations under the License.
module GrpcBuildConfig
CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-36.dll'
CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-37.dll'
end

@ -12,11 +12,11 @@ settings:
'#08': Use "-preN" suffixes to identify pre-release versions
'#09': Per-language overrides are possible with (eg) ruby_version tag here
'#10': See the expand_version.py for all the quirks here
core_version: 36.0.0
core_version: 37.0.0
csharp_major_version: 2
g_stands_for: gjallarhorn
protobuf_version: 3.24.3
version: 1.60.0-dev
g_stands_for: grand
protobuf_version: 3.25.0
version: 1.61.0-dev
configs:
asan:
CC: clang
@ -149,8 +149,8 @@ defaults:
CFLAGS: -g
COREFLAGS: -fno-exceptions
CPPFLAGS: -g -Wall -Wextra -DOSATOMIC_USE_INLINED=1 -Ithird_party/abseil-cpp -Ithird_party/re2
-Ithird_party/upb -Isrc/core/ext/upb-generated -Isrc/core/ext/upbdefs-generated
-Ithird_party/utf8_range -Ithird_party/xxhash
-Ithird_party/upb -Isrc/core/ext/upb-gen -Isrc/core/ext/upbdefs-gen -Ithird_party/utf8_range
-Ithird_party/xxhash
LDFLAGS: -g
zlib:
CFLAGS: -fvisibility=hidden

@ -15,6 +15,6 @@
set(UPB_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/upb)
set(_gRPC_UPB_INCLUDE_DIR "${UPB_ROOT_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/third_party/utf8_range")
set(_gRPC_UPB_GRPC_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/core/ext/upb-generated" "${CMAKE_CURRENT_SOURCE_DIR}/src/core/ext/upbdefs-generated")
set(_gRPC_UPB_GRPC_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/core/ext/upb-gen" "${CMAKE_CURRENT_SOURCE_DIR}/src/core/ext/upbdefs-gen")
set(_gRPC_UPB_LIBRARIES upb)

846
config.m4 generated

@ -6,8 +6,8 @@ if test "$PHP_GRPC" != "no"; then
dnl # --with-grpc -> add include path
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/include)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upb-generated)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upbdefs-generated)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upb-gen)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upbdefs-gen)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/php/ext/grpc)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/abseil-cpp)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/address_sorting/include)
@ -156,319 +156,319 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/transport/inproc/inproc_plugin.cc \
src/core/ext/transport/inproc/inproc_transport.cc \
src/core/ext/transport/inproc/legacy_inproc_transport.cc \
src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c \
src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c \
src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \
src/core/ext/upb-generated/envoy/annotations/resource.upb.c \
src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c \
src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c \
src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c \
src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c \
src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c \
src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c \
src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c \
src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c \
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c \
src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c \
src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c \
src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c \
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c \
src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c \
src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.c \
src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c \
src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c \
src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c \
src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c \
src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c \
src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c \
src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c \
src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c \
src/core/ext/upb-generated/envoy/type/v3/http.upb.c \
src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c \
src/core/ext/upb-generated/envoy/type/v3/percent.upb.c \
src/core/ext/upb-generated/envoy/type/v3/range.upb.c \
src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c \
src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c \
src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c \
src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c \
src/core/ext/upb-generated/google/api/annotations.upb.c \
src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c \
src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c \
src/core/ext/upb-generated/google/api/http.upb.c \
src/core/ext/upb-generated/google/api/httpbody.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/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c \
src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \
src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \
src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \
src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \
src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \
src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \
src/core/ext/upb-generated/udpa/annotations/security.upb.c \
src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \
src/core/ext/upb-generated/udpa/annotations/status.upb.c \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c \
src/core/ext/upb-generated/validate/validate.upb.c \
src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c \
src/core/ext/upb-generated/xds/annotations/v3/security.upb.c \
src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c \
src/core/ext/upb-generated/xds/annotations/v3/status.upb.c \
src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c \
src/core/ext/upb-generated/xds/core/v3/authority.upb.c \
src/core/ext/upb-generated/xds/core/v3/cidr.upb.c \
src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c \
src/core/ext/upb-generated/xds/core/v3/context_params.upb.c \
src/core/ext/upb-generated/xds/core/v3/extension.upb.c \
src/core/ext/upb-generated/xds/core/v3/resource.upb.c \
src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c \
src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c \
src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c \
src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c \
src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c \
src/core/ext/upb-generated/xds/type/v3/cel.upb.c \
src/core/ext/upb-generated/xds/type/v3/range.upb.c \
src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \
src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \
src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c \
src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c \
src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c \
src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c \
src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c \
src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c \
src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c \
src/core/ext/upb-gen/envoy/admin/v3/certs.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/clusters.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/config_dump.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/config_dump_shared.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/init_dump.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/listeners.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/memory.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/metrics.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/mutex_stats.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/server_info.upb_minitable.c \
src/core/ext/upb-gen/envoy/admin/v3/tap.upb_minitable.c \
src/core/ext/upb-gen/envoy/annotations/deprecation.upb_minitable.c \
src/core/ext/upb-gen/envoy/annotations/resource.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/cluster/v3/circuit_breaker.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/cluster/v3/filter.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/cluster/v3/outlier_detection.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/backoff.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/config_source.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/event_service_config.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/extension.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/grpc_method_list.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/health_check.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/http_uri.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/resolver.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/core/v3/udp_socket_config.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/listener/v3/api_listener.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/listener/v3/udp_listener_config.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/route/v3/scoped_route.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/dynamic_ot.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/http_tracer.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/lightstep.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/service.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/skywalking.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/xray.upb_minitable.c \
src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c \
src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/common/fault/v3/fault.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/http/fault/v3/fault.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3/router.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/cert.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb_minitable.c \
src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb_minitable.c \
src/core/ext/upb-gen/envoy/service/discovery/v3/ads.upb_minitable.c \
src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.c \
src/core/ext/upb-gen/envoy/service/load_stats/v3/lrs.upb_minitable.c \
src/core/ext/upb-gen/envoy/service/status/v3/csds.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/http/v3/path_transformation.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/filter_state.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/http_inputs.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/metadata.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/node.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/number.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/path.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/regex.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/status_code_input.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/string.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/struct.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/metadata/v3/metadata.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/hash_policy.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/http.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/http_status.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/percent.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/range.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/ratelimit_strategy.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/ratelimit_unit.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/semantic_version.upb_minitable.c \
src/core/ext/upb-gen/envoy/type/v3/token_bucket.upb_minitable.c \
src/core/ext/upb-gen/google/api/annotations.upb_minitable.c \
src/core/ext/upb-gen/google/api/expr/v1alpha1/checked.upb_minitable.c \
src/core/ext/upb-gen/google/api/expr/v1alpha1/syntax.upb_minitable.c \
src/core/ext/upb-gen/google/api/http.upb_minitable.c \
src/core/ext/upb-gen/google/api/httpbody.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/duration.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/empty.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/struct.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/timestamp.upb_minitable.c \
src/core/ext/upb-gen/google/protobuf/wrappers.upb_minitable.c \
src/core/ext/upb-gen/google/rpc/status.upb_minitable.c \
src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/lb/v1/load_balancer.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls.upb_minitable.c \
src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls_config.upb_minitable.c \
src/core/ext/upb-gen/udpa/annotations/migrate.upb_minitable.c \
src/core/ext/upb-gen/udpa/annotations/security.upb_minitable.c \
src/core/ext/upb-gen/udpa/annotations/sensitive.upb_minitable.c \
src/core/ext/upb-gen/udpa/annotations/status.upb_minitable.c \
src/core/ext/upb-gen/udpa/annotations/versioning.upb_minitable.c \
src/core/ext/upb-gen/validate/validate.upb_minitable.c \
src/core/ext/upb-gen/xds/annotations/v3/migrate.upb_minitable.c \
src/core/ext/upb-gen/xds/annotations/v3/security.upb_minitable.c \
src/core/ext/upb-gen/xds/annotations/v3/sensitive.upb_minitable.c \
src/core/ext/upb-gen/xds/annotations/v3/status.upb_minitable.c \
src/core/ext/upb-gen/xds/annotations/v3/versioning.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/authority.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/cidr.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/collection_entry.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/context_params.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/extension.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/resource.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/resource_locator.upb_minitable.c \
src/core/ext/upb-gen/xds/core/v3/resource_name.upb_minitable.c \
src/core/ext/upb-gen/xds/data/orca/v3/orca_load_report.upb_minitable.c \
src/core/ext/upb-gen/xds/service/orca/v3/orca.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/domain.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/ip.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/range.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/regex.upb_minitable.c \
src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c \
src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c \
src/core/ext/upb-gen/xds/type/v3/range.upb_minitable.c \
src/core/ext/upb-gen/xds/type/v3/typed_struct.upb_minitable.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/certs.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/clusters.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump_shared.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/init_dump.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/listeners.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/memory.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/metrics.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/mutex_stats.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/server_info.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/admin/v3/tap.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/cluster/v3/circuit_breaker.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/cluster/v3/filter.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/cluster/v3/outlier_detection.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/backoff.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/config_source.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/event_service_config.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/extension.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_method_list.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/health_check.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/http_uri.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/resolver.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/core/v3/udp_socket_config.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/listener/v3/api_listener.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/route/v3/scoped_route.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/dynamic_ot.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/http_tracer.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/lightstep.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/service.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/skywalking.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/trace.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/xray.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/data/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/service/discovery/v3/ads.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/service/load_stats/v3/lrs.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/http/v3/path_transformation.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/filter_state.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/http_inputs.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/node.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/number.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/path.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/regex.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/status_code_input.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/string.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/struct.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/matcher/v3/value.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/metadata/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/hash_policy.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/http.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/http_status.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/percent.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/range.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_strategy.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_unit.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/semantic_version.upbdefs.c \
src/core/ext/upbdefs-gen/envoy/type/v3/token_bucket.upbdefs.c \
src/core/ext/upbdefs-gen/google/api/annotations.upbdefs.c \
src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/checked.upbdefs.c \
src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/syntax.upbdefs.c \
src/core/ext/upbdefs-gen/google/api/http.upbdefs.c \
src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/any.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/descriptor.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/duration.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/empty.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/struct.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/timestamp.upbdefs.c \
src/core/ext/upbdefs-gen/google/protobuf/wrappers.upbdefs.c \
src/core/ext/upbdefs-gen/google/rpc/status.upbdefs.c \
src/core/ext/upbdefs-gen/opencensus/proto/trace/v1/trace_config.upbdefs.c \
src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \
src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c \
src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c \
src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c \
src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c \
src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c \
src/core/ext/upbdefs-gen/validate/validate.upbdefs.c \
src/core/ext/upbdefs-gen/xds/annotations/v3/migrate.upbdefs.c \
src/core/ext/upbdefs-gen/xds/annotations/v3/security.upbdefs.c \
src/core/ext/upbdefs-gen/xds/annotations/v3/sensitive.upbdefs.c \
src/core/ext/upbdefs-gen/xds/annotations/v3/status.upbdefs.c \
src/core/ext/upbdefs-gen/xds/annotations/v3/versioning.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/authority.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/cidr.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/collection_entry.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/context_params.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/extension.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/resource.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/resource_locator.upbdefs.c \
src/core/ext/upbdefs-gen/xds/core/v3/resource_name.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/domain.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/ip.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/range.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/regex.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/v3/range.upbdefs.c \
src/core/ext/upbdefs-gen/xds/type/v3/typed_struct.upbdefs.c \
src/core/ext/xds/certificate_provider_store.cc \
src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
src/core/ext/xds/xds_api.cc \
@ -534,12 +534,12 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/event_engine/default_event_engine_factory.cc \
src/core/lib/event_engine/event_engine.cc \
src/core/lib/event_engine/forkable.cc \
src/core/lib/event_engine/memory_allocator.cc \
src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \
src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \
src/core/lib/event_engine/posix_engine/internal_errqueue.cc \
src/core/lib/event_engine/posix_engine/lockfree_event.cc \
src/core/lib/event_engine/posix_engine/native_dns_resolver.cc \
src/core/lib/event_engine/posix_engine/posix_endpoint.cc \
src/core/lib/event_engine/posix_engine/posix_engine.cc \
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc \
@ -565,6 +565,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/event_engine/time_util.cc \
src/core/lib/event_engine/trace.cc \
src/core/lib/event_engine/utils.cc \
src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc \
src/core/lib/event_engine/windows/iocp.cc \
src/core/lib/event_engine/windows/win_socket.cc \
src/core/lib/event_engine/windows/windows_endpoint.cc \
@ -1294,9 +1295,6 @@ if test "$PHP_GRPC" != "no"; then
third_party/re2/util/rune.cc \
third_party/re2/util/strutil.cc \
third_party/upb/upb/base/status.c \
third_party/upb/upb/collections/array.c \
third_party/upb/upb/collections/map.c \
third_party/upb/upb/collections/map_sorter.c \
third_party/upb/upb/hash/common.c \
third_party/upb/upb/json/decode.c \
third_party/upb/upb/json/encode.c \
@ -1307,6 +1305,9 @@ if test "$PHP_GRPC" != "no"; then
third_party/upb/upb/mem/alloc.c \
third_party/upb/upb/mem/arena.c \
third_party/upb/upb/message/accessors.c \
third_party/upb/upb/message/array.c \
third_party/upb/upb/message/map.c \
third_party/upb/upb/message/map_sorter.c \
third_party/upb/upb/message/message.c \
third_party/upb/upb/mini_descriptor/build_enum.c \
third_party/upb/upb/mini_descriptor/decode.c \
@ -1316,7 +1317,6 @@ if test "$PHP_GRPC" != "no"; then
third_party/upb/upb/mini_table/extension_registry.c \
third_party/upb/upb/mini_table/internal/message.c \
third_party/upb/upb/mini_table/message.c \
third_party/upb/upb/reflection/def_builder.c \
third_party/upb/upb/reflection/def_pool.c \
third_party/upb/upb/reflection/def_type.c \
third_party/upb/upb/reflection/desc_state.c \
@ -1326,6 +1326,8 @@ if test "$PHP_GRPC" != "no"; then
third_party/upb/upb/reflection/extension_range.c \
third_party/upb/upb/reflection/field_def.c \
third_party/upb/upb/reflection/file_def.c \
third_party/upb/upb/reflection/internal/def_builder.c \
third_party/upb/upb/reflection/internal/strdup2.c \
third_party/upb/upb/reflection/message.c \
third_party/upb/upb/reflection/message_def.c \
third_party/upb/upb/reflection/message_reserved_range.c \
@ -1346,7 +1348,7 @@ if test "$PHP_GRPC" != "no"; then
-D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \
-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1 \
-DGRPC_XDS_USER_AGENT_NAME_SUFFIX='"\"PHP\""' \
-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.60.0dev\""')
-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.61.0dev\""')
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/backend_metrics)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census)
@ -1389,106 +1391,106 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/transport)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/inproc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/admin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/bootstrap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/common/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/endpoint/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/listener/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/metrics/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/overload/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/tap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/trace/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/data/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/status/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/tracing/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api/expr/v1alpha1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/protobuf)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/rpc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/opencensus/proto/trace/v1)
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/lb/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lookup/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/annotations/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/data/orca/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/service/orca/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/admin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/listener/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/metrics/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/overload/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/tap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/trace/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/status/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/tracing/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/api)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/protobuf)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/rpc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/validate)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/annotations/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/admin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/bootstrap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/common/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/endpoint/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/listener/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/metrics/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/overload/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/tap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/config/trace/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/data/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/common/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/pick_first/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/ring_hash/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/wrr_locality/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/service/status/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/type/tracing/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/envoy/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/google/api)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/google/api/expr/v1alpha1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/google/protobuf)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/google/rpc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/opencensus/proto/trace/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/src/proto/grpc/gcp)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/src/proto/grpc/health/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/src/proto/grpc/lb/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/src/proto/grpc/lookup/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/udpa/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/validate)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/annotations/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/data/orca/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/service/orca/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-gen/xds/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/admin/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/listener/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/metrics/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/overload/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/tap/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/config/trace/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/data/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/common/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/router/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/service/status/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/type/tracing/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/envoy/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/google/api)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/google/api/expr/v1alpha1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/google/protobuf)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/google/rpc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/opencensus/proto/trace/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/udpa/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/validate)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/xds/annotations/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/xds/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-gen/xds/type/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/xds)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/address_utils)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff)
@ -1636,7 +1638,6 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/third_party/re2/re2)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/re2/util)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/base)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/collections)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/hash)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/json)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/lex)
@ -1647,6 +1648,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/mini_table)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/mini_table/internal)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/reflection)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/reflection/internal)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/text)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb/wire)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/utf8_range)

1116
config.w32 generated

File diff suppressed because it is too large Load Diff

@ -59,4 +59,5 @@
- 1.57 'g' stands for ['grounded'](https://github.com/grpc/grpc/tree/v1.57.x)
- 1.58 'g' stands for ['goku'](https://github.com/grpc/grpc/tree/v1.58.x)
- 1.59 'g' stands for ['generative'](https://github.com/grpc/grpc/tree/v1.59.x)
- 1.60 'g' stands for ['gjallarhorn'](https://github.com/grpc/grpc/tree/master)
- 1.60 'g' stands for ['gjallarhorn'](https://github.com/grpc/grpc/tree/v1.60.x)
- 1.61 'g' stands for ['grand'](https://github.com/grpc/grpc/tree/master)

@ -62,12 +62,12 @@ DNS](https://github.com/grpc/proposal/blob/master/A2-service-configs-in-dns.md).
Here is an example service config in protobuf form:
```
```textproto
{
// Use round_robin LB policy.
# Use round_robin LB policy.
load_balancing_config: { round_robin: {} }
// This method config applies to method "foo/bar" and to all methods
// of service "baz".
# This method config applies to method "foo/bar" and to all methods
# of service "baz".
method_config: {
name: {
service: "foo"
@ -76,7 +76,7 @@ Here is an example service config in protobuf form:
name: {
service: "baz"
}
// Default timeout for matching methods.
# Default timeout for matching methods.
timeout: {
seconds: 1
nanos: 1
@ -87,7 +87,7 @@ Here is an example service config in protobuf form:
Here is the same example service config in JSON form:
```
```json
{
"loadBalancingConfig": [ { "round_robin": {} } ],
"methodConfig": [

@ -51,6 +51,7 @@ if(GRPC_AS_SUBMODULE)
# this build.
set(_PROTOBUF_LIBPROTOBUF libprotobuf)
set(_REFLECTION grpc++_reflection)
set(_ORCA_SERVICE grpcpp_orca_service)
if(CMAKE_CROSSCOMPILING)
find_program(_PROTOBUF_PROTOC protoc)
else()

@ -0,0 +1,42 @@
# Copyright 2023 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.
licenses(["notice"])
cc_binary(
name = "crashing_greeter_client",
srcs = ["crashing_greeter_client.cc"],
defines = ["BAZEL_BUILD"],
deps = [
"//:grpc++",
"//examples/protos:helloworld_cc_grpc",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
],
)
cc_binary(
name = "greeter_callback_server_admin",
srcs = ["greeter_callback_server_admin.cc"],
defines = ["BAZEL_BUILD"],
deps = [
"//:grpc++",
"//:grpc++_reflection",
"//:grpcpp_admin",
"//examples/protos:helloworld_cc_grpc",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
"@com_google_absl//absl/strings:str_format",
],
)

@ -0,0 +1,132 @@
# gRPC C++ Debugging Example
This example demonstrates a handful of ways you can debug your gRPC C++ applications.
## Enabling Trace Logs
gRPC allows you to configure more detailed log output for various aspects of gRPC behavior. The tracing log generation might have a large overhead and result in significantly larger log file sizes, especially when you try to trace transport or timer_check. But it is a powerful tool in your debugging toolkit.
### The Most Verbose Logging
Specify environment variables, then run your application:
```
GRPC_VERBOSITY=debug
GRPC_TRACE=all
```
For more granularity, please see
[environment_variables](https://github.com/grpc/grpc/blob/master/doc/environment_variables.md).
### Debug Transport Protocol
```
GRPC_VERBOSITY=debug
GRPC_TRACE=tcp,http,secure_endpoint,transport_security
```
### Debug Connection Behavior
```
GRPC_VERBOSITY=debug
GRPC_TRACE=call_error,connectivity_state,pick_first,round_robin,glb
```
## GDB and other debuggers
`gdb` (and the like) are tools that lets you inspect your application while it is running, view stack traces on exceptions, pause and step through code at specified points or under certain conditions, etc. See https://www.sourceware.org/gdb/
### Inspecting errors
```
bazel build --config=dbg examples/cpp/debugging:crashing_greeter_client
gdb -ex run \
--args ./bazel-bin/examples/cpp/debugging/crashing_greeter_client \
--crash_on_errors=true \
--target=localhork:50051
```
Once the exception is thrown, you can use `bt` to see the stack trace and examine the crash, `info threads` to get the set of threads, etc. See the [GDB documentation](https://sourceware.org/gdb/current/onlinedocs/gdb.html/) for a more complete list of available features and commands.
### Breaking inside a function
After building the application above, this will break inside gRPC generated stub code:
```
gdb -ex 'b helloworld::Greeter::Stub::SayHello' \
-ex run \
--args ./bazel-bin/examples/cpp/debugging/crashing_greeter_client \
--crash_on_errors=true \
--target=localhork:50051
```
## gRPC Admin Interface: Live Channel Tracing
The [gRPC Admin Service](https://github.com/grpc/proposal/blob/master/A38-admin-interface-api.md)
provides a convenient API in each gRPC language to improve the usability of
creating a gRPC server with admin services to expose states in the gRPC library.
This includes channelz, which is a channel tracing feature; it tracks statistics
like how many messages have been sent, how many of them failed, what are the
connected sockets. See the [Channelz design doc](https://github.com/grpc/proposal/blob/master/A14-channelz.md).
### Integrating the gRPC Admin Service Into Your Server
As seen in the `greeter_callback_admin_server` target, you canenable admin services by using the `AddAdminServices` method.
```
grpc::ServerBuilder builder;
grpc::AddAdminServices(&builder);
builder.AddListeningPort(":50051", grpc::ServerCredentials(...));
std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
```
### Using grpcdebug
grpcdebug is a tool created to access the metrics from channelz and health services.
#### Installing the grpcdebug tool
The source code is located in a github project
[grpc-ecosystem/grpcdebug](https://github.com/grpc-ecosystem/grpcdebug). You
can either download [the latest built version]
(https://github.com/grpc-ecosystem/grpcdebug/releases/latest) (recommended) or
follow the README.md to build it yourself.
#### Running the grpcdebug tool
##### Usage
`grpcdebug <target address> [flags] channelz <command> [argument]`
| Command | Argument | Description |
| :--------- | :------------------: | :------------------------------------------------ |
| channel | \<channel id or URL> | Display channel states in a human readable way. |
| channels | | Lists client channels for the target application. |
| server | \<server ID> | Displays server state in a human readable way. |
| servers | | Lists servers in a human readable way. |
| socket | \<socket ID> | Displays socket states in a human readable way. |
| subchannel | \<id> | Display subchannel states in human readable way. |
Generally, you will start with either `servers` or `channels` and then work down
to the details
##### Getting overall server info
To begin with, build and run the server binary in the background
```
bazel build --config=dbg examples/cpp/debugging:all
./bazel-bin/examples/cpp/debugging/greeter_callback_server_admin&
```
You can then inspect the server
```bash
grpcdebug localhost:50051 channelz servers
```
This will show you the server ids with their activity
```text
Server ID Listen Addresses Calls(Started/Succeeded/Failed) Last Call Started
1 [[::]:50051] 38/34/3 now
```
For more information about `grpcdebug` features, please see [the grpcdebug documentation](https://github.com/grpc-ecosystem/grpcdebug)

@ -0,0 +1,92 @@
// Copyright 2023 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.
#include <iostream>
#include <memory>
#include <string>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include <grpcpp/grpcpp.h>
#ifdef BAZEL_BUILD
#include "examples/protos/helloworld.grpc.pb.h"
#else
#include "helloworld.grpc.pb.h"
#endif
ABSL_FLAG(bool, crash_on_errors, false,
"Crash the application on client errors");
ABSL_FLAG(std::string, target, "localhost:50051", "Server address");
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;
class GreeterClient {
public:
GreeterClient(std::shared_ptr<Channel> channel)
: stub_(Greeter::NewStub(channel)) {}
// Assembles the client's payload, sends it and presents the response back
// from the server.
std::string SayHello(const std::string& user) {
// Data we are sending to the server.
HelloRequest request;
request.set_name(user);
// Container for the data we expect from the server.
HelloReply reply;
// Context for the client. It could be used to convey extra information to
// the server and/or tweak certain RPC behaviors.
ClientContext context;
// The actual RPC.
Status status = stub_->SayHello(&context, request, &reply);
// Act upon the status of the actual RPC.
if (absl::GetFlag(FLAGS_crash_on_errors)) {
assert(status.ok());
}
if (status.ok()) {
return reply.message();
} else {
return "RPC failed";
}
}
private:
std::unique_ptr<Greeter::Stub> stub_;
};
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
// Instantiate the client. It requires a channel, out of which the actual RPCs
// are created. This channel models a connection to an endpoint specified by
// the argument "--target=" which is the only expected argument.
// We indicate that the channel isn't authenticated (use of
// InsecureChannelCredentials()).
GreeterClient greeter(grpc::CreateChannel(
absl::GetFlag(FLAGS_target), grpc::InsecureChannelCredentials()));
std::string user("world");
std::string reply = greeter.SayHello(user);
std::cout << "Greeter received: " << reply << std::endl;
return 0;
}

@ -0,0 +1,86 @@
// Copyright 2023 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.
#include <iostream>
#include <memory>
#include <string>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/strings/str_format.h"
#include <grpcpp/ext/admin_services.h>
#include <grpcpp/ext/proto_server_reflection_plugin.h>
#include <grpcpp/grpcpp.h>
#include <grpcpp/health_check_service_interface.h>
#ifdef BAZEL_BUILD
#include "examples/protos/helloworld.grpc.pb.h"
#else
#include "helloworld.grpc.pb.h"
#endif
ABSL_FLAG(uint16_t, port, 50051, "Server port for the service");
using grpc::CallbackServerContext;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerUnaryReactor;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;
// Logic and data behind the server's behavior.
class GreeterServiceImpl final : public Greeter::CallbackService {
ServerUnaryReactor* SayHello(CallbackServerContext* context,
const HelloRequest* request,
HelloReply* reply) override {
std::string prefix("Hello ");
reply->set_message(prefix + request->name());
ServerUnaryReactor* reactor = context->DefaultReactor();
reactor->Finish(Status::OK);
return reactor;
}
};
void RunServer(uint16_t port) {
std::string server_address = absl::StrFormat("0.0.0.0:%d", port);
GreeterServiceImpl service;
grpc::EnableDefaultHealthCheckService(true);
grpc::reflection::InitProtoReflectionServerBuilderPlugin();
ServerBuilder builder;
// Enable gRPC Admin Services
grpc::AddAdminServices(&builder);
// Listen on the given address without any authentication mechanism.
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// Register "service" as the instance through which we'll communicate with
// clients. In this case it corresponds to an *synchronous* service.
builder.RegisterService(&service);
// Finally assemble the server.
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
// Wait for the server to shutdown. Note that some other thread must be
// responsible for shutting down the server for this call to ever return.
server->Wait();
}
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
RunServer(absl::GetFlag(FLAGS_port));
return 0;
}

@ -1,4 +1,4 @@
# Copyright 2017 gRPC authors.
# Copyright 2023 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.
@ -12,19 +12,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# Config file for the internal CI (in protobuf text format)
licenses(["notice"])
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_run_tests_matrix.sh"
timeout_mins: 60
action {
define_artifacts {
regex: "**/*sponge_log.*"
regex: "github/grpc/reports/**"
}
}
env_vars {
key: "RUN_TESTS_FLAGS"
value: "-f basictests linux iwyu --inner_jobs 16 -j 1 --internal_ci"
}
cc_binary(
name = "orca_server",
srcs = ["orca_server.cc"],
defines = ["BAZEL_BUILD"],
deps = [
"//:grpc++",
"//:grpcpp_orca_service",
"//examples/protos:helloworld_cc_grpc",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
"@com_google_absl//absl/strings:str_format",
],
)

@ -0,0 +1,46 @@
# gRPC Custom Metrics Example
You can find a complete set of instructions for building gRPC and running the
examples in the [C++ Quick Start][].
This example shows how to implement a server that provides custom metrics usable
by custom load balancing policies.
Server needs to be setup with metrics recorder and Orca service for sending
these metrics to a client:
```c++
GreeterServiceImpl service;
// Setup custom metrics recording
auto server_metric_recorder =
grpc::experimental::ServerMetricRecorder::Create();
grpc::experimental::OrcaService orca_service(
server_metric_recorder.get(),
grpc::experimental::OrcaService::Options().set_min_report_duration(
absl::Seconds(0.1)));
builder.RegisterService(&orca_service);
grpc::ServerBuilder::experimental_type(&builder).EnableCallMetricRecording(
nullptr);
```
Afterwards per-request metrics can be reported from the gRPC service
implementation using the metric recorder from the request context:
```c++
auto recorder = context->ExperimentalGetCallMetricRecorder();
if (recorder == nullptr) {
return Status(grpc::StatusCode::INTERNAL,
"Unable to access metrics recorder. Make sure "
"EnableCallMetricRecording had been called.");
}
recorder->RecordCpuUtilizationMetric(0.5);
```
Out of band metrics can be reported using the `server_metric_recorder`
directly:
```c++
server_metric_recorder->SetCpuUtilization(0.75);
```
[C++ Quick Start]: https://grpc.io/docs/languages/cpp/quickstart

@ -0,0 +1,101 @@
/*
*
* Copyright 2023 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 <cstddef>
#include <iostream>
#include <memory>
#include <string>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/strings/str_format.h"
#include "examples/protos/helloworld.grpc.pb.h"
#include <grpcpp/ext/call_metric_recorder.h>
#include <grpcpp/ext/orca_service.h>
#include <grpcpp/grpcpp.h>
#include <grpcpp/health_check_service_interface.h>
#include <grpcpp/support/status.h>
using grpc::CallbackServerContext;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerUnaryReactor;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;
ABSL_FLAG(uint16_t, port, 50051, "Server port for the service");
// Logic and data behind the server's behavior.
class GreeterServiceImpl final : public Greeter::CallbackService {
ServerUnaryReactor* SayHello(CallbackServerContext* context,
const HelloRequest* request,
HelloReply* reply) override {
ServerUnaryReactor* reactor = context->DefaultReactor();
// Obtain the call metric recorder and use it to report the number of
// DB queries (custom cost metric) and CPU utilization.
auto recorder = context->ExperimentalGetCallMetricRecorder();
if (recorder == nullptr) {
reactor->Finish({grpc::StatusCode::INTERNAL,
"Unable to access metrics recorder. Make sure "
"EnableCallMetricRecording had been called."});
return reactor;
}
recorder->RecordRequestCostMetric("db_queries", 10);
recorder->RecordCpuUtilizationMetric(0.5);
std::string prefix("Hello ");
reply->set_message(prefix + request->name());
reactor->Finish(Status::OK);
return reactor;
}
};
void RunServer(uint16_t port) {
std::string server_address = absl::StrFormat("0.0.0.0:%d", port);
ServerBuilder builder;
GreeterServiceImpl service;
// Setup custom metrics recording. Note that this recorder may be use to send
// the out-of-band metrics to the client.
auto server_metric_recorder =
grpc::experimental::ServerMetricRecorder::Create();
grpc::experimental::OrcaService orca_service(
server_metric_recorder.get(),
grpc::experimental::OrcaService::Options().set_min_report_duration(
absl::Seconds(0.1)));
builder.RegisterService(&orca_service);
grpc::ServerBuilder::experimental_type(&builder).EnableCallMetricRecording(
server_metric_recorder.get());
// Resume setting up gRPC server as usual
grpc::EnableDefaultHealthCheckService(true);
// Listen on the given address without any authentication mechanism.
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// Register "service" as the instance through which we'll communicate with
// clients. In this case it corresponds to an *synchronous* service.
builder.RegisterService(&service);
// Finally assemble the server.
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
server->Wait();
}
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
RunServer(absl::GetFlag(FLAGS_port));
return 0;
}

@ -1,5 +1,4 @@
#! /bin/bash
# Copyright 2021 The gRPC Authors
# Copyright 2023 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.
@ -12,12 +11,17 @@
# 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.
#
# Checks if any file contains "DO NOT SUBMIT"
cd "$(dirname "$0")/../../.." || exit 1
git grep -Irn 'DO NOT SUBMIT' -- \
'./*' \
':!*check_do_not_submit.sh' \
':!third_party/'
test $? -eq 1 || exit 1
licenses(["notice"])
cc_binary(
name = "greeter_callback_client",
srcs = ["greeter_callback_client.cc"],
defines = ["BAZEL_BUILD"],
deps = [
"//:grpc++",
"//examples/protos:helloworld_cc_grpc",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
],
)

@ -0,0 +1,70 @@
# Copyright 2018 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.
#
# cmake build file for C++ helloworld example.
# Assumes protobuf and gRPC have been installed using cmake.
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build
# that automatically builds all the dependencies before building helloworld.
cmake_minimum_required(VERSION 3.8)
project(HelloWorld C CXX)
include(../cmake/common.cmake)
# Proto file
get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE)
get_filename_component(hw_proto_path "${hw_proto}" PATH)
# Generated sources
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc")
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h")
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")
add_custom_command(
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
-I "${hw_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${hw_proto}"
DEPENDS "${hw_proto}")
# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
# hw_grpc_proto
add_library(hw_grpc_proto
${hw_grpc_srcs}
${hw_grpc_hdrs}
${hw_proto_srcs}
${hw_proto_hdrs})
target_link_libraries(hw_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
# Targets greeter_[async_](client|server)
foreach(_target
greeter_callback_client greeter_callback_server
add_executable(${_target} "${_target}.cc")
target_link_libraries(${_target}
hw_grpc_proto
absl::flags
absl::flags_parse
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
endforeach()

@ -0,0 +1,32 @@
# gRPC C++ Wait-For-Ready Example
The Wait-For-Ready example builds on the
[Hello World Example](https://github.com/grpc/grpc/tree/master/examples/cpp/helloworld)
and changes the gRPC client and server to show how to set wait-for-ready.
For more information on wait-for-ready in gRPC, please refer to
[gRPC Wait For Ready Semantics](https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md).
## Running the example
First run the client -
```
$ tools/bazel run examples/cpp/wait_for_ready:greeter_callback_client
```
On running this, we'll see 10 RPCs failed due to "Connection refused" errors.
These RPCs did not have WAIT_FOR_READY set, resulting in the RPCs not waiting
for the channel to be connected.
The next 10 RPCs have WAIT_FOR_READY set, so the client will be waiting for the
channel to be ready before progressing.
Now, on a separate terminal, run the server -
```
$ tools/bazel run examples/cpp/helloworld:greeter_callback_server
```
The client channel should now be able to connect to the server, and the RPCs
should succeed.

@ -0,0 +1,107 @@
//
//
// Copyright 2023 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 <condition_variable>
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
#include <thread>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include <grpcpp/grpcpp.h>
#ifdef BAZEL_BUILD
#include "examples/protos/helloworld.grpc.pb.h"
#else
#include "helloworld.grpc.pb.h"
#endif
ABSL_FLAG(std::string, target, "localhost:50051", "Server address");
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloReply;
using helloworld::HelloRequest;
class GreeterClient {
public:
GreeterClient(std::shared_ptr<Channel> channel)
: stub_(Greeter::NewStub(channel)) {}
// Assembles the client's payload, sends it and presents the response back
// from the server.
std::string SayHello(const std::string& user, bool wait_for_ready) {
HelloRequest request;
request.set_name(user);
HelloReply reply;
ClientContext context;
context.set_wait_for_ready(wait_for_ready);
std::mutex mu;
std::condition_variable cv;
bool done = false;
Status status;
stub_->async()->SayHello(&context, &request, &reply,
[&mu, &cv, &done, &status](Status s) {
status = std::move(s);
std::lock_guard<std::mutex> lock(mu);
done = true;
cv.notify_one();
});
std::unique_lock<std::mutex> lock(mu);
while (!done) {
cv.wait(lock);
}
if (status.ok()) {
return reply.message();
} else {
std::cout << status.error_code() << ": " << status.error_message()
<< "\n";
return "RPC failed";
}
}
private:
std::unique_ptr<Greeter::Stub> stub_;
};
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
std::string target_str = absl::GetFlag(FLAGS_target);
GreeterClient greeter(
grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
std::string user("world");
// First send an RPC without wait_for_ready. If the server is not running,
// this RPC will fail immediately.
std::cout << "Greeter received: "
<< greeter.SayHello(user, /*wait_for_ready=*/false) << "\n";
std::cout << "\nWe will now send RPCs with wait_for_ready set. If the "
"server is not running already, please start it now.\n";
// Now send RPC with wait_for_ready for set. Even if the server is not
// running, the RPC will still wait for the deadline to expire before
// failing.
std::cout << "Greeter received: "
<< greeter.SayHello(user, /*wait_for_ready=*/true) << "\n";
return 0;
}

1748
gRPC-C++.podspec generated

File diff suppressed because it is too large Load Diff

2386
gRPC-Core.podspec generated

File diff suppressed because it is too large Load Diff

@ -21,7 +21,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-ProtoRPC'
version = '1.60.0-dev'
version = '1.61.0-dev'
s.version = version
s.summary = 'RPC library for Protocol Buffers, based on gRPC'
s.homepage = 'https://grpc.io'

@ -21,7 +21,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-RxLibrary'
version = '1.60.0-dev'
version = '1.61.0-dev'
s.version = version
s.summary = 'Reactive Extensions library for iOS/OSX.'
s.homepage = 'https://grpc.io'

38
gRPC.podspec generated

@ -20,7 +20,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC'
version = '1.60.0-dev'
version = '1.61.0-dev'
s.version = version
s.summary = 'gRPC client library for iOS/OSX'
s.homepage = 'https://grpc.io'
@ -32,6 +32,8 @@ Pod::Spec.new do |s|
:tag => "v#{version}",
}
s.resource = 'src/objective-c/PrivacyInfo.xcprivacy'
name = 'GRPCClient'
s.module_name = name
s.header_dir = name
@ -68,7 +70,7 @@ Pod::Spec.new do |s|
"src/objective-c/GRPCClient/GRPCCall+Tests.h",
"src/objective-c/GRPCClient/GRPCCallLegacy.h",
"src/objective-c/GRPCClient/GRPCTypes.h",
"src/objective-c/GRPCClient/GRPCTypes.m"
"src/objective-c/GRPCClient/GRPCTypes.mm"
ss.dependency "gRPC-RxLibrary/Interface", version
s.ios.deployment_target = '10.0'
@ -89,19 +91,19 @@ Pod::Spec.new do |s|
'src/objective-c/GRPCClient/version.h'
ss.source_files = 'src/objective-c/GRPCClient/GRPCCall.h',
'src/objective-c/GRPCClient/GRPCCall.m',
'src/objective-c/GRPCClient/GRPCCall.mm',
'src/objective-c/GRPCClient/GRPCCall+Interceptor.h',
'src/objective-c/GRPCClient/GRPCCall+Interceptor.m',
'src/objective-c/GRPCClient/GRPCCall+Interceptor.mm',
'src/objective-c/GRPCClient/GRPCCallOptions.h',
'src/objective-c/GRPCClient/GRPCCallOptions.m',
'src/objective-c/GRPCClient/GRPCCallOptions.mm',
'src/objective-c/GRPCClient/GRPCDispatchable.h',
'src/objective-c/GRPCClient/GRPCInterceptor.h',
'src/objective-c/GRPCClient/GRPCInterceptor.m',
'src/objective-c/GRPCClient/GRPCInterceptor.mm',
'src/objective-c/GRPCClient/GRPCTransport.h',
'src/objective-c/GRPCClient/GRPCTransport.m',
'src/objective-c/GRPCClient/GRPCTransport.mm',
'src/objective-c/GRPCClient/internal/*.h',
'src/objective-c/GRPCClient/private/GRPCTransport+Private.h',
'src/objective-c/GRPCClient/private/GRPCTransport+Private.m',
'src/objective-c/GRPCClient/private/GRPCTransport+Private.mm',
'src/objective-c/GRPCClient/version.h'
ss.dependency "#{s.name}/Interface-Legacy", version
@ -121,18 +123,18 @@ Pod::Spec.new do |s|
'src/objective-c/GRPCClient/GRPCCall+Tests.h',
'src/objective-c/GRPCClient/GRPCCall+ChannelArg.h'
ss.private_header_files = 'src/objective-c/GRPCClient/private/GRPCCore/*.h'
ss.source_files = 'src/objective-c/GRPCClient/private/GRPCCore/*.{h,m}',
ss.source_files = 'src/objective-c/GRPCClient/private/GRPCCore/*.{h,mm}',
'src/objective-c/GRPCClient/GRPCCall+ChannelArg.h',
'src/objective-c/GRPCClient/GRPCCall+ChannelArg.m',
'src/objective-c/GRPCClient/GRPCCall+ChannelArg.mm',
'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h',
'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.m',
'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.mm',
'src/objective-c/GRPCClient/GRPCCall+Cronet.h',
'src/objective-c/GRPCClient/GRPCCall+Cronet.m',
'src/objective-c/GRPCClient/GRPCCall+Cronet.mm',
'src/objective-c/GRPCClient/GRPCCall+OAuth2.h',
'src/objective-c/GRPCClient/GRPCCall+OAuth2.m',
'src/objective-c/GRPCClient/GRPCCall+OAuth2.mm',
'src/objective-c/GRPCClient/GRPCCall+Tests.h',
'src/objective-c/GRPCClient/GRPCCall+Tests.m',
'src/objective-c/GRPCClient/GRPCCallLegacy.m'
'src/objective-c/GRPCClient/GRPCCall+Tests.mm',
'src/objective-c/GRPCClient/GRPCCallLegacy.mm'
# Certificates, to be able to establish TLS connections:
ss.resource_bundles = { 'gRPCCertificates' => ['etc/roots.pem'] }
@ -152,8 +154,8 @@ Pod::Spec.new do |s|
ss.header_mappings_dir = 'src/objective-c/GRPCClient'
ss.source_files = 'src/objective-c/GRPCClient/GRPCCall+Cronet.h',
'src/objective-c/GRPCClient/GRPCCall+Cronet.m',
'src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/*.{h,m}'
'src/objective-c/GRPCClient/GRPCCall+Cronet.mm',
'src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/*.{h,mm}'
ss.dependency "#{s.name}/GRPCCore", version
ss.dependency 'gRPC-Core/Cronet-Implementation', version
ss.dependency 'CronetFramework'
@ -174,7 +176,7 @@ Pod::Spec.new do |s|
s.subspec 'InternalTesting' do |ss|
ss.dependency "#{s.name}/GRPCCore", version
ss.public_header_files = 'src/objective-c/GRPCClient/internal_testing/*.h'
ss.source_files = 'src/objective-c/GRPCClient/internal_testing/*.{h,m}'
ss.source_files = 'src/objective-c/GRPCClient/internal_testing/*.{h,mm}'
ss.header_mappings_dir = 'src/objective-c/GRPCClient'
s.ios.deployment_target = '10.0'

2
grpc.def generated

@ -157,6 +157,8 @@ EXPORTS
grpc_tls_certificate_provider_file_watcher_create
grpc_tls_certificate_provider_release
grpc_tls_credentials_options_create
grpc_tls_credentials_options_set_min_tls_version
grpc_tls_credentials_options_set_max_tls_version
grpc_tls_credentials_options_copy
grpc_tls_credentials_options_destroy
grpc_tls_credentials_options_set_certificate_provider

1511
grpc.gemspec generated

File diff suppressed because it is too large Load Diff

805
grpc.gyp generated

File diff suppressed because it is too large Load Diff

@ -79,7 +79,7 @@ namespace experimental {
///
///
/// Blocking EventEngine Callbacks
/// -----------------------------
/// ------------------------------
///
/// Doing blocking work in EventEngine callbacks is generally not advisable.
/// While gRPC's default EventEngine implementations have some capacity to scale
@ -90,6 +90,15 @@ namespace experimental {
/// *Best Practice* : Occasional blocking work may be fine, but we do not
/// recommend running a mostly blocking workload in EventEngine threads.
///
///
/// Thread-safety guarantees
/// ------------------------
///
/// All EventEngine methods are guaranteed to be thread-safe, no external
/// synchronization is required to call any EventEngine method. Please note that
/// this does not apply to application callbacks, which may be run concurrently;
/// application state synchronization must be managed by the application.
///
////////////////////////////////////////////////////////////////////////////////
class EventEngine : public std::enable_shared_from_this<EventEngine> {
public:
@ -246,6 +255,45 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
/// values are expected to remain valid for the life of the Endpoint.
virtual const ResolvedAddress& GetPeerAddress() const = 0;
virtual const ResolvedAddress& GetLocalAddress() const = 0;
/// A method which allows users to query whether an Endpoint implementation
/// supports a specified extension. The name of the extension is provided
/// as an input.
///
/// An extension could be any type with a unique string id. Each extension
/// may support additional capabilities and if the Endpoint implementation
/// supports the queried extension, it should return a valid pointer to the
/// extension type.
///
/// E.g., use case of an EventEngine::Endpoint supporting a custom
/// extension.
///
/// class CustomEndpointExtension {
/// public:
/// static constexpr std::string name = "my.namespace.extension_name";
/// void Process() { ... }
/// }
///
///
/// class CustomEndpoint :
/// public EventEngine::Endpoint, CustomEndpointExtension {
/// public:
/// void* QueryExtension(absl::string_view id) override {
/// if (id == CustomEndpointExtension::name) {
/// return static_cast<CustomEndpointExtension*>(this);
/// }
/// return nullptr;
/// }
/// ...
/// }
///
/// auto ext_ =
/// static_cast<CustomEndpointExtension*>(
/// endpoint->QueryExtension(CustomrEndpointExtension::name));
/// if (ext_ != nullptr) { ext_->Process(); }
///
///
virtual void* QueryExtension(absl::string_view /*id*/) { return nullptr; }
};
/// Called when a new connection is established.
@ -405,8 +453,8 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
/// Asynchronously executes a task as soon as possible.
///
/// \a Closures scheduled with \a Run cannot be cancelled. The \a closure will
/// not be deleted after it has been run, ownership remains with the caller.
/// \a Closures passed to \a Run cannot be cancelled. The \a closure will not
/// be deleted after it has been run, ownership remains with the caller.
///
/// Implementations must not execute the closure in the calling thread before
/// \a Run returns. For example, if the caller must release a lock before the
@ -415,9 +463,9 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
virtual void Run(Closure* closure) = 0;
/// Asynchronously executes a task as soon as possible.
///
/// \a Closures scheduled with \a Run cannot be cancelled. Unlike the
/// overloaded \a Closure alternative, the absl::AnyInvocable version's \a
/// closure will be deleted by the EventEngine after the closure has been run.
/// \a Closures passed to \a Run cannot be cancelled. Unlike the overloaded \a
/// Closure alternative, the absl::AnyInvocable version's \a closure will be
/// deleted by the EventEngine after the closure has been run.
///
/// This version of \a Run may be less performant than the \a Closure version
/// in some scenarios. This overload is useful in situations where performance
@ -453,13 +501,12 @@ class EventEngine : public std::enable_shared_from_this<EventEngine> {
absl::AnyInvocable<void()> closure) = 0;
/// Request cancellation of a task.
///
/// If the associated closure has already been scheduled to run, it will not
/// be cancelled, and this function will return false.
/// If the associated closure cannot be cancelled for any reason, this
/// function will return false.
///
/// If the associated closure has not been scheduled to run, it will be
/// cancelled, and this method will return true. The associated
/// absl::AnyInvocable or \a Closure* will not be called. If the closure type
/// was an absl::AnyInvocable, it will be destroyed before the method returns.
/// If the associated closure can be cancelled, the associated callback will
/// never be run, and this method will return true. If the callback type was
/// an absl::AnyInvocable, it will be destroyed before the method returns.
virtual bool Cancel(TaskHandle handle) = 0;
};

@ -50,6 +50,12 @@ class MemoryAllocatorImpl
/// request.max() inclusively.
virtual size_t Reserve(MemoryRequest request) = 0;
/// Allocate a slice, using MemoryRequest to size the number of returned
/// bytes. For a variable length request, check the returned slice length to
/// verify how much memory was allocated. Takes care of reserving memory for
/// any relevant control structures also.
virtual grpc_slice MakeSlice(MemoryRequest request) = 0;
/// Release some bytes that were previously reserved.
/// If more bytes are released than were reserved, we will have undefined
/// behavior.

@ -134,7 +134,9 @@ class MemoryAllocator {
/// bytes. For a variable length request, check the returned slice length to
/// verify how much memory was allocated. Takes care of reserving memory for
/// any relevant control structures also.
grpc_slice MakeSlice(MemoryRequest request);
grpc_slice MakeSlice(MemoryRequest request) {
return allocator_->MakeSlice(request);
}
/// A C++ allocator for containers of T.
template <typename T>

@ -815,6 +815,24 @@ GRPCAPI void grpc_tls_certificate_provider_release(
*/
GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void);
/**
* EXPERIMENTAL API - Subject to change
*
* Sets the minimum TLS version that will be negotiated during the TLS
* handshake. If not set, the underlying SSL library will set it to TLS v1.2.
*/
GRPCAPI void grpc_tls_credentials_options_set_min_tls_version(
grpc_tls_credentials_options* options, grpc_tls_version min_tls_version);
/**
* EXPERIMENTAL API - Subject to change
*
* Sets the maximum TLS version that will be negotiated during the TLS
* handshake. If not set, the underlying SSL library will set it to TLS v1.3.
*/
GRPCAPI void grpc_tls_credentials_options_set_max_tls_version(
grpc_tls_credentials_options* options, grpc_tls_version max_tls_version);
/**
* EXPERIMENTAL API - Subject to change
*
@ -894,7 +912,10 @@ GRPCAPI void grpc_tls_credentials_options_set_identity_cert_name(
GRPCAPI void grpc_tls_credentials_options_set_cert_request_type(
grpc_tls_credentials_options* options,
grpc_ssl_client_certificate_request_type type);
/**
/** Deprecated in favor of grpc_tls_credentials_options_set_crl_provider. The
* crl provider interface provides a significantly more flexible approach to
* using CRLs. See gRFC A69 for details.
* EXPERIMENTAL API - Subject to change
*
* If set, gRPC will read all hashed x.509 CRL files in the directory and

@ -15,7 +15,7 @@
#ifndef GRPC_IMPL_CHANNEL_ARG_NAMES_H
#define GRPC_IMPL_CHANNEL_ARG_NAMES_H
// IWYU pragma: private, include "third_party/grpc/include/grpc/grpc.h"
// IWYU pragma: private, include <grpc/grpc.h>
// IWYU pragma: friend "src/.*"
// IWYU pragma: friend "test/.*"
@ -384,6 +384,11 @@
* Defaults to 250ms. */
#define GRPC_ARG_HAPPY_EYEBALLS_CONNECTION_ATTEMPT_DELAY_MS \
"grpc.happy_eyeballs_connection_attempt_delay_ms"
/** It accepts a MemoryAllocatorFactory as input and If specified, it forces
* the default event engine to use memory allocators created using the provided
* factory. */
#define GRPC_ARG_EVENT_ENGINE_USE_MEMORY_ALLOCATOR_FACTORY \
"grpc.event_engine_use_memory_allocator_factory"
/** \} */
#endif /* GRPC_IMPL_CHANNEL_ARG_NAMES_H */

@ -74,7 +74,7 @@ struct grpc_slice {
} data;
};
#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8
#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 7
/** Represents an expandable array of slices, to be interpreted as a
single item. */

@ -99,8 +99,9 @@ class TlsCredentialsOptions {
// verifiers other than the host name verifier is used.
void set_check_call_host(bool check_call_host);
// TODO(zhenlian): This is an experimental API is likely to change in the
// future. Before de-experiementalizing, verify the API is up to date.
// Deprecated in favor of set_crl_provider. The
// crl provider interface provides a significantly more flexible approach to
// using CRLs. See gRFC A69 for details.
// If set, gRPC will read all hashed x.509 CRL files in the directory and
// enforce the CRL files on all TLS handshakes. Only supported for OpenSSL
// version > 1.1.
@ -108,6 +109,15 @@ class TlsCredentialsOptions {
void set_crl_provider(std::shared_ptr<CrlProvider> crl_provider);
// Sets the minimum TLS version that will be negotiated during the TLS
// handshake. If not set, the underlying SSL library will use TLS v1.2.
// @param tls_version: The minimum TLS version.
void set_min_tls_version(grpc_tls_version tls_version);
// Sets the maximum TLS version that will be negotiated during the TLS
// handshake. If not set, the underlying SSL library will use TLS v1.3.
// @param tls_version: The maximum TLS version.
void set_max_tls_version(grpc_tls_version tls_version);
// ----- Getters for member fields ----
// Returns a deep copy of the internal c options. The caller takes ownership
// of the returned pointer. This function shall be used only internally.

@ -19,9 +19,9 @@
#define GRPCPP_VERSION_INFO_H
#define GRPC_CPP_VERSION_MAJOR 1
#define GRPC_CPP_VERSION_MINOR 60
#define GRPC_CPP_VERSION_MINOR 61
#define GRPC_CPP_VERSION_PATCH 0
#define GRPC_CPP_VERSION_TAG "dev"
#define GRPC_CPP_VERSION_STRING "1.60.0-dev"
#define GRPC_CPP_VERSION_STRING "1.61.0-dev"
#endif // GRPCPP_VERSION_INFO_H

1515
package.xml generated

File diff suppressed because it is too large Load Diff

@ -16,3 +16,4 @@ xds-protos==0.0.11
opencensus==0.10.0
opencensus-ext-stackdriver==0.8.0
absl-py==1.4.0
googleapis-common-protos==1.61.0

@ -4,7 +4,7 @@
plugins = Cython.Coverage
[build]
build_base=python_build
build_base=pyb
[build_ext]
inplace=1

@ -72,11 +72,9 @@ SSL_INCLUDE = (
os.path.join("third_party", "boringssl-with-bazel", "src", "include"),
)
UPB_INCLUDE = (os.path.join("third_party", "upb"),)
UPB_GRPC_GENERATED_INCLUDE = (
os.path.join("src", "core", "ext", "upb-generated"),
)
UPB_GRPC_GENERATED_INCLUDE = (os.path.join("src", "core", "ext", "upb-gen"),)
UPBDEFS_GRPC_GENERATED_INCLUDE = (
os.path.join("src", "core", "ext", "upbdefs-generated"),
os.path.join("src", "core", "ext", "upbdefs-gen"),
)
UTF8_RANGE_INCLUDE = (os.path.join("third_party", "utf8_range"),)
XXHASH_INCLUDE = (os.path.join("third_party", "xxhash"),)

@ -117,10 +117,12 @@ grpc_cc_library(
"lib/experiments/config.h",
"lib/experiments/experiments.h",
],
defines = select({
"//:grpc_experiments_are_final": ["GRPC_EXPERIMENTS_ARE_FINAL"],
"//conditions:default": [],
}),
defines = select(
{
"//:grpc_experiments_are_final": ["GRPC_EXPERIMENTS_ARE_FINAL"],
"//conditions:default": [],
},
),
external_deps = [
"absl/functional:any_invocable",
"absl/strings",
@ -291,7 +293,9 @@ grpc_cc_library(
"absl/strings:cord",
"absl/time",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
"upb_mem_lib",
],
language = "c++",
deps = [
@ -418,6 +422,23 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "status_flag",
external_deps = [
"absl/status",
"absl/status:statusor",
"absl/types:optional",
],
language = "c++",
public_hdrs = [
"lib/promise/status_flag.h",
],
deps = [
"promise_status",
"//:gpr_platform",
],
)
grpc_cc_library(
name = "map_pipe",
external_deps = ["absl/status"],
@ -457,6 +478,7 @@ grpc_cc_library(
"arena",
"construct_destruct",
"context",
"poll",
"promise_factory",
"promise_trace",
"ref_counted",
@ -853,6 +875,25 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "inter_activity_latch",
external_deps = [
"absl/base:core_headers",
"absl/strings",
],
language = "c++",
public_hdrs = [
"lib/promise/inter_activity_latch.h",
],
deps = [
"activity",
"poll",
"promise_trace",
"wait_set",
"//:gpr",
],
)
grpc_cc_library(
name = "interceptor_list",
hdrs = [
@ -979,7 +1020,9 @@ grpc_cc_library(
"construct_destruct",
"poll",
"promise_factory",
"promise_status",
"promise_trace",
"status_flag",
"//:gpr",
"//:gpr_platform",
],
@ -1122,9 +1165,6 @@ grpc_cc_library(
grpc_cc_library(
name = "event_engine_memory_allocator",
srcs = [
"lib/event_engine/memory_allocator.cc",
],
hdrs = [
"//:include/grpc/event_engine/internal/memory_allocator_impl.h",
"//:include/grpc/event_engine/memory_allocator.h",
@ -1134,7 +1174,6 @@ grpc_cc_library(
language = "c++",
deps = [
"slice",
"slice_refcount",
"//:gpr_platform",
],
)
@ -1180,6 +1219,7 @@ grpc_cc_library(
"race",
"resource_quota_trace",
"seq",
"slice_refcount",
"time",
"useful",
"//:gpr",
@ -1499,6 +1539,18 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "event_engine_query_extensions",
hdrs = [
"lib/event_engine/query_extensions.h",
],
external_deps = ["absl/strings"],
deps = [
"//:event_engine_base_hdrs",
"//:gpr_platform",
],
)
grpc_cc_library(
name = "event_engine_work_queue",
hdrs = [
@ -2088,6 +2140,7 @@ grpc_cc_library(
"forkable",
"init_internally",
"iomgr_port",
"native_dns_resolver",
"no_destruct",
"posix_event_engine_base_hdrs",
"posix_event_engine_closure",
@ -2098,7 +2151,9 @@ grpc_cc_library(
"posix_event_engine_tcp_socket_utils",
"posix_event_engine_timer",
"posix_event_engine_timer_manager",
"ref_counted_dns_resolver_interface",
"useful",
"//:config_vars",
"//:event_engine_base_hdrs",
"//:gpr",
"//:grpc_trace",
@ -2116,6 +2171,7 @@ grpc_cc_library(
"absl/strings",
],
deps = [
"ares_resolver",
"channel_args_endpoint_config",
"common_event_engine_closures",
"error",
@ -2125,6 +2181,7 @@ grpc_cc_library(
"event_engine_trace",
"event_engine_utils",
"init_internally",
"iomgr_port",
"posix_event_engine_timer_manager",
"time",
"windows_endpoint",
@ -2325,27 +2382,29 @@ grpc_cc_library(
srcs = ["lib/event_engine/default_event_engine_factory.cc"],
hdrs = ["lib/event_engine/default_event_engine_factory.h"],
external_deps = ["absl/memory"],
select_deps = [{
"//:windows": ["windows_event_engine"],
"//:windows_msvc": ["windows_event_engine"],
"//:windows_other": ["windows_event_engine"],
"//:mac": [
"posix_event_engine",
"cf_event_engine",
],
"//:mac_x86_64": [
"posix_event_engine",
"cf_event_engine",
],
"//:mac_arm64": [
"posix_event_engine",
"cf_event_engine",
],
"//:ios": ["cf_event_engine"],
"//:tvos": ["cf_event_engine"],
"//:watchos": ["cf_event_engine"],
"//conditions:default": ["posix_event_engine"],
}],
select_deps = [
{
"//:windows": ["windows_event_engine"],
"//:windows_msvc": ["windows_event_engine"],
"//:windows_other": ["windows_event_engine"],
"//:mac": [
"posix_event_engine",
"cf_event_engine",
],
"//:mac_x86_64": [
"posix_event_engine",
"cf_event_engine",
],
"//:mac_arm64": [
"posix_event_engine",
"cf_event_engine",
],
"//:ios": ["cf_event_engine"],
"//:tvos": ["cf_event_engine"],
"//:watchos": ["cf_event_engine"],
"//conditions:default": ["posix_event_engine"],
},
],
deps = [
"//:event_engine_base_hdrs",
"//:gpr_platform",
@ -2415,16 +2474,53 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "ref_counted_dns_resolver_interface",
hdrs = ["lib/event_engine/ref_counted_dns_resolver_interface.h"],
external_deps = ["absl/strings"],
deps = [
"//:event_engine_base_hdrs",
"//:gpr_platform",
"//:orphanable",
],
)
grpc_cc_library(
name = "native_dns_resolver",
srcs = [
"lib/event_engine/posix_engine/native_dns_resolver.cc",
],
hdrs = [
"lib/event_engine/posix_engine/native_dns_resolver.h",
],
external_deps = [
"absl/functional:any_invocable",
"absl/status",
"absl/status:statusor",
"absl/strings",
"absl/strings:str_format",
],
deps = [
"iomgr_port",
"ref_counted_dns_resolver_interface",
"useful",
"//:event_engine_base_hdrs",
"//:gpr",
],
)
grpc_cc_library(
name = "ares_resolver",
srcs = [
"lib/event_engine/ares_resolver.cc",
"lib/event_engine/windows/grpc_polled_fd_windows.cc",
],
hdrs = [
"lib/event_engine/ares_resolver.h",
"lib/event_engine/grpc_polled_fd.h",
"lib/event_engine/nameser.h",
"lib/event_engine/posix_engine/grpc_polled_fd_posix.h",
"lib/event_engine/windows/grpc_polled_fd_windows.h",
],
external_deps = [
"absl/base:core_headers",
@ -2440,6 +2536,7 @@ grpc_cc_library(
"cares",
],
deps = [
"common_event_engine_closures",
"error",
"event_engine_time_util",
"grpc_sockaddr",
@ -2447,7 +2544,10 @@ grpc_cc_library(
"posix_event_engine_closure",
"posix_event_engine_event_poller",
"posix_event_engine_tcp_socket_utils",
"ref_counted_dns_resolver_interface",
"resolved_address",
"slice",
"windows_iocp",
"//:debug_location",
"//:event_engine_base_hdrs",
"//:gpr",
@ -4090,13 +4190,16 @@ grpc_cc_library(
external_deps = [
"absl/base:core_headers",
"absl/container:inlined_vector",
"absl/functional:function_ref",
"absl/status",
"absl/status:statusor",
"absl/strings",
"absl/strings:str_format",
"absl/types:optional",
"absl/types:variant",
"upb_base_lib",
"upb_lib",
"upb_mem_lib",
],
language = "c++",
deps = [
@ -4201,6 +4304,7 @@ grpc_cc_library(
"absl/strings",
"absl/strings:str_format",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
],
language = "c++",
@ -4252,7 +4356,7 @@ grpc_cc_library(
],
external_deps = [
"absl/strings",
"upb_lib",
"upb_base_lib",
],
language = "c++",
deps = ["//:gpr_platform"],
@ -4327,7 +4431,9 @@ grpc_cc_library(
"absl/types:optional",
"absl/types:span",
"absl/types:variant",
"upb_base_lib",
"upb_lib",
"upb_mem_lib",
"upb_textformat_lib",
"upb_json_lib",
"re2",
@ -4612,6 +4718,7 @@ grpc_cc_library(
"ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc",
],
external_deps = [
"absl/functional:function_ref",
"absl/status",
"absl/status:statusor",
"absl/strings",
@ -4634,6 +4741,7 @@ grpc_cc_library(
"no_destruct",
"pollset_set",
"ref_counted_string",
"resolved_address",
"validation_errors",
"//:channel_arg_names",
"//:config",
@ -4782,6 +4890,7 @@ grpc_cc_library(
"ext/filters/client_channel/lb_policy/address_filtering.h",
],
external_deps = [
"absl/functional:function_ref",
"absl/status:statusor",
"absl/strings",
],
@ -4790,6 +4899,7 @@ grpc_cc_library(
"channel_args",
"ref_counted",
"ref_counted_string",
"resolved_address",
"//:endpoint_addresses",
"//:gpr_platform",
"//:ref_counted_ptr",
@ -4811,6 +4921,7 @@ grpc_cc_library(
"absl/status:statusor",
"absl/strings",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
],
language = "c++",
@ -4858,6 +4969,7 @@ grpc_cc_library(
"lb_policy",
"subchannel_interface",
"//:debug_location",
"//:endpoint_addresses",
"//:gpr",
"//:grpc_base",
"//:ref_counted_ptr",
@ -4875,7 +4987,7 @@ grpc_cc_library(
"ext/filters/client_channel/lb_policy/endpoint_list.h",
],
external_deps = [
"absl/functional:any_invocable",
"absl/functional:function_ref",
"absl/status",
"absl/status:statusor",
"absl/types:optional",
@ -5269,6 +5381,7 @@ grpc_cc_library(
],
external_deps = [
"absl/base:core_headers",
"absl/functional:function_ref",
"absl/status",
"absl/status:statusor",
"absl/strings",
@ -5370,6 +5483,7 @@ grpc_cc_library(
"absl/status:statusor",
"absl/strings",
"absl/types:optional",
"upb_base_lib",
"upb_lib",
],
language = "c++",
@ -5431,8 +5545,12 @@ grpc_cc_library(
grpc_cc_library(
name = "service_config_helper",
srcs = ["ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc"],
hdrs = ["ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.h"],
srcs = [
"ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc",
],
hdrs = [
"ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.h",
],
external_deps = [
"absl/status:statusor",
"absl/strings",
@ -5452,8 +5570,12 @@ grpc_cc_library(
grpc_cc_library(
name = "grpc_resolver_dns_event_engine",
srcs = ["ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc"],
hdrs = ["ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.h"],
srcs = [
"ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc",
],
hdrs = [
"ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.h",
],
external_deps = [
"absl/base:core_headers",
"absl/cleanup",
@ -6395,7 +6517,9 @@ grpc_upb_proto_library(
grpc_upb_proto_library(
name = "envoy_extensions_load_balancing_policies_client_side_weighted_round_robin_upb",
deps = ["@envoy_api//envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3:pkg"],
deps = [
"@envoy_api//envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3:pkg",
],
)
grpc_upb_proto_library(
@ -6415,12 +6539,16 @@ grpc_upb_proto_library(
grpc_upb_proto_library(
name = "envoy_extensions_filters_network_http_connection_manager_upb",
deps = ["@envoy_api//envoy/extensions/filters/network/http_connection_manager/v3:pkg"],
deps = [
"@envoy_api//envoy/extensions/filters/network/http_connection_manager/v3:pkg",
],
)
grpc_upb_proto_reflection_library(
name = "envoy_extensions_filters_network_http_connection_manager_upbdefs",
deps = ["@envoy_api//envoy/extensions/filters/network/http_connection_manager/v3:pkg"],
deps = [
"@envoy_api//envoy/extensions/filters/network/http_connection_manager/v3:pkg",
],
)
grpc_upb_proto_library(
@ -6547,14 +6675,20 @@ WELL_KNOWN_PROTO_TARGETS = [
"wrappers",
]
[grpc_upb_proto_library(
name = "protobuf_" + target + "_upb",
deps = ["@com_google_protobuf//:" + target + "_proto"],
) for target in WELL_KNOWN_PROTO_TARGETS]
[
grpc_upb_proto_library(
name = "protobuf_" + target + "_upb",
deps = ["@com_google_protobuf//:" + target + "_proto"],
)
for target in WELL_KNOWN_PROTO_TARGETS
]
[grpc_upb_proto_reflection_library(
name = "protobuf_" + target + "_upbdefs",
deps = ["@com_google_protobuf//:" + target + "_proto"],
) for target in WELL_KNOWN_PROTO_TARGETS]
[
grpc_upb_proto_reflection_library(
name = "protobuf_" + target + "_upbdefs",
deps = ["@com_google_protobuf//:" + target + "_proto"],
)
for target in WELL_KNOWN_PROTO_TARGETS
]
grpc_generate_one_off_internal_targets()

@ -315,6 +315,14 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
public:
explicit PromiseBasedCallData(ClientChannel* chand) : chand_(chand) {}
~PromiseBasedCallData() override {
if (was_queued_ && client_initial_metadata_ != nullptr) {
MutexLock lock(&chand_->resolution_mu_);
RemoveCallFromResolverQueuedCallsLocked();
chand_->resolver_queued_calls_.erase(this);
}
}
ArenaPromise<absl::StatusOr<CallArgs>> MakeNameResolutionPromise(
CallArgs call_args) {
pollent_ = NowOrNever(call_args.polling_entity->WaitAndCopy()).value();
@ -399,6 +407,7 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
ClientChannel::MakeCallPromise,
/* init_call: */ nullptr,
ClientChannel::StartTransportOp,
sizeof(ClientChannel::FilterBasedCallData),
ClientChannel::FilterBasedCallData::Init,
@ -415,6 +424,7 @@ const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
const grpc_channel_filter ClientChannel::kFilterVtableWithoutPromises = {
ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
nullptr,
/* init_call: */ nullptr,
ClientChannel::StartTransportOp,
sizeof(ClientChannel::FilterBasedCallData),
ClientChannel::FilterBasedCallData::Init,
@ -562,6 +572,7 @@ class DynamicTerminationFilter::CallData {
const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
DynamicTerminationFilter::CallData::StartTransportStreamOpBatch,
DynamicTerminationFilter::MakeCallPromise,
/* init_call: */ nullptr,
DynamicTerminationFilter::StartTransportOp,
sizeof(DynamicTerminationFilter::CallData),
DynamicTerminationFilter::CallData::Init,
@ -1599,7 +1610,12 @@ absl::Status ClientChannel::CreateOrUpdateLbPolicyLocked(
Resolver::Result result) {
// Construct update.
LoadBalancingPolicy::UpdateArgs update_args;
update_args.addresses = std::move(result.addresses);
if (!result.addresses.ok()) {
update_args.addresses = result.addresses.status();
} else {
update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
std::move(*result.addresses));
}
update_args.config = std::move(lb_policy_config);
update_args.resolution_note = std::move(result.resolution_note);
// Remove the config selector from channel args so that we're not holding

@ -20,11 +20,13 @@
#include <stddef.h>
#include <algorithm>
#include <utility>
#include "absl/functional/function_ref.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/iomgr/resolved_address.h"
namespace grpc_core {
@ -43,32 +45,63 @@ int HierarchicalPathArg::ChannelArgsCompare(const HierarchicalPathArg* a,
return 0;
}
namespace {
class HierarchicalAddressIterator : public EndpointAddressesIterator {
public:
HierarchicalAddressIterator(
std::shared_ptr<EndpointAddressesIterator> parent_it,
RefCountedStringValue child_name)
: parent_it_(std::move(parent_it)), child_name_(std::move(child_name)) {}
void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
const override {
RefCountedPtr<HierarchicalPathArg> remaining_path_attr;
parent_it_->ForEach([&](const EndpointAddresses& endpoint) {
const auto* path_arg = endpoint.args().GetObject<HierarchicalPathArg>();
if (path_arg == nullptr) return;
const std::vector<RefCountedStringValue>& path = path_arg->path();
auto it = path.begin();
if (it == path.end()) return;
if (*it != child_name_) return;
ChannelArgs args = endpoint.args();
++it;
if (it != path.end()) {
std::vector<RefCountedStringValue> remaining_path(it, path.end());
if (remaining_path_attr == nullptr ||
remaining_path_attr->path() != remaining_path) {
remaining_path_attr =
MakeRefCounted<HierarchicalPathArg>(std::move(remaining_path));
}
args = args.SetObject(remaining_path_attr);
}
callback(EndpointAddresses(endpoint.addresses(), args));
});
}
private:
std::shared_ptr<EndpointAddressesIterator> parent_it_;
RefCountedStringValue child_name_;
};
} // namespace
absl::StatusOr<HierarchicalAddressMap> MakeHierarchicalAddressMap(
const absl::StatusOr<EndpointAddressesList>& addresses) {
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses) {
if (!addresses.ok()) return addresses.status();
HierarchicalAddressMap result;
RefCountedPtr<HierarchicalPathArg> remaining_path_attr;
for (const EndpointAddresses& endpoint_addresses : *addresses) {
const auto* path_arg =
endpoint_addresses.args().GetObject<HierarchicalPathArg>();
if (path_arg == nullptr) continue;
(*addresses)->ForEach([&](const EndpointAddresses& endpoint) {
const auto* path_arg = endpoint.args().GetObject<HierarchicalPathArg>();
if (path_arg == nullptr) return;
const std::vector<RefCountedStringValue>& path = path_arg->path();
auto it = path.begin();
if (it == path.end()) continue;
EndpointAddressesList& target_list = result[*it];
ChannelArgs args = endpoint_addresses.args();
++it;
if (it != path.end()) {
std::vector<RefCountedStringValue> remaining_path(it, path.end());
if (remaining_path_attr == nullptr ||
remaining_path_attr->path() != remaining_path) {
remaining_path_attr =
MakeRefCounted<HierarchicalPathArg>(std::move(remaining_path));
}
args = args.SetObject(remaining_path_attr);
if (it == path.end()) return;
auto& target_list = result[*it];
if (target_list == nullptr) {
target_list =
std::make_shared<HierarchicalAddressIterator>(*addresses, *it);
}
target_list.emplace_back(endpoint_addresses.addresses(), args);
}
});
return result;
}

@ -20,6 +20,7 @@
#include <grpc/support/port_platform.h>
#include <map>
#include <memory>
#include <utility>
#include <vector>
@ -105,12 +106,12 @@ class HierarchicalPathArg : public RefCounted<HierarchicalPathArg> {
// A map from the next path element to the endpoint addresses that fall
// under that path element.
using HierarchicalAddressMap =
std::map<RefCountedStringValue, EndpointAddressesList,
std::map<RefCountedStringValue, std::shared_ptr<EndpointAddressesIterator>,
RefCountedStringValueLessThan>;
// Splits up the addresses into a separate list for each child.
absl::StatusOr<HierarchicalAddressMap> MakeHierarchicalAddressMap(
const absl::StatusOr<EndpointAddressesList>& addresses);
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses);
} // namespace grpc_core

@ -118,7 +118,7 @@ void EndpointList::Endpoint::Init(
GPR_ASSERT(config.ok());
// Update child policy.
LoadBalancingPolicy::UpdateArgs update_args;
update_args.addresses.emplace().emplace_back(addresses);
update_args.addresses = std::make_shared<SingleEndpointIterator>(addresses);
update_args.args = child_args;
update_args.config = std::move(*config);
// TODO(roth): If the child reports a non-OK status with the update,
@ -163,15 +163,16 @@ RefCountedPtr<SubchannelInterface> EndpointList::Endpoint::CreateSubchannel(
//
void EndpointList::Init(
const EndpointAddressesList& endpoints, const ChannelArgs& args,
absl::AnyInvocable<OrphanablePtr<Endpoint>(RefCountedPtr<EndpointList>,
const EndpointAddresses&,
const ChannelArgs&)>
EndpointAddressesIterator* endpoints, const ChannelArgs& args,
absl::FunctionRef<OrphanablePtr<Endpoint>(RefCountedPtr<EndpointList>,
const EndpointAddresses&,
const ChannelArgs&)>
create_endpoint) {
for (const EndpointAddresses& addresses : endpoints) {
if (endpoints == nullptr) return;
endpoints->ForEach([&](const EndpointAddresses& endpoint) {
endpoints_.push_back(
create_endpoint(Ref(DEBUG_LOCATION, "Endpoint"), addresses, args));
}
create_endpoint(Ref(DEBUG_LOCATION, "Endpoint"), endpoint, args));
});
}
void EndpointList::ResetBackoffLocked() {

@ -25,7 +25,7 @@
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/functional/function_ref.h"
#include "absl/status/status.h"
#include "absl/types/optional.h"
@ -53,7 +53,7 @@ namespace grpc_core {
class MyEndpointList : public EndpointList {
public:
MyEndpointList(RefCountedPtr<MyLbPolicy> lb_policy,
const EndpointAddressesList& endpoints,
EndpointAddressesIterator* endpoints,
const ChannelArgs& args)
: EndpointList(std::move(lb_policy),
GRPC_TRACE_FLAG_ENABLED(grpc_my_tracer)
@ -184,8 +184,8 @@ class EndpointList : public InternallyRefCounted<EndpointList> {
EndpointList(RefCountedPtr<LoadBalancingPolicy> policy, const char* tracer)
: policy_(std::move(policy)), tracer_(tracer) {}
void Init(const EndpointAddressesList& endpoints, const ChannelArgs& args,
absl::AnyInvocable<OrphanablePtr<Endpoint>(
void Init(EndpointAddressesIterator* endpoints, const ChannelArgs& args,
absl::FunctionRef<OrphanablePtr<Endpoint>(
RefCountedPtr<EndpointList>, const EndpointAddresses&,
const ChannelArgs&)>
create_endpoint);

@ -72,6 +72,7 @@
#include <vector>
#include "absl/container/inlined_vector.h"
#include "absl/functional/function_ref.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
@ -384,9 +385,9 @@ class GrpcLb : public LoadBalancingPolicy {
// Returns a text representation suitable for logging.
std::string AsText() const;
// Extracts all non-drop entries into an EndpointAddressesList.
EndpointAddressesList GetServerAddressList(
GrpcLbClientStats* client_stats) const;
// Extracts all non-drop entries into an EndpointAddressesIterator.
std::shared_ptr<EndpointAddressesIterator> GetServerAddressList(
GrpcLbClientStats* client_stats);
// Returns true if the serverlist contains at least one drop entry and
// no backend address entries.
@ -400,6 +401,8 @@ class GrpcLb : public LoadBalancingPolicy {
const char* ShouldDrop();
private:
class AddressIterator;
std::vector<GrpcLbServer> serverlist_;
// Accessed from the picker, so needs synchronization.
@ -504,6 +507,8 @@ class GrpcLb : public LoadBalancingPolicy {
RefCountedPtr<GrpcLb> parent_;
};
class NullLbTokenEndpointIterator;
void ShutdownLocked() override;
// Helper functions used in UpdateLocked().
@ -569,7 +574,8 @@ class GrpcLb : public LoadBalancingPolicy {
// Whether we're in fallback mode.
bool fallback_mode_ = false;
// The backend addresses from the resolver.
absl::StatusOr<EndpointAddressesList> fallback_backend_addresses_;
absl::StatusOr<std::shared_ptr<NullLbTokenEndpointIterator>>
fallback_backend_addresses_;
// The last resolution note from our parent.
// To be passed to child policy when fallback_backend_addresses_ is empty.
std::string resolution_note_;
@ -594,11 +600,30 @@ class GrpcLb : public LoadBalancingPolicy {
};
//
// GrpcLb::Serverlist
// GrpcLb::Serverlist::AddressIterator
//
bool GrpcLb::Serverlist::operator==(const Serverlist& other) const {
return serverlist_ == other.serverlist_;
bool IsServerValid(const GrpcLbServer& server, size_t idx, bool log) {
if (server.drop) return false;
if (GPR_UNLIKELY(server.port >> 16 != 0)) {
if (log) {
gpr_log(GPR_ERROR,
"Invalid port '%d' at index %" PRIuPTR
" of serverlist. Ignoring.",
server.port, idx);
}
return false;
}
if (GPR_UNLIKELY(server.ip_size != 4 && server.ip_size != 16)) {
if (log) {
gpr_log(GPR_ERROR,
"Expected IP to be 4 or 16 bytes, got %d at index %" PRIuPTR
" of serverlist. Ignoring",
server.ip_size, idx);
}
return false;
}
return true;
}
void ParseServer(const GrpcLbServer& server, grpc_resolved_address* addr) {
@ -623,6 +648,53 @@ void ParseServer(const GrpcLbServer& server, grpc_resolved_address* addr) {
}
}
class GrpcLb::Serverlist::AddressIterator : public EndpointAddressesIterator {
public:
AddressIterator(RefCountedPtr<Serverlist> serverlist,
RefCountedPtr<GrpcLbClientStats> client_stats)
: serverlist_(std::move(serverlist)),
client_stats_(std::move(client_stats)) {}
void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
const override {
for (size_t i = 0; i < serverlist_->serverlist_.size(); ++i) {
const GrpcLbServer& server = serverlist_->serverlist_[i];
if (!IsServerValid(server, i, false)) continue;
// Address processing.
grpc_resolved_address addr;
ParseServer(server, &addr);
// LB token processing.
const size_t lb_token_length = strnlen(
server.load_balance_token, GPR_ARRAY_SIZE(server.load_balance_token));
std::string lb_token(server.load_balance_token, lb_token_length);
if (lb_token.empty()) {
auto addr_uri = grpc_sockaddr_to_uri(&addr);
gpr_log(GPR_INFO,
"Missing LB token for backend address '%s'. The empty token "
"will be used instead",
addr_uri.ok() ? addr_uri->c_str()
: addr_uri.status().ToString().c_str());
}
// Return address with a channel arg containing LB token and stats object.
callback(EndpointAddresses(
addr, ChannelArgs().SetObject(MakeRefCounted<TokenAndClientStatsArg>(
std::move(lb_token), client_stats_))));
}
}
private:
RefCountedPtr<Serverlist> serverlist_;
RefCountedPtr<GrpcLbClientStats> client_stats_;
};
//
// GrpcLb::Serverlist
//
bool GrpcLb::Serverlist::operator==(const Serverlist& other) const {
return serverlist_ == other.serverlist_;
}
std::string GrpcLb::Serverlist::AsText() const {
std::vector<std::string> entries;
for (size_t i = 0; i < serverlist_.size(); ++i) {
@ -642,59 +714,12 @@ std::string GrpcLb::Serverlist::AsText() const {
return absl::StrJoin(entries, "");
}
bool IsServerValid(const GrpcLbServer& server, size_t idx, bool log) {
if (server.drop) return false;
if (GPR_UNLIKELY(server.port >> 16 != 0)) {
if (log) {
gpr_log(GPR_ERROR,
"Invalid port '%d' at index %" PRIuPTR
" of serverlist. Ignoring.",
server.port, idx);
}
return false;
}
if (GPR_UNLIKELY(server.ip_size != 4 && server.ip_size != 16)) {
if (log) {
gpr_log(GPR_ERROR,
"Expected IP to be 4 or 16 bytes, got %d at index %" PRIuPTR
" of serverlist. Ignoring",
server.ip_size, idx);
}
return false;
}
return true;
}
// Returns addresses extracted from the serverlist.
EndpointAddressesList GrpcLb::Serverlist::GetServerAddressList(
GrpcLbClientStats* client_stats) const {
std::shared_ptr<EndpointAddressesIterator>
GrpcLb::Serverlist::GetServerAddressList(GrpcLbClientStats* client_stats) {
RefCountedPtr<GrpcLbClientStats> stats;
if (client_stats != nullptr) stats = client_stats->Ref();
EndpointAddressesList endpoints;
for (size_t i = 0; i < serverlist_.size(); ++i) {
const GrpcLbServer& server = serverlist_[i];
if (!IsServerValid(server, i, false)) continue;
// Address processing.
grpc_resolved_address addr;
ParseServer(server, &addr);
// LB token processing.
const size_t lb_token_length = strnlen(
server.load_balance_token, GPR_ARRAY_SIZE(server.load_balance_token));
std::string lb_token(server.load_balance_token, lb_token_length);
if (lb_token.empty()) {
auto addr_uri = grpc_sockaddr_to_uri(&addr);
gpr_log(GPR_INFO,
"Missing LB token for backend address '%s'. The empty token will "
"be used instead",
addr_uri.ok() ? addr_uri->c_str()
: addr_uri.status().ToString().c_str());
}
// Add address with a channel arg containing LB token and stats object.
endpoints.emplace_back(
addr, ChannelArgs().SetObject(MakeRefCounted<TokenAndClientStatsArg>(
std::move(lb_token), stats)));
}
return endpoints;
return std::make_shared<AddressIterator>(Ref(), std::move(stats));
}
bool GrpcLb::Serverlist::ContainsAllDropEntries() const {
@ -1503,6 +1528,31 @@ void GrpcLb::ResetBackoffLocked() {
}
}
// Endpoint iterator wrapper to add null LB token attribute.
class GrpcLb::NullLbTokenEndpointIterator : public EndpointAddressesIterator {
public:
explicit NullLbTokenEndpointIterator(
std::shared_ptr<EndpointAddressesIterator> parent_it)
: parent_it_(std::move(parent_it)) {}
void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
const override {
parent_it_->ForEach([&](const EndpointAddresses& endpoint) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
gpr_log(GPR_INFO, "[grpclb %p] fallback address: %s", this,
endpoint.ToString().c_str());
}
callback(EndpointAddresses(endpoint.addresses(),
endpoint.args().SetObject(empty_token_)));
});
}
private:
std::shared_ptr<EndpointAddressesIterator> parent_it_;
RefCountedPtr<TokenAndClientStatsArg> empty_token_ =
MakeRefCounted<TokenAndClientStatsArg>("", nullptr);
};
absl::Status GrpcLb::UpdateLocked(UpdateArgs args) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
gpr_log(GPR_INFO, "[grpclb %p] received update", this);
@ -1512,19 +1562,11 @@ absl::Status GrpcLb::UpdateLocked(UpdateArgs args) {
GPR_ASSERT(config_ != nullptr);
args_ = std::move(args.args);
// Update fallback address list.
fallback_backend_addresses_ = std::move(args.addresses);
if (fallback_backend_addresses_.ok()) {
// Add null LB token attributes.
for (EndpointAddresses& endpoint : *fallback_backend_addresses_) {
endpoint = EndpointAddresses(
endpoint.addresses(),
endpoint.args().SetObject(
MakeRefCounted<TokenAndClientStatsArg>("", nullptr)));
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
gpr_log(GPR_INFO, "[grpclb %p] fallback address: %s", this,
endpoint.ToString().c_str());
}
}
if (!args.addresses.ok()) {
fallback_backend_addresses_ = args.addresses.status();
} else {
fallback_backend_addresses_ = std::make_shared<NullLbTokenEndpointIterator>(
std::move(*args.addresses));
}
resolution_note_ = std::move(args.resolution_note);
// Update balancer channel.
@ -1756,6 +1798,12 @@ OrphanablePtr<LoadBalancingPolicy> GrpcLb::CreateChildPolicyLocked(
return lb_policy;
}
bool EndpointIteratorIsEmpty(const EndpointAddressesIterator& endpoints) {
bool empty = true;
endpoints.ForEach([&](const EndpointAddresses&) { empty = false; });
return empty;
}
void GrpcLb::CreateOrUpdateChildPolicyLocked() {
if (shutting_down_) return;
// Construct update args.
@ -1769,16 +1817,17 @@ void GrpcLb::CreateOrUpdateChildPolicyLocked() {
// picks.
update_args.addresses = fallback_backend_addresses_;
if (fallback_backend_addresses_.ok() &&
fallback_backend_addresses_->empty()) {
EndpointIteratorIsEmpty(**fallback_backend_addresses_)) {
update_args.resolution_note = absl::StrCat(
"grpclb in fallback mode without any balancer addresses: ",
"grpclb in fallback mode without any fallback addresses: ",
resolution_note_);
}
} else {
update_args.addresses = serverlist_->GetServerAddressList(
lb_calld_ == nullptr ? nullptr : lb_calld_->client_stats());
is_backend_from_grpclb_load_balancer = true;
if (update_args.addresses.ok() && update_args.addresses->empty()) {
if (update_args.addresses.ok() &&
EndpointIteratorIsEmpty(**update_args.addresses)) {
update_args.resolution_note = "empty serverlist from grpclb balancer";
}
}

@ -661,7 +661,7 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) {
if (args.addresses.ok()) {
std::set<EndpointAddressSet> current_endpoints;
std::set<grpc_resolved_address, ResolvedAddressLessThan> current_addresses;
for (const EndpointAddresses& endpoint : *args.addresses) {
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
EndpointAddressSet key(endpoint.addresses());
current_endpoints.emplace(key);
for (const grpc_resolved_address& address : endpoint.addresses()) {
@ -708,7 +708,7 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) {
}
it->second->DisableEjection();
}
}
});
// Remove any entries we no longer need in the subchannel map.
for (auto it = subchannel_state_map_.begin();
it != subchannel_state_map_.end();) {
@ -753,7 +753,6 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) {
update_args.addresses = std::move(args.addresses);
update_args.resolution_note = std::move(args.resolution_note);
update_args.config = config_->child_policy();
// Update the policy.
update_args.args = std::move(args.args);
if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
gpr_log(GPR_INFO,

@ -21,7 +21,6 @@
#include <inttypes.h>
#include <string.h>
#include <algorithm>
#include <memory>
#include <set>
#include <string>
@ -114,7 +113,7 @@ class PickFirst : public LoadBalancingPolicy {
public:
class SubchannelData {
public:
SubchannelData(SubchannelList* subchannel_list,
SubchannelData(SubchannelList* subchannel_list, size_t index,
RefCountedPtr<SubchannelInterface> subchannel);
SubchannelInterface* subchannel() const { return subchannel_.get(); }
@ -125,12 +124,6 @@ class PickFirst : public LoadBalancingPolicy {
return connectivity_status_;
}
// Returns the index into the subchannel list of this object.
size_t Index() const {
return static_cast<size_t>(this -
&subchannel_list_->subchannels_.front());
}
// Resets the connection backoff.
void ResetBackoffLocked() {
if (subchannel_ != nullptr) subchannel_->ResetBackoff();
@ -153,10 +146,8 @@ class PickFirst : public LoadBalancingPolicy {
class Watcher
: public SubchannelInterface::ConnectivityStateWatcherInterface {
public:
Watcher(SubchannelData* subchannel_data,
RefCountedPtr<SubchannelList> subchannel_list)
: subchannel_data_(subchannel_data),
subchannel_list_(std::move(subchannel_list)) {}
Watcher(RefCountedPtr<SubchannelList> subchannel_list, size_t index)
: subchannel_list_(std::move(subchannel_list)), index_(index) {}
~Watcher() override {
subchannel_list_.reset(DEBUG_LOCATION, "Watcher dtor");
@ -164,8 +155,8 @@ class PickFirst : public LoadBalancingPolicy {
void OnConnectivityStateChange(grpc_connectivity_state new_state,
absl::Status status) override {
subchannel_data_->OnConnectivityStateChange(new_state,
std::move(status));
subchannel_list_->subchannels_[index_].OnConnectivityStateChange(
new_state, std::move(status));
}
grpc_pollset_set* interested_parties() override {
@ -173,8 +164,8 @@ class PickFirst : public LoadBalancingPolicy {
}
private:
SubchannelData* subchannel_data_;
RefCountedPtr<SubchannelList> subchannel_list_;
const size_t index_;
};
// This method will be invoked once soon after instantiation to report
@ -193,6 +184,7 @@ class PickFirst : public LoadBalancingPolicy {
// Backpointer to owning subchannel list. Not owned.
SubchannelList* subchannel_list_;
const size_t index_;
// The subchannel.
RefCountedPtr<SubchannelInterface> subchannel_;
// Will be non-null when the subchannel's state is being watched.
@ -205,7 +197,8 @@ class PickFirst : public LoadBalancingPolicy {
};
SubchannelList(RefCountedPtr<PickFirst> policy,
EndpointAddressesList addresses, const ChannelArgs& args);
EndpointAddressesIterator* addresses,
const ChannelArgs& args);
~SubchannelList() override;
@ -413,9 +406,9 @@ void PickFirst::ResetBackoffLocked() {
void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
// Create a subchannel list from latest_update_args_.
EndpointAddressesList addresses;
EndpointAddressesIterator* addresses = nullptr;
if (latest_update_args_.addresses.ok()) {
addresses = *latest_update_args_.addresses;
addresses = latest_update_args_.addresses->get();
}
// Replace latest_pending_subchannel_list_.
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace) &&
@ -425,7 +418,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
latest_pending_subchannel_list_.get());
}
latest_pending_subchannel_list_ = MakeOrphanable<SubchannelList>(
Ref(), std::move(addresses), latest_update_args_.args);
Ref(), addresses, latest_update_args_.args);
// Empty update or no valid subchannels. Put the channel in
// TRANSIENT_FAILURE and request re-resolution.
if (latest_pending_subchannel_list_->size() == 0) {
@ -483,9 +476,7 @@ class AddressFamilyIterator {
absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
if (args.addresses.ok()) {
gpr_log(GPR_INFO,
"Pick First %p received update with %" PRIuPTR " addresses", this,
args.addresses->size());
gpr_log(GPR_INFO, "Pick First %p received update", this);
} else {
gpr_log(GPR_INFO, "Pick First %p received update with address error: %s",
this, args.addresses.status().ToString().c_str());
@ -495,51 +486,59 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
absl::Status status;
if (!args.addresses.ok()) {
status = args.addresses.status();
} else if (args.addresses->empty()) {
status = absl::UnavailableError("address list must not be empty");
} else {
// Shuffle the list if needed.
auto config = static_cast<PickFirstConfig*>(args.config.get());
if (config->shuffle_addresses()) {
absl::c_shuffle(*args.addresses, bit_gen_);
}
// Flatten the list so that we have one address per endpoint.
// While we're iterating, also determine the desired address family
// order and the index of the first element of each family, for use in
// the interleaving below.
std::set<absl::string_view> address_families;
std::vector<AddressFamilyIterator> address_family_order;
EndpointAddressesList endpoints;
for (const auto& endpoint : *args.addresses) {
for (const auto& address : endpoint.addresses()) {
endpoints.emplace_back(address, endpoint.args());
if (IsPickFirstHappyEyeballsEnabled()) {
absl::string_view scheme = GetAddressFamily(address);
bool inserted = address_families.insert(scheme).second;
if (inserted) {
address_family_order.emplace_back(scheme, endpoints.size() - 1);
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
endpoints.push_back(endpoint);
});
if (endpoints.empty()) {
status = absl::UnavailableError("address list must not be empty");
} else {
// Shuffle the list if needed.
auto config = static_cast<PickFirstConfig*>(args.config.get());
if (config->shuffle_addresses()) {
absl::c_shuffle(endpoints, bit_gen_);
}
// Flatten the list so that we have one address per endpoint.
// While we're iterating, also determine the desired address family
// order and the index of the first element of each family, for use in
// the interleaving below.
std::set<absl::string_view> address_families;
std::vector<AddressFamilyIterator> address_family_order;
EndpointAddressesList flattened_endpoints;
for (const auto& endpoint : endpoints) {
for (const auto& address : endpoint.addresses()) {
flattened_endpoints.emplace_back(address, endpoint.args());
if (IsPickFirstHappyEyeballsEnabled()) {
absl::string_view scheme = GetAddressFamily(address);
bool inserted = address_families.insert(scheme).second;
if (inserted) {
address_family_order.emplace_back(scheme,
flattened_endpoints.size() - 1);
}
}
}
}
}
// Interleave addresses as per RFC-8305 section 4.
if (IsPickFirstHappyEyeballsEnabled()) {
EndpointAddressesList interleaved_endpoints;
interleaved_endpoints.reserve(endpoints.size());
std::vector<bool> endpoints_moved(endpoints.size());
size_t scheme_index = 0;
for (size_t i = 0; i < endpoints.size(); ++i) {
EndpointAddresses* endpoint;
do {
auto& iterator = address_family_order[scheme_index++ %
address_family_order.size()];
endpoint = iterator.Next(endpoints, &endpoints_moved);
} while (endpoint == nullptr);
interleaved_endpoints.emplace_back(std::move(*endpoint));
endpoints = std::move(flattened_endpoints);
// Interleave addresses as per RFC-8305 section 4.
if (IsPickFirstHappyEyeballsEnabled()) {
EndpointAddressesList interleaved_endpoints;
interleaved_endpoints.reserve(endpoints.size());
std::vector<bool> endpoints_moved(endpoints.size());
size_t scheme_index = 0;
for (size_t i = 0; i < endpoints.size(); ++i) {
EndpointAddresses* endpoint;
do {
auto& iterator = address_family_order[scheme_index++ %
address_family_order.size()];
endpoint = iterator.Next(endpoints, &endpoints_moved);
} while (endpoint == nullptr);
interleaved_endpoints.emplace_back(std::move(*endpoint));
}
endpoints = std::move(interleaved_endpoints);
}
args.addresses = std::move(interleaved_endpoints);
} else {
args.addresses = std::move(endpoints);
args.addresses =
std::make_shared<EndpointAddressesListIterator>(std::move(endpoints));
}
}
// If the update contains a resolver error and we have a previous update
@ -617,18 +616,20 @@ void PickFirst::HealthWatcher::OnConnectivityStateChange(
//
PickFirst::SubchannelList::SubchannelData::SubchannelData(
SubchannelList* subchannel_list,
SubchannelList* subchannel_list, size_t index,
RefCountedPtr<SubchannelInterface> subchannel)
: subchannel_list_(subchannel_list), subchannel_(std::move(subchannel)) {
: subchannel_list_(subchannel_list),
index_(index),
subchannel_(std::move(subchannel)) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
gpr_log(GPR_INFO,
"[PF %p] subchannel list %p index %" PRIuPTR
" (subchannel %p): starting watch",
subchannel_list_->policy_.get(), subchannel_list_,
subchannel_list_->size(), subchannel_.get());
subchannel_list_->policy_.get(), subchannel_list_, index_,
subchannel_.get());
}
auto watcher = std::make_unique<Watcher>(
this, subchannel_list_->Ref(DEBUG_LOCATION, "Watcher"));
subchannel_list_->Ref(DEBUG_LOCATION, "Watcher"), index_);
pending_watcher_ = watcher.get();
subchannel_->WatchConnectivityState(std::move(watcher));
}
@ -639,7 +640,7 @@ void PickFirst::SubchannelList::SubchannelData::ShutdownLocked() {
gpr_log(GPR_INFO,
"[PF %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
" (subchannel %p): cancelling watch and unreffing subchannel",
subchannel_list_->policy_.get(), subchannel_list_, Index(),
subchannel_list_->policy_.get(), subchannel_list_, index_,
subchannel_list_->size(), subchannel_.get());
}
subchannel_->CancelConnectivityStateWatch(pending_watcher_);
@ -659,7 +660,7 @@ void PickFirst::SubchannelList::SubchannelData::OnConnectivityStateChange(
"status=%s, shutting_down=%d, pending_watcher=%p, "
"seen_transient_failure=%d, p->selected_=%p, "
"p->subchannel_list_=%p, p->latest_pending_subchannel_list_=%p",
p, subchannel_list_, Index(), subchannel_list_->size(),
p, subchannel_list_, index_, subchannel_list_->size(),
subchannel_.get(),
(connectivity_state_.has_value()
? ConnectivityStateName(*connectivity_state_)
@ -771,7 +772,7 @@ void PickFirst::SubchannelList::SubchannelData::OnConnectivityStateChange(
if (!IsPickFirstHappyEyeballsEnabled()) {
// Ignore any other updates for subchannels we're not currently trying to
// connect to.
if (Index() != subchannel_list_->attempting_index_) return;
if (index_ != subchannel_list_->attempting_index_) return;
// React to the connectivity state.
ReactToConnectivityStateLocked();
return;
@ -784,7 +785,7 @@ void PickFirst::SubchannelList::SubchannelData::OnConnectivityStateChange(
if (!prev_seen_transient_failure && seen_transient_failure_) {
// If a connection attempt fails before the timer fires, then
// cancel the timer and start connecting on the next subchannel.
if (Index() == subchannel_list_->attempting_index_) {
if (index_ == subchannel_list_->attempting_index_) {
if (subchannel_list_->timer_handle_.has_value()) {
p->channel_control_helper()->GetEventEngine()->Cancel(
*subchannel_list_->timer_handle_);
@ -858,7 +859,7 @@ void PickFirst::SubchannelList::SubchannelData::
// We skip subchannels in state TRANSIENT_FAILURE to avoid a
// large recursion that could overflow the stack.
SubchannelData* found_subchannel = nullptr;
for (size_t next_index = Index() + 1;
for (size_t next_index = index_ + 1;
next_index < subchannel_list_->size(); ++next_index) {
SubchannelData* sc = &subchannel_list_->subchannels_[next_index];
GPR_ASSERT(sc->connectivity_state_.has_value());
@ -946,14 +947,14 @@ void PickFirst::SubchannelList::SubchannelData::RequestConnectionWithTimer() {
GPR_ASSERT(connectivity_state_ == GRPC_CHANNEL_CONNECTING);
}
// If this is not the last subchannel in the list, start the timer.
if (Index() != subchannel_list_->size() - 1) {
if (index_ != subchannel_list_->size() - 1) {
PickFirst* p = subchannel_list_->policy_.get();
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
gpr_log(GPR_INFO,
"Pick First %p subchannel list %p: starting Connection "
"Attempt Delay timer for %" PRId64 "ms for index %" PRIuPTR,
p, subchannel_list_, p->connection_attempt_delay_.millis(),
Index());
index_);
}
subchannel_list_->timer_handle_ =
p->channel_control_helper()->GetEventEngine()->RunAfter(
@ -1041,7 +1042,7 @@ void PickFirst::SubchannelList::SubchannelData::ProcessUnselectedReadyLocked() {
}
// Unref all other subchannels in the list.
for (size_t i = 0; i < subchannel_list_->size(); ++i) {
if (i != Index()) {
if (i != index_) {
subchannel_list_->subchannels_[i].ShutdownLocked();
}
}
@ -1052,7 +1053,7 @@ void PickFirst::SubchannelList::SubchannelData::ProcessUnselectedReadyLocked() {
//
PickFirst::SubchannelList::SubchannelList(RefCountedPtr<PickFirst> policy,
EndpointAddressesList addresses,
EndpointAddressesIterator* addresses,
const ChannelArgs& args)
: InternallyRefCounted<SubchannelList>(
GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace) ? "SubchannelList"
@ -1062,14 +1063,12 @@ PickFirst::SubchannelList::SubchannelList(RefCountedPtr<PickFirst> policy,
.Remove(
GRPC_ARG_INTERNAL_PICK_FIRST_OMIT_STATUS_MESSAGE_PREFIX)) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
gpr_log(GPR_INFO,
"[PF %p] Creating subchannel list %p for %" PRIuPTR
" subchannels - channel args: %s",
policy_.get(), this, addresses.size(), args_.ToString().c_str());
gpr_log(GPR_INFO, "[PF %p] Creating subchannel list %p - channel args: %s",
policy_.get(), this, args_.ToString().c_str());
}
subchannels_.reserve(addresses.size());
if (addresses == nullptr) return;
// Create a subchannel for each address.
for (const EndpointAddresses& address : addresses) {
addresses->ForEach([&](const EndpointAddresses& address) {
GPR_ASSERT(address.addresses().size() == 1);
RefCountedPtr<SubchannelInterface> subchannel =
policy_->channel_control_helper()->CreateSubchannel(
@ -1081,7 +1080,7 @@ PickFirst::SubchannelList::SubchannelList(RefCountedPtr<PickFirst> policy,
"[PF %p] could not create subchannel for address %s, ignoring",
policy_.get(), address.ToString().c_str());
}
continue;
return;
}
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
gpr_log(GPR_INFO,
@ -1090,8 +1089,8 @@ PickFirst::SubchannelList::SubchannelList(RefCountedPtr<PickFirst> policy,
policy_.get(), this, subchannels_.size(), subchannel.get(),
address.ToString().c_str());
}
subchannels_.emplace_back(this, std::move(subchannel));
}
subchannels_.emplace_back(this, subchannels_.size(), std::move(subchannel));
});
}
PickFirst::SubchannelList::~SubchannelList() {

@ -684,7 +684,8 @@ absl::Status PriorityLb::ChildPriority::UpdateLocked(
if (priority_policy_->addresses_.ok()) {
auto it = priority_policy_->addresses_->find(name_);
if (it == priority_policy_->addresses_->end()) {
update_args.addresses.emplace();
update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
EndpointAddressesList());
} else {
update_args.addresses = it->second;
}

@ -554,7 +554,8 @@ void RingHash::RingHashEndpoint::UpdateChildPolicyLocked() {
GPR_ASSERT(config.ok());
// Update child policy.
LoadBalancingPolicy::UpdateArgs update_args;
update_args.addresses.emplace().emplace_back(ring_hash_->endpoints_[index_]);
update_args.addresses =
std::make_shared<SingleEndpointIterator>(ring_hash_->endpoints_[index_]);
update_args.args = ring_hash_->args_;
update_args.config = std::move(*config);
// TODO(roth): If the child reports a non-OK status with the update,
@ -622,18 +623,14 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) {
// Check address list.
if (args.addresses.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
gpr_log(GPR_INFO, "[RH %p] received update with %" PRIuPTR " addresses",
this, args.addresses->size());
gpr_log(GPR_INFO, "[RH %p] received update", this);
}
// De-dup endpoints, taking weight into account.
endpoints_.clear();
endpoints_.reserve(args.addresses->size());
std::map<EndpointAddressSet, size_t> endpoint_indices;
size_t num_skipped = 0;
for (size_t i = 0; i < args.addresses->size(); ++i) {
EndpointAddresses& endpoint = (*args.addresses)[i];
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
const EndpointAddressSet key(endpoint.addresses());
auto p = endpoint_indices.emplace(key, i - num_skipped);
auto p = endpoint_indices.emplace(key, endpoints_.size());
if (!p.second) {
// Duplicate endpoint. Combine weights and skip the dup.
EndpointAddresses& prev_endpoint = endpoints_[p.first->second];
@ -651,11 +648,10 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) {
prev_endpoint.addresses(),
prev_endpoint.args().Set(GRPC_ARG_ADDRESS_WEIGHT,
weight_arg + prev_weight_arg));
++num_skipped;
} else {
endpoints_.push_back(std::move(endpoint));
endpoints_.push_back(endpoint);
}
}
});
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
gpr_log(GPR_INFO, "[RH %p] received update with addresses error: %s",

@ -707,7 +707,7 @@ class RlsLb : public LoadBalancingPolicy {
OrphanablePtr<RlsChannel> rls_channel_ ABSL_GUARDED_BY(mu_);
// Accessed only from within WorkSerializer.
absl::StatusOr<EndpointAddressesList> addresses_;
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses_;
ChannelArgs channel_args_;
RefCountedPtr<RlsLbConfig> config_;
RefCountedPtr<ChildPolicyWrapper> default_child_policy_;
@ -1858,6 +1858,27 @@ RlsLb::RlsLb(Args args) : LoadBalancingPolicy(std::move(args)), cache_(this) {
}
}
bool EndpointsEqual(
const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> endpoints1,
const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>
endpoints2) {
if (endpoints1.status() != endpoints2.status()) return false;
if (endpoints1.ok()) {
std::vector<EndpointAddresses> e1_list;
(*endpoints1)->ForEach([&](const EndpointAddresses& endpoint) {
e1_list.push_back(endpoint);
});
size_t i = 0;
bool different = false;
(*endpoints2)->ForEach([&](const EndpointAddresses& endpoint) {
if (endpoint != e1_list[i++]) different = true;
});
if (different) return false;
if (i != e1_list.size()) return false;
}
return true;
}
absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
gpr_log(GPR_INFO, "[rlslb %p] policy updated", this);
@ -1875,7 +1896,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
// Swap out addresses.
// If the new address list is an error and we have an existing address list,
// stick with the existing addresses.
absl::StatusOr<EndpointAddressesList> old_addresses;
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> old_addresses;
if (args.addresses.ok()) {
old_addresses = std::move(addresses_);
addresses_ = std::move(args.addresses);
@ -1888,7 +1909,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
bool update_child_policies =
old_config == nullptr ||
old_config->child_policy_config() != config_->child_policy_config() ||
old_addresses != addresses_ || args.args != channel_args_;
!EndpointsEqual(old_addresses, addresses_) || args.args != channel_args_;
// If default target changes, swap out child policy.
bool created_default_child = false;
if (old_config == nullptr ||

@ -125,14 +125,14 @@ class OldRoundRobin : public LoadBalancingPolicy {
: public SubchannelList<RoundRobinSubchannelList,
RoundRobinSubchannelData> {
public:
RoundRobinSubchannelList(OldRoundRobin* policy, ServerAddressList addresses,
RoundRobinSubchannelList(OldRoundRobin* policy,
EndpointAddressesIterator* addresses,
const ChannelArgs& args)
: SubchannelList(policy,
(GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)
? "RoundRobinSubchannelList"
: nullptr),
std::move(addresses), policy->channel_control_helper(),
args) {
addresses, policy->channel_control_helper(), args) {
// Need to maintain a ref to the LB policy as long as we maintain
// any references to subchannels, since the subchannels'
// pollset_sets will include the LB policy's pollset_set.
@ -277,13 +277,12 @@ void OldRoundRobin::ResetBackoffLocked() {
}
absl::Status OldRoundRobin::UpdateLocked(UpdateArgs args) {
ServerAddressList addresses;
EndpointAddressesIterator* addresses = nullptr;
if (args.addresses.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " addresses",
this, args.addresses->size());
gpr_log(GPR_INFO, "[RR %p] received update", this);
}
addresses = std::move(*args.addresses);
addresses = args.addresses->get();
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
@ -299,8 +298,8 @@ absl::Status OldRoundRobin::UpdateLocked(UpdateArgs args) {
gpr_log(GPR_INFO, "[RR %p] replacing previous pending subchannel list %p",
this, latest_pending_subchannel_list_.get());
}
latest_pending_subchannel_list_ = MakeRefCounted<RoundRobinSubchannelList>(
this, std::move(addresses), args.args);
latest_pending_subchannel_list_ =
MakeRefCounted<RoundRobinSubchannelList>(this, addresses, args.args);
latest_pending_subchannel_list_->StartWatchingLocked(args.args);
// If the new list is empty, immediately promote it to
// subchannel_list_ and report TRANSIENT_FAILURE.
@ -524,7 +523,7 @@ class RoundRobin : public LoadBalancingPolicy {
class RoundRobinEndpointList : public EndpointList {
public:
RoundRobinEndpointList(RefCountedPtr<RoundRobin> round_robin,
const EndpointAddressesList& endpoints,
EndpointAddressesIterator* endpoints,
const ChannelArgs& args)
: EndpointList(std::move(round_robin),
GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)
@ -687,13 +686,12 @@ void RoundRobin::ResetBackoffLocked() {
}
absl::Status RoundRobin::UpdateLocked(UpdateArgs args) {
EndpointAddressesList addresses;
EndpointAddressesIterator* addresses = nullptr;
if (args.addresses.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " endpoints",
this, args.addresses->size());
gpr_log(GPR_INFO, "[RR %p] received update", this);
}
addresses = std::move(*args.addresses);
addresses = args.addresses->get();
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
@ -710,8 +708,7 @@ absl::Status RoundRobin::UpdateLocked(UpdateArgs args) {
latest_pending_endpoint_list_.get());
}
latest_pending_endpoint_list_ = MakeOrphanable<RoundRobinEndpointList>(
Ref(DEBUG_LOCATION, "RoundRobinEndpointList"), std::move(addresses),
args.args);
Ref(DEBUG_LOCATION, "RoundRobinEndpointList"), addresses, args.args);
// If the new list is empty, immediately promote it to
// endpoint_list_ and report TRANSIENT_FAILURE.
if (latest_pending_endpoint_list_->size() == 0) {

@ -42,6 +42,7 @@
#include "src/core/lib/iomgr/iomgr_fwd.h"
#include "src/core/lib/load_balancing/lb_policy.h"
#include "src/core/lib/load_balancing/subchannel_interface.h"
#include "src/core/lib/resolver/endpoint_addresses.h"
#include "src/core/lib/resolver/server_address.h"
#include "src/core/lib/transport/connectivity_state.h"
@ -208,7 +209,7 @@ class SubchannelList : public DualRefCounted<SubchannelListType> {
protected:
SubchannelList(LoadBalancingPolicy* policy, const char* tracer,
ServerAddressList addresses,
EndpointAddressesIterator* addresses,
LoadBalancingPolicy::ChannelControlHelper* helper,
const ChannelArgs& args);
@ -365,19 +366,18 @@ void SubchannelData<SubchannelListType, SubchannelDataType>::ShutdownLocked() {
template <typename SubchannelListType, typename SubchannelDataType>
SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
LoadBalancingPolicy* policy, const char* tracer,
ServerAddressList addresses,
EndpointAddressesIterator* addresses,
LoadBalancingPolicy::ChannelControlHelper* helper, const ChannelArgs& args)
: DualRefCounted<SubchannelListType>(tracer),
policy_(policy),
tracer_(tracer) {
if (GPR_UNLIKELY(tracer_ != nullptr)) {
gpr_log(GPR_INFO,
"[%s %p] Creating subchannel list %p for %" PRIuPTR " subchannels",
tracer_, policy, this, addresses.size());
gpr_log(GPR_INFO, "[%s %p] Creating subchannel list %p", tracer_, policy,
this);
}
subchannels_.reserve(addresses.size());
if (addresses == nullptr) return;
// Create a subchannel for each address.
for (ServerAddress address : addresses) {
addresses->ForEach([&](const EndpointAddresses& address) {
RefCountedPtr<SubchannelInterface> subchannel =
helper->CreateSubchannel(address.address(), address.args(), args);
if (subchannel == nullptr) {
@ -387,7 +387,7 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
"[%s %p] could not create subchannel for address %s, ignoring",
tracer_, policy_, address.ToString().c_str());
}
continue;
return;
}
if (GPR_UNLIKELY(tracer_ != nullptr)) {
gpr_log(GPR_INFO,
@ -397,8 +397,8 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
address.ToString().c_str());
}
subchannels_.emplace_back();
subchannels_.back().Init(this, std::move(address), std::move(subchannel));
}
subchannels_.back().Init(this, address, std::move(subchannel));
});
}
template <typename SubchannelListType, typename SubchannelDataType>

@ -247,14 +247,13 @@ class OldWeightedRoundRobin : public LoadBalancingPolicy {
WeightedRoundRobinSubchannelData> {
public:
WeightedRoundRobinSubchannelList(OldWeightedRoundRobin* policy,
ServerAddressList addresses,
EndpointAddressesIterator* addresses,
const ChannelArgs& args)
: SubchannelList(policy,
(GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)
? "WeightedRoundRobinSubchannelList"
: nullptr),
std::move(addresses), policy->channel_control_helper(),
args) {
addresses, policy->channel_control_helper(), args) {
// Need to maintain a ref to the LB policy as long as we maintain
// any references to subchannels, since the subchannels'
// pollset_sets will include the LB policy's pollset_set.
@ -675,11 +674,10 @@ void OldWeightedRoundRobin::ResetBackoffLocked() {
absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
global_stats().IncrementWrrUpdates();
config_ = std::move(args.config);
ServerAddressList addresses;
std::shared_ptr<EndpointAddressesIterator> addresses;
if (args.addresses.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
gpr_log(GPR_INFO, "[WRR %p] received update with %" PRIuPTR " addresses",
this, args.addresses->size());
gpr_log(GPR_INFO, "[WRR %p] received update", this);
}
// Weed out duplicate addresses. Also sort the addresses so that if
// the set of the addresses don't change, their indexes in the
@ -698,10 +696,12 @@ absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
return memcmp(addr1.addr, addr2.addr, addr1.len) < 0;
}
};
std::set<ServerAddress, AddressLessThan> ordered_addresses(
args.addresses->begin(), args.addresses->end());
addresses =
ServerAddressList(ordered_addresses.begin(), ordered_addresses.end());
std::set<ServerAddress, AddressLessThan> ordered_addresses;
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
ordered_addresses.insert(endpoint);
});
addresses = std::make_shared<EndpointAddressesListIterator>(
ServerAddressList(ordered_addresses.begin(), ordered_addresses.end()));
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
gpr_log(GPR_INFO, "[WRR %p] received update with address error: %s", this,
@ -718,8 +718,8 @@ absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
this, latest_pending_subchannel_list_.get());
}
latest_pending_subchannel_list_ =
MakeRefCounted<WeightedRoundRobinSubchannelList>(
this, std::move(addresses), args.args);
MakeRefCounted<WeightedRoundRobinSubchannelList>(this, addresses.get(),
args.args);
latest_pending_subchannel_list_->StartWatchingLocked(args.args);
// If the new list is empty, immediately promote it to
// subchannel_list_ and report TRANSIENT_FAILURE.
@ -1079,7 +1079,7 @@ class WeightedRoundRobin : public LoadBalancingPolicy {
};
WrrEndpointList(RefCountedPtr<WeightedRoundRobin> wrr,
const EndpointAddressesList& endpoints,
EndpointAddressesIterator* endpoints,
const ChannelArgs& args)
: EndpointList(std::move(wrr),
GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)
@ -1516,11 +1516,10 @@ void WeightedRoundRobin::ResetBackoffLocked() {
absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
global_stats().IncrementWrrUpdates();
config_ = std::move(args.config);
EndpointAddressesList addresses;
std::shared_ptr<EndpointAddressesIterator> addresses;
if (args.addresses.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
gpr_log(GPR_INFO, "[WRR %p] received update with %" PRIuPTR " addresses",
this, args.addresses->size());
gpr_log(GPR_INFO, "[WRR %p] received update", this);
}
// Weed out duplicate endpoints. Also sort the endpoints so that if
// the set of endpoints doesn't change, their indexes in the endpoint
@ -1539,10 +1538,13 @@ absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
return e1 < e2;
}
};
std::set<EndpointAddresses, EndpointAddressesLessThan> ordered_addresses(
args.addresses->begin(), args.addresses->end());
addresses = EndpointAddressesList(ordered_addresses.begin(),
ordered_addresses.end());
std::set<EndpointAddresses, EndpointAddressesLessThan> ordered_addresses;
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
ordered_addresses.insert(endpoint);
});
addresses =
std::make_shared<EndpointAddressesListIterator>(EndpointAddressesList(
ordered_addresses.begin(), ordered_addresses.end()));
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
gpr_log(GPR_INFO, "[WRR %p] received update with address error: %s", this,
@ -1559,7 +1561,7 @@ absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
this, latest_pending_endpoint_list_.get());
}
latest_pending_endpoint_list_ =
MakeOrphanable<WrrEndpointList>(Ref(), std::move(addresses), args.args);
MakeOrphanable<WrrEndpointList>(Ref(), addresses.get(), args.args);
// If the new list is empty, immediately promote it to
// endpoint_list_ and report TRANSIENT_FAILURE.
if (latest_pending_endpoint_list_->size() == 0) {

@ -157,10 +157,10 @@ class WeightedTargetLb : public LoadBalancingPolicy {
void Orphan() override;
absl::Status UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config,
absl::StatusOr<EndpointAddressesList> addresses,
const std::string& resolution_note,
const ChannelArgs& args);
absl::Status UpdateLocked(
const WeightedTargetLbConfig::ChildConfig& config,
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
const std::string& resolution_note, const ChannelArgs& args);
void ResetBackoffLocked();
void DeactivateLocked();
@ -338,11 +338,12 @@ absl::Status WeightedTargetLb::UpdateLocked(UpdateArgs args) {
target = MakeOrphanable<WeightedChild>(
Ref(DEBUG_LOCATION, "WeightedChild"), name);
}
absl::StatusOr<EndpointAddressesList> addresses;
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses;
if (address_map.ok()) {
auto it = address_map->find(name);
if (it == address_map->end()) {
addresses.emplace();
addresses = std::make_shared<EndpointAddressesListIterator>(
EndpointAddressesList());
} else {
addresses = std::move(it->second);
}
@ -589,7 +590,7 @@ WeightedTargetLb::WeightedChild::CreateChildPolicyLocked(
absl::Status WeightedTargetLb::WeightedChild::UpdateLocked(
const WeightedTargetLbConfig::ChildConfig& config,
absl::StatusOr<EndpointAddressesList> addresses,
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
const std::string& resolution_note, const ChannelArgs& args) {
if (weighted_target_policy_->shutting_down_) return absl::OkStatus();
// Update child weight.

@ -199,8 +199,21 @@ class CdsLb : public LoadBalancingPolicy {
// The root of the tree is config_->cluster().
std::map<std::string, WatcherState> watchers_;
// TODO(roth, yashkt): These are here because XdsCertificateProvider
// does not store the actual underlying cert providers, it stores only
// their distributors, so we need to hold a ref to the cert providers
// here. However, in the aggregate cluster case, there may be multiple
// clusters in the same cert provider, and we're only tracking the cert
// providers for the most recent underlying cluster here. This is
// clearly a bug, and I think it will cause us to stop getting updates
// for all but one of the cert providers in the aggregate cluster
// case. Need to figure out the right way to fix this -- I don't
// think we want to store another map here, so ideally, we should just
// have XdsCertificateProvider actually hold the refs to the cert
// providers instead of just the distributors.
RefCountedPtr<grpc_tls_certificate_provider> root_certificate_provider_;
RefCountedPtr<grpc_tls_certificate_provider> identity_certificate_provider_;
RefCountedPtr<XdsCertificateProvider> xds_certificate_provider_;
// Child LB policy.
@ -594,20 +607,7 @@ absl::Status CdsLb::UpdateXdsCertificateProvider(
root_provider_instance_name, "\" not recognized."));
}
}
if (root_certificate_provider_ != new_root_provider) {
if (root_certificate_provider_ != nullptr &&
root_certificate_provider_->interested_parties() != nullptr) {
grpc_pollset_set_del_pollset_set(
interested_parties(),
root_certificate_provider_->interested_parties());
}
if (new_root_provider != nullptr &&
new_root_provider->interested_parties() != nullptr) {
grpc_pollset_set_add_pollset_set(interested_parties(),
new_root_provider->interested_parties());
}
root_certificate_provider_ = std::move(new_root_provider);
}
root_certificate_provider_ = std::move(new_root_provider);
xds_certificate_provider_->UpdateRootCertNameAndDistributor(
cluster_name, root_provider_cert_name,
root_certificate_provider_ == nullptr
@ -631,20 +631,7 @@ absl::Status CdsLb::UpdateXdsCertificateProvider(
identity_provider_instance_name, "\" not recognized."));
}
}
if (identity_certificate_provider_ != new_identity_provider) {
if (identity_certificate_provider_ != nullptr &&
identity_certificate_provider_->interested_parties() != nullptr) {
grpc_pollset_set_del_pollset_set(
interested_parties(),
identity_certificate_provider_->interested_parties());
}
if (new_identity_provider != nullptr &&
new_identity_provider->interested_parties() != nullptr) {
grpc_pollset_set_add_pollset_set(
interested_parties(), new_identity_provider->interested_parties());
}
identity_certificate_provider_ = std::move(new_identity_provider);
}
identity_certificate_provider_ = std::move(new_identity_provider);
xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
cluster_name, identity_provider_cert_name,
identity_certificate_provider_ == nullptr

@ -250,7 +250,7 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
const ChannelArgs& args);
absl::Status UpdateChildPolicyLocked(
absl::StatusOr<EndpointAddressesList> addresses,
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
std::string resolution_note, const ChannelArgs& args);
void MaybeUpdatePickerLocked();
@ -569,7 +569,7 @@ OrphanablePtr<LoadBalancingPolicy> XdsClusterImplLb::CreateChildPolicyLocked(
}
absl::Status XdsClusterImplLb::UpdateChildPolicyLocked(
absl::StatusOr<EndpointAddressesList> addresses,
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
std::string resolution_note, const ChannelArgs& args) {
// Create policy if needed.
if (child_policy_ == nullptr) {

@ -149,7 +149,8 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
absl::Status UpdateLocked(
RefCountedPtr<LoadBalancingPolicy::Config> config,
const absl::StatusOr<EndpointAddressesList>& addresses,
const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>&
addresses,
const ChannelArgs& args);
void ExitIdleLocked();
void ResetBackoffLocked();
@ -482,7 +483,7 @@ XdsClusterManagerLb::ClusterChild::CreateChildPolicyLocked(
absl::Status XdsClusterManagerLb::ClusterChild::UpdateLocked(
RefCountedPtr<LoadBalancingPolicy::Config> config,
const absl::StatusOr<EndpointAddressesList>& addresses,
const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>& addresses,
const ChannelArgs& args) {
if (xds_cluster_manager_policy_->shutting_down_) return absl::OkStatus();
// Update child weight.

@ -28,6 +28,7 @@
#include <utility>
#include <vector>
#include "absl/functional/function_ref.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
@ -61,6 +62,7 @@
#include "src/core/lib/gprpp/validation_errors.h"
#include "src/core/lib/gprpp/work_serializer.h"
#include "src/core/lib/iomgr/pollset_set.h"
#include "src/core/lib/iomgr/resolved_address.h"
#include "src/core/lib/json/json.h"
#include "src/core/lib/json/json_args.h"
#include "src/core/lib/json/json_object_loader.h"
@ -390,7 +392,7 @@ class XdsClusterResolverLb : public LoadBalancingPolicy {
absl::Status UpdateChildPolicyLocked();
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
const ChannelArgs& args);
EndpointAddressesList CreateChildPolicyAddressesLocked();
std::shared_ptr<EndpointAddressesIterator> CreateChildPolicyAddressesLocked();
std::string CreateChildPolicyResolutionNoteLocked();
RefCountedPtr<Config> CreateChildPolicyConfigLocked();
ChannelArgs CreateChildPolicyArgsLocked(const ChannelArgs& args_in);
@ -529,10 +531,16 @@ XdsClusterResolverLb::DiscoveryMechanismEntry::config() const {
->config_->discovery_mechanisms()[discovery_mechanism->index()];
}
std::string MakeChildPolicyName(absl::string_view cluster_name,
size_t child_number) {
return absl::StrCat("{cluster=", cluster_name,
", child_number=", child_number, "}");
}
std::string XdsClusterResolverLb::DiscoveryMechanismEntry::GetChildPolicyName(
size_t priority) const {
return absl::StrCat("{cluster=", config().cluster_name,
", child_number=", priority_child_numbers[priority], "}");
return MakeChildPolicyName(config().cluster_name,
priority_child_numbers[priority]);
}
//
@ -768,39 +776,76 @@ void XdsClusterResolverLb::OnResourceDoesNotExist(size_t index,
// child policy-related methods
//
EndpointAddressesList XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
EndpointAddressesList addresses;
for (const auto& discovery_entry : discovery_mechanisms_) {
const auto& priority_list =
GetUpdatePriorityList(*discovery_entry.latest_update);
for (size_t priority = 0; priority < priority_list.size(); ++priority) {
const auto& priority_entry = priority_list[priority];
std::string priority_child_name =
discovery_entry.GetChildPolicyName(priority);
for (const auto& p : priority_entry.localities) {
const auto& locality_name = p.first;
const auto& locality = p.second;
std::vector<RefCountedStringValue> hierarchical_path = {
RefCountedStringValue(priority_child_name),
RefCountedStringValue(locality_name->AsHumanReadableString())};
auto hierarchical_path_attr =
MakeRefCounted<HierarchicalPathArg>(std::move(hierarchical_path));
for (const auto& endpoint : locality.endpoints) {
uint32_t endpoint_weight =
locality.lb_weight *
endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT).value_or(1);
addresses.emplace_back(
endpoint.addresses(),
endpoint.args()
.SetObject(hierarchical_path_attr)
.Set(GRPC_ARG_ADDRESS_WEIGHT, endpoint_weight)
.SetObject(locality_name->Ref())
.Set(GRPC_ARG_XDS_LOCALITY_WEIGHT, locality.lb_weight));
class PriorityEndpointIterator : public EndpointAddressesIterator {
public:
struct DiscoveryMechanismResult {
std::shared_ptr<const XdsEndpointResource> update;
std::string cluster_name;
std::vector<size_t /*child_number*/> priority_child_numbers;
DiscoveryMechanismResult(
std::shared_ptr<const XdsEndpointResource> resource,
std::string cluster, std::vector<size_t> child_numbers)
: update(std::move(resource)),
cluster_name(std::move(cluster)),
priority_child_numbers(std::move(child_numbers)) {}
std::string GetChildPolicyName(size_t priority) const {
return MakeChildPolicyName(cluster_name,
priority_child_numbers[priority]);
}
};
explicit PriorityEndpointIterator(
std::vector<DiscoveryMechanismResult> results)
: results_(std::move(results)) {}
void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
const override {
for (const auto& entry : results_) {
const auto& priority_list = GetUpdatePriorityList(*entry.update);
for (size_t priority = 0; priority < priority_list.size(); ++priority) {
const auto& priority_entry = priority_list[priority];
std::string priority_child_name = entry.GetChildPolicyName(priority);
for (const auto& p : priority_entry.localities) {
const auto& locality_name = p.first;
const auto& locality = p.second;
std::vector<RefCountedStringValue> hierarchical_path = {
RefCountedStringValue(priority_child_name),
RefCountedStringValue(locality_name->AsHumanReadableString())};
auto hierarchical_path_attr =
MakeRefCounted<HierarchicalPathArg>(std::move(hierarchical_path));
for (const auto& endpoint : locality.endpoints) {
uint32_t endpoint_weight =
locality.lb_weight *
endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT).value_or(1);
callback(EndpointAddresses(
endpoint.addresses(),
endpoint.args()
.SetObject(hierarchical_path_attr)
.Set(GRPC_ARG_ADDRESS_WEIGHT, endpoint_weight)
.SetObject(locality_name->Ref())
.Set(GRPC_ARG_XDS_LOCALITY_WEIGHT, locality.lb_weight)));
}
}
}
}
}
return addresses;
private:
std::vector<DiscoveryMechanismResult> results_;
};
std::shared_ptr<EndpointAddressesIterator>
XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
std::vector<PriorityEndpointIterator::DiscoveryMechanismResult> entries;
entries.reserve(discovery_mechanisms_.size());
for (const auto& discovery_entry : discovery_mechanisms_) {
entries.emplace_back(discovery_entry.latest_update,
discovery_entry.config().cluster_name,
discovery_entry.priority_child_numbers);
}
return std::make_shared<PriorityEndpointIterator>(std::move(entries));
}
std::string XdsClusterResolverLb::CreateChildPolicyResolutionNoteLocked() {

@ -18,7 +18,6 @@
#include "src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h"
#include <inttypes.h>
#include <stddef.h>
#include <algorithm>
@ -34,6 +33,7 @@
#include <vector>
#include "absl/base/thread_annotations.h"
#include "absl/functional/function_ref.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
@ -300,8 +300,7 @@ class XdsOverrideHostLb : public LoadBalancingPolicy {
void MaybeUpdatePickerLocked();
absl::StatusOr<EndpointAddressesList> UpdateAddressMap(
absl::StatusOr<EndpointAddressesList> endpoints);
void UpdateAddressMap(const EndpointAddressesIterator& endpoints);
RefCountedPtr<SubchannelWrapper> AdoptSubchannel(
const grpc_resolved_address& address,
@ -508,12 +507,36 @@ void XdsOverrideHostLb::ResetBackoffLocked() {
if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
}
// Wraps the endpoint iterator and filters out endpoints in state DRAINING.
class ChildEndpointIterator : public EndpointAddressesIterator {
public:
explicit ChildEndpointIterator(
std::shared_ptr<EndpointAddressesIterator> parent_it)
: parent_it_(std::move(parent_it)) {}
void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
const override {
parent_it_->ForEach([&](const EndpointAddresses& endpoint) {
XdsHealthStatus status = GetEndpointHealthStatus(endpoint);
if (status.status() != XdsHealthStatus::kDraining) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO,
"[xds_override_host_lb %p] endpoint %s: not draining, "
"passing to child",
this, endpoint.ToString().c_str());
}
callback(endpoint);
}
});
}
private:
std::shared_ptr<EndpointAddressesIterator> parent_it_;
};
absl::Status XdsOverrideHostLb::UpdateLocked(UpdateArgs args) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO,
"[xds_override_host_lb %p] Received update with %" PRIuPTR
" addresses",
this, args.addresses.ok() ? args.addresses->size() : 0);
gpr_log(GPR_INFO, "[xds_override_host_lb %p] Received update", this);
}
auto old_config = std::move(config_);
// Update config.
@ -521,13 +544,24 @@ absl::Status XdsOverrideHostLb::UpdateLocked(UpdateArgs args) {
if (config_ == nullptr) {
return absl::InvalidArgumentError("Missing policy config");
}
// Update address map and wrap endpoint iterator for child policy.
if (args.addresses.ok()) {
UpdateAddressMap(**args.addresses);
args.addresses =
std::make_shared<ChildEndpointIterator>(std::move(*args.addresses));
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO, "[xds_override_host_lb %p] address error: %s", this,
args.addresses.status().ToString().c_str());
}
}
// Create child policy if needed.
if (child_policy_ == nullptr) {
child_policy_ = CreateChildPolicyLocked(args.args);
}
// Update child policy.
UpdateArgs update_args;
update_args.addresses = UpdateAddressMap(std::move(args.addresses));
update_args.addresses = std::move(args.addresses);
update_args.resolution_note = std::move(args.resolution_note);
update_args.config = config_->child_config();
update_args.args = std::move(args.args);
@ -578,18 +612,9 @@ OrphanablePtr<LoadBalancingPolicy> XdsOverrideHostLb::CreateChildPolicyLocked(
return lb_policy;
}
absl::StatusOr<EndpointAddressesList> XdsOverrideHostLb::UpdateAddressMap(
absl::StatusOr<EndpointAddressesList> endpoints) {
if (!endpoints.ok()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO, "[xds_override_host_lb %p] address error: %s", this,
endpoints.status().ToString().c_str());
}
return endpoints;
}
// Construct the list of addresses to pass to the child policy and a
// map of address info from which to update subchannel_map_.
EndpointAddressesList child_addresses;
void XdsOverrideHostLb::UpdateAddressMap(
const EndpointAddressesIterator& endpoints) {
// Construct a map of address info from which to update subchannel_map_.
struct AddressInfo {
XdsHealthStatus eds_health_status;
RefCountedStringValue address_list;
@ -597,25 +622,18 @@ absl::StatusOr<EndpointAddressesList> XdsOverrideHostLb::UpdateAddressMap(
: eds_health_status(status), address_list(std::move(addresses)) {}
};
std::map<const std::string, AddressInfo> addresses_for_map;
for (const auto& endpoint : *endpoints) {
endpoints.ForEach([&](const EndpointAddresses& endpoint) {
XdsHealthStatus status = GetEndpointHealthStatus(endpoint);
if (status.status() != XdsHealthStatus::kDraining) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO,
"[xds_override_host_lb %p] endpoint %s: not draining, "
"passing to child",
this, endpoint.ToString().c_str());
}
child_addresses.push_back(endpoint);
} else if (!config_->override_host_status_set().Contains(status)) {
// Skip draining hosts if not in the override status set.
// Skip draining hosts if not in the override status set.
if (status.status() == XdsHealthStatus::kDraining &&
!config_->override_host_status_set().Contains(status)) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
gpr_log(GPR_INFO,
"[xds_override_host_lb %p] endpoint %s: draining but not in "
"override_host_status set -- ignoring",
this, endpoint.ToString().c_str());
}
continue;
return;
}
std::vector<std::string> addresses;
addresses.reserve(endpoint.addresses().size());
@ -641,7 +659,7 @@ absl::StatusOr<EndpointAddressesList> XdsOverrideHostLb::UpdateAddressMap(
std::piecewise_construct, std::forward_as_tuple(addresses[i]),
std::forward_as_tuple(status, std::move(address_list)));
}
}
});
// Now grab the lock and update subchannel_map_ from addresses_for_map.
{
MutexLock lock(&subchannel_map_mu_);
@ -688,7 +706,6 @@ absl::StatusOr<EndpointAddressesList> XdsOverrideHostLb::UpdateAddressMap(
it->second.set_address_list(std::move(address_info.address_list));
}
}
return child_addresses;
}
RefCountedPtr<XdsOverrideHostLb::SubchannelWrapper>

@ -21,7 +21,6 @@
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
@ -170,10 +169,10 @@ absl::Status XdsWrrLocalityLb::UpdateLocked(UpdateArgs args) {
// Scan the addresses to find the weight for each locality.
std::map<std::string, uint32_t> locality_weights;
if (args.addresses.ok()) {
for (const auto& address : *args.addresses) {
auto* locality_name = address.args().GetObject<XdsLocalityName>();
(*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
auto* locality_name = endpoint.args().GetObject<XdsLocalityName>();
uint32_t weight =
address.args().GetInt(GRPC_ARG_XDS_LOCALITY_WEIGHT).value_or(0);
endpoint.args().GetInt(GRPC_ARG_XDS_LOCALITY_WEIGHT).value_or(0);
if (locality_name != nullptr && weight > 0) {
auto p = locality_weights.emplace(
locality_name->AsHumanReadableString(), weight);
@ -184,7 +183,7 @@ absl::Status XdsWrrLocalityLb::UpdateLocked(UpdateArgs args) {
p.first->first.c_str(), p.first->second, weight);
}
}
}
});
}
// Construct the config for the weighted_target policy.
Json::Object weighted_targets;

@ -143,6 +143,7 @@ const RetryMethodConfig* RetryFilter::GetRetryPolicy(
const grpc_channel_filter RetryFilter::kVtable = {
RetryFilter::LegacyCallData::StartTransportStreamOpBatch,
nullptr,
/* init_call: */ nullptr,
RetryFilter::StartTransportOp,
sizeof(RetryFilter::LegacyCallData),
RetryFilter::LegacyCallData::Init,

@ -343,6 +343,7 @@ const grpc_channel_filter grpc_client_deadline_filter = {
grpc_core::NextPromiseFactory next_promise_factory) {
return next_promise_factory(std::move(call_args));
},
/* init_call: */ nullptr,
grpc_channel_next_op,
sizeof(grpc_deadline_state),
deadline_init_call_elem,
@ -368,6 +369,17 @@ const grpc_channel_filter grpc_server_deadline_filter = {
}
return next_promise_factory(std::move(call_args));
},
[](grpc_channel_element*, grpc_core::CallSpineInterface* spine) {
spine->client_initial_metadata().receiver.InterceptAndMap(
[](grpc_core::ClientMetadataHandle md) {
auto deadline = md->get(grpc_core::GrpcTimeoutMetadata());
if (deadline.has_value()) {
grpc_core::GetContext<grpc_core::CallContext>()->UpdateDeadline(
*deadline);
}
return md;
});
},
grpc_channel_next_op,
sizeof(server_call_data),
deadline_init_call_elem,

@ -51,6 +51,10 @@
namespace grpc_core {
const NoInterceptor HttpClientFilter::Call::OnServerToClientMessage;
const NoInterceptor HttpClientFilter::Call::OnClientToServerMessage;
const NoInterceptor HttpClientFilter::Call::OnFinalize;
const grpc_channel_filter HttpClientFilter::kFilter =
MakePromiseBasedFilter<HttpClientFilter, FilterEndpoint::kClient,
kFilterExaminesServerInitialMetadata>("http-client");
@ -105,40 +109,27 @@ Slice UserAgentFromArgs(const ChannelArgs& args,
}
} // namespace
ArenaPromise<ServerMetadataHandle> HttpClientFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
auto& md = call_args.client_initial_metadata;
if (test_only_use_put_requests_) {
md->Set(HttpMethodMetadata(), HttpMethodMetadata::kPut);
void HttpClientFilter::Call::OnClientInitialMetadata(ClientMetadata& md,
HttpClientFilter* filter) {
if (filter->test_only_use_put_requests_) {
md.Set(HttpMethodMetadata(), HttpMethodMetadata::kPut);
} else {
md->Set(HttpMethodMetadata(), HttpMethodMetadata::kPost);
md.Set(HttpMethodMetadata(), HttpMethodMetadata::kPost);
}
md->Set(HttpSchemeMetadata(), scheme_);
md->Set(TeMetadata(), TeMetadata::kTrailers);
md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
md->Set(UserAgentMetadata(), user_agent_.Ref());
auto* initial_metadata_err =
GetContext<Arena>()->New<Latch<ServerMetadataHandle>>();
call_args.server_initial_metadata->InterceptAndMap(
[initial_metadata_err](
ServerMetadataHandle md) -> absl::optional<ServerMetadataHandle> {
auto r = CheckServerMetadata(md.get());
if (!r.ok()) {
initial_metadata_err->Set(ServerMetadataFromStatus(r));
return absl::nullopt;
}
return std::move(md);
});
return Race(initial_metadata_err->Wait(),
Map(next_promise_factory(std::move(call_args)),
[](ServerMetadataHandle md) -> ServerMetadataHandle {
auto r = CheckServerMetadata(md.get());
if (!r.ok()) return ServerMetadataFromStatus(r);
return md;
}));
md.Set(HttpSchemeMetadata(), filter->scheme_);
md.Set(TeMetadata(), TeMetadata::kTrailers);
md.Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
md.Set(UserAgentMetadata(), filter->user_agent_.Ref());
}
absl::Status HttpClientFilter::Call::OnServerInitialMetadata(
ServerMetadata& md) {
return CheckServerMetadata(&md);
}
absl::Status HttpClientFilter::Call::OnServerTrailingMetadata(
ServerMetadata& md) {
return CheckServerMetadata(&md);
}
HttpClientFilter::HttpClientFilter(HttpSchemeMetadata::ValueType scheme,

@ -25,23 +25,28 @@
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/promise/arena_promise.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
namespace grpc_core {
class HttpClientFilter : public ChannelFilter {
class HttpClientFilter : public ImplementChannelFilter<HttpClientFilter> {
public:
static const grpc_channel_filter kFilter;
static absl::StatusOr<HttpClientFilter> Create(
const ChannelArgs& args, ChannelFilter::Args filter_args);
// Construct a promise for one call.
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
class Call {
public:
void OnClientInitialMetadata(ClientMetadata& md, HttpClientFilter* filter);
absl::Status OnServerInitialMetadata(ServerMetadata& md);
absl::Status OnServerTrailingMetadata(ServerMetadata& md);
static const NoInterceptor OnClientToServerMessage;
static const NoInterceptor OnServerToClientMessage;
static const NoInterceptor OnFinalize;
};
private:
HttpClientFilter(HttpSchemeMetadata::ValueType scheme, Slice user_agent,

@ -49,6 +49,10 @@
namespace grpc_core {
const NoInterceptor HttpServerFilter::Call::OnClientToServerMessage;
const NoInterceptor HttpServerFilter::Call::OnServerToClientMessage;
const NoInterceptor HttpServerFilter::Call::OnFinalize;
const grpc_channel_filter HttpServerFilter::kFilter =
MakePromiseBasedFilter<HttpServerFilter, FilterEndpoint::kServer,
kFilterExaminesServerInitialMetadata>("http-server");
@ -71,85 +75,81 @@ ServerMetadataHandle MalformedRequest(absl::string_view explanation) {
}
} // namespace
ArenaPromise<ServerMetadataHandle> HttpServerFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
const auto& md = call_args.client_initial_metadata;
auto method = md->get(HttpMethodMetadata());
ServerMetadataHandle HttpServerFilter::Call::OnClientInitialMetadata(
ClientMetadata& md, HttpServerFilter* filter) {
auto method = md.get(HttpMethodMetadata());
if (method.has_value()) {
switch (*method) {
case HttpMethodMetadata::kPost:
break;
case HttpMethodMetadata::kPut:
if (allow_put_requests_) {
if (filter->allow_put_requests_) {
break;
}
ABSL_FALLTHROUGH_INTENDED;
case HttpMethodMetadata::kInvalid:
case HttpMethodMetadata::kGet:
return Immediate(MalformedRequest("Bad method header"));
return MalformedRequest("Bad method header");
}
} else {
return Immediate(MalformedRequest("Missing :method header"));
return MalformedRequest("Missing :method header");
}
auto te = md->Take(TeMetadata());
auto te = md.Take(TeMetadata());
if (te == TeMetadata::kTrailers) {
// Do nothing, ok.
} else if (!te.has_value()) {
return Immediate(MalformedRequest("Missing :te header"));
return MalformedRequest("Missing :te header");
} else {
return Immediate(MalformedRequest("Bad :te header"));
return MalformedRequest("Bad :te header");
}
auto scheme = md->Take(HttpSchemeMetadata());
auto scheme = md.Take(HttpSchemeMetadata());
if (scheme.has_value()) {
if (*scheme == HttpSchemeMetadata::kInvalid) {
return Immediate(MalformedRequest("Bad :scheme header"));
return MalformedRequest("Bad :scheme header");
}
} else {
return Immediate(MalformedRequest("Missing :scheme header"));
return MalformedRequest("Missing :scheme header");
}
md->Remove(ContentTypeMetadata());
md.Remove(ContentTypeMetadata());
Slice* path_slice = md->get_pointer(HttpPathMetadata());
Slice* path_slice = md.get_pointer(HttpPathMetadata());
if (path_slice == nullptr) {
return Immediate(MalformedRequest("Missing :path header"));
return MalformedRequest("Missing :path header");
}
if (md->get_pointer(HttpAuthorityMetadata()) == nullptr) {
absl::optional<Slice> host = md->Take(HostMetadata());
if (md.get_pointer(HttpAuthorityMetadata()) == nullptr) {
absl::optional<Slice> host = md.Take(HostMetadata());
if (host.has_value()) {
md->Set(HttpAuthorityMetadata(), std::move(*host));
md.Set(HttpAuthorityMetadata(), std::move(*host));
}
}
if (md->get_pointer(HttpAuthorityMetadata()) == nullptr) {
return Immediate(MalformedRequest("Missing :authority header"));
if (md.get_pointer(HttpAuthorityMetadata()) == nullptr) {
return MalformedRequest("Missing :authority header");
}
if (!surface_user_agent_) {
md->Remove(UserAgentMetadata());
if (!filter->surface_user_agent_) {
md.Remove(UserAgentMetadata());
}
call_args.server_initial_metadata->InterceptAndMap(
[](ServerMetadataHandle md) {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO, "%s[http-server] Write metadata",
Activity::current()->DebugTag().c_str());
}
FilterOutgoingMetadata(md.get());
md->Set(HttpStatusMetadata(), 200);
md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
return md;
});
return Map(next_promise_factory(std::move(call_args)),
[](ServerMetadataHandle md) -> ServerMetadataHandle {
FilterOutgoingMetadata(md.get());
return md;
});
return nullptr;
}
void HttpServerFilter::Call::OnServerInitialMetadata(ServerMetadata& md) {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO, "%s[http-server] Write metadata",
Activity::current()->DebugTag().c_str());
}
FilterOutgoingMetadata(&md);
md.Set(HttpStatusMetadata(), 200);
md.Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
}
void HttpServerFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
FilterOutgoingMetadata(&md);
}
absl::StatusOr<HttpServerFilter> HttpServerFilter::Create(

@ -32,16 +32,23 @@
namespace grpc_core {
// Processes metadata on the server side for HTTP2 transports
class HttpServerFilter : public ChannelFilter {
class HttpServerFilter : public ImplementChannelFilter<HttpServerFilter> {
public:
static const grpc_channel_filter kFilter;
static absl::StatusOr<HttpServerFilter> Create(
const ChannelArgs& args, ChannelFilter::Args filter_args);
// Construct a promise for one call.
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
class Call {
public:
ServerMetadataHandle OnClientInitialMetadata(ClientMetadata& md,
HttpServerFilter* filter);
void OnServerInitialMetadata(ServerMetadata& md);
void OnServerTrailingMetadata(ServerMetadata& md);
static const NoInterceptor OnClientToServerMessage;
static const NoInterceptor OnServerToClientMessage;
static const NoInterceptor OnFinalize;
};
private:
HttpServerFilter(bool surface_user_agent, bool allow_put_requests)

@ -50,6 +50,15 @@
namespace grpc_core {
const NoInterceptor ClientMessageSizeFilter::Call::OnClientInitialMetadata;
const NoInterceptor ClientMessageSizeFilter::Call::OnServerInitialMetadata;
const NoInterceptor ClientMessageSizeFilter::Call::OnServerTrailingMetadata;
const NoInterceptor ClientMessageSizeFilter::Call::OnFinalize;
const NoInterceptor ServerMessageSizeFilter::Call::OnClientInitialMetadata;
const NoInterceptor ServerMessageSizeFilter::Call::OnServerInitialMetadata;
const NoInterceptor ServerMessageSizeFilter::Call::OnServerTrailingMetadata;
const NoInterceptor ServerMessageSizeFilter::Call::OnFinalize;
//
// MessageSizeParsedConfig
//
@ -138,60 +147,6 @@ const grpc_channel_filter ServerMessageSizeFilter::kFilter =
kFilterExaminesOutboundMessages |
kFilterExaminesInboundMessages>("message_size");
class MessageSizeFilter::CallBuilder {
private:
auto Interceptor(uint32_t max_length, bool is_send) {
return [max_length, is_send,
err = err_](MessageHandle msg) -> absl::optional<MessageHandle> {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO, "%s[message_size] %s len:%" PRIdPTR " max:%d",
Activity::current()->DebugTag().c_str(),
is_send ? "send" : "recv", msg->payload()->Length(),
max_length);
}
if (msg->payload()->Length() > max_length) {
if (err->is_set()) return std::move(msg);
auto r = GetContext<Arena>()->MakePooled<ServerMetadata>(
GetContext<Arena>());
r->Set(GrpcStatusMetadata(), GRPC_STATUS_RESOURCE_EXHAUSTED);
r->Set(GrpcMessageMetadata(),
Slice::FromCopiedString(
absl::StrFormat("%s message larger than max (%u vs. %d)",
is_send ? "Sent" : "Received",
msg->payload()->Length(), max_length)));
err->Set(std::move(r));
return absl::nullopt;
}
return std::move(msg);
};
}
public:
explicit CallBuilder(const MessageSizeParsedConfig& limits)
: limits_(limits) {}
template <typename T>
void AddSend(T* pipe_end) {
if (!limits_.max_send_size().has_value()) return;
pipe_end->InterceptAndMap(Interceptor(*limits_.max_send_size(), true));
}
template <typename T>
void AddRecv(T* pipe_end) {
if (!limits_.max_recv_size().has_value()) return;
pipe_end->InterceptAndMap(Interceptor(*limits_.max_recv_size(), false));
}
ArenaPromise<ServerMetadataHandle> Run(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
return Race(err_->Wait(), next_promise_factory(std::move(call_args)));
}
private:
Latch<ServerMetadataHandle>* const err_ =
GetContext<Arena>()->ManagedNew<Latch<ServerMetadataHandle>>();
MessageSizeParsedConfig limits_;
};
absl::StatusOr<ClientMessageSizeFilter> ClientMessageSizeFilter::Create(
const ChannelArgs& args, ChannelFilter::Args) {
return ClientMessageSizeFilter(args);
@ -202,20 +157,40 @@ absl::StatusOr<ServerMessageSizeFilter> ServerMessageSizeFilter::Create(
return ServerMessageSizeFilter(args);
}
ArenaPromise<ServerMetadataHandle> ClientMessageSizeFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
namespace {
ServerMetadataHandle CheckPayload(const Message& msg,
absl::optional<uint32_t> max_length,
bool is_send) {
if (!max_length.has_value()) return nullptr;
if (GRPC_TRACE_FLAG_ENABLED(grpc_call_trace)) {
gpr_log(GPR_INFO, "%s[message_size] %s len:%" PRIdPTR " max:%d",
Activity::current()->DebugTag().c_str(), is_send ? "send" : "recv",
msg.payload()->Length(), *max_length);
}
if (msg.payload()->Length() <= *max_length) return nullptr;
auto r = GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
r->Set(GrpcStatusMetadata(), GRPC_STATUS_RESOURCE_EXHAUSTED);
r->Set(GrpcMessageMetadata(), Slice::FromCopiedString(absl::StrFormat(
"%s message larger than max (%u vs. %d)",
is_send ? "Sent" : "Received",
msg.payload()->Length(), *max_length)));
return r;
}
} // namespace
ClientMessageSizeFilter::Call::Call(ClientMessageSizeFilter* filter)
: limits_(filter->parsed_config_) {
// Get max sizes from channel data, then merge in per-method config values.
// Note: Per-method config is only available on the client, so we
// apply the max request size to the send limit and the max response
// size to the receive limit.
MessageSizeParsedConfig limits = this->limits();
const MessageSizeParsedConfig* config_from_call_context =
MessageSizeParsedConfig::GetFromCallContext(
GetContext<grpc_call_context_element>(),
service_config_parser_index_);
filter->service_config_parser_index_);
if (config_from_call_context != nullptr) {
absl::optional<uint32_t> max_send_size = limits.max_send_size();
absl::optional<uint32_t> max_recv_size = limits.max_recv_size();
absl::optional<uint32_t> max_send_size = limits_.max_send_size();
absl::optional<uint32_t> max_recv_size = limits_.max_recv_size();
if (config_from_call_context->max_send_size().has_value() &&
(!max_send_size.has_value() ||
*config_from_call_context->max_send_size() < *max_send_size)) {
@ -226,21 +201,28 @@ ArenaPromise<ServerMetadataHandle> ClientMessageSizeFilter::MakeCallPromise(
*config_from_call_context->max_recv_size() < *max_recv_size)) {
max_recv_size = *config_from_call_context->max_recv_size();
}
limits = MessageSizeParsedConfig(max_send_size, max_recv_size);
limits_ = MessageSizeParsedConfig(max_send_size, max_recv_size);
}
}
ServerMetadataHandle ServerMessageSizeFilter::Call::OnClientToServerMessage(
const Message& message, ServerMessageSizeFilter* filter) {
return CheckPayload(message, filter->parsed_config_.max_recv_size(), false);
}
ServerMetadataHandle ServerMessageSizeFilter::Call::OnServerToClientMessage(
const Message& message, ServerMessageSizeFilter* filter) {
return CheckPayload(message, filter->parsed_config_.max_send_size(), true);
}
CallBuilder b(limits);
b.AddSend(call_args.client_to_server_messages);
b.AddRecv(call_args.server_to_client_messages);
return b.Run(std::move(call_args), std::move(next_promise_factory));
ServerMetadataHandle ClientMessageSizeFilter::Call::OnClientToServerMessage(
const Message& message) {
return CheckPayload(message, limits_.max_send_size(), true);
}
ArenaPromise<ServerMetadataHandle> ServerMessageSizeFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
CallBuilder b(limits());
b.AddSend(call_args.server_to_client_messages);
b.AddRecv(call_args.client_to_server_messages);
return b.Run(std::move(call_args), std::move(next_promise_factory));
ServerMetadataHandle ClientMessageSizeFilter::Call::OnServerToClientMessage(
const Message& message) {
return CheckPayload(message, limits_.max_recv_size(), false);
}
namespace {

@ -86,48 +86,60 @@ class MessageSizeParser : public ServiceConfigParser::Parser {
absl::optional<uint32_t> GetMaxRecvSizeFromChannelArgs(const ChannelArgs& args);
absl::optional<uint32_t> GetMaxSendSizeFromChannelArgs(const ChannelArgs& args);
class MessageSizeFilter : public ChannelFilter {
protected:
explicit MessageSizeFilter(const ChannelArgs& args)
: limits_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
class CallBuilder;
const MessageSizeParsedConfig& limits() const { return limits_; }
private:
MessageSizeParsedConfig limits_;
};
class ServerMessageSizeFilter final : public MessageSizeFilter {
class ServerMessageSizeFilter final
: public ImplementChannelFilter<ServerMessageSizeFilter> {
public:
static const grpc_channel_filter kFilter;
static absl::StatusOr<ServerMessageSizeFilter> Create(
const ChannelArgs& args, ChannelFilter::Args filter_args);
// Construct a promise for one call.
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
class Call {
public:
static const NoInterceptor OnClientInitialMetadata;
static const NoInterceptor OnServerInitialMetadata;
static const NoInterceptor OnServerTrailingMetadata;
static const NoInterceptor OnFinalize;
ServerMetadataHandle OnClientToServerMessage(
const Message& message, ServerMessageSizeFilter* filter);
ServerMetadataHandle OnServerToClientMessage(
const Message& message, ServerMessageSizeFilter* filter);
};
private:
using MessageSizeFilter::MessageSizeFilter;
explicit ServerMessageSizeFilter(const ChannelArgs& args)
: parsed_config_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
const MessageSizeParsedConfig parsed_config_;
};
class ClientMessageSizeFilter final : public MessageSizeFilter {
class ClientMessageSizeFilter final
: public ImplementChannelFilter<ClientMessageSizeFilter> {
public:
static const grpc_channel_filter kFilter;
static absl::StatusOr<ClientMessageSizeFilter> Create(
const ChannelArgs& args, ChannelFilter::Args filter_args);
// Construct a promise for one call.
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
class Call {
public:
explicit Call(ClientMessageSizeFilter* filter);
static const NoInterceptor OnClientInitialMetadata;
static const NoInterceptor OnServerInitialMetadata;
static const NoInterceptor OnServerTrailingMetadata;
static const NoInterceptor OnFinalize;
ServerMetadataHandle OnClientToServerMessage(const Message& message);
ServerMetadataHandle OnServerToClientMessage(const Message& message);
private:
MessageSizeParsedConfig limits_;
};
private:
explicit ClientMessageSizeFilter(const ChannelArgs& args)
: parsed_config_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
const size_t service_config_parser_index_{MessageSizeParser::ParserIndex()};
using MessageSizeFilter::MessageSizeFilter;
const MessageSizeParsedConfig parsed_config_;
};
} // namespace grpc_core

@ -229,6 +229,9 @@ static void send_goaway(grpc_chttp2_transport* t, grpc_error_handle error,
#define GRPC_ARG_SETTINGS_TIMEOUT "grpc.http2.settings_timeout"
namespace {
using TaskHandle = ::grpc_event_engine::experimental::EventEngine::TaskHandle;
grpc_core::CallTracerInterface* CallTracerIfSampled(grpc_chttp2_stream* s) {
if (s->context == nullptr || !grpc_core::IsTraceRecordCallopsEnabled()) {
return nullptr;
@ -500,10 +503,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
if (max_requests_per_read.has_value()) {
t->max_requests_per_read =
grpc_core::Clamp(*max_requests_per_read, 1, 10000);
} else if (grpc_core::IsChttp2BatchRequestsEnabled()) {
t->max_requests_per_read = 32;
} else {
t->max_requests_per_read = std::numeric_limits<size_t>::max();
t->max_requests_per_read = 32;
}
if (channel_args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
@ -520,8 +521,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
t->ack_pings = channel_args.GetBool("grpc.http2.ack_pings").value_or(true);
t->allow_tarpit = channel_args.GetBool(GRPC_ARG_HTTP_ALLOW_TARPIT)
.value_or(grpc_core::IsTarpitEnabled());
t->allow_tarpit =
channel_args.GetBool(GRPC_ARG_HTTP_ALLOW_TARPIT).value_or(true);
t->min_tarpit_duration_ms =
channel_args
.GetDurationFromIntMillis(GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS)
@ -803,41 +804,33 @@ static void close_transport_locked(grpc_chttp2_transport* t,
t->closed_with_error = error;
connectivity_state_set(t, GRPC_CHANNEL_SHUTDOWN, absl::Status(),
"close_transport");
if (t->keepalive_ping_timeout_handle !=
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid) {
t->event_engine->Cancel(std::exchange(
t->keepalive_ping_timeout_handle,
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid));
}
if (t->settings_ack_watchdog !=
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid) {
t->event_engine->Cancel(std::exchange(
t->settings_ack_watchdog,
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid));
}
if (t->delayed_ping_timer_handle.has_value()) {
if (t->event_engine->Cancel(*t->delayed_ping_timer_handle)) {
t->delayed_ping_timer_handle.reset();
}
if (t->keepalive_ping_timeout_handle != TaskHandle::kInvalid) {
t->event_engine->Cancel(std::exchange(t->keepalive_ping_timeout_handle,
TaskHandle::kInvalid));
}
if (t->next_bdp_ping_timer_handle.has_value()) {
if (t->event_engine->Cancel(*t->next_bdp_ping_timer_handle)) {
t->next_bdp_ping_timer_handle.reset();
}
if (t->settings_ack_watchdog != TaskHandle::kInvalid) {
t->event_engine->Cancel(
std::exchange(t->settings_ack_watchdog, TaskHandle::kInvalid));
}
if (t->delayed_ping_timer_handle != TaskHandle::kInvalid &&
t->event_engine->Cancel(t->delayed_ping_timer_handle)) {
t->delayed_ping_timer_handle = TaskHandle::kInvalid;
}
if (t->next_bdp_ping_timer_handle != TaskHandle::kInvalid &&
t->event_engine->Cancel(t->next_bdp_ping_timer_handle)) {
t->next_bdp_ping_timer_handle = TaskHandle::kInvalid;
}
switch (t->keepalive_state) {
case GRPC_CHTTP2_KEEPALIVE_STATE_WAITING:
if (t->keepalive_ping_timer_handle.has_value()) {
if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
t->keepalive_ping_timer_handle.reset();
}
if (t->keepalive_ping_timer_handle != TaskHandle::kInvalid &&
t->event_engine->Cancel(t->keepalive_ping_timer_handle)) {
t->keepalive_ping_timer_handle = TaskHandle::kInvalid;
}
break;
case GRPC_CHTTP2_KEEPALIVE_STATE_PINGING:
if (t->keepalive_ping_timer_handle.has_value()) {
if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
t->keepalive_ping_timer_handle.reset();
}
if (t->keepalive_ping_timer_handle != TaskHandle::kInvalid &&
t->event_engine->Cancel(t->keepalive_ping_timer_handle)) {
t->keepalive_ping_timer_handle = TaskHandle::kInvalid;
}
break;
case GRPC_CHTTP2_KEEPALIVE_STATE_DYING:
@ -1837,8 +1830,8 @@ static void retry_initiate_ping_locked(
grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
GRPC_UNUSED grpc_error_handle error) {
GPR_DEBUG_ASSERT(error.ok());
GPR_ASSERT(t->delayed_ping_timer_handle.has_value());
t->delayed_ping_timer_handle.reset();
GPR_ASSERT(t->delayed_ping_timer_handle != TaskHandle::kInvalid);
t->delayed_ping_timer_handle = TaskHandle::kInvalid;
grpc_chttp2_initiate_write(t.get(),
GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING);
}
@ -2831,7 +2824,6 @@ static void read_action_parse_loop_locked(
}
close_transport_locked(t.get(), error);
t->endpoint_reading = 0;
} else if (t->closed_with_error.ok()) {
keep_reading = true;
// Since we have read a byte, reset the keepalive timer
@ -2860,17 +2852,15 @@ static void read_action_locked(
grpc_error_handle error) {
// got an incoming read, cancel any pending keepalive timers
t->keepalive_incoming_data_wanted = false;
if (t->keepalive_ping_timeout_handle !=
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid) {
if (t->keepalive_ping_timeout_handle != TaskHandle::kInvalid) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_ping_trace) ||
GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) {
gpr_log(GPR_INFO,
"%s[%p]: Clear keepalive timer because data was received",
t->is_client ? "CLIENT" : "SERVER", t.get());
}
t->event_engine->Cancel(std::exchange(
t->keepalive_ping_timeout_handle,
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid));
t->event_engine->Cancel(
std::exchange(t->keepalive_ping_timeout_handle, TaskHandle::kInvalid));
}
grpc_error_handle err = error;
if (!err.ok()) {
@ -2963,7 +2953,7 @@ static void finish_bdp_ping_locked(
t->flow_control.bdp_estimator()->CompletePing();
grpc_chttp2_act_on_flowctl_action(t->flow_control.PeriodicUpdate(), t.get(),
nullptr);
GPR_ASSERT(!t->next_bdp_ping_timer_handle.has_value());
GPR_ASSERT(t->next_bdp_ping_timer_handle == TaskHandle::kInvalid);
t->next_bdp_ping_timer_handle =
t->event_engine->RunAfter(next_ping - grpc_core::Timestamp::Now(), [t] {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
@ -2983,8 +2973,8 @@ static void next_bdp_ping_timer_expired_locked(
grpc_core::RefCountedPtr<grpc_chttp2_transport> t,
GRPC_UNUSED grpc_error_handle error) {
GPR_DEBUG_ASSERT(error.ok());
GPR_ASSERT(t->next_bdp_ping_timer_handle.has_value());
t->next_bdp_ping_timer_handle.reset();
GPR_ASSERT(t->next_bdp_ping_timer_handle != TaskHandle::kInvalid);
t->next_bdp_ping_timer_handle = TaskHandle::kInvalid;
if (t->flow_control.bdp_estimator()->accumulator() == 0) {
// Block the bdp ping till we receive more data.
t->bdp_ping_blocked = true;
@ -3053,8 +3043,8 @@ static void init_keepalive_ping_locked(
GRPC_UNUSED grpc_error_handle error) {
GPR_DEBUG_ASSERT(error.ok());
GPR_ASSERT(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING);
GPR_ASSERT(t->keepalive_ping_timer_handle.has_value());
t->keepalive_ping_timer_handle.reset();
GPR_ASSERT(t->keepalive_ping_timer_handle != TaskHandle::kInvalid);
t->keepalive_ping_timer_handle = TaskHandle::kInvalid;
if (t->destroying || !t->closed_with_error.ok()) {
t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING;
} else {
@ -3095,7 +3085,7 @@ static void finish_keepalive_ping_locked(
std::string(t->peer_string.as_string_view()).c_str());
}
t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
GPR_ASSERT(!t->keepalive_ping_timer_handle.has_value());
GPR_ASSERT(t->keepalive_ping_timer_handle == TaskHandle::kInvalid);
t->keepalive_ping_timer_handle =
t->event_engine->RunAfter(t->keepalive_time, [t] {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
@ -3107,22 +3097,21 @@ static void finish_keepalive_ping_locked(
}
static void maybe_reset_keepalive_ping_timer_locked(grpc_chttp2_transport* t) {
if (t->keepalive_ping_timer_handle.has_value()) {
if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
// Cancel succeeds, resets the keepalive ping timer. Note that we don't
// need to Ref or Unref here since we still hold the Ref.
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) {
gpr_log(GPR_INFO, "%s: Keepalive ping cancelled. Resetting timer.",
std::string(t->peer_string.as_string_view()).c_str());
}
t->keepalive_ping_timer_handle = t->event_engine->RunAfter(
t->keepalive_time, [t = t->Ref()]() mutable {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
grpc_core::ExecCtx exec_ctx;
init_keepalive_ping(std::move(t));
});
if (t->keepalive_ping_timer_handle != TaskHandle::kInvalid &&
t->event_engine->Cancel(t->keepalive_ping_timer_handle)) {
// Cancel succeeds, resets the keepalive ping timer. Note that we don't
// need to Ref or Unref here since we still hold the Ref.
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) {
gpr_log(GPR_INFO, "%s: Keepalive ping cancelled. Resetting timer.",
std::string(t->peer_string.as_string_view()).c_str());
}
t->keepalive_ping_timer_handle =
t->event_engine->RunAfter(t->keepalive_time, [t = t->Ref()]() mutable {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
grpc_core::ExecCtx exec_ctx;
init_keepalive_ping(std::move(t));
});
}
}

@ -119,6 +119,15 @@ class HttpAnnotation : public CallTracerAnnotationInterface::Annotation {
std::string ToString() const override;
Type http_type() const { return type_; }
Timestamp time() const { return time_; }
absl::optional<chttp2::TransportFlowControl::Stats> transport_stats() const {
return transport_stats_;
}
absl::optional<chttp2::StreamFlowControl::Stats> stream_stats() const {
return stream_stats_;
}
private:
const Type type_;
const Timestamp time_;

@ -422,23 +422,9 @@ FlowControlAction StreamFlowControl::UpdateAction(FlowControlAction action) {
}
// min_progress_size_ > 0 means we have a reader ready to read.
if (min_progress_size_ > 0) {
if (IsLazierStreamUpdatesEnabled()) {
if (announced_window_delta_ <=
-static_cast<int64_t>(tfc_->sent_init_window()) / 2) {
urgency = FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
}
} else {
// If we're into initial window to receive that data we should wake up
// and send an update.
if (announced_window_delta_ < 0) {
urgency = FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
} else if (announced_window_delta_ == 0 &&
tfc_->queued_init_window() == 0) {
// Special case when initial window size is zero, meaning that
// announced_window_delta cannot become negative (it may already be so
// however).
urgency = FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
}
if (announced_window_delta_ <=
-static_cast<int64_t>(tfc_->sent_init_window()) / 2) {
urgency = FlowControlAction::Urgency::UPDATE_IMMEDIATELY;
}
}
action.set_send_stream_update(urgency);

@ -126,7 +126,7 @@ grpc_error_handle grpc_chttp2_rst_stream_parser_parse(void* parser,
grpc_core::StatusIntProperty::kHttp2Error,
static_cast<intptr_t>(reason));
}
if (grpc_core::IsPingOnRstStreamEnabled() && !t->is_client &&
if (!t->is_client &&
absl::Bernoulli(t->bitgen, t->ping_on_rst_stream_percent / 100.0)) {
++t->num_pending_induced_frames;
t->ping_callbacks.RequestPing();

@ -319,7 +319,6 @@ struct grpc_chttp2_transport final
};
grpc_closure write_action_begin_locked;
grpc_closure write_action;
grpc_closure write_action_end_locked;
grpc_closure read_action_locked;
@ -385,8 +384,9 @@ struct grpc_chttp2_transport final
grpc_core::Chttp2PingAbusePolicy ping_abuse_policy;
grpc_core::Chttp2PingRatePolicy ping_rate_policy;
grpc_core::Chttp2PingCallbacks ping_callbacks;
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
delayed_ping_timer_handle;
grpc_event_engine::experimental::EventEngine::TaskHandle
delayed_ping_timer_handle =
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid;
grpc_closure retry_initiate_ping_locked;
grpc_core::Chttp2MaxConcurrentStreamsPolicy max_concurrent_streams_policy;
@ -458,21 +458,20 @@ struct grpc_chttp2_transport final
grpc_closure destructive_reclaimer_locked;
// next bdp ping timer handle
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
next_bdp_ping_timer_handle;
grpc_event_engine::experimental::EventEngine::TaskHandle
next_bdp_ping_timer_handle =
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid;
// keep-alive ping support
/// Closure to initialize a keepalive ping
grpc_closure init_keepalive_ping_locked;
/// Closure to run when the keepalive ping is sent
grpc_closure start_keepalive_ping_locked;
/// Closure to run when the keepalive ping ack is received
grpc_closure finish_keepalive_ping_locked;
/// Closure to run when the keepalive ping timeouts
grpc_closure keepalive_watchdog_fired_locked;
/// timer to initiate ping events
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
keepalive_ping_timer_handle;
grpc_event_engine::experimental::EventEngine::TaskHandle
keepalive_ping_timer_handle =
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid;
;
/// time duration in between pings
grpc_core::Duration keepalive_time;
/// grace period to wait for data after sending a ping before keepalives
@ -506,6 +505,9 @@ struct grpc_chttp2_transport final
/// how much data are we willing to buffer when the WRITE_BUFFER_HINT is set?
uint32_t write_buffer_size = grpc_core::chttp2::kDefaultWindow;
/// write execution state of the transport
grpc_chttp2_write_state write_state = GRPC_CHTTP2_WRITE_STATE_IDLE;
/// policy for how much data we're willing to put into one http2 write
grpc_core::Chttp2WriteSizePolicy write_size_policy;
@ -525,8 +527,6 @@ struct grpc_chttp2_transport final
/// if keepalive pings are allowed when there's no outstanding streams
bool keepalive_permit_without_calls = false;
/// If start_keepalive_ping_locked has been called
bool keepalive_ping_started = false;
// bdp estimator
bool bdp_ping_blocked =
@ -535,9 +535,6 @@ struct grpc_chttp2_transport final
/// is the transport destroying itself?
uint8_t destroying = false;
/// is there a read request to the endpoint outstanding?
uint8_t endpoint_reading = 1;
/// is this a client?
bool is_client;
@ -559,9 +556,6 @@ struct grpc_chttp2_transport final
// What percentage of rst_stream frames on the server should cause a ping
// frame to be generated.
uint8_t ping_on_rst_stream_percent;
/// write execution state of the transport
grpc_chttp2_write_state write_state = GRPC_CHTTP2_WRITE_STATE_IDLE;
};
typedef enum {

@ -395,8 +395,7 @@ absl::variant<size_t, absl::Status> grpc_chttp2_perform_read(
}
cur += t->incoming_frame_size;
t->incoming_stream = nullptr;
if (t->incoming_frame_type == GRPC_CHTTP2_FRAME_RST_STREAM &&
grpc_core::IsChttp2OffloadOnRstStreamEnabled()) {
if (t->incoming_frame_type == GRPC_CHTTP2_FRAME_RST_STREAM) {
requests_started = std::numeric_limits<size_t>::max();
}
goto dts_fh_0; // loop
@ -702,8 +701,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
t, std::string(t->peer_string.as_string_view()).c_str(),
t->incoming_stream_id, t->last_new_stream_id));
return init_header_skip_frame_parser(t, priority_type, is_eoh);
} else if (grpc_core::IsBlockExcessiveRequestsBeforeSettingsAckEnabled() &&
t->num_incoming_streams_before_settings_ack == 0) {
} else if (t->num_incoming_streams_before_settings_ack == 0) {
GRPC_CHTTP2_IF_TRACING(gpr_log(
GPR_ERROR,
"transport:%p SERVER peer:%s rejecting grpc_chttp2_stream id=%d, "

@ -172,7 +172,9 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
too_soon.next_allowed_ping_interval.ToString().c_str(),
too_soon.wait.ToString().c_str());
}
if (!t->delayed_ping_timer_handle.has_value()) {
if (t->delayed_ping_timer_handle ==
grpc_event_engine::experimental::EventEngine::TaskHandle::
kInvalid) {
t->delayed_ping_timer_handle = t->event_engine->RunAfter(
too_soon.wait, [t = t->Ref()]() mutable {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
@ -278,8 +280,7 @@ class WriteContext {
t_->settings[GRPC_LOCAL_SETTINGS],
t_->force_send_settings,
GRPC_CHTTP2_NUM_SETTINGS));
if (grpc_core::IsSettingsTimeoutEnabled() &&
t_->keepalive_timeout != grpc_core::Duration::Infinity()) {
if (t_->keepalive_timeout != grpc_core::Duration::Infinity()) {
GPR_ASSERT(
t_->settings_ack_watchdog ==
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid);
@ -732,9 +733,7 @@ void grpc_chttp2_end_write(grpc_chttp2_transport* t, grpc_error_handle error) {
t->keepalive_timeout != grpc_core::Duration::Infinity()) {
// Set ping timeout after finishing write so we don't measure our own send
// time.
const auto timeout = grpc_core::IsSeparatePingFromKeepaliveEnabled()
? t->ping_timeout
: t->keepalive_timeout;
const auto timeout = t->ping_timeout;
auto id = t->ping_callbacks.OnPingTimeout(
timeout, t->event_engine.get(), [t = t->Ref()] {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
@ -748,8 +747,7 @@ void grpc_chttp2_end_write(grpc_chttp2_transport* t, grpc_error_handle error) {
id.value());
}
if (grpc_core::IsSeparatePingFromKeepaliveEnabled() &&
t->keepalive_incoming_data_wanted &&
if (t->keepalive_incoming_data_wanted &&
t->keepalive_timeout < t->ping_timeout &&
t->keepalive_ping_timeout_handle !=
grpc_event_engine::experimental::EventEngine::TaskHandle::

@ -1,5 +1,4 @@
/* This file was generated by upbc (the upb compiler) from the input
* file:
/* This file was generated by upb_generator from the input file:
*
* envoy/admin/v3/certs.proto
*
@ -10,7 +9,14 @@
#define ENVOY_ADMIN_V3_CERTS_PROTO_UPB_H_
#include "upb/generated_code_support.h"
// Must be last.
#include "envoy/admin/v3/certs.upb_minitable.h"
#include "google/protobuf/timestamp.upb_minitable.h"
#include "udpa/annotations/status.upb_minitable.h"
#include "udpa/annotations/versioning.upb_minitable.h"
// Must be last.
#include "upb/port/def.inc"
#ifdef __cplusplus
@ -22,25 +28,19 @@ typedef struct envoy_admin_v3_Certificate envoy_admin_v3_Certificate;
typedef struct envoy_admin_v3_CertificateDetails envoy_admin_v3_CertificateDetails;
typedef struct envoy_admin_v3_CertificateDetails_OcspDetails envoy_admin_v3_CertificateDetails_OcspDetails;
typedef struct envoy_admin_v3_SubjectAlternateName envoy_admin_v3_SubjectAlternateName;
extern const upb_MiniTable envoy_admin_v3_Certificates_msg_init;
extern const upb_MiniTable envoy_admin_v3_Certificate_msg_init;
extern const upb_MiniTable envoy_admin_v3_CertificateDetails_msg_init;
extern const upb_MiniTable envoy_admin_v3_CertificateDetails_OcspDetails_msg_init;
extern const upb_MiniTable envoy_admin_v3_SubjectAlternateName_msg_init;
struct google_protobuf_Timestamp;
extern const upb_MiniTable google_protobuf_Timestamp_msg_init;
/* envoy.admin.v3.Certificates */
UPB_INLINE envoy_admin_v3_Certificates* envoy_admin_v3_Certificates_new(upb_Arena* arena) {
return (envoy_admin_v3_Certificates*)_upb_Message_New(&envoy_admin_v3_Certificates_msg_init, arena);
return (envoy_admin_v3_Certificates*)_upb_Message_New(&envoy__admin__v3__Certificates_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_Certificates* envoy_admin_v3_Certificates_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_Certificates* ret = envoy_admin_v3_Certificates_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Certificates_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Certificates_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -50,7 +50,7 @@ UPB_INLINE envoy_admin_v3_Certificates* envoy_admin_v3_Certificates_parse_ex(con
int options, upb_Arena* arena) {
envoy_admin_v3_Certificates* ret = envoy_admin_v3_Certificates_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Certificates_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Certificates_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -58,13 +58,13 @@ UPB_INLINE envoy_admin_v3_Certificates* envoy_admin_v3_Certificates_parse_ex(con
}
UPB_INLINE char* envoy_admin_v3_Certificates_serialize(const envoy_admin_v3_Certificates* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Certificates_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Certificates_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_Certificates_serialize_ex(const envoy_admin_v3_Certificates* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Certificates_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Certificates_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_Certificates_clear_certificates(envoy_admin_v3_Certificates* msg) {
@ -126,7 +126,7 @@ UPB_INLINE struct envoy_admin_v3_Certificate* envoy_admin_v3_Certificates_add_ce
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_Certificate* sub = (struct envoy_admin_v3_Certificate*)_upb_Message_New(&envoy_admin_v3_Certificate_msg_init, arena);
struct envoy_admin_v3_Certificate* sub = (struct envoy_admin_v3_Certificate*)_upb_Message_New(&envoy__admin__v3__Certificate_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -135,12 +135,12 @@ UPB_INLINE struct envoy_admin_v3_Certificate* envoy_admin_v3_Certificates_add_ce
/* envoy.admin.v3.Certificate */
UPB_INLINE envoy_admin_v3_Certificate* envoy_admin_v3_Certificate_new(upb_Arena* arena) {
return (envoy_admin_v3_Certificate*)_upb_Message_New(&envoy_admin_v3_Certificate_msg_init, arena);
return (envoy_admin_v3_Certificate*)_upb_Message_New(&envoy__admin__v3__Certificate_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_Certificate* envoy_admin_v3_Certificate_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_Certificate* ret = envoy_admin_v3_Certificate_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Certificate_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Certificate_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -150,7 +150,7 @@ UPB_INLINE envoy_admin_v3_Certificate* envoy_admin_v3_Certificate_parse_ex(const
int options, upb_Arena* arena) {
envoy_admin_v3_Certificate* ret = envoy_admin_v3_Certificate_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Certificate_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Certificate_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -158,13 +158,13 @@ UPB_INLINE envoy_admin_v3_Certificate* envoy_admin_v3_Certificate_parse_ex(const
}
UPB_INLINE char* envoy_admin_v3_Certificate_serialize(const envoy_admin_v3_Certificate* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Certificate_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Certificate_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_Certificate_serialize_ex(const envoy_admin_v3_Certificate* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Certificate_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Certificate_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_Certificate_clear_ca_cert(envoy_admin_v3_Certificate* msg) {
@ -263,7 +263,7 @@ UPB_INLINE struct envoy_admin_v3_CertificateDetails* envoy_admin_v3_Certificate_
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_CertificateDetails* sub = (struct envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy_admin_v3_CertificateDetails_msg_init, arena);
struct envoy_admin_v3_CertificateDetails* sub = (struct envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy__admin__v3__CertificateDetails_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -289,7 +289,7 @@ UPB_INLINE struct envoy_admin_v3_CertificateDetails* envoy_admin_v3_Certificate_
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_CertificateDetails* sub = (struct envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy_admin_v3_CertificateDetails_msg_init, arena);
struct envoy_admin_v3_CertificateDetails* sub = (struct envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy__admin__v3__CertificateDetails_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -298,12 +298,12 @@ UPB_INLINE struct envoy_admin_v3_CertificateDetails* envoy_admin_v3_Certificate_
/* envoy.admin.v3.CertificateDetails */
UPB_INLINE envoy_admin_v3_CertificateDetails* envoy_admin_v3_CertificateDetails_new(upb_Arena* arena) {
return (envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy_admin_v3_CertificateDetails_msg_init, arena);
return (envoy_admin_v3_CertificateDetails*)_upb_Message_New(&envoy__admin__v3__CertificateDetails_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_CertificateDetails* envoy_admin_v3_CertificateDetails_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_CertificateDetails* ret = envoy_admin_v3_CertificateDetails_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_CertificateDetails_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__CertificateDetails_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -313,7 +313,7 @@ UPB_INLINE envoy_admin_v3_CertificateDetails* envoy_admin_v3_CertificateDetails_
int options, upb_Arena* arena) {
envoy_admin_v3_CertificateDetails* ret = envoy_admin_v3_CertificateDetails_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_CertificateDetails_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__CertificateDetails_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -321,13 +321,13 @@ UPB_INLINE envoy_admin_v3_CertificateDetails* envoy_admin_v3_CertificateDetails_
}
UPB_INLINE char* envoy_admin_v3_CertificateDetails_serialize(const envoy_admin_v3_CertificateDetails* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_CertificateDetails_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__CertificateDetails_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_CertificateDetails_serialize_ex(const envoy_admin_v3_CertificateDetails* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_CertificateDetails_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__CertificateDetails_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_CertificateDetails_clear_path(envoy_admin_v3_CertificateDetails* msg) {
@ -475,7 +475,7 @@ UPB_INLINE struct envoy_admin_v3_SubjectAlternateName* envoy_admin_v3_Certificat
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_SubjectAlternateName* sub = (struct envoy_admin_v3_SubjectAlternateName*)_upb_Message_New(&envoy_admin_v3_SubjectAlternateName_msg_init, arena);
struct envoy_admin_v3_SubjectAlternateName* sub = (struct envoy_admin_v3_SubjectAlternateName*)_upb_Message_New(&envoy__admin__v3__SubjectAlternateName_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -491,7 +491,7 @@ UPB_INLINE void envoy_admin_v3_CertificateDetails_set_valid_from(envoy_admin_v3_
UPB_INLINE struct google_protobuf_Timestamp* envoy_admin_v3_CertificateDetails_mutable_valid_from(envoy_admin_v3_CertificateDetails* msg, upb_Arena* arena) {
struct google_protobuf_Timestamp* sub = (struct google_protobuf_Timestamp*)envoy_admin_v3_CertificateDetails_valid_from(msg);
if (sub == NULL) {
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google_protobuf_Timestamp_msg_init, arena);
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google__protobuf__Timestamp_msg_init, arena);
if (sub) envoy_admin_v3_CertificateDetails_set_valid_from(msg, sub);
}
return sub;
@ -503,7 +503,7 @@ UPB_INLINE void envoy_admin_v3_CertificateDetails_set_expiration_time(envoy_admi
UPB_INLINE struct google_protobuf_Timestamp* envoy_admin_v3_CertificateDetails_mutable_expiration_time(envoy_admin_v3_CertificateDetails* msg, upb_Arena* arena) {
struct google_protobuf_Timestamp* sub = (struct google_protobuf_Timestamp*)envoy_admin_v3_CertificateDetails_expiration_time(msg);
if (sub == NULL) {
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google_protobuf_Timestamp_msg_init, arena);
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google__protobuf__Timestamp_msg_init, arena);
if (sub) envoy_admin_v3_CertificateDetails_set_expiration_time(msg, sub);
}
return sub;
@ -515,7 +515,7 @@ UPB_INLINE void envoy_admin_v3_CertificateDetails_set_ocsp_details(envoy_admin_v
UPB_INLINE struct envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_CertificateDetails_mutable_ocsp_details(envoy_admin_v3_CertificateDetails* msg, upb_Arena* arena) {
struct envoy_admin_v3_CertificateDetails_OcspDetails* sub = (struct envoy_admin_v3_CertificateDetails_OcspDetails*)envoy_admin_v3_CertificateDetails_ocsp_details(msg);
if (sub == NULL) {
sub = (struct envoy_admin_v3_CertificateDetails_OcspDetails*)_upb_Message_New(&envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, arena);
sub = (struct envoy_admin_v3_CertificateDetails_OcspDetails*)_upb_Message_New(&envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, arena);
if (sub) envoy_admin_v3_CertificateDetails_set_ocsp_details(msg, sub);
}
return sub;
@ -524,12 +524,12 @@ UPB_INLINE struct envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_
/* envoy.admin.v3.CertificateDetails.OcspDetails */
UPB_INLINE envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_CertificateDetails_OcspDetails_new(upb_Arena* arena) {
return (envoy_admin_v3_CertificateDetails_OcspDetails*)_upb_Message_New(&envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, arena);
return (envoy_admin_v3_CertificateDetails_OcspDetails*)_upb_Message_New(&envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_CertificateDetails_OcspDetails_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_CertificateDetails_OcspDetails* ret = envoy_admin_v3_CertificateDetails_OcspDetails_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -539,7 +539,7 @@ UPB_INLINE envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_Certifi
int options, upb_Arena* arena) {
envoy_admin_v3_CertificateDetails_OcspDetails* ret = envoy_admin_v3_CertificateDetails_OcspDetails_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -547,13 +547,13 @@ UPB_INLINE envoy_admin_v3_CertificateDetails_OcspDetails* envoy_admin_v3_Certifi
}
UPB_INLINE char* envoy_admin_v3_CertificateDetails_OcspDetails_serialize(const envoy_admin_v3_CertificateDetails_OcspDetails* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_CertificateDetails_OcspDetails_serialize_ex(const envoy_admin_v3_CertificateDetails_OcspDetails* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_CertificateDetails_OcspDetails_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__CertificateDetails__OcspDetails_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_CertificateDetails_OcspDetails_clear_valid_from(envoy_admin_v3_CertificateDetails_OcspDetails* msg) {
@ -594,7 +594,7 @@ UPB_INLINE void envoy_admin_v3_CertificateDetails_OcspDetails_set_valid_from(env
UPB_INLINE struct google_protobuf_Timestamp* envoy_admin_v3_CertificateDetails_OcspDetails_mutable_valid_from(envoy_admin_v3_CertificateDetails_OcspDetails* msg, upb_Arena* arena) {
struct google_protobuf_Timestamp* sub = (struct google_protobuf_Timestamp*)envoy_admin_v3_CertificateDetails_OcspDetails_valid_from(msg);
if (sub == NULL) {
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google_protobuf_Timestamp_msg_init, arena);
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google__protobuf__Timestamp_msg_init, arena);
if (sub) envoy_admin_v3_CertificateDetails_OcspDetails_set_valid_from(msg, sub);
}
return sub;
@ -606,7 +606,7 @@ UPB_INLINE void envoy_admin_v3_CertificateDetails_OcspDetails_set_expiration(env
UPB_INLINE struct google_protobuf_Timestamp* envoy_admin_v3_CertificateDetails_OcspDetails_mutable_expiration(envoy_admin_v3_CertificateDetails_OcspDetails* msg, upb_Arena* arena) {
struct google_protobuf_Timestamp* sub = (struct google_protobuf_Timestamp*)envoy_admin_v3_CertificateDetails_OcspDetails_expiration(msg);
if (sub == NULL) {
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google_protobuf_Timestamp_msg_init, arena);
sub = (struct google_protobuf_Timestamp*)_upb_Message_New(&google__protobuf__Timestamp_msg_init, arena);
if (sub) envoy_admin_v3_CertificateDetails_OcspDetails_set_expiration(msg, sub);
}
return sub;
@ -615,12 +615,12 @@ UPB_INLINE struct google_protobuf_Timestamp* envoy_admin_v3_CertificateDetails_O
/* envoy.admin.v3.SubjectAlternateName */
UPB_INLINE envoy_admin_v3_SubjectAlternateName* envoy_admin_v3_SubjectAlternateName_new(upb_Arena* arena) {
return (envoy_admin_v3_SubjectAlternateName*)_upb_Message_New(&envoy_admin_v3_SubjectAlternateName_msg_init, arena);
return (envoy_admin_v3_SubjectAlternateName*)_upb_Message_New(&envoy__admin__v3__SubjectAlternateName_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_SubjectAlternateName* envoy_admin_v3_SubjectAlternateName_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_SubjectAlternateName* ret = envoy_admin_v3_SubjectAlternateName_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_SubjectAlternateName_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__SubjectAlternateName_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -630,7 +630,7 @@ UPB_INLINE envoy_admin_v3_SubjectAlternateName* envoy_admin_v3_SubjectAlternateN
int options, upb_Arena* arena) {
envoy_admin_v3_SubjectAlternateName* ret = envoy_admin_v3_SubjectAlternateName_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_SubjectAlternateName_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__SubjectAlternateName_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -638,13 +638,13 @@ UPB_INLINE envoy_admin_v3_SubjectAlternateName* envoy_admin_v3_SubjectAlternateN
}
UPB_INLINE char* envoy_admin_v3_SubjectAlternateName_serialize(const envoy_admin_v3_SubjectAlternateName* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_SubjectAlternateName_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__SubjectAlternateName_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_SubjectAlternateName_serialize_ex(const envoy_admin_v3_SubjectAlternateName* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_SubjectAlternateName_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__SubjectAlternateName_msg_init, options, arena, &ptr, len);
return ptr;
}
typedef enum {
@ -716,8 +716,6 @@ UPB_INLINE void envoy_admin_v3_SubjectAlternateName_set_ip_address(envoy_admin_v
_upb_Message_SetNonExtensionField(msg, &field, &value);
}
extern const upb_MiniTableFile envoy_admin_v3_certs_proto_upb_file_layout;
#ifdef __cplusplus
} /* extern "C" */
#endif

@ -1,5 +1,4 @@
/* This file was generated by upbc (the upb compiler) from the input
* file:
/* This file was generated by upb_generator from the input file:
*
* envoy/admin/v3/certs.proto
*
@ -8,23 +7,23 @@
#include <stddef.h>
#include "upb/generated_code_support.h"
#include "envoy/admin/v3/certs.upb.h"
#include "google/protobuf/timestamp.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "envoy/admin/v3/certs.upb_minitable.h"
#include "google/protobuf/timestamp.upb_minitable.h"
#include "udpa/annotations/status.upb_minitable.h"
#include "udpa/annotations/versioning.upb_minitable.h"
// Must be last.
#include "upb/port/def.inc"
static const upb_MiniTableSub envoy_admin_v3_Certificates_submsgs[1] = {
{.submsg = &envoy_admin_v3_Certificate_msg_init},
{.submsg = &envoy__admin__v3__Certificate_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_Certificates__fields[1] = {
{1, 0, 0, 0, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_Certificates_msg_init = {
const upb_MiniTable envoy__admin__v3__Certificates_msg_init = {
&envoy_admin_v3_Certificates_submsgs[0],
&envoy_admin_v3_Certificates__fields[0],
8, 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
@ -35,8 +34,8 @@ const upb_MiniTable envoy_admin_v3_Certificates_msg_init = {
};
static const upb_MiniTableSub envoy_admin_v3_Certificate_submsgs[2] = {
{.submsg = &envoy_admin_v3_CertificateDetails_msg_init},
{.submsg = &envoy_admin_v3_CertificateDetails_msg_init},
{.submsg = &envoy__admin__v3__CertificateDetails_msg_init},
{.submsg = &envoy__admin__v3__CertificateDetails_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_Certificate__fields[2] = {
@ -44,7 +43,7 @@ static const upb_MiniTableField envoy_admin_v3_Certificate__fields[2] = {
{2, UPB_SIZE(4, 8), 0, 1, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_Certificate_msg_init = {
const upb_MiniTable envoy__admin__v3__Certificate_msg_init = {
&envoy_admin_v3_Certificate_submsgs[0],
&envoy_admin_v3_Certificate__fields[0],
UPB_SIZE(8, 16), 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(24), 0,
@ -57,10 +56,10 @@ const upb_MiniTable envoy_admin_v3_Certificate_msg_init = {
};
static const upb_MiniTableSub envoy_admin_v3_CertificateDetails_submsgs[4] = {
{.submsg = &envoy_admin_v3_SubjectAlternateName_msg_init},
{.submsg = &google_protobuf_Timestamp_msg_init},
{.submsg = &google_protobuf_Timestamp_msg_init},
{.submsg = &envoy_admin_v3_CertificateDetails_OcspDetails_msg_init},
{.submsg = &envoy__admin__v3__SubjectAlternateName_msg_init},
{.submsg = &google__protobuf__Timestamp_msg_init},
{.submsg = &google__protobuf__Timestamp_msg_init},
{.submsg = &envoy__admin__v3__CertificateDetails__OcspDetails_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_CertificateDetails__fields[7] = {
@ -73,7 +72,7 @@ static const upb_MiniTableField envoy_admin_v3_CertificateDetails__fields[7] = {
{7, UPB_SIZE(16, 72), 3, 3, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_CertificateDetails_msg_init = {
const upb_MiniTable envoy__admin__v3__CertificateDetails_msg_init = {
&envoy_admin_v3_CertificateDetails_submsgs[0],
&envoy_admin_v3_CertificateDetails__fields[0],
UPB_SIZE(48, 80), 7, kUpb_ExtMode_NonExtendable, 7, UPB_FASTTABLE_MASK(56), 0,
@ -90,8 +89,8 @@ const upb_MiniTable envoy_admin_v3_CertificateDetails_msg_init = {
};
static const upb_MiniTableSub envoy_admin_v3_CertificateDetails_OcspDetails_submsgs[2] = {
{.submsg = &google_protobuf_Timestamp_msg_init},
{.submsg = &google_protobuf_Timestamp_msg_init},
{.submsg = &google__protobuf__Timestamp_msg_init},
{.submsg = &google__protobuf__Timestamp_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_CertificateDetails_OcspDetails__fields[2] = {
@ -99,7 +98,7 @@ static const upb_MiniTableField envoy_admin_v3_CertificateDetails_OcspDetails__f
{2, UPB_SIZE(8, 16), 2, 1, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_CertificateDetails_OcspDetails_msg_init = {
const upb_MiniTable envoy__admin__v3__CertificateDetails__OcspDetails_msg_init = {
&envoy_admin_v3_CertificateDetails_OcspDetails_submsgs[0],
&envoy_admin_v3_CertificateDetails_OcspDetails__fields[0],
UPB_SIZE(16, 24), 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(24), 0,
@ -117,7 +116,7 @@ static const upb_MiniTableField envoy_admin_v3_SubjectAlternateName__fields[3] =
{3, UPB_SIZE(4, 8), -1, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_SubjectAlternateName_msg_init = {
const upb_MiniTable envoy__admin__v3__SubjectAlternateName_msg_init = {
NULL,
&envoy_admin_v3_SubjectAlternateName__fields[0],
UPB_SIZE(16, 24), 3, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(24), 0,
@ -130,11 +129,11 @@ const upb_MiniTable envoy_admin_v3_SubjectAlternateName_msg_init = {
};
static const upb_MiniTable *messages_layout[5] = {
&envoy_admin_v3_Certificates_msg_init,
&envoy_admin_v3_Certificate_msg_init,
&envoy_admin_v3_CertificateDetails_msg_init,
&envoy_admin_v3_CertificateDetails_OcspDetails_msg_init,
&envoy_admin_v3_SubjectAlternateName_msg_init,
&envoy__admin__v3__Certificates_msg_init,
&envoy__admin__v3__Certificate_msg_init,
&envoy__admin__v3__CertificateDetails_msg_init,
&envoy__admin__v3__CertificateDetails__OcspDetails_msg_init,
&envoy__admin__v3__SubjectAlternateName_msg_init,
};
const upb_MiniTableFile envoy_admin_v3_certs_proto_upb_file_layout = {

@ -0,0 +1,34 @@
/* This file was generated by upb_generator from the input file:
*
* envoy/admin/v3/certs.proto
*
* Do not edit -- your changes will be discarded when the file is
* regenerated. */
#ifndef ENVOY_ADMIN_V3_CERTS_PROTO_UPB_MINITABLE_H_
#define ENVOY_ADMIN_V3_CERTS_PROTO_UPB_MINITABLE_H_
#include "upb/generated_code_support.h"
// Must be last.
#include "upb/port/def.inc"
#ifdef __cplusplus
extern "C" {
#endif
extern const upb_MiniTable envoy__admin__v3__Certificates_msg_init;
extern const upb_MiniTable envoy__admin__v3__Certificate_msg_init;
extern const upb_MiniTable envoy__admin__v3__CertificateDetails_msg_init;
extern const upb_MiniTable envoy__admin__v3__CertificateDetails__OcspDetails_msg_init;
extern const upb_MiniTable envoy__admin__v3__SubjectAlternateName_msg_init;
extern const upb_MiniTableFile envoy_admin_v3_certs_proto_upb_file_layout;
#ifdef __cplusplus
} /* extern "C" */
#endif
#include "upb/port/undef.inc"
#endif /* ENVOY_ADMIN_V3_CERTS_PROTO_UPB_MINITABLE_H_ */

@ -1,5 +1,4 @@
/* This file was generated by upbc (the upb compiler) from the input
* file:
/* This file was generated by upb_generator from the input file:
*
* envoy/admin/v3/clusters.proto
*
@ -10,7 +9,19 @@
#define ENVOY_ADMIN_V3_CLUSTERS_PROTO_UPB_H_
#include "upb/generated_code_support.h"
// Must be last.
#include "envoy/admin/v3/clusters.upb_minitable.h"
#include "envoy/admin/v3/metrics.upb_minitable.h"
#include "envoy/config/cluster/v3/circuit_breaker.upb_minitable.h"
#include "envoy/config/core/v3/address.upb_minitable.h"
#include "envoy/config/core/v3/base.upb_minitable.h"
#include "envoy/config/core/v3/health_check.upb_minitable.h"
#include "envoy/type/v3/percent.upb_minitable.h"
#include "udpa/annotations/status.upb_minitable.h"
#include "udpa/annotations/versioning.upb_minitable.h"
// Must be last.
#include "upb/port/def.inc"
#ifdef __cplusplus
@ -21,32 +32,23 @@ typedef struct envoy_admin_v3_Clusters envoy_admin_v3_Clusters;
typedef struct envoy_admin_v3_ClusterStatus envoy_admin_v3_ClusterStatus;
typedef struct envoy_admin_v3_HostStatus envoy_admin_v3_HostStatus;
typedef struct envoy_admin_v3_HostHealthStatus envoy_admin_v3_HostHealthStatus;
extern const upb_MiniTable envoy_admin_v3_Clusters_msg_init;
extern const upb_MiniTable envoy_admin_v3_ClusterStatus_msg_init;
extern const upb_MiniTable envoy_admin_v3_HostStatus_msg_init;
extern const upb_MiniTable envoy_admin_v3_HostHealthStatus_msg_init;
struct envoy_admin_v3_SimpleMetric;
struct envoy_config_cluster_v3_CircuitBreakers;
struct envoy_config_core_v3_Address;
struct envoy_config_core_v3_Locality;
struct envoy_type_v3_Percent;
extern const upb_MiniTable envoy_admin_v3_SimpleMetric_msg_init;
extern const upb_MiniTable envoy_config_cluster_v3_CircuitBreakers_msg_init;
extern const upb_MiniTable envoy_config_core_v3_Address_msg_init;
extern const upb_MiniTable envoy_config_core_v3_Locality_msg_init;
extern const upb_MiniTable envoy_type_v3_Percent_msg_init;
/* envoy.admin.v3.Clusters */
UPB_INLINE envoy_admin_v3_Clusters* envoy_admin_v3_Clusters_new(upb_Arena* arena) {
return (envoy_admin_v3_Clusters*)_upb_Message_New(&envoy_admin_v3_Clusters_msg_init, arena);
return (envoy_admin_v3_Clusters*)_upb_Message_New(&envoy__admin__v3__Clusters_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_Clusters* envoy_admin_v3_Clusters_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_Clusters* ret = envoy_admin_v3_Clusters_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Clusters_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Clusters_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -56,7 +58,7 @@ UPB_INLINE envoy_admin_v3_Clusters* envoy_admin_v3_Clusters_parse_ex(const char*
int options, upb_Arena* arena) {
envoy_admin_v3_Clusters* ret = envoy_admin_v3_Clusters_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_Clusters_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__Clusters_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -64,13 +66,13 @@ UPB_INLINE envoy_admin_v3_Clusters* envoy_admin_v3_Clusters_parse_ex(const char*
}
UPB_INLINE char* envoy_admin_v3_Clusters_serialize(const envoy_admin_v3_Clusters* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Clusters_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Clusters_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_Clusters_serialize_ex(const envoy_admin_v3_Clusters* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_Clusters_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__Clusters_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_Clusters_clear_cluster_statuses(envoy_admin_v3_Clusters* msg) {
@ -132,7 +134,7 @@ UPB_INLINE struct envoy_admin_v3_ClusterStatus* envoy_admin_v3_Clusters_add_clus
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_ClusterStatus* sub = (struct envoy_admin_v3_ClusterStatus*)_upb_Message_New(&envoy_admin_v3_ClusterStatus_msg_init, arena);
struct envoy_admin_v3_ClusterStatus* sub = (struct envoy_admin_v3_ClusterStatus*)_upb_Message_New(&envoy__admin__v3__ClusterStatus_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -141,12 +143,12 @@ UPB_INLINE struct envoy_admin_v3_ClusterStatus* envoy_admin_v3_Clusters_add_clus
/* envoy.admin.v3.ClusterStatus */
UPB_INLINE envoy_admin_v3_ClusterStatus* envoy_admin_v3_ClusterStatus_new(upb_Arena* arena) {
return (envoy_admin_v3_ClusterStatus*)_upb_Message_New(&envoy_admin_v3_ClusterStatus_msg_init, arena);
return (envoy_admin_v3_ClusterStatus*)_upb_Message_New(&envoy__admin__v3__ClusterStatus_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_ClusterStatus* envoy_admin_v3_ClusterStatus_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_ClusterStatus* ret = envoy_admin_v3_ClusterStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_ClusterStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__ClusterStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -156,7 +158,7 @@ UPB_INLINE envoy_admin_v3_ClusterStatus* envoy_admin_v3_ClusterStatus_parse_ex(c
int options, upb_Arena* arena) {
envoy_admin_v3_ClusterStatus* ret = envoy_admin_v3_ClusterStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_ClusterStatus_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__ClusterStatus_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -164,13 +166,13 @@ UPB_INLINE envoy_admin_v3_ClusterStatus* envoy_admin_v3_ClusterStatus_parse_ex(c
}
UPB_INLINE char* envoy_admin_v3_ClusterStatus_serialize(const envoy_admin_v3_ClusterStatus* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_ClusterStatus_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__ClusterStatus_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_ClusterStatus_serialize_ex(const envoy_admin_v3_ClusterStatus* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_ClusterStatus_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__ClusterStatus_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_ClusterStatus_clear_name(envoy_admin_v3_ClusterStatus* msg) {
@ -315,7 +317,7 @@ UPB_INLINE void envoy_admin_v3_ClusterStatus_set_success_rate_ejection_threshold
UPB_INLINE struct envoy_type_v3_Percent* envoy_admin_v3_ClusterStatus_mutable_success_rate_ejection_threshold(envoy_admin_v3_ClusterStatus* msg, upb_Arena* arena) {
struct envoy_type_v3_Percent* sub = (struct envoy_type_v3_Percent*)envoy_admin_v3_ClusterStatus_success_rate_ejection_threshold(msg);
if (sub == NULL) {
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy_type_v3_Percent_msg_init, arena);
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy__type__v3__Percent_msg_init, arena);
if (sub) envoy_admin_v3_ClusterStatus_set_success_rate_ejection_threshold(msg, sub);
}
return sub;
@ -341,7 +343,7 @@ UPB_INLINE struct envoy_admin_v3_HostStatus* envoy_admin_v3_ClusterStatus_add_ho
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_HostStatus* sub = (struct envoy_admin_v3_HostStatus*)_upb_Message_New(&envoy_admin_v3_HostStatus_msg_init, arena);
struct envoy_admin_v3_HostStatus* sub = (struct envoy_admin_v3_HostStatus*)_upb_Message_New(&envoy__admin__v3__HostStatus_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -353,7 +355,7 @@ UPB_INLINE void envoy_admin_v3_ClusterStatus_set_local_origin_success_rate_eject
UPB_INLINE struct envoy_type_v3_Percent* envoy_admin_v3_ClusterStatus_mutable_local_origin_success_rate_ejection_threshold(envoy_admin_v3_ClusterStatus* msg, upb_Arena* arena) {
struct envoy_type_v3_Percent* sub = (struct envoy_type_v3_Percent*)envoy_admin_v3_ClusterStatus_local_origin_success_rate_ejection_threshold(msg);
if (sub == NULL) {
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy_type_v3_Percent_msg_init, arena);
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy__type__v3__Percent_msg_init, arena);
if (sub) envoy_admin_v3_ClusterStatus_set_local_origin_success_rate_ejection_threshold(msg, sub);
}
return sub;
@ -365,7 +367,7 @@ UPB_INLINE void envoy_admin_v3_ClusterStatus_set_circuit_breakers(envoy_admin_v3
UPB_INLINE struct envoy_config_cluster_v3_CircuitBreakers* envoy_admin_v3_ClusterStatus_mutable_circuit_breakers(envoy_admin_v3_ClusterStatus* msg, upb_Arena* arena) {
struct envoy_config_cluster_v3_CircuitBreakers* sub = (struct envoy_config_cluster_v3_CircuitBreakers*)envoy_admin_v3_ClusterStatus_circuit_breakers(msg);
if (sub == NULL) {
sub = (struct envoy_config_cluster_v3_CircuitBreakers*)_upb_Message_New(&envoy_config_cluster_v3_CircuitBreakers_msg_init, arena);
sub = (struct envoy_config_cluster_v3_CircuitBreakers*)_upb_Message_New(&envoy__config__cluster__v3__CircuitBreakers_msg_init, arena);
if (sub) envoy_admin_v3_ClusterStatus_set_circuit_breakers(msg, sub);
}
return sub;
@ -382,12 +384,12 @@ UPB_INLINE void envoy_admin_v3_ClusterStatus_set_eds_service_name(envoy_admin_v3
/* envoy.admin.v3.HostStatus */
UPB_INLINE envoy_admin_v3_HostStatus* envoy_admin_v3_HostStatus_new(upb_Arena* arena) {
return (envoy_admin_v3_HostStatus*)_upb_Message_New(&envoy_admin_v3_HostStatus_msg_init, arena);
return (envoy_admin_v3_HostStatus*)_upb_Message_New(&envoy__admin__v3__HostStatus_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_HostStatus* envoy_admin_v3_HostStatus_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_HostStatus* ret = envoy_admin_v3_HostStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_HostStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__HostStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -397,7 +399,7 @@ UPB_INLINE envoy_admin_v3_HostStatus* envoy_admin_v3_HostStatus_parse_ex(const c
int options, upb_Arena* arena) {
envoy_admin_v3_HostStatus* ret = envoy_admin_v3_HostStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_HostStatus_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__HostStatus_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -405,13 +407,13 @@ UPB_INLINE envoy_admin_v3_HostStatus* envoy_admin_v3_HostStatus_parse_ex(const c
}
UPB_INLINE char* envoy_admin_v3_HostStatus_serialize(const envoy_admin_v3_HostStatus* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_HostStatus_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__HostStatus_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_HostStatus_serialize_ex(const envoy_admin_v3_HostStatus* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_HostStatus_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__HostStatus_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_HostStatus_clear_address(envoy_admin_v3_HostStatus* msg) {
@ -567,7 +569,7 @@ UPB_INLINE void envoy_admin_v3_HostStatus_set_address(envoy_admin_v3_HostStatus
UPB_INLINE struct envoy_config_core_v3_Address* envoy_admin_v3_HostStatus_mutable_address(envoy_admin_v3_HostStatus* msg, upb_Arena* arena) {
struct envoy_config_core_v3_Address* sub = (struct envoy_config_core_v3_Address*)envoy_admin_v3_HostStatus_address(msg);
if (sub == NULL) {
sub = (struct envoy_config_core_v3_Address*)_upb_Message_New(&envoy_config_core_v3_Address_msg_init, arena);
sub = (struct envoy_config_core_v3_Address*)_upb_Message_New(&envoy__config__core__v3__Address_msg_init, arena);
if (sub) envoy_admin_v3_HostStatus_set_address(msg, sub);
}
return sub;
@ -593,7 +595,7 @@ UPB_INLINE struct envoy_admin_v3_SimpleMetric* envoy_admin_v3_HostStatus_add_sta
if (!arr || !_upb_Array_ResizeUninitialized(arr, arr->size + 1, arena)) {
return NULL;
}
struct envoy_admin_v3_SimpleMetric* sub = (struct envoy_admin_v3_SimpleMetric*)_upb_Message_New(&envoy_admin_v3_SimpleMetric_msg_init, arena);
struct envoy_admin_v3_SimpleMetric* sub = (struct envoy_admin_v3_SimpleMetric*)_upb_Message_New(&envoy__admin__v3__SimpleMetric_msg_init, arena);
if (!arr || !sub) return NULL;
_upb_Array_Set(arr, arr->size - 1, &sub, sizeof(sub));
return sub;
@ -605,7 +607,7 @@ UPB_INLINE void envoy_admin_v3_HostStatus_set_health_status(envoy_admin_v3_HostS
UPB_INLINE struct envoy_admin_v3_HostHealthStatus* envoy_admin_v3_HostStatus_mutable_health_status(envoy_admin_v3_HostStatus* msg, upb_Arena* arena) {
struct envoy_admin_v3_HostHealthStatus* sub = (struct envoy_admin_v3_HostHealthStatus*)envoy_admin_v3_HostStatus_health_status(msg);
if (sub == NULL) {
sub = (struct envoy_admin_v3_HostHealthStatus*)_upb_Message_New(&envoy_admin_v3_HostHealthStatus_msg_init, arena);
sub = (struct envoy_admin_v3_HostHealthStatus*)_upb_Message_New(&envoy__admin__v3__HostHealthStatus_msg_init, arena);
if (sub) envoy_admin_v3_HostStatus_set_health_status(msg, sub);
}
return sub;
@ -617,7 +619,7 @@ UPB_INLINE void envoy_admin_v3_HostStatus_set_success_rate(envoy_admin_v3_HostSt
UPB_INLINE struct envoy_type_v3_Percent* envoy_admin_v3_HostStatus_mutable_success_rate(envoy_admin_v3_HostStatus* msg, upb_Arena* arena) {
struct envoy_type_v3_Percent* sub = (struct envoy_type_v3_Percent*)envoy_admin_v3_HostStatus_success_rate(msg);
if (sub == NULL) {
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy_type_v3_Percent_msg_init, arena);
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy__type__v3__Percent_msg_init, arena);
if (sub) envoy_admin_v3_HostStatus_set_success_rate(msg, sub);
}
return sub;
@ -641,7 +643,7 @@ UPB_INLINE void envoy_admin_v3_HostStatus_set_local_origin_success_rate(envoy_ad
UPB_INLINE struct envoy_type_v3_Percent* envoy_admin_v3_HostStatus_mutable_local_origin_success_rate(envoy_admin_v3_HostStatus* msg, upb_Arena* arena) {
struct envoy_type_v3_Percent* sub = (struct envoy_type_v3_Percent*)envoy_admin_v3_HostStatus_local_origin_success_rate(msg);
if (sub == NULL) {
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy_type_v3_Percent_msg_init, arena);
sub = (struct envoy_type_v3_Percent*)_upb_Message_New(&envoy__type__v3__Percent_msg_init, arena);
if (sub) envoy_admin_v3_HostStatus_set_local_origin_success_rate(msg, sub);
}
return sub;
@ -653,7 +655,7 @@ UPB_INLINE void envoy_admin_v3_HostStatus_set_locality(envoy_admin_v3_HostStatus
UPB_INLINE struct envoy_config_core_v3_Locality* envoy_admin_v3_HostStatus_mutable_locality(envoy_admin_v3_HostStatus* msg, upb_Arena* arena) {
struct envoy_config_core_v3_Locality* sub = (struct envoy_config_core_v3_Locality*)envoy_admin_v3_HostStatus_locality(msg);
if (sub == NULL) {
sub = (struct envoy_config_core_v3_Locality*)_upb_Message_New(&envoy_config_core_v3_Locality_msg_init, arena);
sub = (struct envoy_config_core_v3_Locality*)_upb_Message_New(&envoy__config__core__v3__Locality_msg_init, arena);
if (sub) envoy_admin_v3_HostStatus_set_locality(msg, sub);
}
return sub;
@ -662,12 +664,12 @@ UPB_INLINE struct envoy_config_core_v3_Locality* envoy_admin_v3_HostStatus_mutab
/* envoy.admin.v3.HostHealthStatus */
UPB_INLINE envoy_admin_v3_HostHealthStatus* envoy_admin_v3_HostHealthStatus_new(upb_Arena* arena) {
return (envoy_admin_v3_HostHealthStatus*)_upb_Message_New(&envoy_admin_v3_HostHealthStatus_msg_init, arena);
return (envoy_admin_v3_HostHealthStatus*)_upb_Message_New(&envoy__admin__v3__HostHealthStatus_msg_init, arena);
}
UPB_INLINE envoy_admin_v3_HostHealthStatus* envoy_admin_v3_HostHealthStatus_parse(const char* buf, size_t size, upb_Arena* arena) {
envoy_admin_v3_HostHealthStatus* ret = envoy_admin_v3_HostHealthStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_HostHealthStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
if (upb_Decode(buf, size, ret, &envoy__admin__v3__HostHealthStatus_msg_init, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
return NULL;
}
return ret;
@ -677,7 +679,7 @@ UPB_INLINE envoy_admin_v3_HostHealthStatus* envoy_admin_v3_HostHealthStatus_pars
int options, upb_Arena* arena) {
envoy_admin_v3_HostHealthStatus* ret = envoy_admin_v3_HostHealthStatus_new(arena);
if (!ret) return NULL;
if (upb_Decode(buf, size, ret, &envoy_admin_v3_HostHealthStatus_msg_init, extreg, options, arena) !=
if (upb_Decode(buf, size, ret, &envoy__admin__v3__HostHealthStatus_msg_init, extreg, options, arena) !=
kUpb_DecodeStatus_Ok) {
return NULL;
}
@ -685,13 +687,13 @@ UPB_INLINE envoy_admin_v3_HostHealthStatus* envoy_admin_v3_HostHealthStatus_pars
}
UPB_INLINE char* envoy_admin_v3_HostHealthStatus_serialize(const envoy_admin_v3_HostHealthStatus* msg, upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_HostHealthStatus_msg_init, 0, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__HostHealthStatus_msg_init, 0, arena, &ptr, len);
return ptr;
}
UPB_INLINE char* envoy_admin_v3_HostHealthStatus_serialize_ex(const envoy_admin_v3_HostHealthStatus* msg, int options,
upb_Arena* arena, size_t* len) {
char* ptr;
(void)upb_Encode(msg, &envoy_admin_v3_HostHealthStatus_msg_init, options, arena, &ptr, len);
(void)upb_Encode(msg, &envoy__admin__v3__HostHealthStatus_msg_init, options, arena, &ptr, len);
return ptr;
}
UPB_INLINE void envoy_admin_v3_HostHealthStatus_clear_failed_active_health_check(envoy_admin_v3_HostHealthStatus* msg) {
@ -816,8 +818,6 @@ UPB_INLINE void envoy_admin_v3_HostHealthStatus_set_active_hc_timeout(envoy_admi
_upb_Message_SetNonExtensionField(msg, &field, &value);
}
extern const upb_MiniTableFile envoy_admin_v3_clusters_proto_upb_file_layout;
#ifdef __cplusplus
} /* extern "C" */
#endif

@ -1,5 +1,4 @@
/* This file was generated by upbc (the upb compiler) from the input
* file:
/* This file was generated by upb_generator from the input file:
*
* envoy/admin/v3/clusters.proto
*
@ -8,28 +7,28 @@
#include <stddef.h>
#include "upb/generated_code_support.h"
#include "envoy/admin/v3/clusters.upb.h"
#include "envoy/admin/v3/metrics.upb.h"
#include "envoy/config/cluster/v3/circuit_breaker.upb.h"
#include "envoy/config/core/v3/address.upb.h"
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/config/core/v3/health_check.upb.h"
#include "envoy/type/v3/percent.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "envoy/admin/v3/clusters.upb_minitable.h"
#include "envoy/admin/v3/metrics.upb_minitable.h"
#include "envoy/config/cluster/v3/circuit_breaker.upb_minitable.h"
#include "envoy/config/core/v3/address.upb_minitable.h"
#include "envoy/config/core/v3/base.upb_minitable.h"
#include "envoy/config/core/v3/health_check.upb_minitable.h"
#include "envoy/type/v3/percent.upb_minitable.h"
#include "udpa/annotations/status.upb_minitable.h"
#include "udpa/annotations/versioning.upb_minitable.h"
// Must be last.
#include "upb/port/def.inc"
static const upb_MiniTableSub envoy_admin_v3_Clusters_submsgs[1] = {
{.submsg = &envoy_admin_v3_ClusterStatus_msg_init},
{.submsg = &envoy__admin__v3__ClusterStatus_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_Clusters__fields[1] = {
{1, 0, 0, 0, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_Clusters_msg_init = {
const upb_MiniTable envoy__admin__v3__Clusters_msg_init = {
&envoy_admin_v3_Clusters_submsgs[0],
&envoy_admin_v3_Clusters__fields[0],
8, 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
@ -40,10 +39,10 @@ const upb_MiniTable envoy_admin_v3_Clusters_msg_init = {
};
static const upb_MiniTableSub envoy_admin_v3_ClusterStatus_submsgs[4] = {
{.submsg = &envoy_type_v3_Percent_msg_init},
{.submsg = &envoy_admin_v3_HostStatus_msg_init},
{.submsg = &envoy_type_v3_Percent_msg_init},
{.submsg = &envoy_config_cluster_v3_CircuitBreakers_msg_init},
{.submsg = &envoy__type__v3__Percent_msg_init},
{.submsg = &envoy__admin__v3__HostStatus_msg_init},
{.submsg = &envoy__type__v3__Percent_msg_init},
{.submsg = &envoy__config__cluster__v3__CircuitBreakers_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_ClusterStatus__fields[8] = {
@ -57,7 +56,7 @@ static const upb_MiniTableField envoy_admin_v3_ClusterStatus__fields[8] = {
{8, UPB_SIZE(36, 72), 0, kUpb_NoSub, 9, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_ClusterStatus_msg_init = {
const upb_MiniTable envoy__admin__v3__ClusterStatus_msg_init = {
&envoy_admin_v3_ClusterStatus_submsgs[0],
&envoy_admin_v3_ClusterStatus__fields[0],
UPB_SIZE(48, 88), 8, kUpb_ExtMode_NonExtendable, 8, UPB_FASTTABLE_MASK(120), 0,
@ -82,12 +81,12 @@ const upb_MiniTable envoy_admin_v3_ClusterStatus_msg_init = {
};
static const upb_MiniTableSub envoy_admin_v3_HostStatus_submsgs[6] = {
{.submsg = &envoy_config_core_v3_Address_msg_init},
{.submsg = &envoy_admin_v3_SimpleMetric_msg_init},
{.submsg = &envoy_admin_v3_HostHealthStatus_msg_init},
{.submsg = &envoy_type_v3_Percent_msg_init},
{.submsg = &envoy_type_v3_Percent_msg_init},
{.submsg = &envoy_config_core_v3_Locality_msg_init},
{.submsg = &envoy__config__core__v3__Address_msg_init},
{.submsg = &envoy__admin__v3__SimpleMetric_msg_init},
{.submsg = &envoy__admin__v3__HostHealthStatus_msg_init},
{.submsg = &envoy__type__v3__Percent_msg_init},
{.submsg = &envoy__type__v3__Percent_msg_init},
{.submsg = &envoy__config__core__v3__Locality_msg_init},
};
static const upb_MiniTableField envoy_admin_v3_HostStatus__fields[9] = {
@ -102,7 +101,7 @@ static const upb_MiniTableField envoy_admin_v3_HostStatus__fields[9] = {
{9, UPB_SIZE(32, 72), 5, 5, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_HostStatus_msg_init = {
const upb_MiniTable envoy__admin__v3__HostStatus_msg_init = {
&envoy_admin_v3_HostStatus_submsgs[0],
&envoy_admin_v3_HostStatus__fields[0],
UPB_SIZE(48, 80), 9, kUpb_ExtMode_NonExtendable, 9, UPB_FASTTABLE_MASK(120), 0,
@ -137,7 +136,7 @@ static const upb_MiniTableField envoy_admin_v3_HostHealthStatus__fields[8] = {
{8, 12, 0, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
};
const upb_MiniTable envoy_admin_v3_HostHealthStatus_msg_init = {
const upb_MiniTable envoy__admin__v3__HostHealthStatus_msg_init = {
NULL,
&envoy_admin_v3_HostHealthStatus__fields[0],
16, 8, kUpb_ExtMode_NonExtendable, 8, UPB_FASTTABLE_MASK(120), 0,
@ -162,10 +161,10 @@ const upb_MiniTable envoy_admin_v3_HostHealthStatus_msg_init = {
};
static const upb_MiniTable *messages_layout[4] = {
&envoy_admin_v3_Clusters_msg_init,
&envoy_admin_v3_ClusterStatus_msg_init,
&envoy_admin_v3_HostStatus_msg_init,
&envoy_admin_v3_HostHealthStatus_msg_init,
&envoy__admin__v3__Clusters_msg_init,
&envoy__admin__v3__ClusterStatus_msg_init,
&envoy__admin__v3__HostStatus_msg_init,
&envoy__admin__v3__HostHealthStatus_msg_init,
};
const upb_MiniTableFile envoy_admin_v3_clusters_proto_upb_file_layout = {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save