grpc 1.56.2 → 1.57.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29 -22
  3. data/include/grpc/event_engine/event_engine.h +22 -32
  4. data/include/grpc/impl/grpc_types.h +3 -0
  5. data/include/grpc/support/port_platform.h +29 -23
  6. data/src/core/ext/filters/client_channel/client_channel.cc +44 -8
  7. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  8. data/src/core/ext/filters/client_channel/http_proxy.cc +5 -0
  9. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +21 -52
  10. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +19 -7
  11. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +25 -35
  12. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +78 -132
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +2 -1
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +4 -3
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +38 -15
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +3 -5
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +22 -6
  19. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +2 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +97 -71
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -16
  22. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +56 -11
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +25 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -32
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +4 -6
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +20 -79
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +31 -19
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -41
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -67
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +8 -0
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +31 -74
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +7 -51
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +16 -87
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +16 -50
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -74
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -4
  39. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +69 -59
  40. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +7 -2
  41. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -0
  42. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +25 -13
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +366 -311
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +17 -1
  45. data/src/core/ext/filters/client_channel/retry_filter.cc +39 -2498
  46. data/src/core/ext/filters/client_channel/retry_filter.h +91 -1
  47. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.cc +2052 -0
  48. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.h +442 -0
  49. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +38 -58
  50. data/src/core/ext/filters/client_channel/subchannel.h +3 -3
  51. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -0
  52. data/src/core/ext/filters/rbac/rbac_filter.cc +40 -111
  53. data/src/core/ext/filters/rbac/rbac_filter.h +12 -30
  54. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +162 -86
  55. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +0 -6
  56. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -4
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -186
  58. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +6569 -174
  59. data/src/core/ext/transport/chttp2/transport/decode_huff.h +2278 -441
  60. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -3
  61. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +4 -3
  62. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -8
  63. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  64. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +3 -2
  65. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  66. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -3
  67. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  68. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -6
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +143 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -9
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +0 -39
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +13 -8
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +35 -6
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +17 -13
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +85 -20
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +26 -7
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +45 -3
  78. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +4 -3
  79. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +21 -0
  80. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +30 -6
  81. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +180 -0
  82. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.c +558 -0
  83. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.h +2710 -0
  84. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +30 -11
  85. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +53 -24
  86. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +30 -5
  87. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +110 -0
  88. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +41 -15
  89. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +150 -27
  90. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +1 -0
  91. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.c +47 -0
  92. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.h +93 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +88 -76
  94. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +5 -0
  95. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +11 -12
  96. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +0 -5
  97. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +162 -160
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +129 -118
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +141 -135
  100. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +19 -12
  101. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +38 -30
  102. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  103. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.c +402 -0
  104. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.h +111 -0
  105. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +80 -74
  106. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +63 -47
  107. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +5 -0
  108. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +315 -293
  109. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  110. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -29
  111. data/src/core/ext/xds/xds_bootstrap_grpc.cc +33 -30
  112. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -13
  113. data/src/core/ext/xds/xds_client_grpc.cc +11 -6
  114. data/src/core/ext/xds/xds_client_grpc.h +16 -2
  115. data/src/core/ext/xds/xds_client_stats.h +10 -0
  116. data/src/core/ext/xds/xds_cluster.cc +26 -16
  117. data/src/core/ext/xds/xds_endpoint.cc +4 -7
  118. data/src/core/ext/xds/xds_health_status.cc +0 -17
  119. data/src/core/ext/xds/xds_health_status.h +5 -25
  120. data/src/core/ext/xds/xds_lb_policy_registry.cc +39 -0
  121. data/src/core/ext/xds/xds_route_config.cc +4 -0
  122. data/src/core/ext/xds/xds_transport_grpc.cc +1 -3
  123. data/src/core/lib/address_utils/parse_address.cc +63 -1
  124. data/src/core/lib/address_utils/parse_address.h +8 -0
  125. data/src/core/lib/address_utils/sockaddr_utils.cc +46 -1
  126. data/src/core/lib/address_utils/sockaddr_utils.h +2 -2
  127. data/src/core/lib/channel/channel_args.cc +21 -10
  128. data/src/core/lib/channel/channel_args.h +3 -0
  129. data/src/core/lib/channel/connected_channel.cc +4 -1
  130. data/src/core/lib/channel/promise_based_filter.h +1 -0
  131. data/src/core/lib/debug/trace.cc +1 -4
  132. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -1
  133. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -1
  134. data/src/core/lib/event_engine/event_engine.cc +0 -12
  135. data/src/core/lib/event_engine/forkable.cc +47 -42
  136. data/src/core/lib/event_engine/handle_containers.h +0 -4
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -6
  138. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -6
  139. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +25 -11
  140. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -1
  142. data/src/core/lib/event_engine/posix_engine/posix_engine.h +8 -12
  143. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +37 -27
  144. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -2
  146. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +42 -2
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +6 -0
  148. data/src/core/lib/event_engine/posix_engine/timer.h +10 -37
  149. data/src/core/lib/event_engine/tcp_socket_utils.cc +67 -7
  150. data/src/core/lib/event_engine/tcp_socket_utils.h +3 -0
  151. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +90 -37
  152. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +32 -12
  153. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +12 -21
  154. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +8 -12
  155. data/src/core/lib/event_engine/windows/windows_endpoint.cc +55 -54
  156. data/src/core/lib/event_engine/windows/windows_endpoint.h +15 -12
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +2 -1
  158. data/src/core/lib/event_engine/windows/windows_engine.h +8 -12
  159. data/src/core/lib/experiments/config.cc +60 -22
  160. data/src/core/lib/experiments/config.h +20 -8
  161. data/src/core/lib/experiments/experiments.cc +278 -0
  162. data/src/core/lib/experiments/experiments.h +59 -1
  163. data/src/core/lib/gprpp/dual_ref_counted.h +9 -9
  164. data/src/core/lib/gprpp/fork.cc +8 -9
  165. data/src/core/lib/gprpp/fork.h +6 -5
  166. data/src/core/lib/gprpp/if_list.h +4530 -0
  167. data/src/core/lib/gprpp/orphanable.h +3 -3
  168. data/src/core/lib/gprpp/ref_counted.h +6 -6
  169. data/src/core/lib/gprpp/sorted_pack.h +3 -12
  170. data/src/core/lib/gprpp/status_helper.h +16 -15
  171. data/src/core/lib/gprpp/time.h +12 -0
  172. data/src/core/lib/gprpp/type_list.h +32 -0
  173. data/src/core/lib/http/httpcli.h +6 -9
  174. data/src/core/lib/iomgr/error.cc +32 -2
  175. data/src/core/lib/iomgr/error.h +9 -10
  176. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -7
  177. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  178. data/src/core/lib/iomgr/exec_ctx.h +11 -0
  179. data/src/core/lib/iomgr/pollset.h +4 -5
  180. data/src/core/lib/iomgr/port.h +10 -0
  181. data/src/core/lib/iomgr/resolve_address.cc +13 -1
  182. data/src/core/lib/iomgr/resolve_address.h +17 -3
  183. data/src/core/lib/iomgr/sockaddr_posix.h +7 -0
  184. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -0
  185. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -0
  186. data/src/core/lib/iomgr/socket_utils_posix.h +6 -0
  187. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -1
  188. data/src/core/lib/iomgr/tcp_posix.cc +21 -4
  189. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -2
  190. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -2
  191. data/src/core/lib/iomgr/tcp_windows.cc +1 -3
  192. data/src/core/lib/iomgr/vsock.cc +59 -0
  193. data/src/core/lib/iomgr/vsock.h +38 -0
  194. data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -6
  195. data/src/core/lib/load_balancing/delegating_helper.h +115 -0
  196. data/src/core/lib/load_balancing/lb_policy.h +20 -0
  197. data/src/core/lib/load_balancing/subchannel_interface.h +6 -0
  198. data/src/core/lib/promise/party.h +1 -1
  199. data/src/core/lib/resolver/resolver_factory.h +3 -2
  200. data/src/core/lib/resolver/server_address.cc +9 -94
  201. data/src/core/lib/resolver/server_address.h +10 -64
  202. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  203. data/src/core/lib/security/credentials/channel_creds_registry.h +51 -27
  204. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +169 -9
  205. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  206. data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -1
  207. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -1
  208. data/src/core/lib/security/credentials/external/external_account_credentials.h +6 -0
  209. data/src/core/lib/security/credentials/fake/fake_credentials.cc +30 -38
  210. data/src/core/lib/security/credentials/fake/fake_credentials.h +28 -0
  211. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  212. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -1
  213. data/src/core/lib/service_config/service_config_call_data.h +5 -0
  214. data/src/core/lib/slice/slice.h +16 -0
  215. data/src/core/lib/surface/call.cc +31 -29
  216. data/src/core/lib/surface/server.h +2 -2
  217. data/src/core/lib/surface/version.cc +2 -2
  218. data/src/core/lib/transport/metadata_batch.cc +7 -7
  219. data/src/core/lib/transport/metadata_batch.h +86 -48
  220. data/src/core/lib/transport/parsed_metadata.h +34 -20
  221. data/src/core/lib/transport/simple_slice_based_metadata.h +9 -2
  222. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +4 -6
  223. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -2
  224. data/src/core/tsi/ssl_transport_security.cc +28 -7
  225. data/src/ruby/bin/math_pb.rb +24 -18
  226. data/src/ruby/ext/grpc/extconf.rb +19 -18
  227. data/src/ruby/ext/grpc/rb_call.c +62 -39
  228. data/src/ruby/ext/grpc/rb_call_credentials.c +0 -1
  229. data/src/ruby/ext/grpc/rb_channel.c +126 -49
  230. data/src/ruby/ext/grpc/rb_channel.h +1 -0
  231. data/src/ruby/ext/grpc/rb_channel_args.c +16 -2
  232. data/src/ruby/ext/grpc/rb_channel_args.h +4 -0
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  234. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  235. data/src/ruby/ext/grpc/rb_event_thread.c +22 -6
  236. data/src/ruby/ext/grpc/rb_event_thread.h +1 -0
  237. data/src/ruby/ext/grpc/rb_grpc.c +192 -30
  238. data/src/ruby/ext/grpc/rb_grpc.h +8 -2
  239. data/src/ruby/ext/grpc/rb_server.c +62 -45
  240. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  241. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  242. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  243. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  244. data/src/ruby/lib/grpc/version.rb +1 -1
  245. data/src/ruby/pb/grpc/health/v1/health_pb.rb +24 -13
  246. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +24 -3
  247. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +25 -111
  248. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +25 -2
  249. data/third_party/boringssl-with-bazel/err_data.c +552 -552
  250. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +5 -5
  251. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +34 -1
  252. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +4 -1
  253. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +3 -3
  254. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +7 -8
  255. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +2 -2
  256. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -2
  257. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +8 -8
  258. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
  259. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -2
  260. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +19 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +8 -1
  262. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +28 -185
  263. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +3 -7
  264. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +8 -0
  265. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +3 -0
  266. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +49 -46
  267. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c +18 -0
  268. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +2809 -7417
  269. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +27 -5
  270. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +20 -0
  271. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +110 -72
  272. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +4 -3
  273. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +15 -14
  274. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +13 -10
  275. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +35 -12
  276. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +2 -4
  277. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +3 -7
  278. data/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c +3 -3
  279. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +7 -6
  280. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +34 -72
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -1
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +12 -5
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +5 -6
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +12 -6
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +17 -18
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +51 -15
  287. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +7 -7
  288. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +5 -6
  289. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +2 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +277 -0
  291. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +180 -404
  292. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +3 -3
  293. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +24 -57
  294. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +17 -13
  295. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +33 -71
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +18 -17
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -7
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +15 -18
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +9 -11
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +24 -24
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +11 -27
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +8 -8
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +4 -4
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +9 -3
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/hkdf.c +1 -1
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +40 -26
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +21 -7
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +38 -19
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +2 -29
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +55 -0
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +33 -52
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +3 -8
  313. data/third_party/boringssl-with-bazel/src/crypto/internal.h +198 -79
  314. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +5 -4
  315. data/third_party/boringssl-with-bazel/src/crypto/mem.c +7 -8
  316. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -23
  317. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +3 -3
  318. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c +3 -3
  319. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +7 -7
  320. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +8 -5
  321. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +7 -6
  323. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c +6 -12
  324. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +48 -0
  325. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fuchsia.c → ios.c} +8 -8
  326. data/third_party/boringssl-with-bazel/src/crypto/{refcount_no_threads.c → rand_extra/trusty.c} +15 -19
  327. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +41 -19
  328. data/third_party/boringssl-with-bazel/src/crypto/{refcount_c11.c → refcount.c} +11 -17
  329. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +147 -72
  330. data/third_party/boringssl-with-bazel/src/crypto/thread_none.c +0 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +6 -35
  332. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +5 -26
  333. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +14 -18
  334. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +54 -143
  335. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +7 -13
  336. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +1 -1
  337. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +1 -1
  338. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +2 -4
  339. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +2 -2
  340. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +1 -1
  341. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +8 -12
  342. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +19 -20
  343. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -15
  344. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -5
  345. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -1
  346. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +7 -7
  347. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -3
  348. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +4 -6
  349. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +4 -119
  350. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +207 -0
  351. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +5 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -116
  353. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +0 -2
  354. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +6 -0
  355. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +5 -1
  356. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +0 -21
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +21 -2
  358. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +19 -6
  359. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +11 -7
  360. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +13 -14
  361. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +0 -61
  362. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +127 -81
  363. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +224 -209
  364. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +154 -0
  365. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +1 -29
  366. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +4 -4
  367. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +3 -2
  368. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +9 -65
  369. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +20 -20
  370. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  371. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -11
  372. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +24 -18
  373. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +37 -30
  374. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +125 -26
  375. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -3
  376. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +691 -0
  377. data/third_party/upb/upb/collections/map.c +3 -3
  378. metadata +27 -12
  379. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +0 -42
  380. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +0 -64
  381. data/src/core/ext/transport/chttp2/transport/stream_map.cc +0 -177
  382. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -68
  383. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +0 -89
