grpc 1.78.0 → 1.80.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +22 -8
  3. data/include/grpc/credentials.h +47 -37
  4. data/include/grpc/credentials_cpp.h +39 -0
  5. data/include/grpc/event_engine/event_engine.h +8 -3
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/impl/call.h +9 -0
  8. data/include/grpc/impl/channel_arg_names.h +7 -0
  9. data/include/grpc/module.modulemap +2 -0
  10. data/include/grpc/private_key_signer.h +104 -0
  11. data/include/grpc/support/port_platform.h +6 -0
  12. data/src/core/call/call_filters.h +101 -78
  13. data/src/core/call/call_spine.h +91 -68
  14. data/src/core/call/call_state.h +60 -4
  15. data/src/core/call/client_call.cc +9 -9
  16. data/src/core/call/client_call.h +1 -1
  17. data/src/core/call/metadata_batch.cc +2 -0
  18. data/src/core/call/metadata_batch.h +48 -1
  19. data/src/core/call/metadata_info.cc +35 -0
  20. data/src/core/call/metadata_info.h +2 -0
  21. data/src/core/call/simple_slice_based_metadata.h +2 -1
  22. data/src/core/channelz/channelz.cc +9 -6
  23. data/src/core/channelz/channelz.h +7 -4
  24. data/src/core/channelz/property_list.h +5 -0
  25. data/src/core/channelz/v2tov1/convert.cc +1 -1
  26. data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
  27. data/src/core/client_channel/buffered_call.cc +7 -3
  28. data/src/core/client_channel/buffered_call.h +11 -5
  29. data/src/core/client_channel/client_channel.cc +106 -44
  30. data/src/core/client_channel/client_channel.h +3 -6
  31. data/src/core/client_channel/client_channel_filter.cc +90 -64
  32. data/src/core/client_channel/client_channel_filter.h +3 -6
  33. data/src/core/client_channel/client_channel_internal.h +5 -0
  34. data/src/core/client_channel/config_selector.h +17 -12
  35. data/src/core/client_channel/dynamic_filters.cc +8 -7
  36. data/src/core/client_channel/dynamic_filters.h +7 -5
  37. data/src/core/client_channel/retry_filter.cc +1 -1
  38. data/src/core/client_channel/retry_filter.h +2 -2
  39. data/src/core/client_channel/subchannel.cc +1682 -266
  40. data/src/core/client_channel/subchannel.h +411 -134
  41. data/src/core/client_channel/subchannel_stream_client.cc +22 -18
  42. data/src/core/client_channel/subchannel_stream_client.h +8 -9
  43. data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
  44. data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
  45. data/src/core/config/config_vars.cc +9 -1
  46. data/src/core/config/config_vars.h +6 -0
  47. data/src/core/credentials/call/call_creds_registry.h +51 -22
  48. data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
  49. data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
  50. data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
  51. data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
  52. data/src/core/credentials/transport/channel_creds_registry.h +71 -20
  53. data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
  54. data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
  55. data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
  56. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
  57. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
  58. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
  59. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
  60. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
  61. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
  62. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
  63. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
  64. data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
  65. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
  66. data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
  67. data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
  68. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
  69. data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
  70. data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
  72. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
  73. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
  74. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
  75. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
  76. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
  77. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
  78. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  79. data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
  80. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
  81. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  82. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
  83. data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
  84. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  85. data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
  86. data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
  87. data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
  88. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
  89. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  90. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
  91. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
  94. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
  95. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
  96. data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
  97. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
  98. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
  99. data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
  100. data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
  101. data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
  102. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
  103. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
  104. data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
  105. data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
  106. data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
  107. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
  108. data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
  109. data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
  110. data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
  111. data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
  112. data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
  113. data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
  114. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
  115. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
  116. data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
  117. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
  118. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
  119. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
  120. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
  121. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
  122. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
  123. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
  124. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
  125. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
  126. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
  127. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
  128. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
  141. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
  142. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
  143. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
  144. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
  145. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
  146. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
  147. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
  148. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
  149. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
  150. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
  151. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
  152. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
  153. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  154. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
  155. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
  156. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
  157. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
  158. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
  159. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
  160. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  161. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
  162. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
  163. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
  164. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
  165. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
  166. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
  167. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
  168. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
  169. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
  170. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
  171. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
  172. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
  173. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
  174. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
  175. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
  176. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
  177. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
  178. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
  179. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
  180. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
  181. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
  182. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
  183. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
  184. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
  185. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
  186. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
  187. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
  188. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
  189. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
  190. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
  191. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
  192. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
  193. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
  194. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
  195. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
  196. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
  197. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
  198. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
  199. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
  200. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
  201. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
  202. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
  203. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
  204. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
  205. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
  206. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
  207. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
  208. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
  209. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
  210. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
  211. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
  212. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
  213. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
  214. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
  215. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
  216. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
  217. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
  218. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
  219. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
  220. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
  221. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
  222. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
  223. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
  224. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
  225. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
  235. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
  236. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
  237. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
  238. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  239. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
  240. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
  241. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
  242. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
  243. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
  244. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
  245. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
  246. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
  247. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
  248. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
  249. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
  250. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
  251. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
  252. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
  253. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
  254. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  255. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
  256. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
  257. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
  258. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
  259. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
  260. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
  261. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
  262. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
  263. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
  264. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
  267. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
  268. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
  269. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
  270. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
  271. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
  272. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
  273. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
  274. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
  275. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
  276. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
  277. data/src/core/filter/filter_chain.h +95 -0
  278. data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
  279. data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
  280. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  282. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
  283. data/src/core/handshaker/security/secure_endpoint.cc +282 -68
  284. data/src/core/handshaker/security/secure_endpoint.h +0 -7
  285. data/src/core/lib/channel/channel_args.h +1 -1
  286. data/src/core/lib/channel/promise_based_filter.cc +17 -4
  287. data/src/core/lib/channel/promise_based_filter.h +3 -2
  288. data/src/core/lib/debug/trace_flags.cc +2 -0
  289. data/src/core/lib/debug/trace_flags.h +1 -0
  290. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
  291. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
  292. data/src/core/lib/event_engine/event_engine.cc +9 -0
  293. data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
  294. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
  295. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
  296. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
  297. data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
  298. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
  299. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
  300. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
  301. data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
  302. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
  303. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
  304. data/src/core/lib/experiments/experiments.cc +309 -201
  305. data/src/core/lib/experiments/experiments.h +141 -80
  306. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  307. data/src/core/lib/iomgr/resolve_address.h +0 -2
  308. data/src/core/lib/iomgr/resolved_address.h +0 -2
  309. data/src/core/lib/iomgr/tcp_posix.cc +13 -5
  310. data/src/core/lib/iomgr/tcp_server.cc +0 -5
  311. data/src/core/lib/iomgr/tcp_server.h +0 -7
  312. data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
  313. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
  315. data/src/core/lib/promise/all_ok.h +17 -12
  316. data/src/core/lib/promise/cancel_callback.h +12 -13
  317. data/src/core/lib/promise/detail/join_state.h +626 -0
  318. data/src/core/lib/promise/detail/promise_factory.h +14 -14
  319. data/src/core/lib/promise/for_each.h +32 -8
  320. data/src/core/lib/promise/if.h +9 -7
  321. data/src/core/lib/promise/loop.h +18 -16
  322. data/src/core/lib/promise/map.h +54 -47
  323. data/src/core/lib/promise/mpsc.h +11 -10
  324. data/src/core/lib/promise/observable.h +6 -6
  325. data/src/core/lib/promise/party.h +25 -19
  326. data/src/core/lib/promise/poll.h +5 -5
  327. data/src/core/lib/promise/prioritized_race.h +10 -7
  328. data/src/core/lib/promise/promise.h +16 -11
  329. data/src/core/lib/promise/race.h +6 -5
  330. data/src/core/lib/promise/seq.h +109 -74
  331. data/src/core/lib/promise/try_join.h +14 -6
  332. data/src/core/lib/promise/try_seq.h +76 -60
  333. data/src/core/lib/resource_quota/api.cc +7 -0
  334. data/src/core/lib/resource_quota/arena.h +1 -1
  335. data/src/core/lib/resource_quota/memory_quota.cc +4 -1
  336. data/src/core/lib/resource_quota/resource_quota.cc +2 -1
  337. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  338. data/src/core/lib/resource_quota/stream_quota.cc +77 -1
  339. data/src/core/lib/resource_quota/stream_quota.h +64 -1
  340. data/src/core/lib/resource_quota/telemetry.h +1 -1
  341. data/src/core/lib/surface/call.cc +13 -0
  342. data/src/core/lib/surface/call_utils.h +58 -43
  343. data/src/core/lib/surface/channel.h +1 -4
  344. data/src/core/lib/surface/completion_queue.cc +13 -6
  345. data/src/core/lib/surface/validate_metadata.cc +20 -15
  346. data/src/core/lib/surface/validate_metadata.h +3 -1
  347. data/src/core/lib/surface/version.cc +2 -2
  348. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  349. data/src/core/lib/transport/promise_endpoint.h +1 -1
  350. data/src/core/lib/transport/transport.h +5 -0
  351. data/src/core/load_balancing/health_check_client.cc +1 -15
  352. data/src/core/load_balancing/health_check_client_internal.h +0 -2
  353. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  354. data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
  355. data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
  356. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
  357. data/src/core/resolver/xds/xds_resolver.cc +162 -116
  358. data/src/core/server/server.cc +18 -1
  359. data/src/core/server/server.h +2 -0
  360. data/src/core/server/xds_server_config_fetcher.cc +4 -4
  361. data/src/core/telemetry/call_tracer.cc +87 -2
  362. data/src/core/telemetry/call_tracer.h +46 -8
  363. data/src/core/telemetry/instrument.cc +102 -40
  364. data/src/core/telemetry/instrument.h +246 -65
  365. data/src/core/tsi/fake_transport_security.cc +3 -1
  366. data/src/core/tsi/ssl_transport_security.cc +516 -137
  367. data/src/core/tsi/ssl_transport_security.h +28 -22
  368. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  369. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  370. data/src/core/util/bitset.h +6 -0
  371. data/src/core/util/function_signature.h +3 -1
  372. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  373. data/src/core/util/json/json_reader.cc +0 -4
  374. data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
  375. data/src/core/xds/grpc/certificate_provider_store.h +3 -17
  376. data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
  377. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
  378. data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
  379. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
  380. data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
  381. data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
  382. data/src/core/xds/grpc/xds_client_grpc.h +10 -7
  383. data/src/core/xds/grpc/xds_cluster.cc +18 -4
  384. data/src/core/xds/grpc/xds_cluster.h +17 -2
  385. data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
  386. data/src/core/xds/grpc/xds_common_types.cc +45 -0
  387. data/src/core/xds/grpc/xds_common_types.h +31 -0
  388. data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
  389. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  390. data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
  391. data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
  392. data/src/core/xds/grpc/xds_http_filter.cc +38 -0
  393. data/src/core/xds/grpc/xds_http_filter.h +70 -47
  394. data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
  395. data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
  396. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
  397. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
  398. data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
  399. data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
  400. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
  401. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
  402. data/src/core/xds/grpc/xds_listener.cc +4 -1
  403. data/src/core/xds/grpc/xds_listener.h +10 -2
  404. data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
  405. data/src/core/xds/grpc/xds_matcher.cc +40 -5
  406. data/src/core/xds/grpc/xds_matcher.h +13 -0
  407. data/src/core/xds/grpc/xds_matcher_action.h +1 -1
  408. data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
  409. data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
  410. data/src/core/xds/grpc/xds_route_config.cc +12 -1
  411. data/src/core/xds/grpc/xds_route_config.h +15 -2
  412. data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
  413. data/src/core/xds/grpc/xds_routing.cc +181 -6
  414. data/src/core/xds/grpc/xds_routing.h +57 -0
  415. data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
  416. data/src/core/xds/grpc/xds_server_grpc.h +13 -6
  417. data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
  418. data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
  419. data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
  420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
  422. data/src/ruby/lib/grpc/grpc.rb +7 -9
  423. data/src/ruby/lib/grpc/version.rb +1 -1
  424. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  425. data/src/ruby/spec/client_server_spec.rb +1 -1
  426. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  427. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  428. data/src/ruby/spec/spec_helper.rb +1 -1
  429. metadata +64 -14
  430. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  431. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -77,8 +77,7 @@ class DNSServiceResolver : public EventEngine::DNSResolver {
77
77
  public:
78
78
  explicit DNSServiceResolver(std::shared_ptr<CFEventEngine> engine)
79
79
  : engine_(std::move(engine)),
80
- impl_(grpc_core::MakeRefCounted<DNSServiceResolverImpl>(
81
- std::move((engine_)))) {}
80
+ impl_(grpc_core::MakeRefCounted<DNSServiceResolverImpl>(engine_)) {}
82
81
 
83
82
  ~DNSServiceResolver() override { impl_->Shutdown(); }
84
83
 
@@ -12,8 +12,12 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  #include <grpc/event_engine/event_engine.h>
15
+ #include <grpc/grpc.h>
15
16
  #include <grpc/support/port_platform.h>
16
17
 
18
+ #include <memory>
19
+
20
+ #include "src/core/lib/channel/channel_args.h"
17
21
  #include "src/core/telemetry/context_list_entry.h"
18
22
  #include "absl/strings/str_cat.h"
19
23
 
@@ -78,4 +82,9 @@ std::ostream& operator<<(std::ostream& out,
78
82
  return printout(out, handle);
79
83
  }
80
84
 
85
+ const grpc_arg_pointer_vtable* grpc_event_engine_arg_vtable() {
86
+ return grpc_core::ChannelArgTypeTraits<
87
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>>::VTable();
88
+ }
89
+
81
90
  } // namespace grpc_event_engine::experimental
