grpc 1.39.0 → 1.41.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (885) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +45 -38
  3. data/include/grpc/byte_buffer.h +1 -1
  4. data/include/grpc/byte_buffer_reader.h +1 -1
  5. data/include/grpc/event_engine/endpoint_config.h +6 -11
  6. data/include/grpc/event_engine/event_engine.h +73 -72
  7. data/include/grpc/event_engine/port.h +1 -3
  8. data/include/grpc/event_engine/slice_allocator.h +14 -34
  9. data/include/grpc/fork.h +1 -1
  10. data/include/grpc/grpc.h +10 -4
  11. data/include/grpc/grpc_posix.h +5 -2
  12. data/include/grpc/impl/codegen/atm.h +5 -3
  13. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  14. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  15. data/include/grpc/impl/codegen/atm_windows.h +2 -0
  16. data/include/grpc/impl/codegen/byte_buffer.h +2 -0
  17. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
  18. data/include/grpc/impl/codegen/compression_types.h +2 -0
  19. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  20. data/include/grpc/impl/codegen/fork.h +2 -0
  21. data/include/grpc/impl/codegen/gpr_slice.h +2 -0
  22. data/include/grpc/impl/codegen/gpr_types.h +2 -0
  23. data/include/grpc/impl/codegen/grpc_types.h +22 -13
  24. data/include/grpc/impl/codegen/log.h +2 -0
  25. data/include/grpc/impl/codegen/port_platform.h +50 -22
  26. data/include/grpc/impl/codegen/propagation_bits.h +2 -0
  27. data/include/grpc/impl/codegen/slice.h +2 -0
  28. data/include/grpc/impl/codegen/status.h +2 -0
  29. data/include/grpc/impl/codegen/sync.h +8 -5
  30. data/include/grpc/impl/codegen/sync_abseil.h +2 -0
  31. data/include/grpc/impl/codegen/sync_custom.h +2 -0
  32. data/include/grpc/impl/codegen/sync_generic.h +3 -0
  33. data/include/grpc/impl/codegen/sync_posix.h +4 -2
  34. data/include/grpc/impl/codegen/sync_windows.h +2 -0
  35. data/include/grpc/slice.h +1 -1
  36. data/include/grpc/status.h +1 -1
  37. data/include/grpc/support/atm.h +1 -1
  38. data/include/grpc/support/atm_gcc_atomic.h +1 -1
  39. data/include/grpc/support/atm_gcc_sync.h +1 -1
  40. data/include/grpc/support/atm_windows.h +1 -1
  41. data/include/grpc/support/log.h +1 -1
  42. data/include/grpc/support/port_platform.h +1 -1
  43. data/include/grpc/support/sync.h +1 -1
  44. data/include/grpc/support/sync_abseil.h +1 -1
  45. data/include/grpc/support/sync_custom.h +1 -1
  46. data/include/grpc/support/sync_generic.h +1 -1
  47. data/include/grpc/support/sync_posix.h +1 -1
  48. data/include/grpc/support/sync_windows.h +1 -1
  49. data/include/grpc/support/time.h +2 -2
  50. data/src/core/ext/filters/census/grpc_context.cc +1 -0
  51. data/src/core/ext/filters/client_channel/backend_metric.cc +0 -1
  52. data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
  53. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -2
  54. data/src/core/ext/filters/client_channel/client_channel.cc +437 -299
  55. data/src/core/ext/filters/client_channel/client_channel.h +45 -21
  56. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
  57. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  58. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -0
  59. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -1
  60. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  61. data/src/core/ext/filters/client_channel/config_selector.h +19 -6
  62. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -6
  63. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -3
  64. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +8 -7
  65. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
  66. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -2
  67. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +9 -16
  68. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  69. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +2 -2
  70. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  71. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -1
  72. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +12 -21
  73. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +17 -28
  74. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +18 -38
  75. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +8 -15
  76. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +2 -2
  77. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +5 -14
  78. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +23 -30
  79. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +24 -29
  80. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +4 -17
  81. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -11
  82. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -15
  83. data/src/core/ext/filters/client_channel/lb_policy.h +81 -90
  84. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -7
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -10
  86. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -0
  87. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -3
  88. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -5
  89. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +14 -19
  90. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -0
  91. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  92. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  93. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +106 -81
  94. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +2 -3
  95. data/src/core/ext/filters/client_channel/retry_filter.cc +408 -246
  96. data/src/core/ext/filters/client_channel/retry_service_config.cc +36 -26
  97. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  98. data/src/core/ext/filters/client_channel/service_config_call_data.h +45 -5
  99. data/src/core/ext/filters/client_idle/client_idle_filter.cc +36 -30
  100. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +8 -12
  101. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -13
  102. data/src/core/ext/filters/http/client/http_client_filter.cc +8 -4
  103. data/src/core/ext/filters/http/client_authority_filter.cc +2 -1
  104. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +2 -1
  105. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +7 -8
  106. data/src/core/ext/filters/http/server/http_server_filter.cc +5 -3
  107. data/src/core/ext/filters/message_size/message_size_filter.cc +9 -13
  108. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  109. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +29 -12
  110. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -0
  111. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -3
  112. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +10 -6
  113. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +2 -3
  114. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +65 -38
  115. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -1
  116. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -6
  117. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +5 -9
  118. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -2
  119. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  121. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +67 -0
  122. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +74 -0
  123. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +26 -36
  124. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -1
  125. data/src/core/ext/transport/chttp2/transport/context_list.h +1 -2
  126. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -23
  127. data/src/core/ext/transport/chttp2/transport/flow_control.h +10 -4
  128. data/src/core/ext/transport/chttp2/transport/frame_data.cc +11 -11
  129. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -0
  130. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +12 -11
  131. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
  132. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  133. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -0
  134. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +3 -5
  135. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -0
  136. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +41 -10
  137. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +12 -7
  139. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -0
  140. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
  141. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +272 -666
  142. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +236 -70
  143. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +107 -0
  144. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
  145. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +69 -0
  146. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +821 -1195
  147. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +76 -76
  148. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +159 -0
  149. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +130 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +46 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +30 -0
  152. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  153. data/src/core/ext/transport/chttp2/transport/internal.h +3 -3
  154. data/src/core/ext/transport/chttp2/transport/parsing.cc +89 -83
  155. data/src/core/ext/transport/chttp2/transport/popularity_count.h +60 -0
  156. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
  157. data/src/core/ext/transport/chttp2/transport/varint.cc +13 -7
  158. data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
  159. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -28
  160. data/src/core/ext/transport/inproc/inproc_transport.cc +6 -4
  161. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +96 -96
  162. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +221 -89
  163. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +1 -1
  164. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -1
  165. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +3 -3
  166. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +11 -5
  167. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +48 -48
  168. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +151 -61
  169. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +117 -96
  170. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +347 -141
  171. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +15 -15
  172. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +31 -13
  173. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +133 -126
  174. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +326 -149
  175. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +4 -4
  176. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +11 -5
  177. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +23 -23
  178. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +11 -5
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +28 -28
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +71 -29
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +11 -5
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +114 -78
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +268 -88
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +24 -24
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +51 -21
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +3 -3
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +11 -5
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +9 -9
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +21 -9
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +62 -62
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +131 -53
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +51 -51
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +81 -33
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +5 -5
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +11 -5
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +110 -53
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +356 -45
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +3 -3
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +11 -5
  201. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +46 -0
  202. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +133 -0
  203. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +8 -8
  204. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +11 -5
  205. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +9 -8
  206. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +11 -5
  207. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +35 -0
  208. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +96 -0
  209. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +16 -16
  210. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +31 -13
  211. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +57 -22
  212. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +174 -17
  213. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  214. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +51 -21
  215. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +3 -3
  216. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -5
  217. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +45 -37
  218. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +177 -94
  219. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +42 -40
  220. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +86 -29
  221. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +48 -0
  222. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +177 -0
  223. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +10 -8
  224. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +48 -28
  225. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +30 -30
  226. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +81 -33
  227. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +41 -29
  228. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +141 -43
  229. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +47 -43
  230. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +88 -29
  231. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +34 -17
  232. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +84 -9
  233. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +293 -277
  234. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +633 -240
  235. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +10 -10
  236. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +31 -13
  237. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +6 -6
  238. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +21 -9
  239. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +3 -3
  240. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +11 -5
  241. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +13 -13
  242. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +51 -21
  243. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +24 -23
  244. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +35 -13
  245. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +10 -9
  246. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +26 -16
  247. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +147 -106
  248. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +457 -160
  249. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +1 -1
  250. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -1
  251. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +48 -31
  252. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +135 -34
  253. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -12
  254. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +31 -13
  255. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +44 -42
  256. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +108 -55
  257. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +11 -5
  259. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +2 -2
  260. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +11 -5
  261. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +42 -42
  262. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +61 -25
  263. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +2 -2
  264. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +11 -5
  265. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +2 -2
  266. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +11 -5
  267. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +9 -9
  268. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +21 -9
  269. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +2 -2
  270. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +11 -5
  271. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +2 -2
  272. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +11 -5
  273. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +48 -20
  274. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +162 -17
  275. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +60 -0
  276. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +205 -0
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +9 -8
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -9
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +4 -4
  280. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +11 -5
  281. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +4 -4
  282. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +11 -5
  283. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +3 -3
  284. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +11 -5
  285. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +10 -9
  286. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +31 -13
  287. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +10 -10
  288. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +21 -9
  289. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +6 -6
  290. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +21 -9
  291. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +11 -11
  292. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +31 -13
  293. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +15 -15
  294. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +71 -29
  295. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +19 -19
  296. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +51 -21
  297. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +1 -1
  298. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -1
  299. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +6 -6
  300. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +21 -9
  301. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +10 -10
  302. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +31 -13
  303. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +5 -5
  304. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +11 -5
  305. data/src/core/ext/upb-generated/google/api/annotations.upb.c +1 -1
  306. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  307. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +58 -58
  308. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +111 -45
  309. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +68 -68
  310. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +121 -49
  311. data/src/core/ext/upb-generated/google/api/http.upb.c +18 -18
  312. data/src/core/ext/upb-generated/google/api/http.upb.h +31 -13
  313. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +4 -4
  314. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +11 -5
  315. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +153 -153
  316. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +271 -109
  317. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +4 -4
  318. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +11 -5
  319. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +2 -2
  320. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +11 -5
  321. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  322. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +31 -13
  323. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +4 -4
  324. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +11 -5
  325. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +19 -19
  326. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +91 -37
  327. data/src/core/ext/upb-generated/google/rpc/status.upb.c +5 -5
  328. data/src/core/ext/upb-generated/google/rpc/status.upb.h +11 -5
  329. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  330. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -5
  331. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +60 -60
  332. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +101 -41
  333. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +7 -7
  334. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -9
  335. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +5 -5
  336. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +21 -9
  337. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  338. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +91 -37
  339. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +8 -8
  340. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +31 -13
  341. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +4 -4
  342. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +11 -5
  343. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +1 -1
  344. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -1
  345. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +4 -4
  346. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +11 -5
  347. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +3 -3
  348. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +11 -5
  349. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +13 -13
  350. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +11 -5
  351. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +4 -4
  352. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +11 -5
  353. data/src/core/ext/upb-generated/validate/validate.upb.c +240 -224
  354. data/src/core/ext/upb-generated/validate/validate.upb.h +451 -217
  355. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +3 -3
  356. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +11 -5
  357. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  358. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +21 -9
  359. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +6 -6
  360. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +11 -5
  361. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  362. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +11 -5
  363. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +11 -11
  364. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +21 -9
  365. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +6 -6
  366. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +11 -5
  367. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +15 -7
  368. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +53 -52
  369. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +318 -277
  370. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -0
  371. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +438 -409
  372. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +198 -170
  373. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  374. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +9 -8
  375. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +219 -163
  376. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +15 -0
  377. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +59 -0
  378. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +40 -0
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +29 -25
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +52 -0
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +35 -0
  382. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +94 -63
  383. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +10 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +135 -125
  385. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  386. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +131 -123
  387. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +90 -0
  388. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +35 -0
  389. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +32 -24
  390. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +30 -19
  391. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  392. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +69 -55
  393. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
  394. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +796 -765
  395. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +13 -10
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +13 -10
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +436 -374
  399. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +10 -0
  400. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +140 -114
  401. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
  402. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +178 -173
  403. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +112 -79
  404. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +5 -0
  405. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +64 -0
  406. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +50 -0
  407. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +14 -13
  408. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +35 -32
  409. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +103 -103
  410. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +4 -4
  411. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +182 -160
  412. data/src/core/ext/xds/certificate_provider_registry.cc +2 -2
  413. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  414. data/src/core/ext/xds/xds_api.cc +1116 -1054
  415. data/src/core/ext/xds/xds_api.h +47 -35
  416. data/src/core/ext/xds/xds_bootstrap.cc +29 -51
  417. data/src/core/ext/xds/xds_client.cc +130 -68
  418. data/src/core/ext/xds/xds_client.h +0 -4
  419. data/src/core/ext/xds/xds_client_stats.cc +16 -15
  420. data/src/core/ext/xds/xds_client_stats.h +6 -6
  421. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -3
  422. data/src/core/ext/xds/xds_http_fault_filter.h +3 -2
  423. data/src/core/ext/xds/xds_http_filters.cc +4 -2
  424. data/src/core/ext/xds/xds_http_filters.h +3 -0
  425. data/src/core/ext/xds/xds_server_config_fetcher.cc +10 -10
  426. data/src/core/lib/address_utils/parse_address.cc +4 -8
  427. data/src/core/lib/address_utils/sockaddr_utils.cc +2 -2
  428. data/src/core/lib/channel/call_tracer.h +85 -0
  429. data/src/core/lib/channel/channel_args.cc +2 -1
  430. data/src/core/lib/channel/channel_stack.cc +5 -3
  431. data/src/core/lib/channel/channel_stack.h +1 -1
  432. data/src/core/lib/channel/channel_stack_builder.cc +1 -11
  433. data/src/core/lib/channel/channel_stack_builder.h +0 -8
  434. data/src/core/lib/channel/channel_trace.cc +4 -3
  435. data/src/core/lib/channel/channel_trace.h +1 -0
  436. data/src/core/lib/channel/channelz.cc +40 -36
  437. data/src/core/lib/channel/channelz.h +27 -27
  438. data/src/core/lib/channel/channelz_registry.cc +7 -6
  439. data/src/core/lib/channel/connected_channel.cc +1 -0
  440. data/src/core/lib/channel/context.h +3 -0
  441. data/src/core/lib/channel/handshaker.cc +2 -1
  442. data/src/core/lib/channel/handshaker.h +1 -2
  443. data/src/core/lib/channel/handshaker_factory.h +10 -2
  444. data/src/core/lib/channel/handshaker_registry.cc +15 -70
  445. data/src/core/lib/channel/handshaker_registry.h +29 -12
  446. data/src/core/lib/channel/status_util.h +6 -2
  447. data/src/core/lib/compression/algorithm_metadata.h +1 -0
  448. data/src/core/lib/compression/compression_args.cc +2 -1
  449. data/src/core/lib/compression/compression_internal.cc +2 -4
  450. data/src/core/lib/compression/message_compress.cc +2 -2
  451. data/src/core/lib/compression/stream_compression.cc +2 -1
  452. data/src/core/lib/compression/stream_compression.h +3 -2
  453. data/src/core/lib/compression/stream_compression_gzip.cc +2 -1
  454. data/src/core/lib/compression/stream_compression_gzip.h +1 -1
  455. data/src/core/lib/compression/stream_compression_identity.cc +2 -1
  456. data/src/core/lib/compression/stream_compression_identity.h +1 -1
  457. data/src/core/lib/config/core_configuration.cc +54 -0
  458. data/src/core/lib/config/core_configuration.h +108 -0
  459. data/src/core/lib/debug/stats.h +2 -1
  460. data/src/core/lib/debug/stats_data.cc +2 -1
  461. data/src/core/lib/debug/stats_data.h +1 -0
  462. data/src/core/lib/debug/trace.cc +1 -0
  463. data/src/core/lib/debug/trace.h +2 -1
  464. data/src/core/lib/event_engine/endpoint_config.cc +0 -1
  465. data/src/core/lib/event_engine/event_engine.cc +3 -3
  466. data/src/core/lib/event_engine/sockaddr.cc +3 -3
  467. data/src/core/lib/gpr/alloc.cc +4 -3
  468. data/src/core/lib/gpr/env_linux.cc +1 -2
  469. data/src/core/lib/gpr/env_posix.cc +2 -3
  470. data/src/core/lib/gpr/log.cc +3 -3
  471. data/src/core/lib/gpr/log_android.cc +3 -2
  472. data/src/core/lib/gpr/log_linux.cc +7 -4
  473. data/src/core/lib/gpr/log_posix.cc +6 -3
  474. data/src/core/lib/gpr/murmur_hash.cc +4 -2
  475. data/src/core/lib/gpr/string.h +2 -2
  476. data/src/core/lib/gpr/sync.cc +2 -2
  477. data/src/core/lib/gpr/sync_abseil.cc +7 -6
  478. data/src/core/lib/gpr/sync_posix.cc +3 -3
  479. data/src/core/lib/gpr/time.cc +3 -2
  480. data/src/core/lib/gpr/time_windows.cc +3 -2
  481. data/src/core/lib/gpr/tls.h +120 -41
  482. data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
  483. data/src/core/lib/gprpp/arena.cc +2 -1
  484. data/src/core/lib/gprpp/arena.h +5 -5
  485. data/src/core/lib/gprpp/atomic_utils.h +47 -0
  486. data/src/core/lib/gprpp/bitset.h +166 -0
  487. data/src/core/lib/gprpp/construct_destruct.h +39 -0
  488. data/src/core/lib/gprpp/dual_ref_counted.h +25 -26
  489. data/src/core/lib/gprpp/fork.cc +14 -12
  490. data/src/core/lib/gprpp/fork.h +4 -4
  491. data/src/core/lib/gprpp/global_config.h +1 -2
  492. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  493. data/src/core/lib/gprpp/global_config_generic.h +2 -2
  494. data/src/core/lib/gprpp/manual_constructor.h +9 -6
  495. data/src/core/lib/gprpp/match.h +73 -0
  496. data/src/core/lib/gprpp/memory.h +3 -3
  497. data/src/core/lib/gprpp/mpscq.cc +7 -7
  498. data/src/core/lib/gprpp/mpscq.h +6 -5
  499. data/src/core/lib/gprpp/orphanable.h +6 -6
  500. data/src/core/lib/gprpp/overload.h +59 -0
  501. data/src/core/lib/gprpp/ref_counted.h +18 -18
  502. data/src/core/lib/gprpp/status_helper.cc +4 -4
  503. data/src/core/lib/gprpp/sync.h +5 -31
  504. data/src/core/lib/gprpp/thd_posix.cc +5 -5
  505. data/src/core/lib/gprpp/thd_windows.cc +4 -11
  506. data/src/core/lib/gprpp/time_util.cc +2 -2
  507. data/src/core/lib/gprpp/time_util.h +2 -2
  508. data/src/core/lib/http/format_request.cc +1 -0
  509. data/src/core/lib/http/format_request.h +1 -0
  510. data/src/core/lib/http/httpcli.cc +9 -9
  511. data/src/core/lib/http/httpcli.h +3 -0
  512. data/src/core/lib/http/httpcli_security_connector.cc +5 -8
  513. data/src/core/lib/http/parser.h +1 -0
  514. data/src/core/lib/iomgr/buffer_list.cc +3 -2
  515. data/src/core/lib/iomgr/buffer_list.h +1 -2
  516. data/src/core/lib/iomgr/call_combiner.cc +1 -0
  517. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  518. data/src/core/lib/iomgr/combiner.cc +3 -2
  519. data/src/core/lib/iomgr/combiner.h +1 -0
  520. data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
  521. data/src/core/lib/iomgr/endpoint.cc +0 -4
  522. data/src/core/lib/iomgr/endpoint.h +1 -3
  523. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -20
  524. data/src/core/lib/iomgr/endpoint_cfstream.h +1 -1
  525. data/src/core/lib/iomgr/endpoint_pair.h +1 -0
  526. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +1 -2
  527. data/src/core/lib/iomgr/endpoint_pair_posix.cc +15 -11
  528. data/src/core/lib/iomgr/endpoint_pair_windows.cc +17 -9
  529. data/src/core/lib/iomgr/error.h +23 -9
  530. data/src/core/lib/iomgr/error_cfstream.cc +2 -2
  531. data/src/core/lib/iomgr/error_internal.h +1 -0
  532. data/src/core/lib/iomgr/ev_apple.h +1 -1
  533. data/src/core/lib/iomgr/ev_epoll1_linux.cc +14 -22
  534. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -22
  535. data/src/core/lib/iomgr/ev_poll_posix.cc +13 -25
  536. data/src/core/lib/iomgr/ev_posix.cc +1 -2
  537. data/src/core/lib/iomgr/event_engine/endpoint.cc +9 -30
  538. data/src/core/lib/iomgr/event_engine/endpoint.h +1 -2
  539. data/src/core/lib/iomgr/event_engine/iomgr.cc +17 -18
  540. data/src/core/lib/iomgr/event_engine/iomgr.h +20 -2
  541. data/src/core/lib/iomgr/event_engine/resolver.cc +2 -1
  542. data/src/core/lib/iomgr/event_engine/tcp.cc +68 -19
  543. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  544. data/src/core/lib/iomgr/exec_ctx.h +11 -19
  545. data/src/core/lib/iomgr/executor/mpmcqueue.cc +10 -9
  546. data/src/core/lib/iomgr/executor/mpmcqueue.h +4 -3
  547. data/src/core/lib/iomgr/executor/threadpool.cc +2 -2
  548. data/src/core/lib/iomgr/executor/threadpool.h +2 -1
  549. data/src/core/lib/iomgr/executor.cc +5 -6
  550. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  551. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  552. data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
  553. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  554. data/src/core/lib/iomgr/iomgr.h +2 -2
  555. data/src/core/lib/iomgr/iomgr_custom.cc +2 -2
  556. data/src/core/lib/iomgr/iomgr_custom.h +2 -2
  557. data/src/core/lib/iomgr/iomgr_internal.cc +2 -1
  558. data/src/core/lib/iomgr/iomgr_windows.cc +1 -2
  559. data/src/core/lib/iomgr/is_epollexclusive_available.cc +4 -4
  560. data/src/core/lib/iomgr/polling_entity.cc +2 -2
  561. data/src/core/lib/iomgr/pollset_custom.cc +3 -4
  562. data/src/core/lib/iomgr/pollset_custom.h +2 -2
  563. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -2
  564. data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
  565. data/src/core/lib/iomgr/port.h +0 -5
  566. data/src/core/lib/iomgr/python_util.h +2 -1
  567. data/src/core/lib/iomgr/resolve_address.cc +2 -1
  568. data/src/core/lib/iomgr/resolve_address.h +0 -4
  569. data/src/core/lib/iomgr/resolve_address_custom.cc +4 -4
  570. data/src/core/lib/iomgr/resolve_address_custom.h +0 -1
  571. data/src/core/lib/iomgr/resolve_address_posix.cc +2 -4
  572. data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
  573. data/src/core/lib/iomgr/resource_quota.cc +127 -40
  574. data/src/core/lib/iomgr/resource_quota.h +66 -17
  575. data/src/core/lib/iomgr/sockaddr.h +1 -1
  576. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -3
  577. data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
  578. data/src/core/lib/iomgr/socket_mutator.h +2 -2
  579. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -3
  580. data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
  581. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
  582. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  583. data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
  584. data/src/core/lib/iomgr/tcp_client.cc +4 -2
  585. data/src/core/lib/iomgr/tcp_client.h +4 -0
  586. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -19
  587. data/src/core/lib/iomgr/tcp_client_custom.cc +9 -17
  588. data/src/core/lib/iomgr/tcp_client_posix.cc +24 -9
  589. data/src/core/lib/iomgr/tcp_client_posix.h +5 -2
  590. data/src/core/lib/iomgr/tcp_client_windows.cc +16 -6
  591. data/src/core/lib/iomgr/tcp_custom.cc +11 -23
  592. data/src/core/lib/iomgr/tcp_custom.h +2 -1
  593. data/src/core/lib/iomgr/tcp_posix.cc +29 -59
  594. data/src/core/lib/iomgr/tcp_posix.h +11 -12
  595. data/src/core/lib/iomgr/tcp_server.cc +6 -4
  596. data/src/core/lib/iomgr/tcp_server.h +12 -9
  597. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -33
  598. data/src/core/lib/iomgr/tcp_server_posix.cc +21 -13
  599. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  600. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -2
  601. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +3 -4
  602. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  603. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -9
  604. data/src/core/lib/iomgr/tcp_windows.cc +6 -25
  605. data/src/core/lib/iomgr/tcp_windows.h +2 -1
  606. data/src/core/lib/iomgr/timer.cc +1 -0
  607. data/src/core/lib/iomgr/timer.h +1 -2
  608. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  609. data/src/core/lib/iomgr/timer_generic.cc +8 -38
  610. data/src/core/lib/iomgr/timer_generic.h +1 -0
  611. data/src/core/lib/iomgr/timer_heap.cc +1 -2
  612. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  613. data/src/core/lib/iomgr/udp_server.cc +1 -2
  614. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -5
  615. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -3
  616. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -0
  617. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -3
  618. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -0
  619. data/src/core/lib/iomgr/work_serializer.cc +4 -4
  620. data/src/core/lib/iomgr/work_serializer.h +1 -1
  621. data/src/core/lib/json/json_reader.cc +10 -19
  622. data/src/core/lib/json/json_util.h +18 -26
  623. data/src/core/lib/matchers/matchers.cc +8 -20
  624. data/src/core/lib/matchers/matchers.h +2 -2
  625. data/src/core/lib/profiling/basic_timers.cc +8 -6
  626. data/src/core/lib/profiling/stap_timers.cc +2 -2
  627. data/src/core/lib/security/authorization/authorization_policy_provider.h +5 -4
  628. data/src/core/lib/security/authorization/evaluate_args.cc +2 -0
  629. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +159 -0
  630. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +67 -0
  631. data/src/core/lib/security/context/security_context.cc +7 -6
  632. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
  633. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  634. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
  635. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -3
  636. data/src/core/lib/security/credentials/credentials.cc +6 -6
  637. data/src/core/lib/security/credentials/credentials.h +1 -1
  638. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -3
  639. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +13 -26
  640. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -2
  641. data/src/core/lib/security/credentials/external/aws_request_signer.cc +3 -3
  642. data/src/core/lib/security/credentials/external/external_account_credentials.cc +13 -22
  643. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -4
  644. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -2
  645. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +55 -3
  646. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -1
  647. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  648. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  649. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +31 -14
  650. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  651. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -2
  652. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
  653. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -7
  654. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -0
  655. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -4
  656. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +4 -4
  657. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -1
  658. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +3 -2
  659. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +10 -6
  660. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +50 -0
  661. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +14 -5
  662. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +2 -2
  663. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +4 -6
  664. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
  665. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -3
  666. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -7
  667. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +1 -2
  668. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -3
  669. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +15 -32
  670. data/src/core/lib/security/transport/auth_filters.h +1 -0
  671. data/src/core/lib/security/transport/client_auth_filter.cc +4 -6
  672. data/src/core/lib/security/transport/secure_endpoint.cc +4 -14
  673. data/src/core/lib/security/transport/secure_endpoint.h +1 -0
  674. data/src/core/lib/security/transport/security_handshaker.cc +17 -8
  675. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  676. data/src/core/lib/security/transport/server_auth_filter.cc +0 -7
  677. data/src/core/lib/security/util/json_util.cc +6 -8
  678. data/src/core/lib/slice/percent_encoding.cc +73 -30
  679. data/src/core/lib/slice/percent_encoding.h +29 -28
  680. data/src/core/lib/slice/slice.cc +14 -5
  681. data/src/core/lib/slice/slice_buffer.cc +1 -2
  682. data/src/core/lib/slice/slice_intern.cc +2 -3
  683. data/src/core/lib/slice/slice_internal.h +3 -2
  684. data/src/core/lib/surface/api_trace.cc +2 -1
  685. data/src/core/lib/surface/api_trace.h +1 -0
  686. data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
  687. data/src/core/lib/surface/call.cc +14 -14
  688. data/src/core/lib/surface/call.h +3 -3
  689. data/src/core/lib/surface/call_details.cc +2 -2
  690. data/src/core/lib/surface/call_log_batch.cc +2 -2
  691. data/src/core/lib/surface/channel.cc +22 -9
  692. data/src/core/lib/surface/channel.h +14 -2
  693. data/src/core/lib/surface/channel_ping.cc +1 -2
  694. data/src/core/lib/surface/channel_stack_type.cc +2 -1
  695. data/src/core/lib/surface/completion_queue.cc +54 -64
  696. data/src/core/lib/surface/completion_queue_factory.cc +2 -1
  697. data/src/core/lib/surface/completion_queue_factory.h +1 -0
  698. data/src/core/lib/surface/event_string.cc +1 -0
  699. data/src/core/lib/surface/init.cc +4 -9
  700. data/src/core/lib/surface/init.h +0 -1
  701. data/src/core/lib/surface/init_secure.cc +23 -4
  702. data/src/core/lib/surface/lame_client.cc +6 -5
  703. data/src/core/lib/surface/metadata_array.cc +2 -2
  704. data/src/core/lib/surface/server.cc +20 -34
  705. data/src/core/lib/surface/server.h +14 -16
  706. data/src/core/lib/surface/validate_metadata.cc +44 -16
  707. data/src/core/lib/surface/version.cc +2 -4
  708. data/src/core/lib/transport/byte_stream.h +1 -0
  709. data/src/core/lib/transport/connectivity_state.cc +8 -5
  710. data/src/core/lib/transport/connectivity_state.h +2 -2
  711. data/src/core/lib/transport/error_utils.cc +1 -0
  712. data/src/core/lib/transport/metadata.cc +10 -10
  713. data/src/core/lib/transport/metadata.h +13 -11
  714. data/src/core/lib/transport/metadata_batch.cc +13 -2
  715. data/src/core/lib/transport/metadata_batch.h +15 -0
  716. data/src/core/lib/transport/transport_op_string.cc +2 -2
  717. data/src/core/plugin_registry/grpc_plugin_registry.cc +14 -0
  718. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -2
  719. data/src/core/tsi/alts/crypt/gsec.h +2 -3
  720. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -2
  721. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
  722. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -2
  723. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -3
  724. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
  725. data/src/core/tsi/ssl_transport_security.cc +11 -9
  726. data/src/core/tsi/ssl_transport_security.h +3 -1
  727. data/src/core/tsi/transport_security.cc +3 -3
  728. data/src/core/tsi/transport_security_grpc.h +1 -0
  729. data/src/ruby/ext/grpc/extconf.rb +1 -1
  730. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -1
  731. data/src/ruby/ext/grpc/rb_call.c +5 -5
  732. data/src/ruby/ext/grpc/rb_call_credentials.c +5 -5
  733. data/src/ruby/ext/grpc/rb_channel.c +10 -8
  734. data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
  735. data/src/ruby/ext/grpc/rb_channel_credentials.c +4 -4
  736. data/src/ruby/ext/grpc/rb_channel_credentials.h +1 -0
  737. data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
  738. data/src/ruby/ext/grpc/rb_compression_options.c +5 -4
  739. data/src/ruby/ext/grpc/rb_event_thread.c +4 -4
  740. data/src/ruby/ext/grpc/rb_grpc.c +5 -4
  741. data/src/ruby/ext/grpc/rb_grpc.h +1 -0
  742. data/src/ruby/ext/grpc/rb_server.c +6 -5
  743. data/src/ruby/ext/grpc/rb_server_credentials.c +3 -3
  744. data/src/ruby/ext/grpc/rb_server_credentials.h +1 -0
  745. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +8 -5
  746. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +3 -1
  747. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +6 -5
  748. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +3 -1
  749. data/src/ruby/lib/grpc/version.rb +1 -1
  750. data/third_party/boringssl-with-bazel/err_data.c +294 -292
  751. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +52 -47
  752. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +1 -1
  753. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +1 -1
  754. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -0
  755. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  756. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  757. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -1
  758. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
  759. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_locl.h → internal.h} +20 -1
  760. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +1 -1
  761. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  762. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  763. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +1 -1
  764. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -1
  765. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
  766. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
  767. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +5 -3
  768. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +5 -6
  769. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  770. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +5 -9
  771. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  772. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +4 -6
  773. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +34 -0
  774. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
  775. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
  776. data/third_party/boringssl-with-bazel/src/crypto/internal.h +23 -2
  777. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
  778. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
  779. data/third_party/boringssl-with-bazel/src/crypto/mem.c +2 -0
  780. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +7 -3
  781. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +1 -1
  782. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +1 -0
  783. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
  784. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
  785. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
  786. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +2 -2
  787. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
  788. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -1
  789. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
  790. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +45 -2
  791. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +4 -2
  792. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +10 -3
  793. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +6 -23
  794. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +2 -2
  795. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -0
  796. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +25 -22
  797. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +0 -4
  798. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +1 -0
  799. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +1 -3
  800. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +9 -11
  801. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
  802. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -3
  803. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +1 -3
  804. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +1 -0
  805. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +0 -2
  806. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -0
  807. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -11
  808. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -5
  809. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +160 -74
  810. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  811. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
  812. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +3 -0
  813. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +6 -0
  814. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +25 -0
  815. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
  816. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
  817. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +3 -0
  818. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -4
  819. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +58 -6
  820. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +184 -55
  821. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +0 -5
  822. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +9 -16
  823. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +44 -2
  824. data/third_party/boringssl-with-bazel/src/ssl/{t1_lib.cc → extensions.cc} +24 -11
  825. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -0
  826. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -68
  827. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +17 -9
  828. data/third_party/boringssl-with-bazel/src/ssl/internal.h +25 -6
  829. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +1 -2
  830. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +11 -5
  831. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +0 -49
  832. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +121 -65
  833. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -6
  834. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +9 -11
  835. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +2 -2
  836. data/third_party/upb/upb/decode.c +129 -60
  837. data/third_party/upb/upb/decode.h +32 -4
  838. data/third_party/upb/upb/decode_fast.c +513 -500
  839. data/third_party/upb/upb/decode_fast.h +27 -0
  840. data/third_party/upb/upb/{decode.int.h → decode_internal.h} +38 -8
  841. data/third_party/upb/upb/def.c +171 -181
  842. data/third_party/upb/upb/def.h +41 -19
  843. data/third_party/upb/upb/def.hpp +29 -0
  844. data/third_party/upb/upb/encode.c +49 -16
  845. data/third_party/upb/upb/encode.h +29 -2
  846. data/third_party/upb/upb/msg.c +169 -28
  847. data/third_party/upb/upb/msg.h +75 -580
  848. data/third_party/upb/upb/msg_internal.h +687 -0
  849. data/third_party/upb/upb/port_def.inc +85 -24
  850. data/third_party/upb/upb/port_undef.inc +38 -1
  851. data/third_party/upb/upb/reflection.c +29 -37
  852. data/third_party/upb/upb/reflection.h +36 -8
  853. data/third_party/upb/upb/reflection.hpp +37 -0
  854. data/third_party/upb/upb/table.c +211 -86
  855. data/third_party/upb/upb/{table.int.h → table_internal.h} +56 -180
  856. data/third_party/upb/upb/text_encode.c +32 -4
  857. data/third_party/upb/upb/text_encode.h +26 -0
  858. data/third_party/upb/upb/upb.c +59 -8
  859. data/third_party/upb/upb/upb.h +36 -6
  860. data/third_party/upb/upb/upb.hpp +24 -0
  861. data/third_party/upb/upb/upb_internal.h +58 -0
  862. data/third_party/xxhash/xxhash.h +77 -195
  863. metadata +79 -60
  864. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -179
  865. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
  866. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -243
  867. data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
  868. data/src/core/lib/event_engine/slice_allocator.cc +0 -89
  869. data/src/core/lib/gpr/arena.h +0 -47
  870. data/src/core/lib/gpr/tls_gcc.h +0 -52
  871. data/src/core/lib/gpr/tls_msvc.h +0 -54
  872. data/src/core/lib/gpr/tls_pthread.cc +0 -30
  873. data/src/core/lib/gpr/tls_pthread.h +0 -56
  874. data/src/core/lib/gpr/tls_stdcpp.h +0 -48
  875. data/src/core/lib/gprpp/atomic.h +0 -104
  876. data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
  877. data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
  878. data/src/core/lib/iomgr/pollset_uv.cc +0 -95
  879. data/src/core/lib/iomgr/pollset_uv.h +0 -36
  880. data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
  881. data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
  882. data/src/core/lib/iomgr/tcp_uv.cc +0 -421
  883. data/src/core/lib/iomgr/timer_uv.cc +0 -66
  884. data/third_party/upb/third_party/wyhash/wyhash.h +0 -145
  885. data/third_party/upb/upb/upb.int.h +0 -29