@@ -0,0 +1,442 @@
1
+ // Copyright 2023 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_FILTER_LEGACY_CALL_DATA_H
16
+ #define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_FILTER_LEGACY_CALL_DATA_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stddef.h>
21
+ #include <stdint.h>
22
+
23
+ #include <utility>
24
+
25
+ #include "absl/container/inlined_vector.h"
26
+ #include "absl/functional/any_invocable.h"
27
+ #include "absl/types/optional.h"
28
+
29
+ #include <grpc/event_engine/event_engine.h>
30
+ #include <grpc/slice.h>
31
+ #include <grpc/status.h>
32
+
33
+ #include "src/core/ext/filters/client_channel/client_channel.h"
34
+ #include "src/core/ext/filters/client_channel/retry_filter.h"
35
+ #include "src/core/ext/filters/client_channel/retry_service_config.h"
36
+ #include "src/core/ext/filters/client_channel/retry_throttle.h"
37
+ #include "src/core/lib/backoff/backoff.h"
38
+ #include "src/core/lib/channel/channel_fwd.h"
39
+ #include "src/core/lib/channel/channel_stack.h"
40
+ #include "src/core/lib/channel/context.h"
41
+ #include "src/core/lib/gprpp/debug_location.h"
42
+ #include "src/core/lib/gprpp/orphanable.h"
43
+ #include "src/core/lib/gprpp/ref_counted.h"
44
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
45
+ #include "src/core/lib/gprpp/time.h"
46
+ #include "src/core/lib/iomgr/call_combiner.h"
47
+ #include "src/core/lib/iomgr/closure.h"
48
+ #include "src/core/lib/iomgr/error.h"
49
+ #include "src/core/lib/iomgr/polling_entity.h"
50
+ #include "src/core/lib/resource_quota/arena.h"
51
+ #include "src/core/lib/slice/slice_buffer.h"
52
+ #include "src/core/lib/transport/metadata_batch.h"
53
+ #include "src/core/lib/transport/transport.h"
54
+
55
+ namespace grpc_core {
56
+
57
+ class RetryFilter::LegacyCallData {
58
+ public:
59
+ static grpc_error_handle Init(grpc_call_element* elem,
60
+ const grpc_call_element_args* args);
61
+ static void Destroy(grpc_call_element* elem,
62
+ const grpc_call_final_info* /*final_info*/,
63
+ grpc_closure* then_schedule_closure);
64
+ static void StartTransportStreamOpBatch(
65
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
66
+ static void SetPollent(grpc_call_element* elem, grpc_polling_entity* pollent);
67
+
68
+ private:
69
+ class CallStackDestructionBarrier;
70
+
71
+ // Pending batches stored in call data.
72
+ struct PendingBatch {
73
+ // The pending batch. If nullptr, this slot is empty.
74
+ grpc_transport_stream_op_batch* batch = nullptr;
75
+ // Indicates whether payload for send ops has been cached in
76
+ // LegacyCallData.
77
+ bool send_ops_cached = false;
78
+ };
79
+
80
+ // State associated with each call attempt.
81
+ class CallAttempt : public RefCounted<CallAttempt> {
82
+ public:
83
+ CallAttempt(LegacyCallData* calld, bool is_transparent_retry);
84
+ ~CallAttempt() override;
85
+
86
+ bool lb_call_committed() const { return lb_call_committed_; }
87
+
88
+ // Constructs and starts whatever batches are needed on this call
89
+ // attempt.
90
+ void StartRetriableBatches();
91
+
92
+ // Frees cached send ops that have already been completed after
93
+ // committing the call.
94
+ void FreeCachedSendOpDataAfterCommit();
95
+
96
+ // Cancels the call attempt.
97
+ void CancelFromSurface(grpc_transport_stream_op_batch* cancel_batch);
98
+
99
+ private:
100
+ // State used for starting a retryable batch on the call attempt's LB call.
101
+ // This provides its own grpc_transport_stream_op_batch and other data
102
+ // structures needed to populate the ops in the batch.
103
+ // We allocate one struct on the arena for each attempt at starting a
104
+ // batch on a given LB call.
105
+ class BatchData
106
+ : public RefCounted<BatchData, PolymorphicRefCount, UnrefCallDtor> {
107
+ public:
108
+ BatchData(RefCountedPtr<CallAttempt> call_attempt, int refcount,
109
+ bool set_on_complete);
110
+ ~BatchData() override;
111
+
112
+ grpc_transport_stream_op_batch* batch() { return &batch_; }
113
+
114
+ // Adds retriable send_initial_metadata op.
115
+ void AddRetriableSendInitialMetadataOp();
116
+ // Adds retriable send_message op.
117
+ void AddRetriableSendMessageOp();
118
+ // Adds retriable send_trailing_metadata op.
119
+ void AddRetriableSendTrailingMetadataOp();
120
+ // Adds retriable recv_initial_metadata op.
121
+ void AddRetriableRecvInitialMetadataOp();
122
+ // Adds retriable recv_message op.
123
+ void AddRetriableRecvMessageOp();
124
+ // Adds retriable recv_trailing_metadata op.
125
+ void AddRetriableRecvTrailingMetadataOp();
126
+ // Adds cancel_stream op.
127
+ void AddCancelStreamOp(grpc_error_handle error);
128
+
129
+ private:
130
+ // Frees cached send ops that were completed by the completed batch in
131
+ // batch_data. Used when batches are completed after the call is
132
+ // committed.
133
+ void FreeCachedSendOpDataForCompletedBatch();
134
+
135
+ // If there is a pending recv_initial_metadata op, adds a closure
136
+ // to closures for recv_initial_metadata_ready.
137
+ void MaybeAddClosureForRecvInitialMetadataCallback(
138
+ grpc_error_handle error, CallCombinerClosureList* closures);
139
+ // Intercepts recv_initial_metadata_ready callback for retries.
140
+ // Commits the call and returns the initial metadata up the stack.
141
+ static void RecvInitialMetadataReady(void* arg, grpc_error_handle error);
142
+
143
+ // If there is a pending recv_message op, adds a closure to closures
144
+ // for recv_message_ready.
145
+ void MaybeAddClosureForRecvMessageCallback(
146
+ grpc_error_handle error, CallCombinerClosureList* closures);
147
+ // Intercepts recv_message_ready callback for retries.
148
+ // Commits the call and returns the message up the stack.
149
+ static void RecvMessageReady(void* arg, grpc_error_handle error);
150
+
151
+ // If there is a pending recv_trailing_metadata op, adds a closure to
152
+ // closures for recv_trailing_metadata_ready.
153
+ void MaybeAddClosureForRecvTrailingMetadataReady(
154
+ grpc_error_handle error, CallCombinerClosureList* closures);
155
+ // Adds any necessary closures for deferred batch completion
156
+ // callbacks to closures.
157
+ void AddClosuresForDeferredCompletionCallbacks(
158
+ CallCombinerClosureList* closures);
159
+ // For any pending batch containing an op that has not yet been started,
160
+ // adds the pending batch's completion closures to closures.
161
+ void AddClosuresToFailUnstartedPendingBatches(
162
+ grpc_error_handle error, CallCombinerClosureList* closures);
163
+ // Runs necessary closures upon completion of a call attempt.
164
+ void RunClosuresForCompletedCall(grpc_error_handle error);
165
+ // Intercepts recv_trailing_metadata_ready callback for retries.
166
+ // Commits the call and returns the trailing metadata up the stack.
167
+ static void RecvTrailingMetadataReady(void* arg, grpc_error_handle error);
168
+
169
+ // Adds the on_complete closure for the pending batch completed in
170
+ // batch_data to closures.
171
+ void AddClosuresForCompletedPendingBatch(
172
+ grpc_error_handle error, CallCombinerClosureList* closures);
173
+
174
+ // If there are any cached ops to replay or pending ops to start on the
175
+ // LB call, adds them to closures.
176
+ void AddClosuresForReplayOrPendingSendOps(
177
+ CallCombinerClosureList* closures);
178
+
179
+ // Callback used to intercept on_complete from LB calls.
180
+ static void OnComplete(void* arg, grpc_error_handle error);
181
+
182
+ // Callback used to handle on_complete for internally generated
183
+ // cancel_stream op.
184
+ static void OnCompleteForCancelOp(void* arg, grpc_error_handle error);
185
+
186
+ // This DOES hold a ref, but it cannot be a RefCountedPtr<>, because
187
+ // our dtor unrefs the owning call, which may delete the arena in
188
+ // which we are allocated, which means that running the dtor of any
189
+ // data members after that would cause a crash.
190
+ CallAttempt* call_attempt_;
191
+ // The batch to use in the LB call.
192
+ // Its payload field points to CallAttempt::batch_payload_.
193
+ grpc_transport_stream_op_batch batch_;
194
+ // For intercepting on_complete.
195
+ grpc_closure on_complete_;
196
+ };
197
+
198
+ // Creates a BatchData object on the call's arena with the
199
+ // specified refcount. If set_on_complete is true, the batch's
200
+ // on_complete callback will be set to point to on_complete();
201
+ // otherwise, the batch's on_complete callback will be null.
202
+ BatchData* CreateBatch(int refcount, bool set_on_complete) {
203
+ return calld_->arena_->New<BatchData>(Ref(DEBUG_LOCATION, "CreateBatch"),
204
+ refcount, set_on_complete);
205
+ }
206
+
207
+ // If there are any cached send ops that need to be replayed on this
208
+ // call attempt, creates and returns a new batch to replay those ops.
209
+ // Otherwise, returns nullptr.
210
+ BatchData* MaybeCreateBatchForReplay();
211
+
212
+ // Adds a closure to closures that will execute batch in the call combiner.
213
+ void AddClosureForBatch(grpc_transport_stream_op_batch* batch,
214
+ const char* reason,
215
+ CallCombinerClosureList* closures);
216
+
217
+ // Helper function used to start a recv_trailing_metadata batch. This
218
+ // is used in the case where a recv_initial_metadata or recv_message
219
+ // op fails in a way that we know the call is over but when the application
220
+ // has not yet started its own recv_trailing_metadata op.
221
+ void AddBatchForInternalRecvTrailingMetadata(
222
+ CallCombinerClosureList* closures);
223
+
224
+ // Adds a batch to closures to cancel this call attempt, if
225
+ // cancellation has not already been sent on the LB call.
226
+ void MaybeAddBatchForCancelOp(grpc_error_handle error,
227
+ CallCombinerClosureList* closures);
228
+
229
+ // Adds batches for pending batches to closures.
230
+ void AddBatchesForPendingBatches(CallCombinerClosureList* closures);
231
+
232
+ // Adds whatever batches are needed on this attempt to closures.
233
+ void AddRetriableBatches(CallCombinerClosureList* closures);
234
+
235
+ // Returns true if any send op in the batch was not yet started on this
236
+ // attempt.
237
+ bool PendingBatchContainsUnstartedSendOps(PendingBatch* pending);
238
+
239
+ // Returns true if there are cached send ops to replay.
240
+ bool HaveSendOpsToReplay();
241
+
242
+ // If our retry state is no longer needed, switch to fast path by moving
243
+ // our LB call into calld_->committed_call_ and having calld_ drop
244
+ // its ref to us.
245
+ void MaybeSwitchToFastPath();
246
+
247
+ // Returns true if the call should be retried.
248
+ bool ShouldRetry(absl::optional<grpc_status_code> status,
249
+ absl::optional<Duration> server_pushback_ms);
250
+
251
+ // Abandons the call attempt. Unrefs any deferred batches.
252
+ void Abandon();
253
+
254
+ void OnPerAttemptRecvTimer();
255
+ static void OnPerAttemptRecvTimerLocked(void* arg, grpc_error_handle error);
256
+ void MaybeCancelPerAttemptRecvTimer();
257
+
258
+ LegacyCallData* calld_;
259
+ OrphanablePtr<ClientChannel::FilterBasedLoadBalancedCall> lb_call_;
260
+ bool lb_call_committed_ = false;
261
+
262
+ grpc_closure on_per_attempt_recv_timer_;
263
+ absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
264
+ per_attempt_recv_timer_handle_;
265
+
266
+ // BatchData.batch.payload points to this.
267
+ grpc_transport_stream_op_batch_payload batch_payload_;
268
+ // For send_initial_metadata.
269
+ grpc_metadata_batch send_initial_metadata_{calld_->arena_};
270
+ // For send_trailing_metadata.
271
+ grpc_metadata_batch send_trailing_metadata_{calld_->arena_};
272
+ // For intercepting recv_initial_metadata.
273
+ grpc_metadata_batch recv_initial_metadata_{calld_->arena_};
274
+ grpc_closure recv_initial_metadata_ready_;
275
+ bool trailing_metadata_available_ = false;
276
+ // For intercepting recv_message.
277
+ grpc_closure recv_message_ready_;
278
+ absl::optional<SliceBuffer> recv_message_;
279
+ uint32_t recv_message_flags_;
280
+ // For intercepting recv_trailing_metadata.
281
+ grpc_metadata_batch recv_trailing_metadata_{calld_->arena_};
282
+ grpc_transport_stream_stats collect_stats_;
283
+ grpc_closure recv_trailing_metadata_ready_;
284
+ // These fields indicate which ops have been started and completed on
285
+ // this call attempt.
286
+ size_t started_send_message_count_ = 0;
287
+ size_t completed_send_message_count_ = 0;
288
+ size_t started_recv_message_count_ = 0;
289
+ size_t completed_recv_message_count_ = 0;
290
+ bool started_send_initial_metadata_ : 1;
291
+ bool completed_send_initial_metadata_ : 1;
292
+ bool started_send_trailing_metadata_ : 1;
293
+ bool completed_send_trailing_metadata_ : 1;
294
+ bool started_recv_initial_metadata_ : 1;
295
+ bool completed_recv_initial_metadata_ : 1;
296
+ bool started_recv_trailing_metadata_ : 1;
297
+ bool completed_recv_trailing_metadata_ : 1;
298
+ bool sent_cancel_stream_ : 1;
299
+ // State for callback processing.
300
+ RefCountedPtr<BatchData> recv_initial_metadata_ready_deferred_batch_;
301
+ grpc_error_handle recv_initial_metadata_error_;
302
+ RefCountedPtr<BatchData> recv_message_ready_deferred_batch_;
303
+ grpc_error_handle recv_message_error_;
304
+ struct OnCompleteDeferredBatch {
305
+ OnCompleteDeferredBatch(RefCountedPtr<BatchData> batch,
306
+ grpc_error_handle error)
307
+ : batch(std::move(batch)), error(error) {}
308
+ RefCountedPtr<BatchData> batch;
309
+ grpc_error_handle error;
310
+ };
311
+ // There cannot be more than 3 pending send op batches at a time.
312
+ absl::InlinedVector<OnCompleteDeferredBatch, 3>
313
+ on_complete_deferred_batches_;
314
+ RefCountedPtr<BatchData> recv_trailing_metadata_internal_batch_;
315
+ grpc_error_handle recv_trailing_metadata_error_;
316
+ bool seen_recv_trailing_metadata_from_surface_ : 1;
317
+ // NOTE: Do not move this next to the metadata bitfields above. That would
318
+ // save space but will also result in a data race because compiler
319
+ // will generate a 2 byte store which overwrites the meta-data
320
+ // fields upon setting this field.
321
+ bool abandoned_ : 1;
322
+ };
323
+
324
+ LegacyCallData(RetryFilter* chand, const grpc_call_element_args& args);
325
+ ~LegacyCallData();
326
+
327
+ void StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch);
328
+
329
+ // Returns the index into pending_batches_ to be used for batch.
330
+ static size_t GetBatchIndex(grpc_transport_stream_op_batch* batch);
331
+ PendingBatch* PendingBatchesAdd(grpc_transport_stream_op_batch* batch);
332
+ void PendingBatchClear(PendingBatch* pending);
333
+ void MaybeClearPendingBatch(PendingBatch* pending);
334
+ static void FailPendingBatchInCallCombiner(void* arg,
335
+ grpc_error_handle error);
336
+ // Fails all pending batches. Does NOT yield call combiner.
337
+ void PendingBatchesFail(grpc_error_handle error);
338
+ // Returns a pointer to the first pending batch for which predicate(batch)
339
+ // returns true, or null if not found.
340
+ template <typename Predicate>
341
+ PendingBatch* PendingBatchFind(const char* log_message, Predicate predicate);
342
+
343
+ // Caches data for send ops so that it can be retried later, if not
344
+ // already cached.
345
+ void MaybeCacheSendOpsForBatch(PendingBatch* pending);
346
+ void FreeCachedSendInitialMetadata();
347
+ // Frees cached send_message at index idx.
348
+ void FreeCachedSendMessage(size_t idx);
349
+ void FreeCachedSendTrailingMetadata();
350
+ void FreeAllCachedSendOpData();
351
+
352
+ // Commits the call so that no further retry attempts will be performed.
353
+ void RetryCommit(CallAttempt* call_attempt);
354
+
355
+ // Starts a timer to retry after appropriate back-off.
356
+ // If server_pushback is nullopt, retry_backoff_ is used.
357
+ void StartRetryTimer(absl::optional<Duration> server_pushback);
358
+
359
+ void OnRetryTimer();
360
+ static void OnRetryTimerLocked(void* arg, grpc_error_handle /*error*/);
361
+
362
+ // Adds a closure to closures to start a transparent retry.
363
+ void AddClosureToStartTransparentRetry(CallCombinerClosureList* closures);
364
+ static void StartTransparentRetry(void* arg, grpc_error_handle error);
365
+
366
+ OrphanablePtr<ClientChannel::FilterBasedLoadBalancedCall>
367
+ CreateLoadBalancedCall(absl::AnyInvocable<void()> on_commit,
368
+ bool is_transparent_retry);
369
+
370
+ void CreateCallAttempt(bool is_transparent_retry);
371
+
372
+ RetryFilter* chand_;
373
+ grpc_polling_entity* pollent_;
374
+ RefCountedPtr<internal::ServerRetryThrottleData> retry_throttle_data_;
375
+ const internal::RetryMethodConfig* retry_policy_ = nullptr;
376
+ BackOff retry_backoff_;
377
+
378
+ grpc_slice path_; // Request path.
379
+ Timestamp deadline_;
380
+ Arena* arena_;
381
+ grpc_call_stack* owning_call_;
382
+ CallCombiner* call_combiner_;
383
+ grpc_call_context_element* call_context_;
384
+
385
+ grpc_error_handle cancelled_from_surface_;
386
+
387
+ RefCountedPtr<CallStackDestructionBarrier> call_stack_destruction_barrier_;
388
+
389
+ // TODO(roth): As part of implementing hedging, we will need to maintain a
390
+ // list of all pending attempts, so that we can cancel them all if the call
391
+ // gets cancelled.
392
+ RefCountedPtr<CallAttempt> call_attempt_;
393
+
394
+ // LB call used when we've committed to a call attempt and the retry
395
+ // state for that attempt is no longer needed. This provides a fast
396
+ // path for long-running streaming calls that minimizes overhead.
397
+ OrphanablePtr<ClientChannel::FilterBasedLoadBalancedCall> committed_call_;
398
+
399
+ // When are are not yet fully committed to a particular call (i.e.,
400
+ // either we might still retry or we have committed to the call but
401
+ // there are still some cached ops to be replayed on the call),
402
+ // batches received from above will be added to this list, and they
403
+ // will not be removed until we have invoked their completion callbacks.
404
+ size_t bytes_buffered_for_retry_ = 0;
405
+ PendingBatch pending_batches_[MAX_PENDING_BATCHES];
406
+ bool pending_send_initial_metadata_ : 1;
407
+ bool pending_send_message_ : 1;
408
+ bool pending_send_trailing_metadata_ : 1;
409
+
410
+ // Retry state.
411
+ bool retry_committed_ : 1;
412
+ bool retry_codepath_started_ : 1;
413
+ bool sent_transparent_retry_not_seen_by_server_ : 1;
414
+ int num_attempts_completed_ = 0;
415
+ absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
416
+ retry_timer_handle_;
417
+ grpc_closure retry_closure_;
418
+
419
+ // Cached data for retrying send ops.
420
+ // send_initial_metadata
421
+ bool seen_send_initial_metadata_ = false;
422
+ grpc_metadata_batch send_initial_metadata_{arena_};
423
+ // send_message
424
+ // When we get a send_message op, we replace the original byte stream
425
+ // with a CachingByteStream that caches the slices to a local buffer for
426
+ // use in retries.
427
+ // Note: We inline the cache for the first 3 send_message ops and use
428
+ // dynamic allocation after that. This number was essentially picked
429
+ // at random; it could be changed in the future to tune performance.
430
+ struct CachedSendMessage {
431
+ SliceBuffer* slices;
432
+ uint32_t flags;
433
+ };
434
+ absl::InlinedVector<CachedSendMessage, 3> send_messages_;
435
+ // send_trailing_metadata
436
+ bool seen_send_trailing_metadata_ = false;
437
+ grpc_metadata_batch send_trailing_metadata_{arena_};
438
+ };
439
+
440
+ } // namespace grpc_core
441
+
442
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_FILTER_LEGACY_CALL_DATA_H
@@ -19,7 +19,8 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
- #include <new>
22
+ #include <functional>
23
+ #include <memory>
23
24
  #include <string>