@@ -24,9 +24,6 @@
24
24
 
25
25
  namespace grpc_event_engine::experimental {
26
26
 
27
- /** If non-zero, enable TCP tracing and stats collection. */
28
- #define GRPC_ARG_TCP_TRACING_ENABLED "grpc.tcp_tracing_enabled"
29
-
30
27
  class TcpTraceExtension {
31
28
  public:
32
29
  virtual ~TcpTraceExtension() = default;
@@ -590,8 +590,8 @@ Poller::WorkResult PollPoller::Work(
590
590
  pfds[pfd_count].events = head->BeginPollLocked(POLLIN, POLLOUT);
591
591
  pfd_count++;
592
592
  } else {
593
- LOG(ERROR) << "Polling FD from a wrong generation: "
594
- << head->WrappedFd();
593
+ LOG(INFO) << "FD from fork parent still in poll list: "
594
+ << head->WrappedFd();
595
595
  }
596
596
  }
597
597
  }
@@ -608,7 +608,7 @@ class PosixEndpoint : public PosixEndpointWithFdSupport {
608
608
  grpc_event_engine::experimental::SliceBuffer* buffer,
609
609
  grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs
610
610
  args) override {
611
- return impl_->Read(std::move(on_read), buffer, std::move(args));
611
+ return impl_->Read(std::move(on_read), buffer, args);
612
612
  }