@@ -26,19 +26,18 @@
26
26
 
27
27
  #include <set>
28
28
 
29
+ #include "absl/container/inlined_vector.h"
29
30
  #include "absl/strings/numbers.h"
30
31
  #include "absl/strings/str_cat.h"
31
32
  #include "absl/strings/str_join.h"
32
33
  #include "absl/strings/string_view.h"
34
+ #include "absl/types/optional.h"
33
35
 
34
36
  #include <grpc/support/alloc.h>
35
37
  #include <grpc/support/log.h>
36
38
  #include <grpc/support/string_util.h>
37
39
  #include <grpc/support/sync.h>
38
40
 
39
- #include "absl/container/inlined_vector.h"
40
- #include "absl/types/optional.h"
41
-
42
41
  #include "src/core/ext/filters/client_channel/backend_metric.h"
43
42
  #include "src/core/ext/filters/client_channel/backup_poller.h"
44
43
  #include "src/core/ext/filters/client_channel/config_selector.h"
@@ -174,9 +173,9 @@ class ClientChannel::CallData {
174
173
  void MaybeAddCallToResolverQueuedCallsLocked(grpc_call_element* elem)
175
174
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::resolution_mu_);
176
175
 
177
- static void RecvInitialMetadataReadyForConfigSelectorCommitCallback(
176
+ static void RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
178
177
  void* arg, grpc_error_handle error);