24
25
  #include <utility>
25
26
 
@@ -34,10 +35,12 @@
34
35
  #include "src/core/lib/channel/channel_fwd.h"
35
36
  #include "src/core/lib/channel/channel_stack.h"
36
37
  #include "src/core/lib/channel/channel_stack_builder.h"
38
+ #include "src/core/lib/channel/context.h"
39
+ #include "src/core/lib/channel/promise_based_filter.h"
37
40
  #include "src/core/lib/config/core_configuration.h"
38
41
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
39
- #include "src/core/lib/iomgr/closure.h"
40
- #include "src/core/lib/iomgr/error.h"
42
+ #include "src/core/lib/promise/arena_promise.h"
43
+ #include "src/core/lib/promise/context.h"
41
44
  #include "src/core/lib/resource_quota/arena.h"
42
45
  #include "src/core/lib/service_config/service_config.h"
43
46
  #include "src/core/lib/service_config/service_config_call_data.h"
@@ -45,20 +48,25 @@
45
48
  #include "src/core/lib/service_config/service_config_parser.h"
46
49
  #include "src/core/lib/surface/channel_init.h"
47
50
  #include "src/core/lib/surface/channel_stack_type.h"
51
+ #include "src/core/lib/transport/metadata_batch.h"
52
+ #include "src/core/lib/transport/transport.h"
48
53
 