613
613
 
614
614
  bool Write(absl::AnyInvocable<void(absl::Status)> on_writable,
@@ -403,9 +403,10 @@ void PosixEventEngine::OnConnectFinishInternal(int connection_handle) {
403
403
  }
404
404
  }
405
405
 
406
- std::shared_ptr<PosixEventEngine> PosixEventEngine::MakePosixEventEngine() {
406
+ std::shared_ptr<PosixEventEngine> PosixEventEngine::MakePosixEventEngine(
407
+ Options options) {
407
408
  // Can't use make_shared as ctor is private
408
- std::shared_ptr<PosixEventEngine> engine(new PosixEventEngine());
409
+ std::shared_ptr<PosixEventEngine> engine(new PosixEventEngine(options));
409
410
  RegisterEventEngineForFork(engine, engine->executor_, engine->timer_manager_);
410
411
  return engine;
411
412
  }
@@ -416,20 +417,21 @@ PosixEventEngine::MakeTestOnlyPosixEventEngine(
416
417
  test_only_poller) {
417
418
  // Calling a private PosixEventEngine constructor - can't do make_shared
418
419
  std::shared_ptr<PosixEventEngine> engine(
419
- new PosixEventEngine(std::move(test_only_poller)));
420
+ new PosixEventEngine(Options{}, std::move(test_only_poller)));
420
421
  RegisterEventEngineForFork(engine, engine->executor_, engine->timer_manager_);
421
422
  return engine;
422
423
  }