179
- void InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(
178
+ void InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
180
179
  grpc_transport_stream_op_batch* batch);
181
180
 
182
181
  void CreateDynamicCall(grpc_call_element* elem);
@@ -199,7 +198,7 @@ class ClientChannel::CallData {
199
198
 
200
199
  grpc_polling_entity* pollent_ = nullptr;
201
200
 
202
- grpc_closure pick_closure_;
201
+ grpc_closure resolution_done_closure_;
203
202
 
204
203
  // Accessed while holding ClientChannel::resolution_mu_.
205
204
  bool service_config_applied_ ABSL_GUARDED_BY(&ClientChannel::resolution_mu_) =
@@ -211,10 +210,8 @@ class ClientChannel::CallData {
211
210
  ResolverQueuedCallCanceller* resolver_call_canceller_
212
211
  ABSL_GUARDED_BY(&ClientChannel::resolution_mu_) = nullptr;
213
212
 
214
- std::function<void()> on_call_committed_;
215
-
216
- grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
217
- grpc_closure recv_initial_metadata_ready_;
213
+ grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
214
+ grpc_closure recv_trailing_metadata_ready_;
218
215
 
219
216
  RefCountedPtr<DynamicFilters> dynamic_filters_;
220
217
  RefCountedPtr<DynamicFilters::Call> dynamic_call_;
@@ -345,13 +342,16 @@ class DynamicTerminationFilter::CallData {
345
342
  auto* calld = static_cast<CallData*>(elem->call_data);
346
343
  auto* chand = static_cast<DynamicTerminationFilter*>(elem->channel_data);
347
344
  ClientChannel* client_channel = chand->chand_;
348
- grpc_call_element_args args = {
349
- calld->owning_call_, nullptr,
350
- calld->call_context_, calld->path_,
351
- calld->call_start_time_, calld->deadline_,
352
- calld->arena_, calld->call_combiner_};
353
- calld->lb_call_ =
354
- client_channel->CreateLoadBalancedCall(args, pollent, nullptr);
345
+ grpc_call_element_args args = {calld->owning_call_, nullptr,
346
+ calld->call_context_, calld->path_,
347
+ /*start_time=*/0, calld->deadline_,
348
+ calld->arena_, calld->call_combiner_};
349
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
350
+ calld->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
351
+ calld->lb_call_ = client_channel->CreateLoadBalancedCall(
352
+ args, pollent, nullptr,
353
+ service_config_call_data->call_dispatch_controller(),
354
+ /*is_transparent_retry=*/false);
355
355
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
356
356
  gpr_log(GPR_INFO,
357
357
  "chand=%p dynamic_termination_calld=%p: create lb_call=%p", chand,
@@ -362,7 +362,6 @@ class DynamicTerminationFilter::CallData {
362
362
  private:
363
363
  explicit CallData(const grpc_call_element_args& args)
364
364
  : path_(grpc_slice_ref_internal(args.path)),
365
- call_start_time_(args.start_time),
366
365
  deadline_(args.deadline),
367
366
  arena_(args.arena),
368
367
  owning_call_(args.call_stack),
@@ -372,14 +371,13 @@ class DynamicTerminationFilter::CallData {
372
371
  ~CallData() { grpc_slice_unref_internal(path_); }
373
372
 
374
373
  grpc_slice path_; // Request path.
375
- gpr_cycle_counter call_start_time_;
376
374
  grpc_millis deadline_;
377
375
  Arena* arena_;
378
376
  grpc_call_stack* owning_call_;
379
377
  CallCombiner* call_combiner_;
380
378
  grpc_call_context_element* call_context_;
381
379
 
382
- RefCountedPtr<ClientChannel::LoadBalancedCall> lb_call_;
380
+ OrphanablePtr<ClientChannel::LoadBalancedCall> lb_call_;
383
381
  };
384
382
 
385
383
  const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
@@ -812,8 +810,8 @@ void ClientChannel::ExternalConnectivityWatcher::
812
810
  void ClientChannel::ExternalConnectivityWatcher::Notify(
813
811
  grpc_connectivity_state state, const absl::Status& /* status */) {
814
812
  bool done = false;
815
- if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
816
- MemoryOrder::RELAXED)) {
813
+ if (!done_.compare_exchange_strong(done, true, std::memory_order_relaxed,
814
+ std::memory_order_relaxed)) {
817
815
  return; // Already done.
818
816
  }
819
817
  // Remove external watcher.
@@ -836,8 +834,8 @@ void ClientChannel::ExternalConnectivityWatcher::Notify(
836
834
 
837
835
  void ClientChannel::ExternalConnectivityWatcher::Cancel() {
838
836
  bool done = false;
839
- if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
840
- MemoryOrder::RELAXED)) {
837
+ if (!done_.compare_exchange_strong(done, true, std::memory_order_relaxed,
838
+ std::memory_order_relaxed)) {
841
839
  return; // Already done.
842
840
  }
843
841
  ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED);
@@ -1060,10 +1058,6 @@ void ClientChannel::Destroy(grpc_channel_element* elem) {
1060
1058
 
1061
1059
  namespace {
1062
1060
 
1063
- bool GetEnableRetries(const grpc_channel_args* args) {
1064
- return grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_RETRIES, false);
1065
- }
1066
-
1067
1061
  RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
1068
1062
  const grpc_channel_args* args) {
1069
1063
  const bool use_local_subchannel_pool = grpc_channel_args_find_bool(
@@ -1085,7 +1079,6 @@ ClientChannel::ClientChannel(grpc_channel_element_args* args,
1085
1079
  grpc_error_handle* error)
1086
1080
  : deadline_checking_enabled_(
1087
1081
  grpc_deadline_checking_enabled(args->channel_args)),
1088
- enable_retries_(GetEnableRetries(args->channel_args)),
1089
1082
  owning_stack_(args->channel_stack),
1090
1083
  client_channel_factory_(
1091
1084
  ClientChannelFactory::GetFromChannelArgs(args->channel_args)),
@@ -1148,9 +1141,8 @@ ClientChannel::ClientChannel(grpc_channel_element_args* args,
1148
1141
  channel_args_, GRPC_ARG_KEEPALIVE_TIME_MS,
1149
1142
  {-1 /* default value, unset */, 1, INT_MAX});
1150
1143
  if (!ResolverRegistry::IsValidTarget(target_uri_.get())) {
1151
- std::string error_message =
1152
- absl::StrCat("the target uri is not valid: ", target_uri_.get());
1153
- *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_message.c_str());
1144
+ *error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
1145
+ absl::StrCat("the target uri is not valid: ", target_uri_.get()));
1154
1146
  return;
1155
1147
  }
1156
1148
  *error = GRPC_ERROR_NONE;
@@ -1166,15 +1158,18 @@ ClientChannel::~ClientChannel() {
1166
1158
  // Stop backup polling.
1167
1159
  grpc_client_channel_stop_backup_polling(interested_parties_);
1168
1160
  grpc_pollset_set_destroy(interested_parties_);
1169
- GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
1161
+ GRPC_ERROR_UNREF(disconnect_error_.load(std::memory_order_relaxed));
1170
1162
  }
1171
1163
 
1172
- RefCountedPtr<ClientChannel::LoadBalancedCall>
1164
+ OrphanablePtr<ClientChannel::LoadBalancedCall>
1173
1165
  ClientChannel::CreateLoadBalancedCall(
1174
1166
  const grpc_call_element_args& args, grpc_polling_entity* pollent,
1175
- grpc_closure* on_call_destruction_complete) {
1176
- return args.arena->New<LoadBalancedCall>(this, args, pollent,
1177
- on_call_destruction_complete);
1167
+ grpc_closure* on_call_destruction_complete,
1168
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
1169
+ bool is_transparent_retry) {
1170
+ return OrphanablePtr<LoadBalancedCall>(args.arena->New<LoadBalancedCall>(
1171
+ this, args, pollent, on_call_destruction_complete,
1172
+ call_dispatch_controller, is_transparent_retry));
1178
1173
  }
1179
1174
 
1180
1175
  namespace {
@@ -1359,11 +1354,12 @@ void ClientChannel::OnResolverErrorLocked(grpc_error_handle error) {
1359
1354
  grpc_error_handle state_error =
1360
1355
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1361
1356
  "Resolver transient failure", &error, 1);
1357
+ absl::Status status = grpc_error_to_absl_status(state_error);
1362
1358
  {
1363
1359
  MutexLock lock(&resolution_mu_);
1364
1360
  // Update resolver transient failure.
1365
1361
  GRPC_ERROR_UNREF(resolver_transient_failure_error_);
1366
- resolver_transient_failure_error_ = GRPC_ERROR_REF(state_error);
1362
+ resolver_transient_failure_error_ = state_error;
1367
1363
  // Process calls that were queued waiting for the resolver result.
1368
1364
  for (ResolverQueuedCall* call = resolver_queued_calls_; call != nullptr;
1369
1365
  call = call->next) {
@@ -1377,10 +1373,8 @@ void ClientChannel::OnResolverErrorLocked(grpc_error_handle error) {
1377
1373
  }
1378
1374
  // Update connectivity state.
1379
1375
  UpdateStateAndPickerLocked(
1380
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(state_error),
1381
- "resolver failure",
1382
- absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
1383
- state_error));
1376
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status, "resolver failure",
1377
+ absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(status));
1384
1378
  }
1385
1379
  GRPC_ERROR_UNREF(error);
1386
1380
  }
@@ -1507,14 +1501,6 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
1507
1501
  config_selector =
1508
1502
  MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
1509
1503
  }
1510
- // Construct dynamic filter stack.
1511
- std::vector<const grpc_channel_filter*> filters =
1512
- config_selector->GetFilters();
1513
- if (enable_retries_) {
1514
- filters.push_back(&kRetryFilterVtable);
1515
- } else {
1516
- filters.push_back(&DynamicTerminationFilter::kFilterVtable);
1517
- }
1518
1504
  absl::InlinedVector<grpc_arg, 2> args_to_add = {
1519
1505
  grpc_channel_arg_pointer_create(
1520
1506
  const_cast<char*>(GRPC_ARG_CLIENT_CHANNEL), this,
@@ -1526,6 +1512,16 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
1526
1512
  grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
1527
1513
  channel_args_, args_to_add.data(), args_to_add.size());
1528
1514
  new_args = config_selector->ModifyChannelArgs(new_args);
1515
+ bool enable_retries =
1516
+ grpc_channel_args_find_bool(new_args, GRPC_ARG_ENABLE_RETRIES, true);
1517
+ // Construct dynamic filter stack.
1518
+ std::vector<const grpc_channel_filter*> filters =
1519
+ config_selector->GetFilters();
1520
+ if (enable_retries) {
1521
+ filters.push_back(&kRetryFilterVtable);
1522
+ } else {
1523
+ filters.push_back(&DynamicTerminationFilter::kFilterVtable);
1524
+ }
1529
1525
  RefCountedPtr<DynamicFilters> dynamic_filters =
1530
1526
  DynamicFilters::Create(new_args, std::move(filters));
1531
1527
  GPR_ASSERT(dynamic_filters != nullptr);
@@ -1548,6 +1544,15 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
1548
1544
  // Process calls that were queued waiting for the resolver result.
1549
1545
  for (ResolverQueuedCall* call = resolver_queued_calls_; call != nullptr;
1550
1546
  call = call->next) {
1547
+ // If there are a lot of queued calls here, resuming them all may cause us
1548
+ // to stay inside C-core for a long period of time. All of that work would
1549
+ // be done using the same ExecCtx instance and therefore the same cached
1550
+ // value of "now". The longer it takes to finish all of this work and exit
1551
+ // from C-core, the more stale the cached value of "now" may become. This
1552
+ // can cause problems whereby (e.g.) we calculate a timer deadline based
1553
+ // on the stale value, which results in the timer firing too early. To
1554
+ // avoid this, we invalidate the cached value for each call we process.
1555
+ ExecCtx::Get()->InvalidateNow();
1551
1556
  grpc_call_element* elem = call->elem;
1552
1557
  CallData* calld = static_cast<CallData*>(elem->call_data);
1553
1558
  grpc_error_handle error = GRPC_ERROR_NONE;
@@ -1660,6 +1665,15 @@ void ClientChannel::UpdateStateAndPickerLocked(
1660
1665
  // Re-process queued picks.
1661
1666
  for (LbQueuedCall* call = lb_queued_calls_; call != nullptr;
1662
1667
  call = call->next) {
1668
+ // If there are a lot of queued calls here, resuming them all may cause us
1669
+ // to stay inside C-core for a long period of time. All of that work would
1670
+ // be done using the same ExecCtx instance and therefore the same cached
1671
+ // value of "now". The longer it takes to finish all of this work and exit
1672
+ // from C-core, the more stale the cached value of "now" may become. This
1673
+ // can cause problems whereby (e.g.) we calculate a timer deadline based
1674
+ // on the stale value, which results in the timer firing too early. To
1675
+ // avoid this, we invalidate the cached value for each call we process.
1676
+ ExecCtx::Get()->InvalidateNow();
1663
1677
  grpc_error_handle error = GRPC_ERROR_NONE;
1664
1678
  if (call->lb_call->PickSubchannelLocked(&error)) {
1665
1679
  call->lb_call->AsyncPickDone(error);
@@ -1671,6 +1685,40 @@ void ClientChannel::UpdateStateAndPickerLocked(
1671
1685
  pending_subchannel_updates_.clear();
1672
1686
  }
1673
1687
 
1688
+ namespace {
1689
+
1690
+ // TODO(roth): Remove this in favor of the gprpp Match() function once
1691
+ // we can do that without breaking lock annotations.
1692
+ template <typename T>
1693
+ T HandlePickResult(
1694
+ LoadBalancingPolicy::PickResult* result,
1695
+ std::function<T(LoadBalancingPolicy::PickResult::Complete*)> complete_func,
1696
+ std::function<T(LoadBalancingPolicy::PickResult::Queue*)> queue_func,
1697
+ std::function<T(LoadBalancingPolicy::PickResult::Fail*)> fail_func,
1698
+ std::function<T(LoadBalancingPolicy::PickResult::Drop*)> drop_func) {
1699
+ auto* complete_pick =
1700
+ absl::get_if<LoadBalancingPolicy::PickResult::Complete>(&result->result);
1701
+ if (complete_pick != nullptr) {
1702
+ return complete_func(complete_pick);
1703
+ }
1704
+ auto* queue_pick =
1705
+ absl::get_if<LoadBalancingPolicy::PickResult::Queue>(&result->result);
1706
+ if (queue_pick != nullptr) {
1707
+ return queue_func(queue_pick);
1708
+ }
1709
+ auto* fail_pick =
1710
+ absl::get_if<LoadBalancingPolicy::PickResult::Fail>(&result->result);
1711
+ if (fail_pick != nullptr) {
1712
+ return fail_func(fail_pick);
1713
+ }
1714
+ auto* drop_pick =
1715
+ absl::get_if<LoadBalancingPolicy::PickResult::Drop>(&result->result);
1716
+ GPR_ASSERT(drop_pick != nullptr);
1717
+ return drop_func(drop_pick);
1718
+ }
1719
+
1720
+ } // namespace
1721
+
1674
1722
  grpc_error_handle ClientChannel::DoPingLocked(grpc_transport_op* op) {
1675
1723
  if (state_tracker_.state() != GRPC_CHANNEL_READY) {
1676
1724
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
@@ -1680,21 +1728,31 @@ grpc_error_handle ClientChannel::DoPingLocked(grpc_transport_op* op) {
1680
1728
  MutexLock lock(&data_plane_mu_);
1681
1729
  result = picker_->Pick(LoadBalancingPolicy::PickArgs());
1682
1730
  }
1683
- ConnectedSubchannel* connected_subchannel = nullptr;
1684
- if (result.subchannel != nullptr) {
1685
- SubchannelWrapper* subchannel =
1686
- static_cast<SubchannelWrapper*>(result.subchannel.get());
1687
- connected_subchannel = subchannel->connected_subchannel();
1688
- }
1689
- if (connected_subchannel != nullptr) {
1690
- connected_subchannel->Ping(op->send_ping.on_initiate, op->send_ping.on_ack);
1691
- } else {
1692
- if (result.error == GRPC_ERROR_NONE) {
1693
- result.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1694
- "LB policy dropped call on ping");
1695
- }
1696
- }
1697
- return result.error;
1731
+ return HandlePickResult<grpc_error_handle>(
1732
+ &result,
1733
+ // Complete pick.
1734
+ [op](LoadBalancingPolicy::PickResult::Complete* complete_pick)
1735
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::work_serializer_) {
1736
+ SubchannelWrapper* subchannel = static_cast<SubchannelWrapper*>(
1737
+ complete_pick->subchannel.get());
1738
+ ConnectedSubchannel* connected_subchannel =
1739
+ subchannel->connected_subchannel();
1740
+ connected_subchannel->Ping(op->send_ping.on_initiate,
1741
+ op->send_ping.on_ack);
1742
+ return GRPC_ERROR_NONE;
1743
+ },
1744
+ // Queue pick.
1745
+ [](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/) {
1746
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("LB picker queued call");
1747
+ },
1748
+ // Fail pick.
1749
+ [](LoadBalancingPolicy::PickResult::Fail* fail_pick) {
1750
+ return absl_status_to_grpc_error(fail_pick->status);
1751
+ },
1752
+ // Drop pick.
1753
+ [](LoadBalancingPolicy::PickResult::Drop* drop_pick) {
1754
+ return absl_status_to_grpc_error(drop_pick->status);
1755
+ });
1698
1756
  }
1699
1757
 
1700
1758
  void ClientChannel::StartTransportOpLocked(grpc_transport_op* op) {
@@ -1743,13 +1801,14 @@ void ClientChannel::StartTransportOpLocked(grpc_transport_op* op) {
1743
1801
  GRPC_ERROR_UNREF(op->disconnect_with_error);
1744
1802
  } else {
1745
1803
  // Disconnect.
1746
- GPR_ASSERT(disconnect_error_.Load(MemoryOrder::RELAXED) ==
1804
+ GPR_ASSERT(disconnect_error_.load(std::memory_order_relaxed) ==
1747
1805
  GRPC_ERROR_NONE);
1748
- disconnect_error_.Store(op->disconnect_with_error, MemoryOrder::RELEASE);
1806
+ disconnect_error_.store(op->disconnect_with_error,
1807
+ std::memory_order_release);
1749
1808
  UpdateStateAndPickerLocked(
1750
1809
  GRPC_CHANNEL_SHUTDOWN, absl::Status(), "shutdown from API",
1751
1810
  absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
1752
- GRPC_ERROR_REF(op->disconnect_with_error)));
1811
+ grpc_error_to_absl_status(op->disconnect_with_error)));
1753
1812
  }
1754
1813
  }
1755
1814
  GRPC_CHANNEL_STACK_UNREF(owning_stack_, "start_transport_op");
@@ -1919,10 +1978,26 @@ void ClientChannel::CallData::StartTransportStreamOpBatch(
1919
1978
  if (GPR_LIKELY(chand->deadline_checking_enabled_)) {
1920
1979
  grpc_deadline_state_client_start_transport_stream_op_batch(elem, batch);
1921
1980
  }
1922
- // Intercept recv_initial_metadata for config selector on-committed callback.
1923
- if (batch->recv_initial_metadata) {
1924
- calld->InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(batch);
1981
+ // Intercept recv_trailing_metadata to call CallDispatchController::Commit(),
1982
+ // in case we wind up failing the call before we get down to the retry
1983
+ // or LB call layer.
1984
+ if (batch->recv_trailing_metadata) {
1985
+ calld->InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
1986
+ batch);
1925
1987
  }
1988
+ // If we already have a dynamic call, pass the batch down to it.
1989
+ // Note that once we have done so, we do not need to acquire the channel's
1990
+ // resolution mutex, which is more efficient (especially for streaming calls).
1991
+ if (calld->dynamic_call_ != nullptr) {
1992
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
1993
+ gpr_log(GPR_INFO, "chand=%p calld=%p: starting batch on dynamic_call=%p",
1994
+ chand, calld, calld->dynamic_call_.get());
1995
+ }
1996
+ calld->dynamic_call_->StartTransportStreamOpBatch(batch);
1997
+ return;
1998
+ }
1999
+ // We do not yet have a dynamic call.
2000
+ //
1926
2001
  // If we've previously been cancelled, immediately fail any new batches.
1927
2002
  if (GPR_UNLIKELY(calld->cancel_error_ != GRPC_ERROR_NONE)) {
1928
2003
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -1949,35 +2024,16 @@ void ClientChannel::CallData::StartTransportStreamOpBatch(
1949
2024
  gpr_log(GPR_INFO, "chand=%p calld=%p: recording cancel_error=%s", chand,
1950
2025
  calld, grpc_error_std_string(calld->cancel_error_).c_str());
1951
2026
  }
1952
- // If we do not have a dynamic call (i.e., name resolution has not
1953
- // yet completed), fail all pending batches. Otherwise, send the
1954
- // cancellation down to the dynamic call.
1955
- if (calld->dynamic_call_ == nullptr) {
1956
- calld->PendingBatchesFail(elem, GRPC_ERROR_REF(calld->cancel_error_),
1957
- NoYieldCallCombiner);
1958
- // Note: This will release the call combiner.
1959
- grpc_transport_stream_op_batch_finish_with_failure(
1960
- batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_);
1961
- } else {
1962
- // Note: This will release the call combiner.
1963
- calld->dynamic_call_->StartTransportStreamOpBatch(batch);
1964
- }
2027
+ // Fail all pending batches.
2028
+ calld->PendingBatchesFail(elem, GRPC_ERROR_REF(calld->cancel_error_),
2029
+ NoYieldCallCombiner);
2030
+ // Note: This will release the call combiner.
2031
+ grpc_transport_stream_op_batch_finish_with_failure(
2032
+ batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_);
1965
2033
  return;
1966
2034
  }
1967
2035
  // Add the batch to the pending list.
1968
2036
  calld->PendingBatchesAdd(elem, batch);
1969
- // Check if we've already created a dynamic call.
1970
- // Note that once we have done so, we do not need to acquire the channel's
1971
- // resolution mutex, which is more efficient (especially for streaming calls).
1972
- if (calld->dynamic_call_ != nullptr) {
1973
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
1974
- gpr_log(GPR_INFO, "chand=%p calld=%p: starting batch on dynamic_call=%p",
1975
- chand, calld, calld->dynamic_call_.get());
1976
- }
1977
- calld->PendingBatchesResume(elem);
1978
- return;
1979
- }
1980
- // We do not yet have a dynamic call.
1981
2037
  // For batches containing a send_initial_metadata op, acquire the
1982
2038
  // channel's resolution mutex to apply the service config to the call,
1983
2039
  // after which we will create a dynamic call.
@@ -2218,7 +2274,6 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
2218
2274
  ConfigSelector::CallConfig call_config =
2219
2275
  config_selector->GetCallConfig({&path_, initial_metadata, arena_});
2220
2276
  if (call_config.error != GRPC_ERROR_NONE) return call_config.error;
2221
- on_call_committed_ = std::move(call_config.on_call_committed);
2222
2277
  // Create a ServiceConfigCallData for the call. This stores a ref to the
2223
2278
  // ServiceConfig and caches the right set of parsed configs to use for
2224
2279
  // the call. The MethodConfig will store itself in the call context,
@@ -2226,7 +2281,8 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
2226
2281
  // will be cleaned up when the call ends.
2227
2282
  auto* service_config_call_data = arena_->New<ServiceConfigCallData>(
2228
2283
  std::move(call_config.service_config), call_config.method_configs,
2229
- std::move(call_config.call_attributes), call_context_);
2284
+ std::move(call_config.call_attributes),
2285
+ call_config.call_dispatch_controller, call_context_);
2230
2286
  // Apply our own method params to the call.
2231
2287
  auto* method_params = static_cast<ClientChannelMethodParsedConfig*>(
2232
2288
  service_config_call_data->GetMethodParsedConfig(
@@ -2265,36 +2321,36 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
2265
2321
  }
2266
2322
 
2267
2323
  void ClientChannel::CallData::
2268
- RecvInitialMetadataReadyForConfigSelectorCommitCallback(
2324
+ RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
2269
2325
  void* arg, grpc_error_handle error) {
2270
2326
  auto* self = static_cast<CallData*>(arg);
2271
- if (self->on_call_committed_ != nullptr) {
2272
- self->on_call_committed_();
2273
- self->on_call_committed_ = nullptr;
2327
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
2328
+ self->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
2329
+ if (service_config_call_data != nullptr) {
2330
+ service_config_call_data->call_dispatch_controller()->Commit();
2274
2331
  }
2275
2332
  // Chain to original callback.
2276
- Closure::Run(DEBUG_LOCATION, self->original_recv_initial_metadata_ready_,
2333
+ Closure::Run(DEBUG_LOCATION, self->original_recv_trailing_metadata_ready_,
2277
2334
  GRPC_ERROR_REF(error));
2278
2335
  }
2279
2336
 
2280
- // TODO(roth): Consider not intercepting this callback unless we
2281
- // actually need to, if this causes a performance problem.
2282
2337
  void ClientChannel::CallData::
2283
- InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(
2338
+ InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
2284
2339
  grpc_transport_stream_op_batch* batch) {
2285
- original_recv_initial_metadata_ready_ =
2286
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
2287
- GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
2288
- RecvInitialMetadataReadyForConfigSelectorCommitCallback,
2340
+ original_recv_trailing_metadata_ready_ =
2341
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
2342
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
2343
+ RecvTrailingMetadataReadyForConfigSelectorCommitCallback,
2289
2344
  this, nullptr);
2290
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
2291
- &recv_initial_metadata_ready_;
2345
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
2346
+ &recv_trailing_metadata_ready_;
2292
2347
  }
2293
2348
 
2294
2349
  void ClientChannel::CallData::AsyncResolutionDone(grpc_call_element* elem,
2295
2350
  grpc_error_handle error) {
2296
- GRPC_CLOSURE_INIT(&pick_closure_, ResolutionDone, elem, nullptr);
2297
- ExecCtx::Run(DEBUG_LOCATION, &pick_closure_, error);
2351
+ // TODO(roth): Does this callback need to hold a ref to the call stack?
2352
+ GRPC_CLOSURE_INIT(&resolution_done_closure_, ResolutionDone, elem, nullptr);
2353
+ ExecCtx::Run(DEBUG_LOCATION, &resolution_done_closure_, error);
2298
2354
  }
2299
2355
 
2300
2356
  void ClientChannel::CallData::ResolutionDone(void* arg,
@@ -2443,48 +2499,21 @@ class ClientChannel::LoadBalancedCall::Metadata
2443
2499
  GRPC_ERROR_NONE);
2444
2500
  }
2445
2501
 
2446
- iterator begin() const override {
2447
- static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
2448
- "iterator size too large");
2449
- return iterator(
2450
- this, reinterpret_cast<intptr_t>(MaybeSkipEntry(batch_->list.head)));
2451
- }
2452
- iterator end() const override {
2453
- static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
2454
- "iterator size too large");
2455
- return iterator(this, 0);
2456
- }
2457
-
2458
- iterator erase(iterator it) override {
2459
- grpc_linked_mdelem* linked_mdelem =
2460
- reinterpret_cast<grpc_linked_mdelem*>(GetIteratorHandle(it));
2461
- intptr_t handle = reinterpret_cast<intptr_t>(linked_mdelem->next);
2462
- grpc_metadata_batch_remove(batch_, linked_mdelem);
2463
- return iterator(this, handle);
2464
- }
2465
-
2466
- private:
2467
- grpc_linked_mdelem* MaybeSkipEntry(grpc_linked_mdelem* entry) const {
2468
- if (entry != nullptr && batch_->idx.named.path == entry) {
2469
- return entry->next;
2502
+ std::vector<std::pair<std::string, std::string>> TestOnlyCopyToVector()
2503
+ override {
2504
+ std::vector<std::pair<std::string, std::string>> result;
2505
+ for (grpc_linked_mdelem* entry = batch_->list.head; entry != nullptr;
2506
+ entry = entry->next) {
2507
+ if (batch_->idx.named.path != entry) {
2508
+ result.push_back(std::make_pair(
2509
+ std::string(StringViewFromSlice(GRPC_MDKEY(entry->md))),
2510
+ std::string(StringViewFromSlice(GRPC_MDVALUE(entry->md)))));
2511
+ }
2470
2512
  }
2471
- return entry;
2472
- }
2473
-
2474
- intptr_t IteratorHandleNext(intptr_t handle) const override {
2475
- grpc_linked_mdelem* linked_mdelem =
2476
- reinterpret_cast<grpc_linked_mdelem*>(handle);
2477
- return reinterpret_cast<intptr_t>(MaybeSkipEntry(linked_mdelem->next));
2478
- }
2479
-
2480
- std::pair<absl::string_view, absl::string_view> IteratorHandleGet(
2481
- intptr_t handle) const override {
2482
- grpc_linked_mdelem* linked_mdelem =
2483
- reinterpret_cast<grpc_linked_mdelem*>(handle);
2484
- return std::make_pair(StringViewFromSlice(GRPC_MDKEY(linked_mdelem->md)),
2485
- StringViewFromSlice(GRPC_MDVALUE(linked_mdelem->md)));
2513
+ return result;
2486
2514
  }
2487
2515
 
2516
+ private:
2488
2517
  LoadBalancedCall* lb_call_;
2489
2518
  grpc_metadata_batch* batch_;
2490
2519
  };
@@ -2530,22 +2559,39 @@ class ClientChannel::LoadBalancedCall::LbCallState
2530
2559
  // LoadBalancedCall
2531
2560
  //
2532
2561
 
2562
+ namespace {
2563
+
2564
+ CallTracer::CallAttemptTracer* GetCallAttemptTracer(
2565
+ grpc_call_context_element* context, bool is_transparent_retry) {
2566
+ auto* call_tracer =
2567
+ static_cast<CallTracer*>(context[GRPC_CONTEXT_CALL_TRACER].value);
2568
+ if (call_tracer == nullptr) return nullptr;
2569
+ return call_tracer->StartNewAttempt(is_transparent_retry);
2570
+ }
2571
+
2572
+ } // namespace
2573
+
2533
2574
  ClientChannel::LoadBalancedCall::LoadBalancedCall(
2534
2575
  ClientChannel* chand, const grpc_call_element_args& args,
2535
- grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete)
2536
- : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)
2537
- ? "LoadBalancedCall"
2538
- : nullptr),
2576
+ grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
2577
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
2578
+ bool is_transparent_retry)
2579
+ : InternallyRefCounted(
2580
+ GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)
2581
+ ? "LoadBalancedCall"
2582
+ : nullptr),
2539
2583
  chand_(chand),
