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
@@ -88,9 +88,7 @@
88
88
 
89
89
  // TODO(roth): In subsequent PRs:
90
90
  // - add support for transparent retries (including initial metadata)
91
- // - figure out how to record stats in census for retries
92
- // (census filter is on top of this one)
93
- // - add census stats for retries
91
+ // - implement hedging
94
92
 
95
93
  // By default, we buffer 256 KiB per RPC for retries.
96
94
  // TODO(roth): Do we have any data to suggest a better value?
@@ -216,6 +214,8 @@ class RetryFilter::CallData {
216
214
  explicit CallAttempt(CallData* calld);
217
215
  ~CallAttempt() override;
218
216
 
217
+ bool lb_call_committed() const { return lb_call_committed_; }
218
+
219
219
  // Constructs and starts whatever batches are needed on this call
220
220
  // attempt.
221
221
  void StartRetriableBatches();
@@ -255,7 +255,7 @@ class RetryFilter::CallData {
255
255
  // Adds retriable recv_trailing_metadata op.
256
256
  void AddRetriableRecvTrailingMetadataOp();
257
257
  // Adds cancel_stream op.
258
- void AddCancelStreamOp();
258
+ void AddCancelStreamOp(grpc_error_handle error);
259
259
 
260
260
  private:
261
261
  // Frees cached send ops that were completed by the completed batch in
@@ -263,21 +263,25 @@ class RetryFilter::CallData {
263
263
  // committed.
264
264
  void FreeCachedSendOpDataForCompletedBatch();
265
265
 
266
- // Invokes recv_initial_metadata_ready for a batch.
267
- static void InvokeRecvInitialMetadataCallback(void* arg,
268
- grpc_error_handle error);
266
+ // If there is a pending recv_initial_metadata op, adds a closure
267
+ // to closures for recv_initial_metadata_ready.
268
+ void MaybeAddClosureForRecvInitialMetadataCallback(
269
+ grpc_error_handle error, CallCombinerClosureList* closures);
269
270
  // Intercepts recv_initial_metadata_ready callback for retries.
270
271
  // Commits the call and returns the initial metadata up the stack.
271
272
  static void RecvInitialMetadataReady(void* arg, grpc_error_handle error);
272
273
 
273
- // Invokes recv_message_ready for a batch.
274
- static void InvokeRecvMessageCallback(void* arg, grpc_error_handle error);
274
+ // If there is a pending recv_message op, adds a closure to closures
275
+ // for recv_message_ready.
276
+ void MaybeAddClosureForRecvMessageCallback(
277
+ grpc_error_handle error, CallCombinerClosureList* closures);
275
278
  // Intercepts recv_message_ready callback for retries.
276
279
  // Commits the call and returns the message up the stack.
277
280
  static void RecvMessageReady(void* arg, grpc_error_handle error);
278
281
 
279
- // Adds recv_trailing_metadata_ready closure to closures.
280
- void AddClosureForRecvTrailingMetadataReady(
282
+ // If there is a pending recv_trailing_metadata op, adds a closure to
283
+ // closures for recv_trailing_metadata_ready.
284
+ void MaybeAddClosureForRecvTrailingMetadataReady(
281
285
  grpc_error_handle error, CallCombinerClosureList* closures);
282
286
  // Adds any necessary closures for deferred batch completion
283
287
  // callbacks to closures.
@@ -306,6 +310,10 @@ class RetryFilter::CallData {
306
310
  // Callback used to intercept on_complete from LB calls.
307
311
  static void OnComplete(void* arg, grpc_error_handle error);
308
312
 
313
+ // Callback used to handle on_complete for internally generated
314
+ // cancel_stream op.
315
+ static void OnCompleteForCancelOp(void* arg, grpc_error_handle error);
316
+
309
317
  RefCountedPtr<CallAttempt> call_attempt_;
310
318
  // The batch to use in the LB call.
311
319
  // Its payload field points to CallAttempt::batch_payload_.
@@ -314,6 +322,30 @@ class RetryFilter::CallData {
314
322
  grpc_closure on_complete_;
315
323
  };
316
324
 
325
+ class AttemptDispatchController
326
+ : public ConfigSelector::CallDispatchController {
327
+ public:
328
+ explicit AttemptDispatchController(CallAttempt* call_attempt)
329
+ : call_attempt_(call_attempt) {}
330
+
331
+ // Will never be called.
332
+ bool ShouldRetry() override { return false; }
333
+
334
+ void Commit() override {
335
+ call_attempt_->lb_call_committed_ = true;
336
+ auto* calld = call_attempt_->calld_;
337
+ if (calld->retry_committed_) {
338
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
339
+ calld->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA]
340
+ .value);
341
+ service_config_call_data->call_dispatch_controller()->Commit();
342
+ }
343
+ }
344
+
345
+ private:
346
+ CallAttempt* call_attempt_;
347
+ };
348
+
317
349
  // Creates a BatchData object on the call's arena with the
318
350
  // specified refcount. If set_on_complete is true, the batch's
319
351
  // on_complete callback will be set to point to on_complete();
@@ -333,14 +365,26 @@ class RetryFilter::CallData {
333
365
  const char* reason,
334
366
  CallCombinerClosureList* closures);
335
367
 
368
+ // Helper function used to start a recv_trailing_metadata batch. This
369
+ // is used in the case where a recv_initial_metadata or recv_message
370
+ // op fails in a way that we know the call is over but when the application
371
+ // has not yet started its own recv_trailing_metadata op.
372
+ void AddBatchForInternalRecvTrailingMetadata(
373
+ CallCombinerClosureList* closures);
374
+
375
+ // Adds a batch to closures to cancel this call attempt.
376
+ void AddBatchForCancelOp(grpc_error_handle error,
377
+ CallCombinerClosureList* closures);
378
+
336
379
  // Adds batches for pending batches to closures.
337
380
  void AddBatchesForPendingBatches(CallCombinerClosureList* closures);
338
381
 
339
382
  // Adds whatever batches are needed on this attempt to closures.
340
383
  void AddRetriableBatches(CallCombinerClosureList* closures);
341
384
 
342
- // Returns true if any op in the batch was not yet started on this attempt.
343
- bool PendingBatchIsUnstarted(PendingBatch* pending);
385
+ // Returns true if any send op in the batch was not yet started on this
386
+ // attempt.
387
+ bool PendingBatchContainsUnstartedSendOps(PendingBatch* pending);
344
388
 
345
389
  // Returns true if there are cached send ops to replay.
346
390
  bool HaveSendOpsToReplay();
@@ -350,28 +394,23 @@ class RetryFilter::CallData {
350
394
  // its ref to us.
351
395
  void MaybeSwitchToFastPath();
352
396
 
353
- // Helper function used to start a recv_trailing_metadata batch. This
354
- // is used in the case where a recv_initial_metadata or recv_message
355
- // op fails in a way that we know the call is over but when the application
356
- // has not yet started its own recv_trailing_metadata op.
357
- void StartInternalRecvTrailingMetadata();
358
-
359
397
  // Returns true if the call should be retried.
360
398
  // If server_pushback_md is non-null, sets *server_pushback_ms.
361
399
  bool ShouldRetry(absl::optional<grpc_status_code> status, bool is_lb_drop,
362
400
  grpc_mdelem* server_pushback_md,
363
401
  grpc_millis* server_pushback_ms);
364
402
 
365
- // Cancels the call attempt. Unrefs any deferred batches.
366
- // Adds a batch to closures to cancel this call attempt.
367
- void Cancel(CallCombinerClosureList* closures);
403
+ // Abandons the call attempt. Unrefs any deferred batches.
404
+ void Abandon();
368
405
 
369
406
  static void OnPerAttemptRecvTimer(void* arg, grpc_error_handle error);
370
407
  static void OnPerAttemptRecvTimerLocked(void* arg, grpc_error_handle error);
371
408
  void MaybeCancelPerAttemptRecvTimer();
372
409
 
373
410
  CallData* calld_;
374
- RefCountedPtr<ClientChannel::LoadBalancedCall> lb_call_;
411
+ AttemptDispatchController attempt_dispatch_controller_;
412
+ OrphanablePtr<ClientChannel::LoadBalancedCall> lb_call_;
413
+ bool lb_call_committed_ = false;
375
414
 
376
415
  grpc_timer per_attempt_recv_timer_;
377
416
  grpc_closure on_per_attempt_recv_timer_;
@@ -422,8 +461,16 @@ class RetryFilter::CallData {
422
461
  grpc_error_handle recv_initial_metadata_error_ = GRPC_ERROR_NONE;
423
462
  RefCountedPtr<BatchData> recv_message_ready_deferred_batch_;
424
463
  grpc_error_handle recv_message_error_ = GRPC_ERROR_NONE;
425
- RefCountedPtr<BatchData> on_complete_deferred_batch_;
426
- grpc_error_handle on_complete_error_ = GRPC_ERROR_NONE;
464
+ struct OnCompleteDeferredBatch {
465
+ OnCompleteDeferredBatch(RefCountedPtr<BatchData> batch,
466
+ grpc_error_handle error)
467
+ : batch(std::move(batch)), error(error) {}
468
+ RefCountedPtr<BatchData> batch;
469
+ grpc_error_handle error;
470
+ };
471
+ // There cannot be more than 3 pending send op batches at a time.
472
+ absl::InlinedVector<OnCompleteDeferredBatch, 3>
473
+ on_complete_deferred_batches_;
427
474
  RefCountedPtr<BatchData> recv_trailing_metadata_internal_batch_;
428
475
  grpc_error_handle recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
429
476
  bool seen_recv_trailing_metadata_from_surface_ : 1;
@@ -431,7 +478,7 @@ class RetryFilter::CallData {
431
478
  // save space but will also result in a data race because compiler
432
479
  // will generate a 2 byte store which overwrites the meta-data
433
480
  // fields upon setting this field.
434
- bool cancelled_ : 1;
481
+ bool abandoned_ : 1;
435
482
  };
436
483
 
437
484
  CallData(RetryFilter* chand, const grpc_call_element_args& args);
@@ -472,7 +519,8 @@ class RetryFilter::CallData {
472
519
  static void OnRetryTimer(void* arg, grpc_error_handle error);
473
520
  static void OnRetryTimerLocked(void* arg, grpc_error_handle error);
474
521
 
475
- RefCountedPtr<ClientChannel::LoadBalancedCall> CreateLoadBalancedCall();
522
+ OrphanablePtr<ClientChannel::LoadBalancedCall> CreateLoadBalancedCall(
523
+ ConfigSelector::CallDispatchController* call_dispatch_controller);
476
524
 
477
525
  void CreateCallAttempt();
478
526
 
@@ -483,13 +531,14 @@ class RetryFilter::CallData {
483
531
  BackOff retry_backoff_;
484
532
 
485
533
  grpc_slice path_; // Request path.
486
- gpr_cycle_counter call_start_time_;
487
534
  grpc_millis deadline_;
488
535
  Arena* arena_;
489
536
  grpc_call_stack* owning_call_;
490
537
  CallCombiner* call_combiner_;
491
538
  grpc_call_context_element* call_context_;
492
539
 
540
+ grpc_error_handle cancelled_from_surface_ = GRPC_ERROR_NONE;
541
+
493
542
  RefCountedPtr<CallStackDestructionBarrier> call_stack_destruction_barrier_;
494
543
 
495
544
  // TODO(roth): As part of implementing hedging, we will need to maintain a
@@ -500,7 +549,7 @@ class RetryFilter::CallData {
500
549
  // LB call used when we've committed to a call attempt and the retry
501
550
  // state for that attempt is no longer needed. This provides a fast
502
551
  // path for long-running streaming calls that minimizes overhead.
503
- RefCountedPtr<ClientChannel::LoadBalancedCall> committed_call_;
552
+ OrphanablePtr<ClientChannel::LoadBalancedCall> committed_call_;
504
553
 
505
554
  // When are are not yet fully committed to a particular call (i.e.,
506
555
  // either we might still retry or we have committed to the call but
@@ -614,6 +663,7 @@ RetryFilter::CallData::CallAttempt::CallAttempt(CallData* calld)
614
663
  : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace) ? "CallAttempt"
615
664
  : nullptr),
616
665
  calld_(calld),
666
+ attempt_dispatch_controller_(this),
617
667
  batch_payload_(calld->call_context_),
618
668
  started_send_initial_metadata_(false),
619
669
  completed_send_initial_metadata_(false),
@@ -624,8 +674,8 @@ RetryFilter::CallData::CallAttempt::CallAttempt(CallData* calld)
624
674
  started_recv_trailing_metadata_(false),
625
675
  completed_recv_trailing_metadata_(false),
626
676
  seen_recv_trailing_metadata_from_surface_(false),
627
- cancelled_(false) {
628
- lb_call_ = calld->CreateLoadBalancedCall();
677
+ abandoned_(false) {
678
+ lb_call_ = calld->CreateLoadBalancedCall(&attempt_dispatch_controller_);
629
679
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
630
680
  gpr_log(GPR_INFO, "chand=%p calld=%p attempt=%p: create lb_call=%p",
631
681
  calld->chand_, calld, this, lb_call_.get());
@@ -677,13 +727,9 @@ void RetryFilter::CallData::CallAttempt::FreeCachedSendOpDataAfterCommit() {
677
727
  }
678
728
  }
679
729
 
680
- bool RetryFilter::CallData::CallAttempt::PendingBatchIsUnstarted(
730
+ bool RetryFilter::CallData::CallAttempt::PendingBatchContainsUnstartedSendOps(
681
731
  PendingBatch* pending) {
682
- // Only look at batches containing send ops, since batches containing
683
- // only recv ops are always started immediately.
684
- if (pending->batch == nullptr || pending->batch->on_complete == nullptr) {
685
- return false;
686
- }
732
+ if (pending->batch->on_complete == nullptr) return false;
687
733
  if (pending->batch->send_initial_metadata &&
688
734
  !started_send_initial_metadata_) {
689
735
  return true;
@@ -712,8 +758,8 @@ void RetryFilter::CallData::CallAttempt::MaybeSwitchToFastPath() {
712
758
  // If we're not yet committed, we can't switch yet.
713
759
  // TODO(roth): As part of implementing hedging, this logic needs to
714
760
  // check that *this* call attempt is the one that we've committed to.
715
- // Might need to replace cancelled_ with an enum indicating whether we're
716
- // in flight, cancelled, or the winning call attempt.
761
+ // Might need to replace abandoned_ with an enum indicating whether we're
762
+ // in flight, abandoned, or the winning call attempt.
717
763
  if (!calld_->retry_committed_) return;
718
764
  // If we've already switched to fast path, there's nothing to do here.
719
765
  if (calld_->committed_call_ != nullptr) return;
@@ -735,24 +781,6 @@ void RetryFilter::CallData::CallAttempt::MaybeSwitchToFastPath() {
735
781
  calld_->call_attempt_.reset(DEBUG_LOCATION, "MaybeSwitchToFastPath");
736
782
  }
737
783
 
738
- void RetryFilter::CallData::CallAttempt::StartInternalRecvTrailingMetadata() {
739
- if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
740
- gpr_log(GPR_INFO,
741
- "chand=%p calld=%p attempt=%p: call failed but "
742
- "recv_trailing_metadata not started; starting it internally",
743
- calld_->chand_, calld_, this);
744
- }
745
- // Create batch_data with 2 refs, since this batch will be unreffed twice:
746
- // once for the recv_trailing_metadata_ready callback when the batch
747
- // completes, and again when we actually get a recv_trailing_metadata
748
- // op from the surface.
749
- BatchData* batch_data = CreateBatch(2, false /* set_on_complete */);
750
- batch_data->AddRetriableRecvTrailingMetadataOp();
751
- recv_trailing_metadata_internal_batch_.reset(batch_data);
752
- // Note: This will release the call combiner.
753
- lb_call_->StartTransportStreamOpBatch(batch_data->batch());
754
- }
755
-
756
784
  // If there are any cached send ops that need to be replayed on the
757
785
  // current call attempt, creates and returns a new batch to replay those ops.
758
786
  // Otherwise, returns nullptr.
@@ -836,12 +864,40 @@ void RetryFilter::CallData::CallAttempt::AddClosureForBatch(
836
864
  closures->Add(&batch->handler_private.closure, GRPC_ERROR_NONE, reason);
837
865
  }
838
866
 
867
+ void RetryFilter::CallData::CallAttempt::
868
+ AddBatchForInternalRecvTrailingMetadata(CallCombinerClosureList* closures) {
869
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
870
+ gpr_log(GPR_INFO,
871
+ "chand=%p calld=%p attempt=%p: call failed but "
872
+ "recv_trailing_metadata not started; starting it internally",
873
+ calld_->chand_, calld_, this);
874
+ }
875
+ // Create batch_data with 2 refs, since this batch will be unreffed twice:
876
+ // once for the recv_trailing_metadata_ready callback when the batch
877
+ // completes, and again when we actually get a recv_trailing_metadata
878
+ // op from the surface.
879
+ BatchData* batch_data = CreateBatch(2, false /* set_on_complete */);
880
+ batch_data->AddRetriableRecvTrailingMetadataOp();
881
+ recv_trailing_metadata_internal_batch_.reset(batch_data);
882
+ AddClosureForBatch(batch_data->batch(),
883
+ "starting internal recv_trailing_metadata", closures);
884
+ }
885
+
886
+ void RetryFilter::CallData::CallAttempt::AddBatchForCancelOp(
887
+ grpc_error_handle error, CallCombinerClosureList* closures) {
888
+ BatchData* cancel_batch_data = CreateBatch(1, /*set_on_complete=*/true);
889
+ cancel_batch_data->AddCancelStreamOp(error);
890
+ AddClosureForBatch(cancel_batch_data->batch(),
891
+ "start cancellation batch on call attempt", closures);
892
+ }
893
+
839
894
  void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
840
895
  CallCombinerClosureList* closures) {
841
896
  for (size_t i = 0; i < GPR_ARRAY_SIZE(calld_->pending_batches_); ++i) {
842
897
  PendingBatch* pending = &calld_->pending_batches_[i];
843
898
  grpc_transport_stream_op_batch* batch = pending->batch;
844
899
  if (batch == nullptr) continue;
900
+ bool has_send_ops = false;
845
901
  // Skip any batch that either (a) has already been started on this
846
902
  // call attempt or (b) we can't start yet because we're still
847
903
  // replaying send ops that need to be completed first.
@@ -852,60 +908,84 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
852
908
  // starting a recv op due to it being in the same batch with a send
853
909
  // op. If/when we revamp the callback protocol in
854
910
  // transport_stream_op_batch, we may be able to fix this.
855
- if (batch->send_initial_metadata && started_send_initial_metadata_) {
856
- continue;
911
+ if (batch->send_initial_metadata) {
912
+ if (started_send_initial_metadata_) continue;
913
+ has_send_ops = true;
857
914
  }
858
- if (batch->send_message &&
859
- completed_send_message_count_ < started_send_message_count_) {
860
- continue;
915
+ if (batch->send_message) {
916
+ if (completed_send_message_count_ < started_send_message_count_) {
917
+ continue;
918
+ }
919
+ has_send_ops = true;
861
920
  }
862
921
  // Note that we only start send_trailing_metadata if we have no more
863
922
  // send_message ops to start, since we can't send down any more
864
923
  // send_message ops after send_trailing_metadata.
865
- if (batch->send_trailing_metadata &&
866
- (started_send_message_count_ + batch->send_message <
867
- calld_->send_messages_.size() ||
868
- started_send_trailing_metadata_)) {
869
- continue;
924
+ if (batch->send_trailing_metadata) {
925
+ if (started_send_message_count_ + batch->send_message <
926
+ calld_->send_messages_.size() ||
927
+ started_send_trailing_metadata_) {
928
+ continue;
929
+ }
930
+ has_send_ops = true;
870
931
  }
871
- if (batch->recv_initial_metadata && started_recv_initial_metadata_) {
872
- continue;
932
+ int num_callbacks = has_send_ops; // All send ops share one callback.
933
+ if (batch->recv_initial_metadata) {
934
+ if (started_recv_initial_metadata_) continue;
935
+ ++num_callbacks;
873
936
  }
874
- if (batch->recv_message &&
875
- completed_recv_message_count_ < started_recv_message_count_) {
876
- continue;
937
+ if (batch->recv_message) {
938
+ if (completed_recv_message_count_ < started_recv_message_count_) {
939
+ continue;
940
+ }
941
+ ++num_callbacks;
877
942
  }
878
- if (batch->recv_trailing_metadata && started_recv_trailing_metadata_) {
879
- seen_recv_trailing_metadata_from_surface_ = true;
880
- // If we previously completed a recv_trailing_metadata op
881
- // initiated by StartInternalRecvTrailingMetadata(), use the
882
- // result of that instead of trying to re-start this op.
883
- if (GPR_UNLIKELY(recv_trailing_metadata_internal_batch_ != nullptr)) {
884
- // If the batch completed, then trigger the completion callback
885
- // directly, so that we return the previously returned results to
886
- // the application. Otherwise, just unref the internally started
887
- // batch, since we'll propagate the completion when it completes.
888
- if (completed_recv_trailing_metadata_) {
889
- closures->Add(
890
- &recv_trailing_metadata_ready_, recv_trailing_metadata_error_,
891
- "re-executing recv_trailing_metadata_ready to propagate "
892
- "internally triggered result");
893
- // Ref will be released by callback.
894
- recv_trailing_metadata_internal_batch_.release();
895
- } else {
896
- recv_trailing_metadata_internal_batch_.reset(
897
- DEBUG_LOCATION,
898
- "internally started recv_trailing_metadata batch pending and "
899
- "recv_trailing_metadata started from surface");
900
- GRPC_ERROR_UNREF(recv_trailing_metadata_error_);
943
+ if (batch->recv_trailing_metadata) {
944
+ if (started_recv_trailing_metadata_) {
945
+ seen_recv_trailing_metadata_from_surface_ = true;
946
+ // If we previously completed a recv_trailing_metadata op
947
+ // initiated by AddBatchForInternalRecvTrailingMetadata(), use the
948
+ // result of that instead of trying to re-start this op.
949
+ if (GPR_UNLIKELY(recv_trailing_metadata_internal_batch_ != nullptr)) {
950
+ // If the batch completed, then trigger the completion callback
951
+ // directly, so that we return the previously returned results to
952
+ // the application. Otherwise, just unref the internally started
953
+ // batch, since we'll propagate the completion when it completes.
954
+ if (completed_recv_trailing_metadata_) {
955
+ closures->Add(
956
+ &recv_trailing_metadata_ready_, recv_trailing_metadata_error_,
957
+ "re-executing recv_trailing_metadata_ready to propagate "
958
+ "internally triggered result");
959
+ // Ref will be released by callback.
960
+ recv_trailing_metadata_internal_batch_.release();
961
+ } else {
962
+ recv_trailing_metadata_internal_batch_.reset(
963
+ DEBUG_LOCATION,
964
+ "internally started recv_trailing_metadata batch pending and "
965
+ "recv_trailing_metadata started from surface");
966
+ GRPC_ERROR_UNREF(recv_trailing_metadata_error_);
967
+ }
968
+ recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
901
969
  }
902
- recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
970
+ // We don't want the fact that we've already started this op internally
971
+ // to prevent us from adding a batch that may contain other ops.
972
+ // Instead, we'll just skip adding this op below.
973
+ if (num_callbacks == 0) continue;
974
+ } else {
975
+ ++num_callbacks;
903
976
  }
904
- continue;
905
977
  }
906
- // If we're already committed and these send ops aren't cached, just send
907
- // the batch as-is.
908
- if (calld_->retry_committed_ && !pending->send_ops_cached) {
978
+ // If we're already committed and the following conditions are met,
979
+ // just send the batch down as-is:
980
+ // - The batch contains no cached send ops. (If it does, we need
981
+ // the logic below to use the cached payloads.)
982
+ // - The batch does not contain recv_trailing_metadata when we have
983
+ // already started an internal recv_trailing_metadata batch. (If
984
+ // we've already started an internal recv_trailing_metadata batch,
985
+ // then we need the logic below to send all ops in the batch
986
+ // *except* the recv_trailing_metadata op.)
987
+ if (calld_->retry_committed_ && !pending->send_ops_cached &&
988
+ (!batch->recv_trailing_metadata || !started_recv_trailing_metadata_)) {
909
989
  AddClosureForBatch(
910
990
  batch,
911
991
  "start non-replayable pending batch on call attempt after commit",
@@ -914,12 +994,6 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
914
994
  continue;
915
995
  }
916
996
  // Create batch with the right number of callbacks.
917
- const bool has_send_ops = batch->send_initial_metadata ||
918
- batch->send_message ||
919
- batch->send_trailing_metadata;
920
- const int num_callbacks = has_send_ops + batch->recv_initial_metadata +
921
- batch->recv_message +
922
- batch->recv_trailing_metadata;
923
997
  BatchData* batch_data =
924
998
  CreateBatch(num_callbacks, has_send_ops /* set_on_complete */);
925
999
  // Cache send ops if needed.
@@ -947,7 +1021,7 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
947
1021
  batch_data->AddRetriableRecvMessageOp();
948
1022
  }
949
1023
  // recv_trailing_metadata.
950
- if (batch->recv_trailing_metadata) {
1024
+ if (batch->recv_trailing_metadata && !started_recv_trailing_metadata_) {
951
1025
  batch_data->AddRetriableRecvTrailingMetadataOp();
952
1026
  }
953
1027
  AddClosureForBatch(batch_data->batch(),
@@ -1084,14 +1158,24 @@ bool RetryFilter::CallData::CallAttempt::ShouldRetry(
1084
1158
  *server_pushback_ms = static_cast<grpc_millis>(ms);
1085
1159
  }
1086
1160
  }
1161
+ // Check with call dispatch controller.
1162
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
1163
+ calld_->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
1164
+ if (!service_config_call_data->call_dispatch_controller()->ShouldRetry()) {
1165
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1166
+ gpr_log(
1167
+ GPR_INFO,
1168
+ "chand=%p calld=%p attempt=%p: call dispatch controller denied retry",
1169
+ calld_->chand_, calld_, this);
1170
+ }
1171
+ return false;
1172
+ }
1087
1173
  // We should retry.
1088
1174
  return true;
1089
1175
  }
1090
1176
 
1091
- void RetryFilter::CallData::CallAttempt::Cancel(
1092
- CallCombinerClosureList* closures) {
1093
- // Record that this attempt has been cancelled.
1094
- cancelled_ = true;
1177
+ void RetryFilter::CallData::CallAttempt::Abandon() {
1178
+ abandoned_ = true;
1095
1179
  // Unref batches for deferred completion callbacks that will now never
1096
1180
  // be invoked.
1097
1181
  if (started_recv_trailing_metadata_ &&
@@ -1112,17 +1196,12 @@ void RetryFilter::CallData::CallAttempt::Cancel(
1112
1196
  DEBUG_LOCATION, "unref deferred recv_message_ready batch due to retry");
1113
1197
  GRPC_ERROR_UNREF(recv_message_error_);
1114
1198
  recv_message_error_ = GRPC_ERROR_NONE;
1115
- on_complete_deferred_batch_.reset(
1116
- DEBUG_LOCATION, "unref deferred on_complete batch due to retry");
1117
- GRPC_ERROR_UNREF(on_complete_error_);
1118
- on_complete_error_ = GRPC_ERROR_NONE;
1119
- // Start a cancellation op on this call attempt to make sure the
1120
- // transport knows that this call should be cleaned up, even if it
1121
- // hasn't received any ops.
1122
- BatchData* cancel_batch_data = CreateBatch(1, /*set_on_complete=*/true);
1123
- cancel_batch_data->AddCancelStreamOp();
1124
- AddClosureForBatch(cancel_batch_data->batch(),
1125
- "start cancellation batch on call attempt", closures);
1199
+ for (auto& on_complete_deferred_batch : on_complete_deferred_batches_) {
1200
+ on_complete_deferred_batch.batch.reset(
1201
+ DEBUG_LOCATION, "unref deferred on_complete batch due to retry");
1202
+ GRPC_ERROR_UNREF(on_complete_deferred_batch.error);
1203
+ }
1204
+ on_complete_deferred_batches_.clear();
1126
1205
  }
1127
1206
 
1128
1207
  void RetryFilter::CallData::CallAttempt::OnPerAttemptRecvTimer(
@@ -1154,11 +1233,17 @@ void RetryFilter::CallData::CallAttempt::OnPerAttemptRecvTimerLocked(
1154
1233
  // Cancel this attempt.
1155
1234
  // TODO(roth): When implementing hedging, we should not cancel the
1156
1235
  // current attempt.
1157
- call_attempt->Cancel(&closures);
1236
+ call_attempt->AddBatchForCancelOp(
1237
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1238
+ "retry perAttemptRecvTimeout exceeded"),
1239
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED),
1240
+ &closures);
1158
1241
  // Check whether we should retry.
1159
1242
  if (call_attempt->ShouldRetry(
1160
1243
  /*status=*/absl::nullopt, /*is_lb_drop=*/false,
1161
1244
  /*server_pushback_md=*/nullptr, /*server_pushback_ms=*/nullptr)) {
1245
+ // Mark current attempt as abandoned.
1246
+ call_attempt->Abandon();
1162
1247
  // We are retrying. Start backoff timer.
1163
1248
  calld->StartRetryTimer(/*server_pushback_ms=*/-1);
1164
1249
  } else {
@@ -1212,8 +1297,7 @@ RetryFilter::CallData::CallAttempt::BatchData::BatchData(
1212
1297
  GRPC_CALL_STACK_REF(call_attempt_->calld_->owning_call_, "Retry BatchData");
1213
1298
  batch_.payload = &call_attempt_->batch_payload_;
1214
1299
  if (set_on_complete) {
1215
- GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this,
1216
- grpc_schedule_on_exec_ctx);
1300
+ GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this, nullptr);
1217
1301
  batch_.on_complete = &on_complete_;
1218
1302
  }
1219
1303
  }
@@ -1264,22 +1348,27 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1264
1348
  //
1265
1349
 
1266
1350
  void RetryFilter::CallData::CallAttempt::BatchData::
1267
- InvokeRecvInitialMetadataCallback(void* arg, grpc_error_handle error) {
1268
- auto* batch_data = static_cast<BatchData*>(arg);
1269
- auto* call_attempt = batch_data->call_attempt_.get();
1351
+ MaybeAddClosureForRecvInitialMetadataCallback(
1352
+ grpc_error_handle error, CallCombinerClosureList* closures) {
1270
1353
  // Find pending batch.
1271
- PendingBatch* pending = call_attempt->calld_->PendingBatchFind(
1354
+ PendingBatch* pending = call_attempt_->calld_->PendingBatchFind(
1272
1355
  "invoking recv_initial_metadata_ready for",
1273
1356
  [](grpc_transport_stream_op_batch* batch) {
1274
1357
  return batch->recv_initial_metadata &&
1275
1358
  batch->payload->recv_initial_metadata
1276
1359
  .recv_initial_metadata_ready != nullptr;
1277
1360
  });
1278
- GPR_ASSERT(pending != nullptr);
1361
+ if (pending == nullptr) {
1362
+ GRPC_ERROR_UNREF(error);
1363
+ return;
1364
+ }
1279
1365
  // Return metadata.
1280
1366
  grpc_metadata_batch_move(
1281
- &call_attempt->recv_initial_metadata_,
1367
+ &call_attempt_->recv_initial_metadata_,
1282
1368
  pending->batch->payload->recv_initial_metadata.recv_initial_metadata);
1369
+ // Propagate trailing_metadata_available.
1370
+ *pending->batch->payload->recv_initial_metadata.trailing_metadata_available =
1371
+ call_attempt_->trailing_metadata_available_;
1283
1372
  // Update bookkeeping.
1284
1373
  // Note: Need to do this before invoking the callback, since invoking
1285
1374
  // the callback will result in yielding the call combiner.
@@ -1288,11 +1377,10 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1288
1377
  .recv_initial_metadata_ready;
1289
1378
  pending->batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
1290
1379
  nullptr;
1291
- call_attempt->calld_->MaybeClearPendingBatch(pending);
1292
- batch_data->Unref();
1293
- // Invoke callback.
1294
- Closure::Run(DEBUG_LOCATION, recv_initial_metadata_ready,
1295
- GRPC_ERROR_REF(error));
1380
+ call_attempt_->calld_->MaybeClearPendingBatch(pending);
1381
+ // Add callback to closures.
1382
+ closures->Add(recv_initial_metadata_ready, error,
1383
+ "recv_initial_metadata_ready for pending batch");
1296
1384
  }
1297
1385
 
1298
1386
  void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
@@ -1302,17 +1390,18 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
1302
1390
  CallData* calld = call_attempt->calld_;
1303
1391
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1304
1392
  gpr_log(GPR_INFO,
1305
- "chand=%p calld=%p attempt=%p: got recv_initial_metadata_ready, "
1306
- "error=%s",
1307
- calld->chand_, calld, call_attempt,
1393
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
1394
+ "got recv_initial_metadata_ready, error=%s",
1395
+ calld->chand_, calld, call_attempt, batch_data.get(),
1308
1396
  grpc_error_std_string(error).c_str());
1309
1397
  }
1310
1398
  call_attempt->completed_recv_initial_metadata_ = true;
1311
- // If this attempt has been cancelled, then we're not going to use the
1399
+ // If this attempt has been abandoned, then we're not going to use the
1312
1400
  // result of this recv_initial_metadata op, so do nothing.
1313
- if (call_attempt->cancelled_) {
1314
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1315
- "recv_initial_metadata_ready after cancellation");
1401
+ if (call_attempt->abandoned_) {
1402
+ GRPC_CALL_COMBINER_STOP(
1403
+ calld->call_combiner_,
1404
+ "recv_initial_metadata_ready for abandoned attempt");
1316
1405
  return;
1317
1406
  }
1318
1407
  // Cancel per-attempt recv timer, if any.
@@ -1335,15 +1424,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
1335
1424
  call_attempt->recv_initial_metadata_ready_deferred_batch_ =
1336
1425
  std::move(batch_data);
1337
1426
  call_attempt->recv_initial_metadata_error_ = GRPC_ERROR_REF(error);
1427
+ CallCombinerClosureList closures;
1428
+ if (error != GRPC_ERROR_NONE) {
1429
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
1430
+ }
1338
1431
  if (!call_attempt->started_recv_trailing_metadata_) {
1339
1432
  // recv_trailing_metadata not yet started by application; start it
1340
1433
  // ourselves to get status.
1341
- call_attempt->StartInternalRecvTrailingMetadata();
1342
- } else {
1343
- GRPC_CALL_COMBINER_STOP(
1344
- calld->call_combiner_,
1345
- "recv_initial_metadata_ready trailers-only or error");
1434
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
1346
1435
  }
1436
+ closures.RunClosures(calld->call_combiner_);
1347
1437
  return;
1348
1438
  }
1349
1439
  // Received valid initial metadata, so commit the call.
@@ -1353,40 +1443,43 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
1353
1443
  call_attempt->MaybeSwitchToFastPath();
1354
1444
  }
1355
1445
  // Invoke the callback to return the result to the surface.
1356
- // Manually invoking a callback function; it does not take ownership of error.
1357
- InvokeRecvInitialMetadataCallback(batch_data.release(), error);
1446
+ CallCombinerClosureList closures;
1447
+ batch_data->MaybeAddClosureForRecvInitialMetadataCallback(
1448
+ GRPC_ERROR_REF(error), &closures);
1449
+ closures.RunClosures(calld->call_combiner_);
1358
1450
  }
1359
1451
 
1360
1452
  //
1361
1453
  // recv_message callback handling
1362
1454
  //
1363
1455
 
1364
- void RetryFilter::CallData::CallAttempt::BatchData::InvokeRecvMessageCallback(
1365
- void* arg, grpc_error_handle error) {
1366
- auto* batch_data = static_cast<BatchData*>(arg);
1367
- CallAttempt* call_attempt = batch_data->call_attempt_.get();
1368
- CallData* calld = call_attempt->calld_;
1456
+ void RetryFilter::CallData::CallAttempt::BatchData::
1457
+ MaybeAddClosureForRecvMessageCallback(grpc_error_handle error,
1458
+ CallCombinerClosureList* closures) {
1369
1459
  // Find pending op.
1370
- PendingBatch* pending = calld->PendingBatchFind(
1460
+ PendingBatch* pending = call_attempt_->calld_->PendingBatchFind(
1371
1461
  "invoking recv_message_ready for",
1372
1462
  [](grpc_transport_stream_op_batch* batch) {
1373
1463
  return batch->recv_message &&
1374
1464
  batch->payload->recv_message.recv_message_ready != nullptr;
1375
1465
  });
1376
- GPR_ASSERT(pending != nullptr);
1466
+ if (pending == nullptr) {
1467
+ GRPC_ERROR_UNREF(error);
1468
+ return;
1469
+ }
1377
1470
  // Return payload.
1378
1471
  *pending->batch->payload->recv_message.recv_message =
1379
- std::move(call_attempt->recv_message_);
1472
+ std::move(call_attempt_->recv_message_);
1380
1473
  // Update bookkeeping.
1381
1474
  // Note: Need to do this before invoking the callback, since invoking
1382
1475
  // the callback will result in yielding the call combiner.
1383
1476
  grpc_closure* recv_message_ready =
1384
1477
  pending->batch->payload->recv_message.recv_message_ready;
1385
1478
  pending->batch->payload->recv_message.recv_message_ready = nullptr;
1386
- calld->MaybeClearPendingBatch(pending);
1387
- batch_data->Unref();
1388
- // Invoke callback.
1389
- Closure::Run(DEBUG_LOCATION, recv_message_ready, GRPC_ERROR_REF(error));
1479
+ call_attempt_->calld_->MaybeClearPendingBatch(pending);
1480
+ // Add callback to closures.
1481
+ closures->Add(recv_message_ready, error,
1482
+ "recv_message_ready for pending batch");
1390
1483
  }
1391
1484
 
1392
1485
  void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
@@ -1396,16 +1489,17 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
1396
1489
  CallData* calld = call_attempt->calld_;
1397
1490
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1398
1491
  gpr_log(GPR_INFO,
1399
- "chand=%p calld=%p attempt=%p: got recv_message_ready, error=%s",
1400
- calld->chand_, calld, call_attempt,
1492
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
1493
+ "got recv_message_ready, error=%s",
1494
+ calld->chand_, calld, call_attempt, batch_data.get(),
1401
1495
  grpc_error_std_string(error).c_str());
1402
1496
  }
1403
1497
  ++call_attempt->completed_recv_message_count_;
1404
- // If this attempt has been cancelled, then we're not going to use the
1498
+ // If this attempt has been abandoned, then we're not going to use the
1405
1499
  // result of this recv_message op, so do nothing.
1406
- if (call_attempt->cancelled_) {
1500
+ if (call_attempt->abandoned_) {
1407
1501
  GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1408
- "recv_message_ready after cancellation");
1502
+ "recv_message_ready for abandoned attempt");
1409
1503
  return;
1410
1504
  }
1411
1505
  // Cancel per-attempt recv timer, if any.
@@ -1427,14 +1521,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
1427
1521
  }
1428
1522
  call_attempt->recv_message_ready_deferred_batch_ = std::move(batch_data);
1429
1523
  call_attempt->recv_message_error_ = GRPC_ERROR_REF(error);
1524
+ CallCombinerClosureList closures;
1525
+ if (error != GRPC_ERROR_NONE) {
1526
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
1527
+ }
1430
1528
  if (!call_attempt->started_recv_trailing_metadata_) {
1431
1529
  // recv_trailing_metadata not yet started by application; start it
1432
1530
  // ourselves to get status.
1433
- call_attempt->StartInternalRecvTrailingMetadata();
1434
- } else {
1435
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1436
- "recv_message_ready null");
1531
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
1437
1532
  }
1533
+ closures.RunClosures(calld->call_combiner_);
1438
1534
  return;
1439
1535
  }
1440
1536
  // Received a valid message, so commit the call.
@@ -1444,8 +1540,10 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
1444
1540
  call_attempt->MaybeSwitchToFastPath();
1445
1541
  }
1446
1542
  // Invoke the callback to return the result to the surface.
1447
- // Manually invoking a callback function; it does not take ownership of error.
1448
- InvokeRecvMessageCallback(batch_data.release(), error);
1543
+ CallCombinerClosureList closures;
1544
+ batch_data->MaybeAddClosureForRecvMessageCallback(GRPC_ERROR_REF(error),
1545
+ &closures);
1546
+ closures.RunClosures(calld->call_combiner_);
1449
1547
  }
1450
1548
 
1451
1549
  //
@@ -1480,23 +1578,28 @@ void GetCallStatus(grpc_millis deadline, grpc_metadata_batch* md_batch,
1480
1578
  } // namespace
1481
1579
 
1482
1580
  void RetryFilter::CallData::CallAttempt::BatchData::
1483
- AddClosureForRecvTrailingMetadataReady(grpc_error_handle error,
1484
- CallCombinerClosureList* closures) {
1581
+ MaybeAddClosureForRecvTrailingMetadataReady(
1582
+ grpc_error_handle error, CallCombinerClosureList* closures) {
1485
1583
  auto* calld = call_attempt_->calld_;
1486
1584
  // Find pending batch.
1487
1585
  PendingBatch* pending = calld->PendingBatchFind(
1488
- "invoking recv_trailing_metadata for",
1586
+ "invoking recv_trailing_metadata_ready for",
1489
1587
  [](grpc_transport_stream_op_batch* batch) {
1490
1588
  return batch->recv_trailing_metadata &&
1491
1589
  batch->payload->recv_trailing_metadata
1492
1590
  .recv_trailing_metadata_ready != nullptr;
1493
1591
  });
1494
1592
  // If we generated the recv_trailing_metadata op internally via
1495
- // StartInternalRecvTrailingMetadata(), then there will be no pending batch.
1593
+ // AddBatchForInternalRecvTrailingMetadata(), then there will be no
1594
+ // pending batch.
1496
1595
  if (pending == nullptr) {
1497
1596
  call_attempt_->recv_trailing_metadata_error_ = error;
1498
1597
  return;
1499
1598
  }
1599
+ // Copy transport stats to be delivered up to the surface.
1600
+ grpc_transport_move_stats(
1601
+ &call_attempt_->collect_stats_,
1602
+ pending->batch->payload->recv_trailing_metadata.collect_stats);
1500
1603
  // Return metadata.
1501
1604
  grpc_metadata_batch_move(
1502
1605
  &call_attempt_->recv_trailing_metadata_,
@@ -1514,38 +1617,32 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1514
1617
  void RetryFilter::CallData::CallAttempt::BatchData::
1515
1618
  AddClosuresForDeferredCompletionCallbacks(
1516
1619
  CallCombinerClosureList* closures) {
1517
- if (batch_.recv_trailing_metadata) {
1518
- // Add closure for deferred recv_initial_metadata_ready.
1519
- if (GPR_UNLIKELY(
1520
- call_attempt_->recv_initial_metadata_ready_deferred_batch_ !=
1521
- nullptr)) {
1522
- GRPC_CLOSURE_INIT(
1523
- &call_attempt_->recv_initial_metadata_ready_,
1524
- InvokeRecvInitialMetadataCallback,
1525
- call_attempt_->recv_initial_metadata_ready_deferred_batch_.release(),
1526
- grpc_schedule_on_exec_ctx);
1527
- closures->Add(&call_attempt_->recv_initial_metadata_ready_,
1528
- call_attempt_->recv_initial_metadata_error_,
1529
- "resuming recv_initial_metadata_ready");
1530
- }
1531
- // Add closure for deferred recv_message_ready.
1532
- if (GPR_UNLIKELY(call_attempt_->recv_message_ready_deferred_batch_ !=
1533
- nullptr)) {
1534
- GRPC_CLOSURE_INIT(
1535
- &call_attempt_->recv_message_ready_, InvokeRecvMessageCallback,
1536
- call_attempt_->recv_message_ready_deferred_batch_.release(),
1537
- grpc_schedule_on_exec_ctx);
1538
- closures->Add(&call_attempt_->recv_message_ready_,
1539
- call_attempt_->recv_message_error_,
1540
- "resuming recv_message_ready");
1541
- }
1542
- // Add closure for deferred on_complete.
1543
- if (GPR_UNLIKELY(call_attempt_->on_complete_deferred_batch_ != nullptr)) {
1544
- closures->Add(&call_attempt_->on_complete_deferred_batch_->on_complete_,
1545
- call_attempt_->on_complete_error_, "resuming on_complete");
1546
- call_attempt_->on_complete_deferred_batch_.release();
1547
- }
1548
- }
1620
+ // Add closure for deferred recv_initial_metadata_ready.
1621
+ if (GPR_UNLIKELY(call_attempt_->recv_initial_metadata_ready_deferred_batch_ !=
1622
+ nullptr)) {
1623
+ MaybeAddClosureForRecvInitialMetadataCallback(
1624
+ call_attempt_->recv_initial_metadata_error_, closures);
1625
+ call_attempt_->recv_initial_metadata_ready_deferred_batch_.reset(
1626
+ DEBUG_LOCATION, "resuming deferred recv_initial_metadata_ready");
1627
+ call_attempt_->recv_initial_metadata_error_ = GRPC_ERROR_NONE;
1628
+ }
1629
+ // Add closure for deferred recv_message_ready.
1630
+ if (GPR_UNLIKELY(call_attempt_->recv_message_ready_deferred_batch_ !=
1631
+ nullptr)) {
1632
+ MaybeAddClosureForRecvMessageCallback(call_attempt_->recv_message_error_,
1633
+ closures);
1634
+ call_attempt_->recv_message_ready_deferred_batch_.reset(
1635
+ DEBUG_LOCATION, "resuming deferred recv_message_ready");
1636
+ call_attempt_->recv_message_error_ = GRPC_ERROR_NONE;
1637
+ }
1638
+ // Add closures for deferred on_complete callbacks.
1639
+ for (auto& on_complete_deferred_batch :
1640
+ call_attempt_->on_complete_deferred_batches_) {
1641
+ closures->Add(&on_complete_deferred_batch.batch->on_complete_,
1642
+ on_complete_deferred_batch.error, "resuming on_complete");
1643
+ on_complete_deferred_batch.batch.release();
1644
+ }
1645
+ call_attempt_->on_complete_deferred_batches_.clear();
1549
1646
  }
1550
1647
 
1551
1648
  void RetryFilter::CallData::CallAttempt::BatchData::
@@ -1554,13 +1651,8 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1554
1651
  auto* calld = call_attempt_->calld_;
1555
1652
  for (size_t i = 0; i < GPR_ARRAY_SIZE(calld->pending_batches_); ++i) {
1556
1653
  PendingBatch* pending = &calld->pending_batches_[i];
1557
- if (call_attempt_->PendingBatchIsUnstarted(pending)) {
1558
- if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1559
- gpr_log(GPR_INFO,
1560
- "chand=%p calld=%p attempt=%p: failing unstarted pending "
1561
- "batch at index %" PRIuPTR,
1562
- calld->chand_, calld, call_attempt_.get(), i);
1563
- }
1654
+ if (pending->batch == nullptr) continue;
1655
+ if (call_attempt_->PendingBatchContainsUnstartedSendOps(pending)) {
1564
1656
  closures->Add(pending->batch->on_complete, GRPC_ERROR_REF(error),
1565
1657
  "failing on_complete for pending batch");
1566
1658
  pending->batch->on_complete = nullptr;
@@ -1575,7 +1667,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RunClosuresForCompletedCall(
1575
1667
  // Construct list of closures to execute.
1576
1668
  CallCombinerClosureList closures;
1577
1669
  // First, add closure for recv_trailing_metadata_ready.
1578
- AddClosureForRecvTrailingMetadataReady(GRPC_ERROR_REF(error), &closures);
1670
+ MaybeAddClosureForRecvTrailingMetadataReady(GRPC_ERROR_REF(error), &closures);
1579
1671
  // If there are deferred batch completion callbacks, add them to closures.
1580
1672
  AddClosuresForDeferredCompletionCallbacks(&closures);
1581
1673
  // Add closures to fail any pending batches that have not yet been started.
@@ -1593,17 +1685,18 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvTrailingMetadataReady(
1593
1685
  CallData* calld = call_attempt->calld_;
1594
1686
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1595
1687
  gpr_log(GPR_INFO,
1596
- "chand=%p calld=%p attempt=%p: got recv_trailing_metadata_ready, "
1597
- "error=%s",
1598
- calld->chand_, calld, call_attempt,
1688
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
1689
+ "got recv_trailing_metadata_ready, error=%s",
1690
+ calld->chand_, calld, call_attempt, batch_data.get(),
1599
1691
  grpc_error_std_string(error).c_str());
1600
1692
  }
1601
1693
  call_attempt->completed_recv_trailing_metadata_ = true;
1602
- // If this attempt has been cancelled, then we're not going to use the
1694
+ // If this attempt has been abandoned, then we're not going to use the
1603
1695
  // result of this recv_trailing_metadata op, so do nothing.
1604
- if (call_attempt->cancelled_) {
1605
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1606
- "recv_trailing_metadata_ready after cancellation");
1696
+ if (call_attempt->abandoned_) {
1697
+ GRPC_CALL_COMBINER_STOP(
1698
+ calld->call_combiner_,
1699
+ "recv_trailing_metadata_ready for abandoned attempt");
1607
1700
  return;
1608
1701
  }
1609
1702
  // Cancel per-attempt recv timer, if any.
@@ -1631,7 +1724,15 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvTrailingMetadataReady(
1631
1724
  calld->StartRetryTimer(server_pushback_ms);
1632
1725
  // Cancel call attempt.
1633
1726
  CallCombinerClosureList closures;
1634
- call_attempt->Cancel(&closures);
1727
+ call_attempt->AddBatchForCancelOp(
1728
+ error == GRPC_ERROR_NONE
1729
+ ? grpc_error_set_int(
1730
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("call attempt failed"),
1731
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED)
1732
+ : GRPC_ERROR_REF(error),
1733
+ &closures);
1734
+ // Record that this attempt has been abandoned.
1735
+ call_attempt->Abandon();
1635
1736
  // Yields call combiner.
1636
1737
  closures.RunClosures(calld->call_combiner_);
1637
1738
  return;
@@ -1668,6 +1769,11 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1668
1769
  GRPC_ERROR_UNREF(error);
1669
1770
  return;
1670
1771
  }
1772
+ // Propagate payload.
1773
+ if (batch_.send_message) {
1774
+ pending->batch->payload->send_message.stream_write_closed =
1775
+ batch_.payload->send_message.stream_write_closed;
1776
+ }
1671
1777
  // Add closure.
1672
1778
  closures->Add(pending->batch->on_complete, error,
1673
1779
  "on_complete for pending batch");
@@ -1711,16 +1817,17 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
1711
1817
  CallData* calld = call_attempt->calld_;
1712
1818
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1713
1819
  gpr_log(GPR_INFO,
1714
- "chand=%p calld=%p attempt=%p: got on_complete, error=%s, batch=%s",
1715
- calld->chand_, calld, call_attempt,
1820
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
1821
+ "got on_complete, error=%s, batch=%s",
1822
+ calld->chand_, calld, call_attempt, batch_data.get(),
1716
1823
  grpc_error_std_string(error).c_str(),
1717
1824
  grpc_transport_stream_op_batch_string(&batch_data->batch_).c_str());
1718
1825
  }
1719
- // If this attempt has been cancelled, then we're not going to propagate
1826
+ // If this attempt has been abandoned, then we're not going to propagate
1720
1827
  // the completion of this batch, so do nothing.
1721
- if (call_attempt->cancelled_) {
1828
+ if (call_attempt->abandoned_) {
1722
1829
  GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1723
- "on_complete after cancellation");
1830
+ "on_complete for abandoned attempt");
1724
1831
  return;
1725
1832
  }
1726
1833
  // If we got an error and have not yet gotten the
@@ -1733,17 +1840,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
1733
1840
  gpr_log(GPR_INFO, "chand=%p calld=%p attempt=%p: deferring on_complete",
1734
1841
  calld->chand_, calld, call_attempt);
1735
1842
  }
1736
- call_attempt->on_complete_deferred_batch_ = std::move(batch_data);
1737
- call_attempt->on_complete_error_ = GRPC_ERROR_REF(error);
1843
+ call_attempt->on_complete_deferred_batches_.emplace_back(
1844
+ std::move(batch_data), GRPC_ERROR_REF(error));
1845
+ CallCombinerClosureList closures;
1846
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
1738
1847
  if (!call_attempt->started_recv_trailing_metadata_) {
1739
1848
  // recv_trailing_metadata not yet started by application; start it
1740
1849
  // ourselves to get status.
1741
- call_attempt->StartInternalRecvTrailingMetadata();
1742
- } else {
1743
- GRPC_CALL_COMBINER_STOP(
1744
- calld->call_combiner_,
1745
- "on_complete failure before recv_trailing_metadata_ready");
1850
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
1746
1851
  }
1852
+ closures.RunClosures(calld->call_combiner_);
1747
1853
  return;
1748
1854
  }
1749
1855
  // Update bookkeeping in call_attempt.
@@ -1780,6 +1886,24 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
1780
1886
  closures.RunClosures(calld->call_combiner_);
1781
1887
  }
1782
1888
 
1889
+ void RetryFilter::CallData::CallAttempt::BatchData::OnCompleteForCancelOp(
1890
+ void* arg, grpc_error_handle error) {
1891
+ RefCountedPtr<BatchData> batch_data(static_cast<BatchData*>(arg));
1892
+ CallAttempt* call_attempt = batch_data->call_attempt_.get();
1893
+ CallData* calld = call_attempt->calld_;
1894
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1895
+ gpr_log(GPR_INFO,
1896
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
1897
+ "got on_complete for cancel_stream batch, error=%s, batch=%s",
1898
+ calld->chand_, calld, call_attempt, batch_data.get(),
1899
+ grpc_error_std_string(error).c_str(),
1900
+ grpc_transport_stream_op_batch_string(&batch_data->batch_).c_str());
1901
+ }
1902
+ GRPC_CALL_COMBINER_STOP(
1903
+ calld->call_combiner_,
1904
+ "on_complete for internally generated cancel_stream op");
1905
+ }
1906
+
1783
1907
  //
1784
1908
  // retriable batch construction
1785
1909
  //
@@ -1914,10 +2038,12 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1914
2038
  &call_attempt_->recv_trailing_metadata_ready_;
1915
2039
  }
1916
2040
 
1917
- void RetryFilter::CallData::CallAttempt::BatchData::AddCancelStreamOp() {
2041
+ void RetryFilter::CallData::CallAttempt::BatchData::AddCancelStreamOp(
2042
+ grpc_error_handle error) {
1918
2043
  batch_.cancel_stream = true;
1919
- batch_.payload->cancel_stream.cancel_error =
1920
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("retry attempt abandoned");
2044
+ batch_.payload->cancel_stream.cancel_error = error;
2045
+ // Override on_complete callback.
2046
+ GRPC_CLOSURE_INIT(&on_complete_, OnCompleteForCancelOp, this, nullptr);
1921
2047
  }
1922
2048
 
1923
2049
  //
@@ -1996,7 +2122,6 @@ RetryFilter::CallData::CallData(RetryFilter* chand,
1996
2122
  .set_max_backoff(
1997
2123
  retry_policy_ == nullptr ? 0 : retry_policy_->max_backoff())),
1998
2124
  path_(grpc_slice_ref_internal(args.path)),
1999
- call_start_time_(args.start_time),
2000
2125
  deadline_(args.deadline),
2001
2126
  arena_(args.arena),
2002
2127
  owning_call_(args.call_stack),
@@ -2016,6 +2141,7 @@ RetryFilter::CallData::~CallData() {
2016
2141
  for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
2017
2142
  GPR_ASSERT(pending_batches_[i].batch == nullptr);
2018
2143
  }
2144
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
2019
2145
  }
2020
2146
 
2021
2147
  void RetryFilter::CallData::StartTransportStreamOpBatch(
@@ -2048,6 +2174,9 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2048
2174
  call_attempt_->CancelFromSurface(batch);
2049
2175
  return;
2050
2176
  }
2177
+ // Save cancel_error in case subsequent batches are started.
2178
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
2179
+ cancelled_from_surface_ = GRPC_ERROR_REF(cancel_error);
2051
2180
  // Cancel retry timer.
2052
2181
  if (retry_timer_pending_) {
2053
2182
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
@@ -2076,6 +2205,20 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2076
2205
  }
2077
2206
  // If we do not yet have a call attempt, create one.
2078
2207
  if (call_attempt_ == nullptr) {
2208
+ // If we were previously cancelled from the surface, cancel this
2209
+ // batch instead of creating a call attempt.
2210
+ if (cancelled_from_surface_ != GRPC_ERROR_NONE) {
2211
+ PendingBatchClear(pending);
2212
+ // Note: This will release the call combiner.
2213
+ grpc_transport_stream_op_batch_finish_with_failure(
2214
+ batch, GRPC_ERROR_REF(cancelled_from_surface_), call_combiner_);
2215
+ return;
2216
+ }
2217
+ // If there is no retry policy, then commit retries immediately.
2218
+ // This ensures that the code below will always jump to the fast path.
2219
+ // TODO(roth): Remove this special case when we implement
2220
+ // transparent retries.
2221
+ if (retry_policy_ == nullptr) retry_committed_ = true;
2079
2222
  // If this is the first batch and retries are already committed
2080
2223
  // (e.g., if this batch put the call above the buffer size limit), then
2081
2224
  // immediately create an LB call and delegate the batch to it. This
@@ -2101,7 +2244,10 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2101
2244
  chand_, this);
2102
2245
  }
2103
2246
  PendingBatchClear(pending);
2104
- committed_call_ = CreateLoadBalancedCall();
2247
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
2248
+ call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
2249
+ committed_call_ = CreateLoadBalancedCall(
2250
+ service_config_call_data->call_dispatch_controller());
2105
2251
  committed_call_->StartTransportStreamOpBatch(batch);
2106
2252
  return;
2107
2253
  }
@@ -2123,16 +2269,20 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2123
2269
  call_attempt_->StartRetriableBatches();
2124
2270
  }
2125
2271
 
2126
- RefCountedPtr<ClientChannel::LoadBalancedCall>
2127
- RetryFilter::CallData::CreateLoadBalancedCall() {
2272
+ OrphanablePtr<ClientChannel::LoadBalancedCall>
2273
+ RetryFilter::CallData::CreateLoadBalancedCall(
2274
+ ConfigSelector::CallDispatchController* call_dispatch_controller) {
2128
2275
  grpc_call_element_args args = {owning_call_, nullptr, call_context_,
2129
- path_, call_start_time_, deadline_,
2276
+ path_, /*start_time=*/0, deadline_,
2130
2277
  arena_, call_combiner_};
2131
2278
  return chand_->client_channel_->CreateLoadBalancedCall(
2132
2279
  args, pollent_,
2133
2280
  // This callback holds a ref to the CallStackDestructionBarrier
2134
2281
  // object until the LB call is destroyed.
2135
- call_stack_destruction_barrier_->MakeLbCallDestructionClosure(this));
2282
+ call_stack_destruction_barrier_->MakeLbCallDestructionClosure(this),
2283
+ call_dispatch_controller,
2284
+ // TODO(roth): Change this when we support transparent retries.
2285
+ /*is_transparent_retry=*/false);
2136
2286
  }
2137
2287
 
2138
2288
  void RetryFilter::CallData::CreateCallAttempt() {
@@ -2384,6 +2534,18 @@ void RetryFilter::CallData::RetryCommit(CallAttempt* call_attempt) {
2384
2534
  gpr_log(GPR_INFO, "chand=%p calld=%p: committing retries", chand_, this);
2385
2535
  }
2386
2536
  if (call_attempt != nullptr) {
2537
+ // If the call attempt's LB call has been committed, inform the call
2538
+ // dispatch controller that the call has been committed.
2539
+ // Note: If call_attempt is null, this is happening before the first
2540
+ // retry attempt is started, in which case we'll just pass the real
2541
+ // call dispatch controller down into the LB call, and it won't be
2542
+ // our problem anymore.
2543
+ if (call_attempt->lb_call_committed()) {
2544
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
2545
+ call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
2546
+ service_config_call_data->call_dispatch_controller()->Commit();
2547
+ }
2548
+ // Free cached send ops.
2387
2549
  call_attempt->FreeCachedSendOpDataAfterCommit();
2388
2550
  }
2389
2551
  }