423
424
 
424
- PosixEventEngine::PosixEventEngine(std::shared_ptr<PosixEventPoller> poller)
425
- : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
425
+ PosixEventEngine::PosixEventEngine(const Options& options,
426
+ std::shared_ptr<PosixEventPoller> poller)
427
+ : connection_shards_(options.connection_shards),
426
428
  poller_(std::move(poller)),
427
- executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
429
+ executor_(MakeThreadPool(options.reserve_threads)),
428
430
  timer_manager_(std::make_shared<TimerManager>(executor_)) {}
429
431
 
430
- PosixEventEngine::PosixEventEngine()
431
- : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
432
- executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
432
+ PosixEventEngine::PosixEventEngine(const Options& options)
433
+ : connection_shards_(options.connection_shards),
434
+ executor_(MakeThreadPool(options.reserve_threads)),
433
435
  timer_manager_(std::make_shared<TimerManager>(executor_)) {
434
436
  if (ShouldUsePosixPoller()) {
435
437
  poller_ = grpc_event_engine::experimental::MakeDefaultPoller(executor_);
@@ -457,6 +459,19 @@ struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
457
459
  }
458
460
  };
459
461
 
462
+ void PosixEventEngine::CancelAllPendingTimers() {
463
+ {
464
+ grpc_core::MutexLock lock(&mu_);
465
+ auto pending_handles = known_handles_;
466
+ for (auto handle : pending_handles) {
467
+ CancelInternal(handle);
468
+ }
469
+ GRPC_CHECK(known_handles_.empty());
470
+ // Prevent new timers from being scheduled on this EventEngine.
471
+ disallow_new_timers_ = true;
472
+ }
473
+ }
474
+
460
475
  PosixEventEngine::~PosixEventEngine() {
461
476
  {
462
477
  grpc_core::MutexLock lock(&mu_);
@@ -478,6 +493,10 @@ PosixEventEngine::~PosixEventEngine() {
478
493
 
479
494
  bool PosixEventEngine::Cancel(EventEngine::TaskHandle handle) {
480
495
  grpc_core::MutexLock lock(&mu_);
496
+ return CancelInternal(handle);
497
+ }
498
+
499
+ bool PosixEventEngine::CancelInternal(EventEngine::TaskHandle handle) {
481
500
  if (!known_handles_.contains(handle)) return false;
482
501
  auto* cd = reinterpret_cast<ClosureData*>(handle.keys[0]);
483
502
  bool r = timer_manager_->TimerCancel(&cd->timer);
@@ -517,6 +536,12 @@ EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
517
536
  EventEngine::TaskHandle handle{reinterpret_cast<intptr_t>(cd),
518
537
  aba_token_.fetch_add(1)};
519
538
  grpc_core::MutexLock lock(&mu_);
539
+ if (disallow_new_timers_) {
540
+ delete cd;
541
+ // Return handle and don't schedule the callback. The caller will see a
542
+ // valid handle but it cannot be cancelled since it was not scheduled.
543
+ return handle;
544
+ }
520
545
  known_handles_.insert(handle);
521
546
  cd->handle = handle;
522
547
  GRPC_TRACE_LOG(event_engine, INFO)
@@ -16,8 +16,10 @@
16
16
  #include <grpc/event_engine/endpoint_config.h>
17
17
  #include <grpc/event_engine/event_engine.h>
18
18
  #include <grpc/event_engine/memory_allocator.h>
19
+ #include <grpc/support/cpu.h>
19
20
  #include <grpc/support/port_platform.h>
20
21
 
22
+ #include <algorithm>
21
23
  #include <atomic>
22
24
  #include <cstdint>
23
25
  #include <memory>
@@ -35,6 +37,7 @@
35
37
  #include "src/core/lib/iomgr/port.h"
36
38
  #include "src/core/util/orphanable.h"
37
39
  #include "src/core/util/sync.h"
40
+ #include "src/core/util/useful.h"
38
41
  #include "absl/base/thread_annotations.h"
39
42
  #include "absl/container/flat_hash_map.h"
40
43
  #include "absl/container/inlined_vector.h"
@@ -100,6 +103,17 @@ class AsyncConnect {
100
103
  // All methods require an ExecCtx to already exist on the thread's stack.
101
104
  class PosixEventEngine final : public PosixEventEngineWithFdSupport {
102
105
  public:
106
+ struct Options {
107
+ // Number of connection shards to use.
108
+ int connection_shards;
109
+ // Number of threads to reserve for the thread pool.
110
+ int reserve_threads;
111
+ // Options struct is expected to grow to include more fields to
112
+ // configure the thread pool, poller etc.
113
+ Options()
114
+ : connection_shards(std::max(2 * gpr_cpu_num_cores(), 1u)),
115
+ reserve_threads(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u)) {}
116
+ };
103
117
  class PosixDNSResolver : public EventEngine::DNSResolver {
104
118
  public:
105
119
  explicit PosixDNSResolver(
@@ -116,7 +130,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport {
116
130
  grpc_core::OrphanablePtr<RefCountedDNSResolverInterface> dns_resolver_;
117
131
  };
118
132
 
119
- static std::shared_ptr<PosixEventEngine> MakePosixEventEngine();
133
+ static std::shared_ptr<PosixEventEngine> MakePosixEventEngine(
134
+ Options options = Options{});
120
135
 
121
136
  ~PosixEventEngine() override;
122
137
 
@@ -162,6 +177,9 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport {
162
177
  TaskHandle RunAfter(Duration when,
163
178
  absl::AnyInvocable<void()> closure) override;
164
179
  bool Cancel(TaskHandle handle) override;
180
+ // Cancels all pending timers and prevents any more timers from being
181
+ // scheduled. This method should be only called prior to EventEngine shutdown.
182
+ void CancelAllPendingTimers();
165
183
 
166
184
  #ifdef GRPC_POSIX_SOCKET_TCP
167
185
 
@@ -185,13 +203,16 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport {
185
203
  friend class AresResolverTest;
186
204
  struct ClosureData;
187
205
 
188
- PosixEventEngine();
206
+ explicit PosixEventEngine(const Options& options);
207
+
208
+ bool CancelInternal(TaskHandle handle) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
189
209
 
190
210
  #ifdef GRPC_POSIX_SOCKET_TCP
191
211
  // Constructs an EventEngine which has a shared ownership of the poller. Use
192
212
  // the MakeTestOnlyPosixEventEngine static method to call this. Its expected
193
213
  // to be used only in tests.
194
214
  explicit PosixEventEngine(
215
+ const Options& options,
195
216
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
196
217
  poller);
197
218
 
@@ -249,6 +270,7 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport {
249
270
  #endif
250
271
 
251
272
  grpc_core::Mutex mu_;
273
+ bool disallow_new_timers_ ABSL_GUARDED_BY(mu_) = false;
252
274
  TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_);
253
275
  std::atomic<intptr_t> aba_token_{0};
254
276
  #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
@@ -273,9 +273,7 @@ absl::Status PosixEngineListenerImpl::HandleExternalConnection(
273
273
  (void)posix_interface.SetSocketNoSigpipeIfPossible(wrapped);
274
274
  auto peer_name = posix_interface.PeerAddressString(wrapped);
275
275
  if (!peer_name.ok()) {
276
- if (grpc_core::IsGracefulExternalConnectionFailureEnabled()) {
277
- posix_interface.Close(wrapped);
278
- }
276
+ posix_interface.Close(wrapped);
279
277
  return absl::UnknownError(
280
278
  absl::StrCat("HandleExternalConnection: peer not connected: ",
281
279
  peer_name.status().ToString()));
@@ -26,6 +26,7 @@
26
26
  #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
27
27
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
28
28
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
29
+ #include "src/core/lib/experiments/experiments.h"
29
30
  #include "src/core/lib/iomgr/port.h"
30
31
  #include "src/core/util/crash.h" // IWYU pragma: keep
31
32
  #include "src/core/util/grpc_check.h"
@@ -63,10 +64,10 @@ bool SystemHasIfAddrs() { return false; }
63
64
 
64
65
  #endif // GRPC_HAVE_IFADDRS
65
66
 
66
- // Prepare a recently-created socket for listening.
67
- absl::Status PrepareSocket(EventEnginePosixInterface* posix_interface,
68
- const PosixTcpOptions& options,
69
- ListenerSocket& socket) {
67
+ // Prepare socket options for a recently-created socket for listening.
68
+ absl::Status PrepareListenerSocketOptions(
69
+ EventEnginePosixInterface* posix_interface, const PosixTcpOptions& options,
70
+ ListenerSocket& socket) {
70
71
  FileDescriptor fd = socket.sock;
71
72
  GRPC_CHECK(fd.ready());
72
73
  bool close_fd = true;
@@ -77,24 +78,119 @@ absl::Status PrepareSocket(EventEnginePosixInterface* posix_interface,
77
78
  posix_interface->Close(fd);
78
79
  }
79
80
  });
80
- auto listen_address =
81
- posix_interface->PrepareListenerSocket(socket.sock, options, socket.addr);
82
- if (!listen_address.ok()) {
83
- return std::move(listen_address).status();
81
+ auto status = posix_interface->PrepareListenerSocketOptions(
82
+ socket.sock, options, socket.addr);
83
+ if (!status.ok()) {
84
+ return status;
84
85
  }
85
- socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
86
- socket.port =
87
- ResolvedAddressGetPort(ResolvedAddress(listen_address->address(), len));
88
86
  // No errors. Set close_fd to false to ensure the socket is not closed.
89
87
  close_fd = false;
90
88
  return absl::OkStatus();
91
89
  }
92
90
 
91
+ absl::StatusOr<int> NewListenerContainerAddWildcardAddresses(
92
+ EventEnginePosixInterface* posix_interface,
93
+ ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
94
+ int requested_port,
95
+ absl::AnyInvocable<bool(const ListenerSocket&)> socket_filter) {
96
+ bool should_expand_wildcard_addrs =
97
+ SystemHasIfAddrs() && options.expand_wildcard_addrs;
98
+ if (should_expand_wildcard_addrs && socket_filter == nullptr) {
99
+ // If there is no socket filter, we can just expand all local addresses.
100
+ return ListenerContainerAddAllLocalAddresses(
101
+ posix_interface, listener_sockets, options, requested_port);
102
+ }
103
+
104
+ ResolvedAddress wild4 = ResolvedAddressMakeWild4(requested_port);
105
+ ResolvedAddress wild6 = ResolvedAddressMakeWild6(requested_port);
106
+ absl::StatusOr<ListenerSocket> v6_sock = absl::InternalError("init");
107
+ absl::StatusOr<ListenerSocket> v4_sock = absl::InternalError("init");
108
+ bool add_v4_sock = true;
109
+
110
+ // Try creating IPv6 socket first.
111
+ v6_sock = CreateListenerSocketWithoutBinding(posix_interface, options, wild6);
112
+ if (v6_sock.ok()) {
113
+ if (v6_sock->dsmode == EventEnginePosixInterface::DSMODE_DUALSTACK ||
114
+ v6_sock->dsmode == EventEnginePosixInterface::DSMODE_IPV4) {
115
+ add_v4_sock = false;
116
+ }
117
+ }
118
+ if (add_v4_sock) {
119
+ // If we got a v6-only socket or nothing, try creating IPv4 socket.
120
+ v4_sock =
121
+ CreateListenerSocketWithoutBinding(posix_interface, options, wild4);
122
+ }
123
+
124
+ // If there is a socket filter, we only expand the wildcard addresses if
125
+ // the socket filter returns true for either socket.
126
+ if (should_expand_wildcard_addrs &&
127
+ ((v6_sock.ok() && socket_filter(*v6_sock)) ||
128
+ (v4_sock.ok() && socket_filter(*v4_sock)))) {
129
+ // Close the wildcard sockets and expand all local addresses.
130
+ if (v6_sock.ok()) {
131
+ posix_interface->Close(v6_sock->sock);
132
+ }
133
+ if (v4_sock.ok()) {
134
+ posix_interface->Close(v4_sock->sock);
135
+ }
136
+ return ListenerContainerAddAllLocalAddresses(
137
+ posix_interface, listener_sockets, options, requested_port);
138
+ }
139
+
140
+ if (!v6_sock.ok() && !v4_sock.ok()) {
141
+ return absl::FailedPreconditionError(absl::StrCat(
142
+ "Failed to add any wildcard listeners: ", v6_sock.status().message(),
143
+ v4_sock.status().message()));
144
+ }
145
+
146
+ // If we are not expanding wildcard addresses, we now bind to each wildcard
147
+ // socket and add them to the listener sockets container.
148
+ int assigned_port = 0;
149
+ if (v6_sock.ok()) {
150
+ auto bind_status =
151
+ BindListenerSocket(posix_interface, v6_sock->addr, *v6_sock);
152
+ if (bind_status.ok()) {
153
+ assigned_port = v6_sock->port;
154
+ listener_sockets.Append(*v6_sock);
155
+ } else {
156
+ v6_sock = bind_status;
157
+ }
158
+ }
159
+ if (v4_sock.ok()) {
160
+ if (assigned_port != 0) {
161
+ ResolvedAddressSetPort(v4_sock->addr, assigned_port);
162
+ }
163
+ auto bind_status =
164
+ BindListenerSocket(posix_interface, v4_sock->addr, *v4_sock);
165
+ if (bind_status.ok()) {
166
+ assigned_port = v4_sock->port;
167
+ listener_sockets.Append(*v4_sock);
168
+ } else {
169
+ v4_sock = bind_status;
170
+ }
171
+ }
172
+ if (assigned_port > 0) return assigned_port;
173
+ return absl::FailedPreconditionError(absl::StrCat(
174
+ "Failed to add any wildcard listeners: ", v6_sock.status().message(),
175
+ v4_sock.status().message()));
176
+ }
177
+
93
178
  } // namespace
94
179
 
95
180
  absl::StatusOr<ListenerSocket> CreateAndPrepareListenerSocket(
96
181
  EventEnginePosixInterface* posix_interface, const PosixTcpOptions& options,
97
182
  const ResolvedAddress& addr) {
183
+ auto result =
184
+ CreateListenerSocketWithoutBinding(posix_interface, options, addr);
185
+ GRPC_RETURN_IF_ERROR(result.status());
186
+ GRPC_RETURN_IF_ERROR(
187
+ BindListenerSocket(posix_interface, result->addr, *result));
188
+ return result;
189
+ }
190
+
191
+ absl::StatusOr<ListenerSocket> CreateListenerSocketWithoutBinding(
192
+ EventEnginePosixInterface* posix_interface, const PosixTcpOptions& options,
193
+ const ResolvedAddress& addr) {
98
194
  ResolvedAddress addr4_copy;
99
195
  ListenerSocket socket;
100
196
  auto result = posix_interface->CreateDualStackSocket(
@@ -109,11 +205,36 @@ absl::StatusOr<ListenerSocket> CreateAndPrepareListenerSocket(
109
205
  } else {
110
206
  socket.addr = addr;
111
207
  }
112
- GRPC_RETURN_IF_ERROR(PrepareSocket(posix_interface, options, socket));
113
- GRPC_CHECK_GT(socket.port, 0);
208
+ GRPC_RETURN_IF_ERROR(
209
+ PrepareListenerSocketOptions(posix_interface, options, socket));
114
210
  return socket;
115
211
  }
116
212
 
213
+ absl::Status BindListenerSocket(EventEnginePosixInterface* posix_interface,
214
+ const ResolvedAddress& addr,
215
+ ListenerSocket& socket) {
216
+ FileDescriptor fd = socket.sock;
217
+ GRPC_CHECK(fd.ready());
218
+ bool close_fd = true;
219
+ socket.port = 0;
220
+ auto sock_cleanup =
221
+ absl::MakeCleanup([&close_fd, fd, posix_interface]() -> void {
222
+ if (close_fd && fd.ready()) {
223
+ posix_interface->Close(fd);
224
+ }
225
+ });
226
+ auto listen_address = posix_interface->BindListenerSocket(socket.sock, addr);
227
+ if (!listen_address.ok()) {
228
+ return std::move(listen_address).status();
229
+ }
230
+ socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
231
+ socket.port =
232
+ ResolvedAddressGetPort(ResolvedAddress(listen_address->address(), len));
233
+ close_fd = false;
234
+ GRPC_CHECK_GT(socket.port, 0);
235
+ return absl::OkStatus();
236
+ }
237
+
117
238
  bool IsSockAddrLinkLocal(const EventEngine::ResolvedAddress* resolved_addr) {
118
239
  const sockaddr* addr = resolved_addr->address();
119
240
  if (addr->sa_family == AF_INET) {
@@ -226,7 +347,13 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
226
347
  absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
227
348
  EventEnginePosixInterface* posix_interface,
228
349
  ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
229
- int requested_port) {
350
+ int requested_port,
351
+ absl::AnyInvocable<bool(const ListenerSocket&)> socket_filter) {
352
+ if (grpc_core::IsWildcardIpExpansionRestrictionEnabled()) {
353
+ return NewListenerContainerAddWildcardAddresses(
354
+ posix_interface, listener_sockets, options, requested_port,
355
+ std::move(socket_filter));
356
+ }
230
357
  ResolvedAddress wild4 = ResolvedAddressMakeWild4(requested_port);
231
358
  ResolvedAddress wild6 = ResolvedAddressMakeWild6(requested_port);
232
359
  absl::StatusOr<ListenerSocket> v6_sock;
@@ -51,6 +51,20 @@ class ListenerSocketsContainer {
51
51
  virtual ~ListenerSocketsContainer() = default;
52
52
  };
53
53
 
54
+ // Creates a listener socket, and prepares it with specified options, but
55
+ // does not bind or listen on it.
56
+ absl::StatusOr<ListenerSocketsContainer::ListenerSocket>
57
+ CreateListenerSocketWithoutBinding(EventEnginePosixInterface* posix_interface,
58
+ const PosixTcpOptions& options,
59
+ const EventEngine::ResolvedAddress& addr);
60
+
61
+ // Binds and listens on a listener socket. The socket must have been created
62
+ // with `CreateListenerSocketWithoutBinding`.
63
+ absl::Status BindListenerSocket(
64
+ EventEnginePosixInterface* posix_interface,
65
+ const EventEngine::ResolvedAddress& addr,
66
+ ListenerSocketsContainer::ListenerSocket& socket);
67
+
54
68
  // Creates and configures a socket to be used by the EventEngine Listener. The
55
69
  // type of the socket to create is determined by the by the passed address. The
56
70
  // socket configuration is specified by passed tcp options. If successful, it
@@ -66,11 +80,14 @@ CreateAndPrepareListenerSocket(
66
80
  // server. The newly created socket is configured according to the passed
67
81
  // options and added to the passed ListenerSocketsContainer object. The function
68
82
  // returns the port at which the created socket listens for incoming
69
- // connections.
83
+ // connections. The optional socket_filter is used to provide additional
84
+ // constraints on whether the wildcard address should be expanded.
70
85
  absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
71
86
  EventEnginePosixInterface* posix_interface,
72
87
  ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
73
- int requested_port);
88
+ int requested_port,
89
+ absl::AnyInvocable<bool(const ListenerSocketsContainer::ListenerSocket&)>
90
+ socket_filter = nullptr);
74
91
 
75
92
  // Get all addresses assigned to network interfaces on the machine and create
76
93
  // and add a socket for each local address. Each newly created socket is
@@ -161,6 +161,13 @@ class EventEnginePosixInterface {
161
161
  const FileDescriptor& fd);
162
162
  // Retrieves the peer address of a connected socket as a string.
163
163
  absl::StatusOr<std::string> PeerAddressString(const FileDescriptor& fd);
164
+ // Prepares listener socket options, but does not bind or listen.
165
+ absl::Status PrepareListenerSocketOptions(
166
+ const FileDescriptor& fd, const PosixTcpOptions& options,
167
+ const EventEngine::ResolvedAddress& address);
168
+ // Bind and listen on a listener socket.
169
+ absl::StatusOr<EventEngine::ResolvedAddress> BindListenerSocket(
170
+ const FileDescriptor& fd, const EventEngine::ResolvedAddress& address);
164
171
  // Prepares a listener socket with specified options and address binding.
165
172
  absl::StatusOr<EventEngine::ResolvedAddress> PrepareListenerSocket(
166
173
  const FileDescriptor& fd, const PosixTcpOptions& options,
@@ -804,12 +804,12 @@ absl::StatusOr<std::string> EventEnginePosixInterface::PeerAddressString(
804
804
  return ResolvedAddressToNormalizedString((*status));
805
805
  }
806
806
 
807
- absl::StatusOr<EventEngine::ResolvedAddress>
808
- EventEnginePosixInterface::PrepareListenerSocket(
807
+ absl::Status EventEnginePosixInterface::PrepareListenerSocketOptions(
809
808
  const FileDescriptor& fd, const PosixTcpOptions& options,
810
809
  const EventEngine::ResolvedAddress& address) {
811
810
  if (!IsCorrectGeneration(fd)) {
812
- return absl::InternalError("PrepareListenerSocket: wrong generation");
811
+ return absl::InternalError(
812
+ "PrepareListenerSocketOptions: wrong generation");
813
813
  }
814
814
  int f = fd.fd();
815
815
  if (IsSocketReusePortSupported() && options.allow_reuse_port &&
@@ -837,6 +837,16 @@ EventEnginePosixInterface::PrepareListenerSocket(
837
837
  // it's not fatal, so just log it.
838
838
  VLOG(2) << "Node does not support SO_ZEROCOPY, continuing.";
839
839
  }
840
+ return absl::OkStatus();
841
+ }
842
+
843
+ absl::StatusOr<EventEngine::ResolvedAddress>
844
+ EventEnginePosixInterface::BindListenerSocket(
845
+ const FileDescriptor& fd, const EventEngine::ResolvedAddress& address) {
846
+ if (!IsCorrectGeneration(fd)) {
847
+ return absl::InternalError("BindListenerSocket: wrong generation");
848
+ }
849
+ int f = fd.fd();
840
850
  if (bind(f, address.address(), address.size()) < 0) {
841
851
  auto sockaddr_str = ResolvedAddressToString(address);
842
852
  if (!sockaddr_str.ok()) {
@@ -863,6 +873,14 @@ EventEnginePosixInterface::PrepareListenerSocket(
863
873
  return sockname_temp;
864
874
  }
865
875
 
876
+ absl::StatusOr<EventEngine::ResolvedAddress>
877
+ EventEnginePosixInterface::PrepareListenerSocket(
878
+ const FileDescriptor& fd, const PosixTcpOptions& options,
879
+ const EventEngine::ResolvedAddress& address) {
880
+ GRPC_RETURN_IF_ERROR(PrepareListenerSocketOptions(fd, options, address));
881
+ return BindListenerSocket(fd, address);
882
+ }
883
+
866
884
  // Set a socket using a grpc_socket_mutator
867
885
  absl::Status EventEnginePosixInterface::SetSocketMutator(
868
886
  const FileDescriptor& fd, grpc_fd_usage usage,
@@ -126,6 +126,22 @@ absl::Status EventEnginePosixInterface::PrepareTcpClientSocket(
126
126
  "EventEnginePosixInterface::PrepareTcpClientSocket");
127
127
  }
128
128
 
129
+ absl::Status EventEnginePosixInterface::PrepareListenerSocketOptions(
130
+ const FileDescriptor& fd, const PosixTcpOptions& options,
131
+ const EventEngine::ResolvedAddress& address) {
132
+ grpc_core::Crash(
133
+ "unimplemented on this platform: "
134
+ "EventEnginePosixInterface::PrepareListenerSocketOptions");
135
+ }
136
+
137
+ absl::StatusOr<EventEngine::ResolvedAddress>
138
+ EventEnginePosixInterface::BindListenerSocket(
139
+ const FileDescriptor& fd, const EventEngine::ResolvedAddress& address) {
140
+ grpc_core::Crash(
141
+ "unimplemented on this platform: "
142
+ "EventEnginePosixInterface::BindListenerSocket");
143
+ }
144
+
129
145
  absl::StatusOr<EventEngine::ResolvedAddress>
130
146
  EventEnginePosixInterface::PrepareListenerSocket(
131
147
  const FileDescriptor& fd, const PosixTcpOptions& options,