2540
2584
  path_(grpc_slice_ref_internal(args.path)),
2541
- call_start_time_(args.start_time),
2542
2585
  deadline_(args.deadline),
2543
2586
  arena_(args.arena),
2544
2587
  owning_call_(args.call_stack),
2545
2588
  call_combiner_(args.call_combiner),
2546
2589
  call_context_(args.context),
2547
2590
  pollent_(pollent),
2548
- on_call_destruction_complete_(on_call_destruction_complete) {}
2591
+ on_call_destruction_complete_(on_call_destruction_complete),
2592
+ call_dispatch_controller_(call_dispatch_controller),
2593
+ call_attempt_tracer_(
2594
+ GetCallAttemptTracer(args.context, is_transparent_retry)) {}
2549
2595
 
2550
2596
  ClientChannel::LoadBalancedCall::~LoadBalancedCall() {
2551
2597
  grpc_slice_unref_internal(path_);
@@ -2565,6 +2611,16 @@ ClientChannel::LoadBalancedCall::~LoadBalancedCall() {
2565
2611
  }
2566
2612
  }
2567
2613
 
2614
+ void ClientChannel::LoadBalancedCall::Orphan() {
2615
+ // Compute latency and report it to the tracer.
2616
+ if (call_attempt_tracer_ != nullptr) {
2617
+ gpr_timespec latency =
2618
+ gpr_cycle_counter_sub(gpr_get_cycle_counter(), lb_call_start_time_);
2619
+ call_attempt_tracer_->RecordEnd(latency);
2620
+ }
2621
+ Unref();
2622
+ }
2623
+
2568
2624
  size_t ClientChannel::LoadBalancedCall::GetBatchIndex(
2569
2625
  grpc_transport_stream_op_batch* batch) {
2570
2626
  // Note: It is important the send_initial_metadata be the first entry
@@ -2680,10 +2736,79 @@ void ClientChannel::LoadBalancedCall::PendingBatchesResume() {
2680
2736
 
2681
2737
  void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
2682
2738
  grpc_transport_stream_op_batch* batch) {
2683
- // Intercept recv_trailing_metadata_ready for LB callback.
2739
+ // Handle call tracing.
2740
+ if (call_attempt_tracer_ != nullptr) {
2741
+ // Record send ops in tracer.
2742
+ if (batch->cancel_stream) {
2743
+ call_attempt_tracer_->RecordCancel(
2744
+ GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error));
2745
+ }
2746
+ if (batch->send_initial_metadata) {
2747
+ call_attempt_tracer_->RecordSendInitialMetadata(
2748
+ batch->payload->send_initial_metadata.send_initial_metadata,
2749
+ batch->payload->send_initial_metadata.send_initial_metadata_flags);
2750
+ peer_string_ = batch->payload->send_initial_metadata.peer_string;
2751
+ original_send_initial_metadata_on_complete_ = batch->on_complete;
2752
+ GRPC_CLOSURE_INIT(&send_initial_metadata_on_complete_,
2753
+ SendInitialMetadataOnComplete, this, nullptr);
2754
+ batch->on_complete = &send_initial_metadata_on_complete_;
2755
+ }
2756
+ if (batch->send_message) {
2757
+ call_attempt_tracer_->RecordSendMessage(
2758
+ *batch->payload->send_message.send_message);
2759
+ }
2760
+ if (batch->send_trailing_metadata) {
2761
+ call_attempt_tracer_->RecordSendTrailingMetadata(
2762
+ batch->payload->send_trailing_metadata.send_trailing_metadata);
2763
+ }
2764
+ // Intercept recv ops.
2765
+ if (batch->recv_initial_metadata) {
2766
+ recv_initial_metadata_ =
2767
+ batch->payload->recv_initial_metadata.recv_initial_metadata;
2768
+ original_recv_initial_metadata_ready_ =
2769
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
2770
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
2771
+ this, nullptr);
2772
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
2773
+ &recv_initial_metadata_ready_;
2774
+ }
2775
+ if (batch->recv_message) {
2776
+ recv_message_ = batch->payload->recv_message.recv_message;
2777
+ original_recv_message_ready_ =
2778
+ batch->payload->recv_message.recv_message_ready;
2779
+ GRPC_CLOSURE_INIT(&recv_message_ready_, RecvMessageReady, this, nullptr);
2780
+ batch->payload->recv_message.recv_message_ready = &recv_message_ready_;
2781
+ }
2782
+ }
2783
+ // Intercept recv_trailing_metadata even if there is no call tracer,
2784
+ // since we may need to notify the LB policy about trailing metadata.
2684
2785
  if (batch->recv_trailing_metadata) {
2685
- InjectRecvTrailingMetadataReadyForLoadBalancingPolicy(batch);
2786
+ recv_trailing_metadata_ =
2787
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
2788
+ transport_stream_stats_ =
2789
+ batch->payload->recv_trailing_metadata.collect_stats;
2790
+ original_recv_trailing_metadata_ready_ =
2791
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
2792
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_, RecvTrailingMetadataReady,
2793
+ this, nullptr);
2794
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
2795
+ &recv_trailing_metadata_ready_;
2796
+ }
2797
+ // If we've already gotten a subchannel call, pass the batch down to it.
2798
+ // Note that once we have picked a subchannel, we do not need to acquire
2799
+ // the channel's data plane mutex, which is more efficient (especially for
2800
+ // streaming calls).
2801
+ if (subchannel_call_ != nullptr) {
2802
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
2803
+ gpr_log(GPR_INFO,
2804
+ "chand=%p lb_call=%p: starting batch on subchannel_call=%p",
2805
+ chand_, this, subchannel_call_.get());
2806
+ }
2807
+ subchannel_call_->StartTransportStreamOpBatch(batch);
2808
+ return;
2686
2809
  }