49
54
  namespace grpc_core {
50
55
 
51
56
  namespace {
52
57
 
53
- class ServiceConfigChannelArgChannelData {
58
+ class ServiceConfigChannelArgFilter : public ChannelFilter {
54
59
  public:
55
- explicit ServiceConfigChannelArgChannelData(
56
- const grpc_channel_element_args* args) {
57
- auto service_config_str =
58
- args->channel_args.GetOwnedString(GRPC_ARG_SERVICE_CONFIG);
60
+ static absl::StatusOr<ServiceConfigChannelArgFilter> Create(
61
+ const ChannelArgs& args, ChannelFilter::Args) {
62
+ return ServiceConfigChannelArgFilter(args);
63
+ }
64
+
65
+ explicit ServiceConfigChannelArgFilter(const ChannelArgs& args) {
66
+ auto service_config_str = args.GetOwnedString(GRPC_ARG_SERVICE_CONFIG);
59
67
  if (service_config_str.has_value()) {
60
- auto service_config = ServiceConfigImpl::Create(
61
- args->channel_args, service_config_str->c_str());
68
+ auto service_config =
69
+ ServiceConfigImpl::Create(args, *service_config_str);
62
70
  if (!service_config.ok()) {
63
71
  gpr_log(GPR_ERROR, "%s", service_config.status().ToString().c_str());
64
72
  } else {
@@ -67,62 +75,34 @@ class ServiceConfigChannelArgChannelData {
67
75
  }
68
76
  }
69
77
 
70
- RefCountedPtr<ServiceConfig> service_config() const {
71
- return service_config_;
72
- }
78
+ // Construct a promise for one call.
79
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
80
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
73
81
 
74
82
  private:
75
83
  RefCountedPtr<ServiceConfig> service_config_;
76
84
  };
77
85
 
78
- grpc_error_handle ServiceConfigChannelArgInitCallElem(
79
- grpc_call_element* elem, const grpc_call_element_args* args) {
80
- auto* chand =
81
- static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
82
- RefCountedPtr<ServiceConfig> service_config = chand->service_config();
86
+ ArenaPromise<ServerMetadataHandle>
87
+ ServiceConfigChannelArgFilter::MakeCallPromise(
88
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
83
89
  const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr;
84
- if (service_config != nullptr) {
85
- method_configs = service_config->GetMethodParsedConfigVector(args->path);
90
+ if (service_config_ != nullptr) {
91
+ method_configs = service_config_->GetMethodParsedConfigVector(
92
+ call_args.client_initial_metadata->get_pointer(HttpPathMetadata())
93
+ ->c_slice());
86
94
  }
87
- auto* service_config_call_data =
88
- args->arena->New<ServiceConfigCallData>(args->arena, args->context);
89
- service_config_call_data->SetServiceConfig(std::move(service_config),
90
- method_configs);
91
- return absl::OkStatus();
92
- }
93
-
94
- void ServiceConfigChannelArgDestroyCallElem(
95
- grpc_call_element* /*elem*/, const grpc_call_final_info* /*final_info*/,
96
- grpc_closure* /*then_schedule_closure*/) {}
97
-
98
- grpc_error_handle ServiceConfigChannelArgInitChannelElem(
99
- grpc_channel_element* elem, grpc_channel_element_args* args) {
100
- ServiceConfigChannelArgChannelData* chand =
101
- static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
102
- new (chand) ServiceConfigChannelArgChannelData(args);
103
- return absl::OkStatus();
104
- }
105
-
106
- void ServiceConfigChannelArgDestroyChannelElem(grpc_channel_element* elem) {
107
- ServiceConfigChannelArgChannelData* chand =
108
- static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
109
- chand->~ServiceConfigChannelArgChannelData();
95
+ auto* arena = GetContext<Arena>();
96
+ auto* service_config_call_data = arena->New<ServiceConfigCallData>(
97
+ arena, GetContext<grpc_call_context_element>());
98
+ service_config_call_data->SetServiceConfig(service_config_, method_configs);
99
+ return next_promise_factory(std::move(call_args));
110
100
  }
111
101
 
112
- const grpc_channel_filter ServiceConfigChannelArgFilter = {
113
- grpc_call_next_op,
114
- nullptr,
115
- grpc_channel_next_op,
116
- 0,
117
- ServiceConfigChannelArgInitCallElem,
118
- grpc_call_stack_ignore_set_pollset_or_pollset_set,
119
- ServiceConfigChannelArgDestroyCallElem,
120
- sizeof(ServiceConfigChannelArgChannelData),
121
- ServiceConfigChannelArgInitChannelElem,
122
- grpc_channel_stack_no_post_init,
123
- ServiceConfigChannelArgDestroyChannelElem,
124
- grpc_channel_next_get_info,
125
- "service_config_channel_arg"};
102
+ const grpc_channel_filter kServiceConfigChannelArgFilter =
103
+ MakePromiseBasedFilter<ServiceConfigChannelArgFilter,
104
+ FilterEndpoint::kClient>(
105
+ "service_config_channel_arg");
126
106
 
127
107
  } // namespace
128
108
 
@@ -136,7 +116,7 @@ void RegisterServiceConfigChannelArgFilter(
136
116
  !channel_args.GetString(GRPC_ARG_SERVICE_CONFIG).has_value()) {
137
117
  return true;
138
118
  }
139
- builder->PrependFilter(&ServiceConfigChannelArgFilter);
119
+ builder->PrependFilter(&kServiceConfigChannelArgFilter);
140
120
  return true;
141
121
  });
142
122
  }
@@ -119,9 +119,9 @@ class SubchannelCall {
119
119
  void SetAfterCallStackDestroy(grpc_closure* closure);
120
120
 
121
121
  // Interface of RefCounted<>.
122
- RefCountedPtr<SubchannelCall> Ref() GRPC_MUST_USE_RESULT;
123
- RefCountedPtr<SubchannelCall> Ref(const DebugLocation& location,
124
- const char* reason) GRPC_MUST_USE_RESULT;
122
+ GRPC_MUST_USE_RESULT RefCountedPtr<SubchannelCall> Ref();
123
+ GRPC_MUST_USE_RESULT RefCountedPtr<SubchannelCall> Ref(
124
+ const DebugLocation& location, const char* reason);
125
125
  // When refcount drops to 0, destroys itself and the associated call stack,
126
126
  // but does NOT free the memory because it's in the call arena.
127
127
  void Unref();
@@ -20,6 +20,7 @@
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
22
  #include "src/core/ext/filters/client_channel/subchannel.h"
23
+ #include "src/core/lib/gprpp/unique_type_name.h"
23
24
  #include "src/core/lib/load_balancing/subchannel_interface.h"
24
25
 
25
26
  namespace grpc_core {
@@ -29,6 +30,8 @@ namespace grpc_core {
29
30
  class InternalSubchannelDataWatcherInterface
30
31
  : public SubchannelInterface::DataWatcherInterface {
31
32
  public:
33
+ virtual UniqueTypeName type() const = 0;
34
+
32
35
  // Tells the watcher which subchannel to register itself with.
33
36
  virtual void SetSubchannel(Subchannel* subchannel) = 0;
34
37
  };