2810
+ // We do not yet have a subchannel call.
2811
+ //
2687
2812
  // If we've previously been cancelled, immediately fail any new batches.
2688
2813
  if (GPR_UNLIKELY(cancel_error_ != GRPC_ERROR_NONE)) {
2689
2814
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -2708,36 +2833,15 @@ void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
2708
2833
  gpr_log(GPR_INFO, "chand=%p lb_call=%p: recording cancel_error=%s",
2709
2834
  chand_, this, grpc_error_std_string(cancel_error_).c_str());
2710
2835
  }
2711
- // If we do not have a subchannel call (i.e., a pick has not yet
2712
- // been started), fail all pending batches. Otherwise, send the
2713
- // cancellation down to the subchannel call.
2714
- if (subchannel_call_ == nullptr) {
2715
- PendingBatchesFail(GRPC_ERROR_REF(cancel_error_), NoYieldCallCombiner);
2716
- // Note: This will release the call combiner.
2717
- grpc_transport_stream_op_batch_finish_with_failure(
2718
- batch, GRPC_ERROR_REF(cancel_error_), call_combiner_);
2719
- } else {
2720
- // Note: This will release the call combiner.
2721
- subchannel_call_->StartTransportStreamOpBatch(batch);
2722
- }
2836
+ // Fail all pending batches.
2837
+ PendingBatchesFail(GRPC_ERROR_REF(cancel_error_), NoYieldCallCombiner);
2838
+ // Note: This will release the call combiner.
2839
+ grpc_transport_stream_op_batch_finish_with_failure(
2840
+ batch, GRPC_ERROR_REF(cancel_error_), call_combiner_);
2723
2841
  return;
2724
2842
  }
2725
2843
  // Add the batch to the pending list.
2726
2844
  PendingBatchesAdd(batch);
2727
- // Check if we've already gotten a subchannel call.
2728
- // Note that once we have picked a subchannel, we do not need to acquire
2729
- // the channel's data plane mutex, which is more efficient (especially for
2730
- // streaming calls).
2731
- if (subchannel_call_ != nullptr) {
2732
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
2733
- gpr_log(GPR_INFO,
2734
- "chand=%p lb_call=%p: starting batch on subchannel_call=%p",
2735
- chand_, this, subchannel_call_.get());
2736
- }
2737
- PendingBatchesResume();
2738
- return;
2739
- }
2740
- // We do not yet have a subchannel call.
2741
2845
  // For batches containing a send_initial_metadata op, acquire the
2742
2846
  // channel's data plane mutex to pick a subchannel.
2743
2847
  if (GPR_LIKELY(batch->send_initial_metadata)) {
@@ -2759,38 +2863,82 @@ void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
2759
2863
  }
2760
2864
  }
2761
2865
 
2762
- void ClientChannel::LoadBalancedCall::
2763
- RecvTrailingMetadataReadyForLoadBalancingPolicy(void* arg,
2764
- grpc_error_handle error) {
2866
+ void ClientChannel::LoadBalancedCall::SendInitialMetadataOnComplete(
2867
+ void* arg, grpc_error_handle error) {
2765
2868
  auto* self = static_cast<LoadBalancedCall*>(arg);
2766
- if (self->lb_recv_trailing_metadata_ready_ != nullptr) {
2767
- // Set error if call did not succeed.
2768
- grpc_error_handle error_for_lb = GRPC_ERROR_NONE;
2869
+ self->call_attempt_tracer_->RecordOnDoneSendInitialMetadata(
2870
+ self->peer_string_);
2871
+ Closure::Run(DEBUG_LOCATION,
2872
+ self->original_send_initial_metadata_on_complete_,
2873
+ GRPC_ERROR_REF(error));
2874
+ }
2875
+
2876
+ void ClientChannel::LoadBalancedCall::RecvInitialMetadataReady(
2877
+ void* arg, grpc_error_handle error) {
2878
+ auto* self = static_cast<LoadBalancedCall*>(arg);
2879
+ if (error == GRPC_ERROR_NONE) {
2880
+ // recv_initial_metadata_flags is not populated for clients
2881
+ self->call_attempt_tracer_->RecordReceivedInitialMetadata(
2882
+ self->recv_initial_metadata_, 0 /* recv_initial_metadata_flags */);
2883
+ }
2884
+ Closure::Run(DEBUG_LOCATION, self->original_recv_initial_metadata_ready_,
2885
+ GRPC_ERROR_REF(error));
2886
+ }
2887
+
2888
+ void ClientChannel::LoadBalancedCall::RecvMessageReady(
2889
+ void* arg, grpc_error_handle error) {
2890
+ auto* self = static_cast<LoadBalancedCall*>(arg);
2891
+ if (*self->recv_message_ != nullptr) {
2892
+ self->call_attempt_tracer_->RecordReceivedMessage(**self->recv_message_);
2893
+ }
2894
+ Closure::Run(DEBUG_LOCATION, self->original_recv_message_ready_,
2895
+ GRPC_ERROR_REF(error));
2896
+ }
2897
+
2898
+ void ClientChannel::LoadBalancedCall::RecvTrailingMetadataReady(
2899
+ void* arg, grpc_error_handle error) {
2900
+ auto* self = static_cast<LoadBalancedCall*>(arg);
2901
+ // Check if we have a tracer or an LB callback to invoke.
2902
+ if (self->call_attempt_tracer_ != nullptr ||
2903
+ self->lb_recv_trailing_metadata_ready_ != nullptr) {
2904
+ // Get the call's status.
2905
+ absl::Status status;
2769
2906
  if (error != GRPC_ERROR_NONE) {
2770
- error_for_lb = error;
2907
+ // Get status from error.
2908
+ grpc_status_code code;
2909
+ grpc_slice message = grpc_empty_slice();
2910
+ grpc_error_get_status(error, self->deadline_, &code, &message,
2911
+ /*http_error=*/nullptr, /*error_string=*/nullptr);
2912
+ status = absl::Status(static_cast<absl::StatusCode>(code),
2913
+ StringViewFromSlice(message));
2771
2914
  } else {
2915
+ // Get status from headers.
2772
2916
  const auto& fields = self->recv_trailing_metadata_->idx.named;
2773
2917
  GPR_ASSERT(fields.grpc_status != nullptr);
2774
- grpc_status_code status =
2918
+ grpc_status_code code =
2775
2919
  grpc_get_status_code_from_metadata(fields.grpc_status->md);
2776
- std::string msg;
2777
- if (status != GRPC_STATUS_OK) {
2778
- error_for_lb = grpc_error_set_int(
2779
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"),
2780
- GRPC_ERROR_INT_GRPC_STATUS, status);
2920
+ if (code != GRPC_STATUS_OK) {
2921
+ absl::string_view message;
2781
2922
  if (fields.grpc_message != nullptr) {
2782
- error_for_lb = grpc_error_set_str(
2783
- error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE,
2784
- grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md)));
2923
+ message = StringViewFromSlice(GRPC_MDVALUE(fields.grpc_message->md));
2785
2924
  }
2925
+ status = absl::Status(static_cast<absl::StatusCode>(code), message);
2786
2926
  }
2787
2927
  }
2788
- // Invoke callback to LB policy.
2789
- Metadata trailing_metadata(self, self->recv_trailing_metadata_);
2790
- LbCallState lb_call_state(self);
2791
- self->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata,
2792
- &lb_call_state);
2793
- if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb);
2928
+ // If we have a tracer, notify it.
2929
+ if (self->call_attempt_tracer_ != nullptr) {
2930
+ self->call_attempt_tracer_->RecordReceivedTrailingMetadata(
2931
+ status, self->recv_trailing_metadata_,
2932
+ *self->transport_stream_stats_);
2933
+ }
2934
+ // If the LB policy requested a callback for trailing metadata, invoke
2935
+ // the callback.
2936
+ if (self->lb_recv_trailing_metadata_ready_ != nullptr) {
2937
+ Metadata trailing_metadata(self, self->recv_trailing_metadata_);
2938
+ LbCallState lb_call_state(self);
2939
+ self->lb_recv_trailing_metadata_ready_(status, &trailing_metadata,
2940
+ &lb_call_state);
2941
+ }
2794
2942
  }
2795
2943
  // Chain to original callback.
2796
2944
  if (self->failure_error_ != GRPC_ERROR_NONE) {
@@ -2803,23 +2951,9 @@ void ClientChannel::LoadBalancedCall::
2803
2951
  error);
2804
2952
  }
2805
2953
 
2806
- void ClientChannel::LoadBalancedCall::
2807
- InjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
2808
- grpc_transport_stream_op_batch* batch) {
2809
- recv_trailing_metadata_ =
2810
- batch->payload->recv_trailing_metadata.recv_trailing_metadata;
2811
- original_recv_trailing_metadata_ready_ =
2812
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
2813
- GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
2814
- RecvTrailingMetadataReadyForLoadBalancingPolicy, this,
2815
- grpc_schedule_on_exec_ctx);
2816
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
2817
- &recv_trailing_metadata_ready_;
2818
- }
2819
-
2820
2954
  void ClientChannel::LoadBalancedCall::CreateSubchannelCall() {
2821
2955
  SubchannelCall::Args call_args = {
2822
- std::move(connected_subchannel_), pollent_, path_, call_start_time_,
2956
+ std::move(connected_subchannel_), pollent_, path_, /*start_time=*/0,
2823
2957
  deadline_, arena_,
2824
2958
  // TODO(roth): When we implement hedging support, we will probably
2825
2959
  // need to use a separate call context for each subchannel call.
@@ -2873,6 +3007,7 @@ class ClientChannel::LoadBalancedCall::LbQueuedCallCanceller {
2873
3007
  lb_call->lb_call_canceller_);
2874
3008
  }
2875
3009
  if (lb_call->lb_call_canceller_ == self && error != GRPC_ERROR_NONE) {
3010
+ lb_call->call_dispatch_controller_->Commit();
2876
3011
  // Remove pick from list of queued picks.
2877
3012
  lb_call->MaybeRemoveCallFromLbQueuedCallsLocked();
2878
3013
  // Fail pending batches on the call.
@@ -2914,6 +3049,7 @@ void ClientChannel::LoadBalancedCall::MaybeAddCallToLbQueuedCallsLocked() {
2914
3049
  }
2915
3050
 
2916
3051
  void ClientChannel::LoadBalancedCall::AsyncPickDone(grpc_error_handle error) {
3052
+ // TODO(roth): Does this callback need to hold a ref to LoadBalancedCall?
2917
3053
  GRPC_CLOSURE_INIT(&pick_closure_, PickDone, this, grpc_schedule_on_exec_ctx);
2918
3054
  ExecCtx::Run(DEBUG_LOCATION, &pick_closure_, error);
2919
3055
  }
@@ -2930,26 +3066,10 @@ void ClientChannel::LoadBalancedCall::PickDone(void* arg,
2930
3066
  self->PendingBatchesFail(GRPC_ERROR_REF(error), YieldCallCombiner);
2931
3067
  return;
2932
3068
  }
3069
+ self->call_dispatch_controller_->Commit();
2933
3070
  self->CreateSubchannelCall();
2934
3071
  }
2935
3072
 
2936
- namespace {
2937
-
2938
- const char* PickResultTypeName(
2939
- LoadBalancingPolicy::PickResult::ResultType type) {
2940
- switch (type) {
2941
- case LoadBalancingPolicy::PickResult::PICK_COMPLETE:
2942
- return "COMPLETE";
2943
- case LoadBalancingPolicy::PickResult::PICK_QUEUE:
2944
- return "QUEUE";
2945
- case LoadBalancingPolicy::PickResult::PICK_FAILED:
2946
- return "FAILED";
2947
- }
2948
- GPR_UNREACHABLE_CODE(return "UNKNOWN");
2949
- }
2950
-
2951
- } // namespace
2952
-
2953
3073
  void ClientChannel::LoadBalancedCall::PickSubchannel(void* arg,
2954
3074
  grpc_error_handle error) {
2955
3075
  auto* self = static_cast<LoadBalancedCall*>(arg);
@@ -2983,64 +3103,82 @@ bool ClientChannel::LoadBalancedCall::PickSubchannelLocked(
2983
3103
  Metadata initial_metadata(this, initial_metadata_batch);
2984
3104
  pick_args.initial_metadata = &initial_metadata;
2985
3105
  auto result = chand_->picker_->Pick(pick_args);
2986
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
2987
- gpr_log(
2988
- GPR_INFO,
2989
- "chand=%p lb_call=%p: LB pick returned %s (subchannel=%p, error=%s)",
2990
- chand_, this, PickResultTypeName(result.type), result.subchannel.get(),
2991
- grpc_error_std_string(result.error).c_str());
2992
- }
2993
- switch (result.type) {
2994
- case LoadBalancingPolicy::PickResult::PICK_FAILED: {
2995
- // If we're shutting down, fail all RPCs.
2996
- grpc_error_handle disconnect_error = chand_->disconnect_error();
2997
- if (disconnect_error != GRPC_ERROR_NONE) {
2998
- GRPC_ERROR_UNREF(result.error);
2999
- MaybeRemoveCallFromLbQueuedCallsLocked();
3000
- *error = GRPC_ERROR_REF(disconnect_error);
3001
- return true;
3002
- }
3003
- // If wait_for_ready is false, then the error indicates the RPC
3004
- // attempt's final status.
3005
- if ((send_initial_metadata_flags &
3006
- GRPC_INITIAL_METADATA_WAIT_FOR_READY) == 0) {
3007
- grpc_error_handle new_error =
3008
- GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
3009
- "Failed to pick subchannel", &result.error, 1);
3010
- GRPC_ERROR_UNREF(result.error);
3011
- *error = new_error;
3012
- MaybeRemoveCallFromLbQueuedCallsLocked();
3013
- return true;
3014
- }
3015
- // If wait_for_ready is true, then queue to retry when we get a new
3016
- // picker.
3017
- GRPC_ERROR_UNREF(result.error);
3018
- }
3019
- // Fallthrough
3020
- case LoadBalancingPolicy::PickResult::PICK_QUEUE:
3021
- MaybeAddCallToLbQueuedCallsLocked();
3022
- return false;
3023
- default: // PICK_COMPLETE
3024
- MaybeRemoveCallFromLbQueuedCallsLocked();
3025
- // Handle drops.
3026
- if (GPR_UNLIKELY(result.subchannel == nullptr)) {
3027
- result.error = grpc_error_set_int(
3028
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3029
- "Call dropped by load balancing policy"),
3030
- GRPC_ERROR_INT_GRPC_STATUS,
3031
- GRPC_STATUS_UNAVAILABLE),
3032
- GRPC_ERROR_INT_LB_POLICY_DROP, 1);
3033
- } else {
3034
- // Grab a ref to the connected subchannel while we're still
3035
- // holding the data plane mutex.
3036
- connected_subchannel_ =
3037
- chand_->GetConnectedSubchannelInDataPlane(result.subchannel.get());
3038
- GPR_ASSERT(connected_subchannel_ != nullptr);
3039
- }
3040
- lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
3041
- *error = result.error;
3042
- return true;
3043
- }
3106
+ return HandlePickResult<bool>(
3107
+ &result,
3108
+ // CompletePick
3109
+ [this](LoadBalancingPolicy::PickResult::Complete* complete_pick)
3110
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
3111
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3112
+ gpr_log(GPR_INFO,
3113
+ "chand=%p lb_call=%p: LB pick succeeded: subchannel=%p",
3114
+ chand_, this, complete_pick->subchannel.get());
3115
+ }
3116
+ GPR_ASSERT(complete_pick->subchannel != nullptr);
3117
+ // Grab a ref to the connected subchannel while we're still
3118
+ // holding the data plane mutex.
3119
+ connected_subchannel_ = chand_->GetConnectedSubchannelInDataPlane(
3120
+ complete_pick->subchannel.get());
3121
+ GPR_ASSERT(connected_subchannel_ != nullptr);
3122
+ lb_recv_trailing_metadata_ready_ =
3123
+ std::move(complete_pick->recv_trailing_metadata_ready);
3124
+ MaybeRemoveCallFromLbQueuedCallsLocked();
3125
+ return true;
3126
+ },
3127
+ // QueuePick
3128
+ [this](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/)
3129
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
3130
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3131
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick queued", chand_,
3132
+ this);
3133
+ }
3134
+ MaybeAddCallToLbQueuedCallsLocked();
3135
+ return false;
3136
+ },
3137
+ // FailPick
3138
+ [this, send_initial_metadata_flags,
3139
+ &error](LoadBalancingPolicy::PickResult::Fail* fail_pick)
3140
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
3141
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3142
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick failed: %s",
3143
+ chand_, this, fail_pick->status.ToString().c_str());
3144
+ }
3145
+ // If we're shutting down, fail all RPCs.
3146
+ grpc_error_handle disconnect_error = chand_->disconnect_error();
3147
+ if (disconnect_error != GRPC_ERROR_NONE) {
3148
+ MaybeRemoveCallFromLbQueuedCallsLocked();
3149
+ *error = GRPC_ERROR_REF(disconnect_error);
3150
+ return true;
3151
+ }
3152
+ // If wait_for_ready is false, then the error indicates the RPC
3153
+ // attempt's final status.
3154
+ if ((send_initial_metadata_flags &
3155
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY) == 0) {
3156
+ grpc_error_handle lb_error =
3157
+ absl_status_to_grpc_error(fail_pick->status);
3158
+ *error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
3159
+ "Failed to pick subchannel", &lb_error, 1);
3160
+ GRPC_ERROR_UNREF(lb_error);
3161
+ MaybeRemoveCallFromLbQueuedCallsLocked();
3162
+ return true;
3163
+ }
3164
+ // If wait_for_ready is true, then queue to retry when we get a new
3165
+ // picker.
3166
+ MaybeAddCallToLbQueuedCallsLocked();
3167
+ return false;
3168
+ },
3169
+ // DropPick
3170
+ [this, &error](LoadBalancingPolicy::PickResult::Drop* drop_pick)
3171
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
3172
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3173
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick dropped: %s",
3174
+ chand_, this, drop_pick->status.ToString().c_str());
3175
+ }
3176
+ *error =
3177
+ grpc_error_set_int(absl_status_to_grpc_error(drop_pick->status),
3178
+ GRPC_ERROR_INT_LB_POLICY_DROP, 1);
3179
+ MaybeRemoveCallFromLbQueuedCallsLocked();
3180
+ return true;
3181
+ });
3044
3182
  }
3045
3183
 
3046
3184
  } // namespace grpc_core