grpc 1.45.0 → 1.53.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 (1842) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +437 -254
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/endpoint_config.h +11 -5
  7. data/include/grpc/event_engine/event_engine.h +129 -39
  8. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  9. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  10. data/include/grpc/event_engine/memory_allocator.h +1 -16
  11. data/include/grpc/event_engine/port.h +1 -1
  12. data/include/grpc/event_engine/slice.h +306 -0
  13. data/include/grpc/event_engine/slice_buffer.h +159 -0
  14. data/include/grpc/fork.h +25 -1
  15. data/include/grpc/grpc.h +4 -14
  16. data/include/grpc/grpc_posix.h +1 -1
  17. data/include/grpc/grpc_security.h +11 -0
  18. data/include/grpc/impl/codegen/atm.h +3 -71
  19. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
  20. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
  21. data/include/grpc/impl/codegen/atm_windows.h +3 -108
  22. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  23. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  24. data/include/grpc/impl/codegen/compression_types.h +5 -83
  25. data/include/grpc/impl/codegen/connectivity_state.h +5 -21
  26. data/include/grpc/impl/codegen/fork.h +4 -25
  27. data/include/grpc/impl/codegen/gpr_types.h +4 -35
  28. data/include/grpc/impl/codegen/grpc_types.h +5 -797
  29. data/include/grpc/impl/codegen/log.h +3 -86
  30. data/include/grpc/impl/codegen/port_platform.h +3 -699
  31. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  32. data/include/grpc/impl/codegen/slice.h +4 -107
  33. data/include/grpc/impl/codegen/status.h +4 -131
  34. data/include/grpc/impl/codegen/sync.h +3 -42
  35. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  36. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  37. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  38. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  39. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  40. data/include/grpc/impl/compression_types.h +109 -0
  41. data/include/grpc/impl/connectivity_state.h +47 -0
  42. data/include/grpc/impl/grpc_types.h +827 -0
  43. data/include/grpc/impl/propagation_bits.h +54 -0
  44. data/include/grpc/impl/slice_type.h +112 -0
  45. data/include/grpc/load_reporting.h +1 -1
  46. data/include/grpc/module.modulemap +5 -1
  47. data/include/grpc/slice.h +1 -1
  48. data/include/grpc/status.h +131 -1
  49. data/include/grpc/support/atm.h +70 -1
  50. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  51. data/include/grpc/support/atm_gcc_sync.h +58 -1
  52. data/include/grpc/support/atm_windows.h +105 -1
  53. data/include/grpc/support/log.h +87 -1
  54. data/include/grpc/support/log_windows.h +1 -1
  55. data/include/grpc/support/port_platform.h +767 -1
  56. data/include/grpc/support/string_util.h +1 -1
  57. data/include/grpc/support/sync.h +35 -2
  58. data/include/grpc/support/sync_abseil.h +11 -1
  59. data/include/grpc/support/sync_custom.h +13 -1
  60. data/include/grpc/support/sync_generic.h +24 -1
  61. data/include/grpc/support/sync_posix.h +27 -1
  62. data/include/grpc/support/sync_windows.h +15 -1
  63. data/include/grpc/support/time.h +31 -6
  64. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
  65. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
  66. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
  67. data/src/core/ext/filters/census/grpc_context.cc +19 -17
  68. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
  69. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
  70. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  71. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +6 -4
  72. data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
  73. data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
  74. data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
  75. data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
  76. data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
  77. data/src/core/ext/filters/client_channel/client_channel.cc +557 -540
  78. data/src/core/ext/filters/client_channel/client_channel.h +70 -26
  79. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
  80. data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
  81. data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
  82. data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
  83. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
  84. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  85. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +33 -27
  86. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  87. data/src/core/ext/filters/client_channel/config_selector.h +29 -23
  88. data/src/core/ext/filters/client_channel/connector.h +19 -10
  89. data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
  90. data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
  91. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  92. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
  93. data/src/core/ext/filters/client_channel/health/health_check_client.cc +137 -582
  94. data/src/core/ext/filters/client_channel/health/health_check_client.h +29 -163
  95. data/src/core/ext/filters/client_channel/http_proxy.cc +130 -164
  96. data/src/core/ext/filters/client_channel/http_proxy.h +46 -22
  97. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  98. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +8 -5
  99. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
  100. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  101. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
  102. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
  103. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
  104. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
  105. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
  106. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
  107. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  108. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
  109. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  110. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +27 -22
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
  112. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
  113. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
  117. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  118. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
  119. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +478 -479
  120. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -409
  121. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
  122. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +618 -642
  123. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
  124. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
  125. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
  126. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
  127. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
  128. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +280 -248
  129. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +251 -187
  130. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  131. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +19 -15
  132. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
  133. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
  134. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +212 -216
  135. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +543 -584
  136. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
  137. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
  138. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
  139. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  140. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
  141. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
  142. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +579 -376
  143. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
  144. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
  145. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
  146. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
  147. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
  148. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  149. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +20 -19
  150. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  151. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
  152. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +86 -224
  153. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
  154. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
  155. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
  156. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +269 -0
  157. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +121 -0
  158. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
  159. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +413 -303
  160. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
  161. data/src/core/ext/filters/client_channel/retry_filter.cc +184 -166
  162. data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
  163. data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
  164. data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
  165. data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
  166. data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
  167. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
  168. data/src/core/ext/filters/client_channel/subchannel.cc +336 -388
  169. data/src/core/ext/filters/client_channel/subchannel.h +112 -82
  170. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  171. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  172. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
  173. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
  174. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  175. data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
  176. data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
  177. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +154 -372
  178. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +41 -9
  179. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  180. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +34 -13
  181. data/src/core/ext/filters/http/client/http_client_filter.cc +119 -477
  182. data/src/core/ext/filters/http/client/http_client_filter.h +55 -25
  183. data/src/core/ext/filters/http/client_authority_filter.cc +48 -58
  184. data/src/core/ext/filters/http/client_authority_filter.h +32 -28
  185. data/src/core/ext/filters/http/http_filters_plugin.cc +46 -52
  186. data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
  187. data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
  188. data/src/core/ext/filters/http/server/http_server_filter.cc +111 -385
  189. data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
  190. data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
  191. data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
  192. data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
  193. data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
  194. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
  195. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
  196. data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
  197. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +90 -202
  198. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
  199. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -0
  200. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  201. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  202. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  203. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  204. data/src/core/ext/transport/chttp2/alpn/alpn.h +24 -24
  205. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +186 -241
  206. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
  207. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +209 -215
  208. data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
  209. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
  210. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
  211. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +31 -30
  212. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +29 -29
  213. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +893 -1079
  214. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
  215. data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
  216. data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
  217. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
  218. data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
  219. data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
  220. data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
  221. data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
  222. data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
  223. data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
  224. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
  225. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
  226. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
  227. data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
  228. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
  229. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
  230. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +46 -77
  231. data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
  232. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
  233. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
  234. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
  235. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +169 -220
  236. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +59 -61
  237. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +4 -1
  238. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +14 -5
  239. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +114 -542
  240. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +31 -24
  241. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +75 -67
  242. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +70 -48
  243. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  244. data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
  245. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  246. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  247. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  248. data/src/core/ext/transport/chttp2/transport/huffsyms.h +21 -21
  249. data/src/core/ext/transport/chttp2/transport/internal.h +250 -298
  250. data/src/core/ext/transport/chttp2/transport/parsing.cc +365 -132
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
  252. data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
  253. data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
  254. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  255. data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
  256. data/src/core/ext/transport/chttp2/transport/writing.cc +144 -106
  257. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
  259. data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
  260. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  261. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +173 -73
  262. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +39 -36
  263. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +210 -85
  264. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +29 -344
  265. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +189 -1489
  266. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
  267. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
  268. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  269. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +38 -17
  270. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +9 -7
  271. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +56 -13
  272. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  273. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +24 -2
  274. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  275. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +19 -6
  276. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  277. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +15 -2
  278. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  279. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +229 -82
  280. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  281. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +16 -4
  282. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  283. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  284. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  285. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +26 -4
  286. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  287. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +379 -140
  288. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +140 -126
  289. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +824 -301
  290. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  291. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +114 -29
  292. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +195 -191
  293. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1042 -412
  294. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  295. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +16 -4
  296. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  297. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +171 -42
  298. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  299. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +517 -202
  300. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +61 -36
  301. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +333 -66
  302. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  303. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +20 -6
  304. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +93 -91
  305. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +615 -213
  306. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  307. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +417 -79
  308. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  309. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +20 -8
  310. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  311. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +16 -93
  312. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  313. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +38 -17
  314. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  315. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +447 -157
  316. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +98 -66
  317. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +545 -191
  318. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  319. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +33 -13
  320. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +108 -87
  321. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +502 -149
  322. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  323. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +9 -2
  324. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  325. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +42 -17
  326. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +24 -9
  327. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +110 -18
  328. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  329. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +64 -26
  330. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  331. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +20 -6
  332. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  333. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +118 -49
  334. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +39 -32
  335. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +242 -87
  336. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  337. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +226 -105
  338. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  339. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -4
  340. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +86 -53
  341. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +475 -141
  342. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  343. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +379 -160
  344. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +16 -12
  345. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +77 -16
  346. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +9 -6
  347. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +50 -8
  348. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  349. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +26 -6
  350. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  351. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +253 -102
  352. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  353. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +229 -92
  354. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +74 -55
  355. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +494 -160
  356. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +38 -30
  357. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +232 -124
  358. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +458 -351
  359. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2879 -947
  360. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  361. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +67 -22
  362. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +79 -54
  363. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +454 -133
  364. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +5 -4
  365. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +21 -2
  366. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  367. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +16 -4
  368. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  369. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +38 -14
  370. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  371. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +33 -14
  372. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  373. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +89 -38
  374. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
  375. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
  376. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  377. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +13 -4
  378. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  379. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +58 -21
  380. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  381. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  382. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  383. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +50 -16
  384. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +9 -8
  385. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +43 -10
  386. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  387. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +16 -8
  388. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  389. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +101 -38
  390. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  391. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +167 -71
  392. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +16 -8
  393. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +88 -16
  394. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +14 -11
  395. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +71 -17
  396. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  397. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  398. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +184 -144
  399. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1091 -361
  400. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  401. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  402. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
  403. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
  404. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
  405. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
  406. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
  407. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
  408. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  409. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  410. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +56 -48
  411. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +327 -130
  412. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  413. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +88 -31
  414. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +83 -56
  415. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +472 -136
  416. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  417. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +35 -13
  418. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  419. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  420. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +171 -54
  421. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +917 -134
  422. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  423. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +59 -25
  424. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -33
  425. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +205 -76
  426. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  427. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +23 -8
  428. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  429. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +62 -25
  430. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
  431. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
  432. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  433. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +36 -8
  434. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  435. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +55 -22
  436. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  437. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +26 -11
  438. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  439. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +30 -11
  440. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  441. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +20 -8
  442. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  443. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +58 -22
  444. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
  445. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
  446. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  447. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +82 -29
  448. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  449. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +49 -22
  450. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  451. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +99 -36
  452. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  453. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +118 -44
  454. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  455. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +120 -40
  456. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  457. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +46 -16
  458. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  459. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +9 -2
  460. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  461. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +25 -8
  462. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  463. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +36 -6
  464. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  465. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  466. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
  467. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  468. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +15 -2
  469. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  470. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +23 -6
  471. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  472. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  473. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  474. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +477 -185
  475. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  476. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +512 -182
  477. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  478. data/src/core/ext/upb-generated/google/api/http.upb.h +134 -49
  479. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  480. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +25 -9
  481. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  482. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +12 -2
  483. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +183 -181
  484. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1332 -488
  485. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  486. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +16 -6
  487. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  488. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  489. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  490. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +126 -46
  491. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  492. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +16 -6
  493. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  494. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +81 -18
  495. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  496. data/src/core/ext/upb-generated/google/rpc/status.upb.h +25 -9
  497. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  498. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +89 -30
  499. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  500. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +55 -14
  501. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  502. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +424 -169
  503. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  504. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +32 -8
  505. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  506. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +18 -4
  507. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  508. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +204 -76
  509. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  510. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +63 -22
  511. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  512. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  513. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  514. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +115 -16
  515. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  516. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +29 -4
  517. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  518. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  519. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  520. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +33 -8
  521. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  522. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +26 -4
  523. data/src/core/ext/upb-generated/validate/validate.upb.c +264 -253
  524. data/src/core/ext/upb-generated/validate/validate.upb.h +1974 -709
  525. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  526. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +115 -16
  527. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  528. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +29 -4
  529. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  530. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  531. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  532. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +94 -18
  533. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  534. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +26 -4
  535. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  536. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +9 -2
  537. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  538. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  539. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  540. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +50 -16
  541. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  542. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +33 -12
  543. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  544. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +16 -4
  545. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  546. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +27 -10
  547. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  548. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +83 -34
  549. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  550. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +22 -4
  551. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +14 -13
  552. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +84 -28
  553. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
  554. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  555. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  556. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  557. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  558. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  559. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  560. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  561. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  562. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  563. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  564. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +309 -121
  565. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  566. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  567. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  568. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +31 -12
  569. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  570. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +82 -29
  571. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  572. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  573. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  574. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  575. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -4
  576. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +16 -4
  577. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
  578. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  579. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  580. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
  581. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
  582. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  583. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  584. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
  585. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  586. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +149 -129
  587. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
  588. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  589. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
  590. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
  592. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  593. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  595. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  596. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +168 -154
  597. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  598. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
  599. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
  600. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  602. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
  603. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
  604. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  605. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  606. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
  607. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  608. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
  609. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -68
  611. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
  612. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -747
  613. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  615. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
  621. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +483 -445
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +211 -193
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  632. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
  633. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  634. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  635. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
  636. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
  637. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  638. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
  639. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
  640. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  641. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  642. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
  643. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  644. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  645. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  646. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  647. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  648. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  649. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  650. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  651. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  652. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  653. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  654. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  655. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  656. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  657. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  658. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  659. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  660. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  661. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  662. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  663. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  664. data/src/core/ext/xds/certificate_provider_store.cc +75 -3
  665. data/src/core/ext/xds/certificate_provider_store.h +30 -4
  666. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
  667. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
  668. data/src/core/ext/xds/upb_utils.h +3 -25
  669. data/src/core/ext/xds/xds_api.cc +106 -192
  670. data/src/core/ext/xds/xds_api.h +41 -39
  671. data/src/core/ext/xds/xds_bootstrap.cc +5 -537
  672. data/src/core/ext/xds/xds_bootstrap.h +42 -95
  673. data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
  674. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  675. data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
  676. data/src/core/ext/xds/xds_certificate_provider.h +36 -4
  677. data/src/core/ext/xds/xds_channel_args.h +3 -3
  678. data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
  679. data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
  680. data/src/core/ext/xds/xds_client.cc +885 -1360
  681. data/src/core/ext/xds/xds_client.h +69 -65
  682. data/src/core/ext/xds/xds_client_grpc.cc +235 -0
  683. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  684. data/src/core/ext/xds/xds_client_stats.cc +24 -25
  685. data/src/core/ext/xds/xds_client_stats.h +26 -24
  686. data/src/core/ext/xds/xds_cluster.cc +505 -247
  687. data/src/core/ext/xds/xds_cluster.h +69 -40
  688. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +132 -0
  689. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +97 -0
  690. data/src/core/ext/xds/xds_common_types.cc +238 -123
  691. data/src/core/ext/xds/xds_common_types.h +29 -16
  692. data/src/core/ext/xds/xds_endpoint.cc +266 -156
  693. data/src/core/ext/xds/xds_endpoint.h +19 -15
  694. data/src/core/ext/xds/xds_health_status.cc +80 -0
  695. data/src/core/ext/xds/xds_health_status.h +109 -0
  696. data/src/core/ext/xds/xds_http_fault_filter.cc +68 -59
  697. data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
  698. data/src/core/ext/xds/xds_http_filters.cc +70 -71
  699. data/src/core/ext/xds/xds_http_filters.h +73 -25
  700. data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
  701. data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
  702. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  703. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  704. data/src/core/ext/xds/xds_lb_policy_registry.cc +334 -0
  705. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  706. data/src/core/ext/xds/xds_listener.cc +573 -481
  707. data/src/core/ext/xds/xds_listener.h +57 -51
  708. data/src/core/ext/xds/xds_resource_type.h +28 -22
  709. data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
  710. data/src/core/ext/xds/xds_route_config.cc +638 -479
  711. data/src/core/ext/xds/xds_route_config.h +79 -42
  712. data/src/core/ext/xds/xds_routing.cc +21 -7
  713. data/src/core/ext/xds/xds_routing.h +17 -12
  714. data/src/core/ext/xds/xds_server_config_fetcher.cc +244 -200
  715. data/src/core/ext/xds/xds_transport.h +86 -0
  716. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  717. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  718. data/src/core/lib/address_utils/parse_address.cc +52 -52
  719. data/src/core/lib/address_utils/parse_address.h +46 -42
  720. data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
  721. data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
  722. data/src/core/lib/avl/avl.h +100 -13
  723. data/src/core/lib/backoff/backoff.cc +19 -21
  724. data/src/core/lib/backoff/backoff.h +21 -21
  725. data/src/core/lib/channel/call_finalization.h +6 -4
  726. data/src/core/lib/channel/call_tracer.h +27 -9
  727. data/src/core/lib/channel/channel_args.cc +268 -101
  728. data/src/core/lib/channel/channel_args.h +461 -56
  729. data/src/core/lib/channel/channel_args_preconditioning.cc +6 -11
  730. data/src/core/lib/channel/channel_args_preconditioning.h +7 -7
  731. data/src/core/lib/channel/channel_fwd.h +26 -0
  732. data/src/core/lib/channel/channel_stack.cc +92 -52
  733. data/src/core/lib/channel/channel_stack.h +186 -140
  734. data/src/core/lib/channel/channel_stack_builder.cc +26 -104
  735. data/src/core/lib/channel/channel_stack_builder.h +45 -31
  736. data/src/core/lib/channel/channel_stack_builder_impl.cc +126 -0
  737. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  738. data/src/core/lib/channel/channel_trace.cc +29 -36
  739. data/src/core/lib/channel/channel_trace.h +27 -24
  740. data/src/core/lib/channel/channelz.cc +50 -65
  741. data/src/core/lib/channel/channelz.h +50 -33
  742. data/src/core/lib/channel/channelz_registry.cc +28 -36
  743. data/src/core/lib/channel/channelz_registry.h +31 -30
  744. data/src/core/lib/channel/connected_channel.cc +1267 -78
  745. data/src/core/lib/channel/connected_channel.h +22 -23
  746. data/src/core/lib/channel/context.h +25 -21
  747. data/src/core/lib/channel/promise_based_filter.cc +2155 -303
  748. data/src/core/lib/channel/promise_based_filter.h +636 -122
  749. data/src/core/lib/channel/status_util.cc +64 -17
  750. data/src/core/lib/channel/status_util.h +38 -24
  751. data/src/core/lib/compression/compression.cc +24 -19
  752. data/src/core/lib/compression/compression_internal.cc +89 -70
  753. data/src/core/lib/compression/compression_internal.h +28 -27
  754. data/src/core/lib/compression/message_compress.cc +28 -26
  755. data/src/core/lib/compression/message_compress.h +28 -29
  756. data/src/core/lib/config/core_configuration.cc +8 -1
  757. data/src/core/lib/config/core_configuration.h +86 -39
  758. data/src/core/lib/debug/event_log.cc +88 -0
  759. data/src/core/lib/debug/event_log.h +81 -0
  760. data/src/core/lib/debug/histogram_view.cc +69 -0
  761. data/src/core/lib/debug/histogram_view.h +37 -0
  762. data/src/core/lib/debug/stats.cc +48 -152
  763. data/src/core/lib/debug/stats.h +50 -57
  764. data/src/core/lib/debug/stats_data.cc +302 -649
  765. data/src/core/lib/debug/stats_data.h +293 -548
  766. data/src/core/lib/debug/trace.cc +18 -20
  767. data/src/core/lib/debug/trace.h +27 -48
  768. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
  769. data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
  770. data/src/core/lib/event_engine/common_closures.h +71 -0
  771. data/src/core/lib/event_engine/default_event_engine.cc +99 -0
  772. data/src/core/lib/event_engine/default_event_engine.h +73 -0
  773. data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
  774. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
  775. data/src/core/lib/event_engine/event_engine.cc +3 -30
  776. data/src/core/lib/event_engine/executor/executor.h +38 -0
  777. data/src/core/lib/event_engine/forkable.cc +106 -0
  778. data/src/core/lib/event_engine/forkable.h +61 -0
  779. data/src/core/lib/event_engine/handle_containers.h +74 -0
  780. data/src/core/lib/event_engine/memory_allocator.cc +11 -3
  781. data/src/core/lib/event_engine/poller.h +62 -0
  782. data/src/core/lib/event_engine/posix.h +158 -0
  783. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
  784. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
  785. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -0
  786. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  787. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  788. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  789. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  790. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  791. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  792. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  793. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  794. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1305 -0
  795. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
  796. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
  797. data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
  798. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  799. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +289 -0
  800. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
  801. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -0
  802. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  803. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  804. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  805. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  806. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  807. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  808. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  809. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
  810. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  811. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  812. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  813. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  814. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  815. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  816. data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
  817. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  818. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  819. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  820. data/src/core/lib/event_engine/resolved_address.cc +23 -2
  821. data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
  822. data/src/core/lib/event_engine/shim.cc +56 -0
  823. data/src/core/lib/event_engine/shim.h +33 -0
  824. data/src/core/lib/event_engine/slice.cc +103 -0
  825. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  826. data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
  827. data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
  828. data/src/core/lib/event_engine/thread_local.cc +29 -0
  829. data/src/core/lib/event_engine/thread_local.h +32 -0
  830. data/src/core/lib/event_engine/thread_pool.cc +253 -0
  831. data/src/core/lib/event_engine/thread_pool.h +141 -0
  832. data/src/core/lib/event_engine/time_util.cc +30 -0
  833. data/src/core/lib/event_engine/time_util.h +32 -0
  834. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/event_engine/trace.cc} +9 -13
  835. data/src/core/lib/event_engine/trace.h +43 -0
  836. data/src/core/lib/event_engine/utils.cc +44 -0
  837. data/src/core/lib/event_engine/utils.h +44 -0
  838. data/src/core/lib/event_engine/windows/iocp.cc +140 -0
  839. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  840. data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
  841. data/src/core/lib/event_engine/windows/win_socket.h +129 -0
  842. data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
  843. data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
  844. data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
  845. data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
  846. data/src/core/lib/experiments/config.cc +161 -0
  847. data/src/core/lib/experiments/config.h +53 -0
  848. data/src/core/lib/experiments/experiments.cc +81 -0
  849. data/src/core/lib/experiments/experiments.h +117 -0
  850. data/src/core/lib/gpr/alloc.cc +19 -25
  851. data/src/core/lib/gpr/alloc.h +20 -20
  852. data/src/core/lib/gpr/atm.cc +17 -17
  853. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  854. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  855. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  856. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  857. data/src/core/lib/gpr/log.cc +30 -17
  858. data/src/core/lib/gpr/log_android.cc +22 -20
  859. data/src/core/lib/gpr/log_linux.cc +24 -24
  860. data/src/core/lib/gpr/log_posix.cc +20 -19
  861. data/src/core/lib/gpr/log_windows.cc +25 -25
  862. data/src/core/lib/gpr/spinlock.h +20 -20
  863. data/src/core/lib/gpr/string.cc +25 -24
  864. data/src/core/lib/gpr/string.h +61 -61
  865. data/src/core/lib/gpr/string_posix.cc +24 -24
  866. data/src/core/lib/gpr/string_util_windows.cc +25 -52
  867. data/src/core/lib/gpr/string_windows.cc +24 -24
  868. data/src/core/lib/gpr/sync.cc +25 -25
  869. data/src/core/lib/gpr/sync_abseil.cc +36 -40
  870. data/src/core/lib/gpr/sync_posix.cc +22 -34
  871. data/src/core/lib/gpr/sync_windows.cc +29 -27
  872. data/src/core/lib/gpr/time.cc +34 -30
  873. data/src/core/lib/gpr/time_posix.cc +41 -45
  874. data/src/core/lib/gpr/time_precise.cc +22 -22
  875. data/src/core/lib/gpr/time_precise.h +21 -22
  876. data/src/core/lib/gpr/time_windows.cc +35 -29
  877. data/src/core/lib/gpr/tmpfile.h +24 -24
  878. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  879. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  880. data/src/core/lib/gpr/tmpfile_windows.cc +28 -29
  881. data/src/core/lib/gpr/useful.h +83 -30
  882. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  883. data/src/core/lib/gprpp/atomic_utils.h +20 -20
  884. data/src/core/lib/gprpp/bitset.h +47 -17
  885. data/src/core/lib/gprpp/chunked_vector.h +7 -3
  886. data/src/core/lib/gprpp/construct_destruct.h +4 -3
  887. data/src/core/lib/gprpp/cpp_impl_of.h +7 -3
  888. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  889. data/src/core/lib/gprpp/crash.h +34 -0
  890. data/src/core/lib/gprpp/debug_location.h +60 -31
  891. data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
  892. data/src/core/lib/gprpp/env.h +53 -0
  893. data/src/core/lib/gprpp/env_linux.cc +80 -0
  894. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/gprpp/env_posix.cc} +25 -9
  895. data/src/core/lib/gprpp/env_windows.cc +56 -0
  896. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  897. data/src/core/lib/gprpp/examine_stack.h +21 -22
  898. data/src/core/lib/gprpp/fork.cc +58 -53
  899. data/src/core/lib/gprpp/fork.h +29 -35
  900. data/src/core/lib/gprpp/global_config.h +22 -24
  901. data/src/core/lib/gprpp/global_config_custom.h +20 -20
  902. data/src/core/lib/gprpp/global_config_env.cc +28 -25
  903. data/src/core/lib/gprpp/global_config_env.h +29 -27
  904. data/src/core/lib/gprpp/global_config_generic.h +21 -25
  905. data/src/core/lib/gprpp/host_port.cc +30 -26
  906. data/src/core/lib/gprpp/host_port.h +32 -31
  907. data/src/core/lib/gprpp/load_file.cc +75 -0
  908. data/src/core/lib/gprpp/load_file.h +33 -0
  909. data/src/core/lib/gprpp/manual_constructor.h +21 -89
  910. data/src/core/lib/gprpp/match.h +75 -0
  911. data/src/core/lib/gprpp/memory.h +22 -26
  912. data/src/core/lib/gprpp/mpscq.cc +17 -17
  913. data/src/core/lib/gprpp/mpscq.h +21 -21
  914. data/src/core/lib/gprpp/no_destruct.h +95 -0
  915. data/src/core/lib/gprpp/notification.h +67 -0
  916. data/src/core/lib/gprpp/orphanable.h +22 -25
  917. data/src/core/lib/gprpp/overload.h +59 -0
  918. data/src/core/lib/gprpp/packed_table.h +40 -0
  919. data/src/core/lib/gprpp/per_cpu.h +46 -0
  920. data/src/core/lib/gprpp/ref_counted.h +24 -24
  921. data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
  922. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  923. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  924. data/src/core/lib/gprpp/stat.h +3 -5
  925. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  926. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  927. data/src/core/lib/gprpp/status_helper.cc +56 -20
  928. data/src/core/lib/gprpp/status_helper.h +13 -5
  929. data/src/core/lib/gprpp/strerror.cc +43 -0
  930. data/src/core/lib/gprpp/strerror.h +29 -0
  931. data/src/core/lib/gprpp/sync.h +26 -24
  932. data/src/core/lib/gprpp/table.h +22 -4
  933. data/src/core/lib/gprpp/tchar.cc +49 -0
  934. data/src/core/lib/gprpp/tchar.h +33 -0
  935. data/src/core/lib/gprpp/thd.h +25 -28
  936. data/src/core/lib/gprpp/thd_posix.cc +33 -32
  937. data/src/core/lib/gprpp/thd_windows.cc +28 -26
  938. data/src/core/lib/gprpp/time.cc +64 -9
  939. data/src/core/lib/gprpp/time.h +79 -5
  940. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  941. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  942. data/src/core/lib/gprpp/time_util.cc +4 -0
  943. data/src/core/lib/gprpp/time_util.h +3 -3
  944. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  945. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  946. data/src/core/lib/gprpp/validation_errors.h +127 -0
  947. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  948. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
  949. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  950. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  951. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  952. data/src/core/lib/http/format_request.cc +54 -24
  953. data/src/core/lib/http/format_request.h +23 -21
  954. data/src/core/lib/http/httpcli.cc +139 -141
  955. data/src/core/lib/http/httpcli.h +86 -38
  956. data/src/core/lib/http/httpcli_security_connector.cc +53 -45
  957. data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
  958. data/src/core/lib/http/parser.cc +144 -85
  959. data/src/core/lib/http/parser.h +51 -35
  960. data/src/core/lib/iomgr/block_annotate.h +23 -23
  961. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  962. data/src/core/lib/iomgr/buffer_list.h +123 -101
  963. data/src/core/lib/iomgr/call_combiner.cc +32 -64
  964. data/src/core/lib/iomgr/call_combiner.h +24 -25
  965. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  966. data/src/core/lib/iomgr/cfstream_handle.h +25 -25
  967. data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
  968. data/src/core/lib/iomgr/closure.h +95 -58
  969. data/src/core/lib/iomgr/combiner.cc +20 -39
  970. data/src/core/lib/iomgr/combiner.h +20 -20
  971. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  972. data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
  973. data/src/core/lib/iomgr/endpoint.cc +21 -21
  974. data/src/core/lib/iomgr/endpoint.h +53 -51
  975. data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
  976. data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
  977. data/src/core/lib/iomgr/endpoint_pair.h +20 -20
  978. data/src/core/lib/iomgr/endpoint_pair_posix.cc +34 -27
  979. data/src/core/lib/iomgr/endpoint_pair_windows.cc +30 -21
  980. data/src/core/lib/iomgr/error.cc +51 -834
  981. data/src/core/lib/iomgr/error.h +45 -317
  982. data/src/core/lib/iomgr/error_cfstream.cc +18 -23
  983. data/src/core/lib/iomgr/error_cfstream.h +21 -21
  984. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  985. data/src/core/lib/iomgr/ev_apple.h +21 -21
  986. data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
  987. data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
  988. data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
  989. data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
  990. data/src/core/lib/iomgr/ev_posix.cc +88 -122
  991. data/src/core/lib/iomgr/ev_posix.h +93 -87
  992. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  993. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
  994. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
  995. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
  996. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
  997. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
  998. data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
  999. data/src/core/lib/iomgr/exec_ctx.cc +34 -56
  1000. data/src/core/lib/iomgr/exec_ctx.h +152 -177
  1001. data/src/core/lib/iomgr/executor.cc +21 -31
  1002. data/src/core/lib/iomgr/executor.h +27 -30
  1003. data/src/core/lib/iomgr/fork_posix.cc +31 -28
  1004. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  1005. data/src/core/lib/iomgr/gethostname.h +20 -20
  1006. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  1007. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  1008. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  1009. data/src/core/lib/iomgr/grpc_if_nametoindex.h +22 -22
  1010. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  1011. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  1012. data/src/core/lib/iomgr/internal_errqueue.cc +41 -48
  1013. data/src/core/lib/iomgr/internal_errqueue.h +84 -89
  1014. data/src/core/lib/iomgr/iocp_windows.cc +23 -23
  1015. data/src/core/lib/iomgr/iocp_windows.h +21 -21
  1016. data/src/core/lib/iomgr/iomgr.cc +25 -20
  1017. data/src/core/lib/iomgr/iomgr.h +35 -35
  1018. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  1019. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  1020. data/src/core/lib/iomgr/iomgr_internal.h +28 -28
  1021. data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
  1022. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -19
  1023. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  1024. data/src/core/lib/iomgr/load_file.cc +24 -27
  1025. data/src/core/lib/iomgr/load_file.h +22 -22
  1026. data/src/core/lib/iomgr/lockfree_event.cc +114 -131
  1027. data/src/core/lib/iomgr/lockfree_event.h +23 -23
  1028. data/src/core/lib/iomgr/nameser.h +86 -86
  1029. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  1030. data/src/core/lib/iomgr/polling_entity.h +29 -29
  1031. data/src/core/lib/iomgr/pollset.cc +17 -17
  1032. data/src/core/lib/iomgr/pollset.h +55 -55
  1033. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  1034. data/src/core/lib/iomgr/pollset_set.h +26 -28
  1035. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  1036. data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
  1037. data/src/core/lib/iomgr/pollset_windows.cc +32 -31
  1038. data/src/core/lib/iomgr/pollset_windows.h +24 -24
  1039. data/src/core/lib/iomgr/port.h +59 -39
  1040. data/src/core/lib/iomgr/python_util.h +24 -24
  1041. data/src/core/lib/iomgr/resolve_address.cc +34 -20
  1042. data/src/core/lib/iomgr/resolve_address.h +73 -43
  1043. data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
  1044. data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
  1045. data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
  1046. data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
  1047. data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
  1048. data/src/core/lib/iomgr/resolved_address.h +3 -3
  1049. data/src/core/lib/iomgr/sockaddr.h +25 -26
  1050. data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
  1051. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
  1052. data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
  1053. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  1054. data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
  1055. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  1056. data/src/core/lib/iomgr/socket_mutator.h +39 -39
  1057. data/src/core/lib/iomgr/socket_utils.h +27 -27
  1058. data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
  1059. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  1060. data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
  1061. data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
  1062. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  1063. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  1064. data/src/core/lib/iomgr/socket_windows.h +59 -61
  1065. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  1066. data/src/core/lib/iomgr/systemd_utils.h +33 -0
  1067. data/src/core/lib/iomgr/tcp_client.cc +28 -24
  1068. data/src/core/lib/iomgr/tcp_client.h +49 -38
  1069. data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
  1070. data/src/core/lib/iomgr/tcp_client_posix.cc +244 -106
  1071. data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
  1072. data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
  1073. data/src/core/lib/iomgr/tcp_posix.cc +562 -361
  1074. data/src/core/lib/iomgr/tcp_posix.h +32 -30
  1075. data/src/core/lib/iomgr/tcp_server.cc +33 -24
  1076. data/src/core/lib/iomgr/tcp_server.h +78 -69
  1077. data/src/core/lib/iomgr/tcp_server_posix.cc +402 -145
  1078. data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
  1079. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
  1080. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
  1081. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  1082. data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
  1083. data/src/core/lib/iomgr/tcp_windows.cc +116 -98
  1084. data/src/core/lib/iomgr/tcp_windows.h +34 -35
  1085. data/src/core/lib/iomgr/timer.cc +17 -17
  1086. data/src/core/lib/iomgr/timer.h +68 -68
  1087. data/src/core/lib/iomgr/timer_generic.cc +125 -134
  1088. data/src/core/lib/iomgr/timer_generic.h +21 -21
  1089. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  1090. data/src/core/lib/iomgr/timer_heap.h +22 -22
  1091. data/src/core/lib/iomgr/timer_manager.cc +31 -31
  1092. data/src/core/lib/iomgr/timer_manager.h +27 -27
  1093. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  1094. data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
  1095. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  1096. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
  1097. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  1098. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  1099. data/src/core/lib/iomgr/wakeup_fd_pipe.h +20 -20
  1100. data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
  1101. data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
  1102. data/src/core/lib/json/json.h +23 -27
  1103. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
  1104. data/src/core/lib/json/json_channel_args.h +42 -0
  1105. data/src/core/lib/json/json_object_loader.cc +217 -0
  1106. data/src/core/lib/json/json_object_loader.h +634 -0
  1107. data/src/core/lib/json/json_reader.cc +123 -90
  1108. data/src/core/lib/json/json_util.cc +14 -34
  1109. data/src/core/lib/json/json_util.h +19 -10
  1110. data/src/core/lib/json/json_writer.cc +62 -57
  1111. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
  1112. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
  1113. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1114. data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
  1115. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1116. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
  1117. data/src/core/lib/matchers/matchers.cc +12 -7
  1118. data/src/core/lib/matchers/matchers.h +5 -3
  1119. data/src/core/lib/promise/activity.cc +23 -8
  1120. data/src/core/lib/promise/activity.h +116 -58
  1121. data/src/core/lib/promise/arena_promise.h +115 -72
  1122. data/src/core/lib/promise/context.h +18 -11
  1123. data/src/core/lib/promise/detail/basic_join.h +197 -0
  1124. data/src/core/lib/promise/detail/basic_seq.h +28 -33
  1125. data/src/core/lib/promise/detail/promise_factory.h +61 -14
  1126. data/src/core/lib/promise/detail/promise_like.h +3 -3
  1127. data/src/core/lib/promise/detail/status.h +33 -4
  1128. data/src/core/lib/promise/detail/switch.h +21 -21
  1129. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
  1130. data/src/core/lib/promise/if.h +195 -0
  1131. data/src/core/lib/promise/interceptor_list.h +308 -0
  1132. data/src/core/lib/promise/intra_activity_waiter.h +55 -0
  1133. data/src/core/lib/promise/latch.h +191 -0
  1134. data/src/core/lib/promise/loop.h +13 -9
  1135. data/src/core/lib/promise/map.h +4 -6
  1136. data/src/core/lib/promise/pipe.h +608 -0
  1137. data/src/core/lib/promise/poll.h +129 -11
  1138. data/src/core/lib/promise/promise.h +5 -5
  1139. data/src/core/lib/promise/race.h +6 -10
  1140. data/src/core/lib/promise/seq.h +32 -14
  1141. data/src/core/lib/promise/sleep.cc +58 -42
  1142. data/src/core/lib/promise/sleep.h +44 -26
  1143. data/src/core/lib/promise/trace.cc +20 -0
  1144. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/promise/trace.h} +6 -8
  1145. data/src/core/lib/promise/try_join.h +82 -0
  1146. data/src/core/lib/promise/try_seq.h +41 -23
  1147. data/src/core/lib/resolver/resolver.cc +17 -59
  1148. data/src/core/lib/resolver/resolver.h +21 -18
  1149. data/src/core/lib/resolver/resolver_factory.h +11 -10
  1150. data/src/core/lib/resolver/resolver_registry.cc +17 -9
  1151. data/src/core/lib/resolver/resolver_registry.h +15 -5
  1152. data/src/core/lib/resolver/server_address.cc +46 -34
  1153. data/src/core/lib/resolver/server_address.h +36 -35
  1154. data/src/core/lib/resource_quota/api.cc +25 -29
  1155. data/src/core/lib/resource_quota/api.h +14 -5
  1156. data/src/core/lib/resource_quota/arena.cc +85 -27
  1157. data/src/core/lib/resource_quota/arena.h +197 -25
  1158. data/src/core/lib/resource_quota/memory_quota.cc +322 -101
  1159. data/src/core/lib/resource_quota/memory_quota.h +191 -56
  1160. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1161. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1162. data/src/core/lib/resource_quota/resource_quota.h +20 -4
  1163. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  1164. data/src/core/lib/resource_quota/thread_quota.h +7 -3
  1165. data/src/core/lib/resource_quota/trace.h +3 -3
  1166. data/src/core/lib/security/authorization/authorization_engine.h +3 -3
  1167. data/src/core/lib/security/authorization/authorization_policy_provider.h +17 -3
  1168. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
  1169. data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
  1170. data/src/core/lib/security/authorization/evaluate_args.h +9 -6
  1171. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
  1172. data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
  1173. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +26 -13
  1174. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +20 -10
  1175. data/src/core/lib/security/authorization/matchers.cc +44 -30
  1176. data/src/core/lib/security/authorization/matchers.h +10 -3
  1177. data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
  1178. data/src/core/lib/security/authorization/rbac_policy.h +10 -3
  1179. data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
  1180. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1181. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1182. data/src/core/lib/security/context/security_context.cc +27 -25
  1183. data/src/core/lib/security/context/security_context.h +64 -35
  1184. data/src/core/lib/security/credentials/alts/alts_credentials.cc +35 -27
  1185. data/src/core/lib/security/credentials/alts/alts_credentials.h +65 -57
  1186. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  1187. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
  1188. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  1189. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  1190. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  1191. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +20 -22
  1192. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  1193. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +38 -39
  1194. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
  1195. data/src/core/lib/security/credentials/call_creds_util.cc +13 -3
  1196. data/src/core/lib/security/credentials/call_creds_util.h +6 -5
  1197. data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
  1198. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
  1199. data/src/core/lib/security/credentials/composite/composite_credentials.cc +46 -41
  1200. data/src/core/lib/security/credentials/composite/composite_credentials.h +51 -38
  1201. data/src/core/lib/security/credentials/credentials.cc +23 -26
  1202. data/src/core/lib/security/credentials/credentials.h +91 -94
  1203. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
  1204. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
  1205. data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
  1206. data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
  1207. data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
  1208. data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
  1209. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
  1210. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
  1211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
  1212. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
  1213. data/src/core/lib/security/credentials/fake/fake_credentials.cc +48 -48
  1214. data/src/core/lib/security/credentials/fake/fake_credentials.h +57 -47
  1215. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
  1216. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +148 -112
  1217. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +35 -29
  1218. data/src/core/lib/security/credentials/iam/iam_credentials.cc +35 -24
  1219. data/src/core/lib/security/credentials/iam/iam_credentials.h +37 -23
  1220. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +32 -29
  1221. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1222. data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
  1223. data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
  1224. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +37 -30
  1225. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +41 -23
  1226. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
  1227. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
  1228. data/src/core/lib/security/credentials/local/local_credentials.cc +36 -30
  1229. data/src/core/lib/security/credentials/local/local_credentials.h +36 -26
  1230. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +107 -91
  1231. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +56 -27
  1232. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +42 -36
  1233. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +55 -29
  1234. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +48 -44
  1235. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +43 -23
  1236. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
  1237. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
  1238. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
  1239. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +69 -9
  1240. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +44 -4
  1241. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +75 -13
  1242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
  1243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +69 -98
  1244. data/src/core/lib/security/credentials/tls/tls_credentials.cc +55 -50
  1245. data/src/core/lib/security/credentials/tls/tls_credentials.h +33 -30
  1246. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1247. data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
  1248. data/src/core/lib/security/credentials/xds/xds_credentials.cc +77 -81
  1249. data/src/core/lib/security/credentials/xds/xds_credentials.h +50 -10
  1250. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
  1251. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
  1252. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
  1253. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
  1254. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
  1255. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
  1256. data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
  1257. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
  1258. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
  1259. data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
  1260. data/src/core/lib/security/security_connector/local/local_security_connector.cc +66 -49
  1261. data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
  1262. data/src/core/lib/security/security_connector/security_connector.cc +37 -35
  1263. data/src/core/lib/security/security_connector/security_connector.h +67 -45
  1264. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +59 -48
  1265. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
  1266. data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
  1267. data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
  1268. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  1269. data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
  1270. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -58
  1271. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
  1272. data/src/core/lib/security/transport/auth_filters.h +59 -30
  1273. data/src/core/lib/security/transport/client_auth_filter.cc +73 -48
  1274. data/src/core/lib/security/transport/secure_endpoint.cc +305 -181
  1275. data/src/core/lib/security/transport/secure_endpoint.h +29 -28
  1276. data/src/core/lib/security/transport/security_handshaker.cc +142 -110
  1277. data/src/core/lib/security/transport/security_handshaker.h +28 -23
  1278. data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
  1279. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  1280. data/src/core/lib/security/transport/tsi_error.h +20 -20
  1281. data/src/core/lib/security/util/json_util.cc +24 -24
  1282. data/src/core/lib/security/util/json_util.h +21 -23
  1283. data/src/core/lib/service_config/service_config.h +19 -12
  1284. data/src/core/lib/service_config/service_config_call_data.h +15 -5
  1285. data/src/core/lib/service_config/service_config_impl.cc +111 -150
  1286. data/src/core/lib/service_config/service_config_impl.h +27 -27
  1287. data/src/core/lib/service_config/service_config_parser.cc +16 -28
  1288. data/src/core/lib/service_config/service_config_parser.h +18 -19
  1289. data/src/core/lib/slice/b64.cc +26 -26
  1290. data/src/core/lib/slice/b64.h +34 -32
  1291. data/src/core/lib/slice/percent_encoding.cc +24 -30
  1292. data/src/core/lib/slice/percent_encoding.h +28 -34
  1293. data/src/core/lib/slice/slice.cc +59 -46
  1294. data/src/core/lib/slice/slice.h +64 -20
  1295. data/src/core/lib/slice/slice_buffer.cc +136 -76
  1296. data/src/core/lib/slice/slice_buffer.h +168 -0
  1297. data/src/core/lib/slice/slice_internal.h +38 -45
  1298. data/src/core/lib/slice/slice_refcount.cc +3 -18
  1299. data/src/core/lib/slice/slice_refcount.h +53 -19
  1300. data/src/core/lib/slice/slice_string_helpers.cc +17 -33
  1301. data/src/core/lib/slice/slice_string_helpers.h +23 -30
  1302. data/src/core/lib/surface/api_trace.cc +17 -17
  1303. data/src/core/lib/surface/api_trace.h +25 -25
  1304. data/src/core/lib/surface/builtins.cc +7 -2
  1305. data/src/core/lib/surface/builtins.h +3 -3
  1306. data/src/core/lib/surface/byte_buffer.cc +26 -21
  1307. data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
  1308. data/src/core/lib/surface/call.cc +3000 -1131
  1309. data/src/core/lib/surface/call.h +135 -56
  1310. data/src/core/lib/surface/call_details.cc +22 -23
  1311. data/src/core/lib/surface/call_log_batch.cc +25 -18
  1312. data/src/core/lib/surface/call_test_only.h +34 -31
  1313. data/src/core/lib/surface/call_trace.cc +123 -0
  1314. data/src/core/lib/surface/call_trace.h +30 -0
  1315. data/src/core/lib/surface/channel.cc +218 -284
  1316. data/src/core/lib/surface/channel.h +137 -90
  1317. data/src/core/lib/surface/channel_init.cc +19 -20
  1318. data/src/core/lib/surface/channel_init.h +24 -26
  1319. data/src/core/lib/surface/channel_ping.cc +26 -20
  1320. data/src/core/lib/surface/channel_stack_type.cc +21 -19
  1321. data/src/core/lib/surface/channel_stack_type.h +22 -22
  1322. data/src/core/lib/surface/completion_queue.cc +200 -222
  1323. data/src/core/lib/surface/completion_queue.h +42 -40
  1324. data/src/core/lib/surface/completion_queue_factory.cc +34 -28
  1325. data/src/core/lib/surface/completion_queue_factory.h +21 -23
  1326. data/src/core/lib/surface/event_string.cc +19 -24
  1327. data/src/core/lib/surface/event_string.h +21 -21
  1328. data/src/core/lib/surface/init.cc +57 -114
  1329. data/src/core/lib/surface/init.h +20 -28
  1330. data/src/core/lib/surface/init_internally.cc +25 -0
  1331. data/src/core/lib/surface/init_internally.h +37 -0
  1332. data/src/core/lib/surface/lame_client.cc +87 -130
  1333. data/src/core/lib/surface/lame_client.h +62 -24
  1334. data/src/core/lib/surface/metadata_array.cc +18 -17
  1335. data/src/core/lib/surface/server.cc +409 -188
  1336. data/src/core/lib/surface/server.h +57 -26
  1337. data/src/core/lib/surface/validate_metadata.cc +34 -48
  1338. data/src/core/lib/surface/validate_metadata.h +24 -21
  1339. data/src/core/lib/surface/version.cc +21 -21
  1340. data/src/core/lib/transport/bdp_estimator.cc +19 -19
  1341. data/src/core/lib/transport/bdp_estimator.h +22 -24
  1342. data/src/core/lib/transport/connectivity_state.cc +24 -23
  1343. data/src/core/lib/transport/connectivity_state.h +24 -25
  1344. data/src/core/lib/transport/error_utils.cc +57 -79
  1345. data/src/core/lib/transport/error_utils.h +29 -25
  1346. data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
  1347. data/src/core/lib/{channel → transport}/handshaker.h +59 -48
  1348. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1349. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1350. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1351. data/src/core/lib/transport/http2_errors.h +22 -22
  1352. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
  1353. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1354. data/src/core/lib/transport/metadata_batch.cc +305 -0
  1355. data/src/core/lib/transport/metadata_batch.h +269 -302
  1356. data/src/core/lib/transport/parsed_metadata.cc +2 -4
  1357. data/src/core/lib/transport/parsed_metadata.h +17 -8
  1358. data/src/core/lib/transport/pid_controller.cc +20 -20
  1359. data/src/core/lib/transport/pid_controller.h +27 -27
  1360. data/src/core/lib/transport/status_conversion.cc +23 -23
  1361. data/src/core/lib/transport/status_conversion.h +24 -24
  1362. data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
  1363. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1364. data/src/core/lib/transport/timeout_encoding.cc +24 -28
  1365. data/src/core/lib/transport/timeout_encoding.h +25 -21
  1366. data/src/core/lib/transport/transport.cc +97 -57
  1367. data/src/core/lib/transport/transport.h +252 -207
  1368. data/src/core/lib/transport/transport_fwd.h +20 -0
  1369. data/src/core/lib/transport/transport_impl.h +59 -48
  1370. data/src/core/lib/transport/transport_op_string.cc +40 -39
  1371. data/src/core/lib/uri/uri_parser.cc +12 -4
  1372. data/src/core/lib/uri/uri_parser.h +3 -5
  1373. data/src/core/plugin_registry/grpc_plugin_registry.cc +62 -73
  1374. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
  1375. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  1376. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  1377. data/src/core/tsi/alts/crypt/gsec.h +336 -336
  1378. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  1379. data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
  1380. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  1381. data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
  1382. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  1383. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
  1384. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  1385. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +82 -83
  1386. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  1387. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  1388. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  1389. data/src/core/tsi/alts/frame_protector/frame_handler.h +169 -169
  1390. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
  1391. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
  1392. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  1393. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
  1394. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +53 -45
  1395. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
  1396. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
  1397. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  1398. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
  1399. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  1400. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
  1401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  1402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +40 -41
  1403. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  1404. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +35 -36
  1405. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
  1406. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  1407. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +55 -56
  1408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  1409. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +141 -142
  1410. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
  1411. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
  1412. data/src/core/tsi/fake_transport_security.cc +146 -110
  1413. data/src/core/tsi/fake_transport_security.h +36 -30
  1414. data/src/core/tsi/local_transport_security.cc +43 -38
  1415. data/src/core/tsi/local_transport_security.h +33 -33
  1416. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
  1417. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
  1418. data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
  1419. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -19
  1420. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  1421. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +31 -22
  1422. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
  1423. data/src/core/tsi/ssl_transport_security.cc +356 -390
  1424. data/src/core/tsi/ssl_transport_security.h +210 -201
  1425. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  1426. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  1427. data/src/core/tsi/ssl_types.h +27 -27
  1428. data/src/core/tsi/transport_security.cc +44 -32
  1429. data/src/core/tsi/transport_security.h +49 -48
  1430. data/src/core/tsi/transport_security_grpc.cc +23 -22
  1431. data/src/core/tsi/transport_security_grpc.h +44 -41
  1432. data/src/core/tsi/transport_security_interface.h +346 -332
  1433. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
  1434. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -0
  1435. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  1436. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  1437. data/src/ruby/ext/grpc/ext-export.gcc +1 -1
  1438. data/src/ruby/ext/grpc/extconf.rb +98 -20
  1439. data/src/ruby/ext/grpc/rb_call.c +1 -0
  1440. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  1441. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  1442. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  1443. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  1444. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  1445. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +60 -60
  1446. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1447. data/src/ruby/lib/grpc/errors.rb +1 -1
  1448. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1449. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  1450. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1451. data/src/ruby/lib/grpc/version.rb +1 -1
  1452. data/src/ruby/pb/generate_proto_ruby.sh +1 -6
  1453. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1454. data/src/ruby/pb/test/client.rb +769 -0
  1455. data/src/ruby/pb/test/server.rb +252 -0
  1456. data/src/ruby/pb/test/xds_client.rb +415 -0
  1457. data/src/ruby/spec/channel_spec.rb +5 -43
  1458. data/src/ruby/spec/client_server_spec.rb +20 -8
  1459. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1460. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1461. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1462. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1463. data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
  1464. data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
  1465. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1466. data/third_party/abseil-cpp/absl/base/config.h +221 -39
  1467. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1468. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
  1469. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  1470. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
  1471. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1472. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  1473. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
  1474. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1475. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
  1476. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
  1477. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1478. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
  1479. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
  1480. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
  1481. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
  1482. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1483. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
  1484. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1485. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1486. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
  1487. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
  1488. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1489. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
  1490. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  1491. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
  1492. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  1493. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1494. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1495. data/third_party/abseil-cpp/absl/base/macros.h +4 -21
  1496. data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
  1497. data/third_party/abseil-cpp/absl/base/options.h +1 -7
  1498. data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
  1499. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1500. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1501. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1502. data/third_party/abseil-cpp/absl/container/fixed_array.h +9 -5
  1503. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1504. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  1505. data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
  1506. data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
  1507. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
  1508. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
  1509. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
  1510. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
  1511. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
  1512. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
  1513. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
  1514. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
  1515. data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
  1516. data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
  1517. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
  1518. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
  1519. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
  1520. data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
  1521. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
  1522. data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  1523. data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  1524. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
  1525. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  1526. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
  1527. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
  1528. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
  1529. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
  1530. data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  1531. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
  1532. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
  1533. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
  1534. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1535. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
  1536. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
  1537. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
  1538. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  1539. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
  1540. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1541. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  1542. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
  1543. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1544. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
  1545. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
  1546. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
  1547. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
  1548. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  1549. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
  1550. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
  1551. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
  1552. data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
  1553. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1554. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  1555. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
  1556. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  1557. data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
  1558. data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
  1559. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
  1560. data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
  1561. data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
  1562. data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
  1563. data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
  1564. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  1565. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
  1566. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  1567. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  1568. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  1569. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
  1570. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  1571. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  1572. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
  1573. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
  1574. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  1575. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  1576. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  1577. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  1578. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
  1579. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  1580. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  1581. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  1582. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  1583. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  1584. data/third_party/abseil-cpp/absl/random/random.h +6 -6
  1585. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  1586. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  1587. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  1588. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  1589. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  1590. data/third_party/abseil-cpp/absl/status/status.cc +193 -14
  1591. data/third_party/abseil-cpp/absl/status/status.h +24 -14
  1592. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  1593. data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
  1594. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1595. data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
  1596. data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
  1597. data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
  1598. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1599. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1600. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1601. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
  1602. data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
  1603. data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
  1604. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
  1605. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
  1606. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  1607. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1608. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  1609. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
  1610. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
  1611. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
  1612. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
  1613. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  1614. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  1615. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  1616. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  1617. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
  1618. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
  1619. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  1620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  1621. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
  1622. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
  1623. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
  1624. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
  1625. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
  1626. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  1627. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
  1628. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
  1629. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
  1630. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
  1631. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
  1632. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
  1633. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
  1634. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
  1635. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
  1636. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
  1637. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
  1638. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
  1639. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
  1640. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
  1641. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1642. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
  1643. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
  1644. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1645. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
  1646. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
  1647. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1648. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
  1649. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1650. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  1651. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  1652. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1653. data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
  1654. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  1655. data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
  1656. data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
  1657. data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
  1658. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1659. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1660. data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
  1661. data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
  1662. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1663. data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
  1664. data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
  1665. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1666. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1667. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
  1668. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
  1669. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
  1670. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1671. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1672. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  1673. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1674. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
  1675. data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
  1676. data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
  1677. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
  1678. data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
  1679. data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
  1680. data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
  1681. data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
  1682. data/third_party/abseil-cpp/absl/time/format.cc +2 -1
  1683. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1684. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  1685. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
  1686. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
  1687. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
  1688. data/third_party/abseil-cpp/absl/time/time.cc +2 -2
  1689. data/third_party/abseil-cpp/absl/time/time.h +268 -169
  1690. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1691. data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
  1692. data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
  1693. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1694. data/third_party/abseil-cpp/absl/types/span.h +31 -8
  1695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
  1696. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
  1697. data/third_party/re2/re2/bitstate.cc +3 -3
  1698. data/third_party/re2/re2/dfa.cc +13 -13
  1699. data/third_party/re2/re2/nfa.cc +4 -4
  1700. data/third_party/re2/re2/onepass.cc +2 -2
  1701. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  1702. data/third_party/re2/re2/prefilter_tree.h +3 -2
  1703. data/third_party/re2/re2/prog.cc +11 -2
  1704. data/third_party/re2/re2/prog.h +17 -5
  1705. data/third_party/re2/re2/re2.cc +6 -11
  1706. data/third_party/re2/re2/re2.h +1 -1
  1707. data/third_party/re2/re2/regexp.cc +1 -2
  1708. data/third_party/re2/re2/stringpiece.h +10 -7
  1709. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  1710. data/third_party/re2/re2/unicode_groups.cc +319 -151
  1711. data/third_party/re2/re2/walker-inl.h +3 -2
  1712. data/third_party/re2/util/mutex.h +4 -4
  1713. data/third_party/upb/upb/arena.c +277 -0
  1714. data/third_party/upb/upb/arena.h +225 -0
  1715. data/third_party/upb/upb/array.c +114 -0
  1716. data/third_party/upb/upb/array.h +83 -0
  1717. data/third_party/upb/upb/collections.h +36 -0
  1718. data/third_party/upb/upb/decode.c +188 -76
  1719. data/third_party/upb/upb/decode.h +1 -0
  1720. data/third_party/upb/upb/decode_fast.c +1 -1
  1721. data/third_party/upb/upb/def.c +128 -57
  1722. data/third_party/upb/upb/def.h +20 -4
  1723. data/third_party/upb/upb/def.hpp +7 -4
  1724. data/third_party/upb/upb/encode.c +43 -28
  1725. data/third_party/upb/upb/encode.h +16 -6
  1726. data/third_party/upb/upb/extension_registry.c +93 -0
  1727. data/third_party/upb/upb/extension_registry.h +84 -0
  1728. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  1729. data/third_party/upb/upb/internal/table.h +385 -0
  1730. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  1731. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1732. data/third_party/upb/upb/json_decode.c +1512 -0
  1733. data/third_party/upb/upb/json_decode.h +47 -0
  1734. data/third_party/upb/upb/json_encode.c +780 -0
  1735. data/third_party/upb/upb/json_encode.h +65 -0
  1736. data/third_party/upb/upb/map.c +108 -0
  1737. data/third_party/upb/upb/map.h +117 -0
  1738. data/third_party/upb/upb/message_value.h +66 -0
  1739. data/third_party/upb/upb/mini_table.c +1147 -0
  1740. data/third_party/upb/upb/mini_table.h +189 -0
  1741. data/third_party/upb/upb/mini_table.hpp +112 -0
  1742. data/third_party/upb/upb/msg.c +6 -68
  1743. data/third_party/upb/upb/msg.h +2 -46
  1744. data/third_party/upb/upb/msg_internal.h +77 -58
  1745. data/third_party/upb/upb/port_def.inc +10 -1
  1746. data/third_party/upb/upb/port_undef.inc +2 -0
  1747. data/third_party/upb/upb/reflection.c +2 -159
  1748. data/third_party/upb/upb/reflection.h +2 -112
  1749. data/third_party/upb/upb/status.c +86 -0
  1750. data/third_party/upb/upb/status.h +66 -0
  1751. data/third_party/upb/upb/table.c +12 -8
  1752. data/third_party/upb/upb/table_internal.h +3 -350
  1753. data/third_party/upb/upb/text_encode.c +3 -2
  1754. data/third_party/upb/upb/upb.c +4 -290
  1755. data/third_party/upb/upb/upb.h +8 -167
  1756. data/third_party/zlib/compress.c +3 -3
  1757. data/third_party/zlib/crc32.c +975 -292
  1758. data/third_party/zlib/crc32.h +9441 -436
  1759. data/third_party/zlib/deflate.c +183 -129
  1760. data/third_party/zlib/deflate.h +12 -15
  1761. data/third_party/zlib/gzguts.h +3 -2
  1762. data/third_party/zlib/gzlib.c +6 -4
  1763. data/third_party/zlib/gzread.c +8 -12
  1764. data/third_party/zlib/gzwrite.c +26 -14
  1765. data/third_party/zlib/infback.c +12 -8
  1766. data/third_party/zlib/inffast.c +14 -14
  1767. data/third_party/zlib/inflate.c +44 -10
  1768. data/third_party/zlib/inflate.h +3 -2
  1769. data/third_party/zlib/inftrees.c +3 -3
  1770. data/third_party/zlib/inftrees.h +1 -1
  1771. data/third_party/zlib/trees.c +85 -107
  1772. data/third_party/zlib/uncompr.c +2 -2
  1773. data/third_party/zlib/zconf.h +16 -3
  1774. data/third_party/zlib/zlib.h +129 -106
  1775. data/third_party/zlib/zutil.c +11 -9
  1776. data/third_party/zlib/zutil.h +13 -9
  1777. metadata +424 -135
  1778. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  1779. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1780. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1781. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1782. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1783. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1784. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1785. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1786. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
  1787. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  1788. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
  1789. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
  1790. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
  1791. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
  1792. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  1793. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -67
  1794. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1795. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1796. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1797. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1798. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1799. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1800. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1801. data/src/core/lib/gpr/env.h +0 -40
  1802. data/src/core/lib/gpr/env_linux.cc +0 -75
  1803. data/src/core/lib/gpr/env_posix.cc +0 -46
  1804. data/src/core/lib/gpr/env_windows.cc +0 -74
  1805. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1806. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1807. data/src/core/lib/gpr/string_windows.h +0 -32
  1808. data/src/core/lib/gpr/tls.h +0 -157
  1809. data/src/core/lib/gprpp/capture.h +0 -76
  1810. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
  1811. data/src/core/lib/iomgr/error_internal.h +0 -66
  1812. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  1813. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1814. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  1815. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1816. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  1817. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  1818. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  1819. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  1820. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  1821. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  1822. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1823. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1824. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1825. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1826. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1827. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1828. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1829. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1830. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  1831. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  1832. data/src/core/lib/profiling/basic_timers.cc +0 -295
  1833. data/src/core/lib/profiling/stap_timers.cc +0 -50
  1834. data/src/core/lib/profiling/timers.h +0 -94
  1835. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  1836. data/src/core/lib/slice/slice_api.cc +0 -39
  1837. data/src/core/lib/slice/slice_refcount_base.h +0 -61
  1838. data/src/core/lib/slice/slice_split.cc +0 -100
  1839. data/src/core/lib/slice/slice_split.h +0 -40
  1840. data/src/core/lib/transport/byte_stream.cc +0 -162
  1841. data/src/core/lib/transport/byte_stream.h +0 -166
  1842. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -20,49 +20,78 @@
20
20
 
21
21
  #include <inttypes.h>
22
22
  #include <limits.h>
23
- #include <math.h>
24
23
  #include <stdio.h>
25
24
  #include <string.h>
26
25
 
26
+ #include <algorithm>
27
+ #include <initializer_list>
28
+ #include <memory>
29
+ #include <new>
30
+ #include <string>
31
+ #include <utility>
32
+
33
+ #include "absl/base/attributes.h"
34
+ #include "absl/status/status.h"
35
+ #include "absl/strings/cord.h"
36
+ #include "absl/strings/str_cat.h"
27
37
  #include "absl/strings/str_format.h"
38
+ #include "absl/strings/string_view.h"
39
+ #include "absl/types/optional.h"
28
40
 
41
+ #include <grpc/event_engine/event_engine.h>
42
+ #include <grpc/grpc.h>
43
+ #include <grpc/impl/connectivity_state.h>
29
44
  #include <grpc/slice_buffer.h>
30
45
  #include <grpc/status.h>
31
46
  #include <grpc/support/alloc.h>
47
+ #include <grpc/support/atm.h>
32
48
  #include <grpc/support/log.h>
33
- #include <grpc/support/string_util.h>
49
+ #include <grpc/support/time.h>
34
50
 
35
51
  #include "src/core/ext/transport/chttp2/transport/context_list.h"
52
+ #include "src/core/ext/transport/chttp2/transport/flow_control.h"
53
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
36
54
  #include "src/core/ext/transport/chttp2/transport/frame_data.h"
55
+ #include "src/core/ext/transport/chttp2/transport/frame_goaway.h"
56
+ #include "src/core/ext/transport/chttp2/transport/frame_rst_stream.h"
57
+ #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
58
+ #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
59
+ #include "src/core/ext/transport/chttp2/transport/http_trace.h"
37
60
  #include "src/core/ext/transport/chttp2/transport/internal.h"
61
+ #include "src/core/ext/transport/chttp2/transport/stream_map.h"
38
62
  #include "src/core/ext/transport/chttp2/transport/varint.h"
39
63
  #include "src/core/lib/channel/channel_args.h"
40
64
  #include "src/core/lib/debug/stats.h"
41
- #include "src/core/lib/gpr/env.h"
42
- #include "src/core/lib/gpr/string.h"
43
- #include "src/core/lib/gprpp/memory.h"
65
+ #include "src/core/lib/debug/stats_data.h"
66
+ #include "src/core/lib/gpr/useful.h"
67
+ #include "src/core/lib/gprpp/bitset.h"
68
+ #include "src/core/lib/gprpp/crash.h"
69
+ #include "src/core/lib/gprpp/debug_location.h"
70
+ #include "src/core/lib/gprpp/ref_counted.h"
71
+ #include "src/core/lib/gprpp/status_helper.h"
72
+ #include "src/core/lib/gprpp/time.h"
44
73
  #include "src/core/lib/http/parser.h"
45
- #include "src/core/lib/iomgr/executor.h"
46
- #include "src/core/lib/iomgr/iomgr.h"
74
+ #include "src/core/lib/iomgr/combiner.h"
75
+ #include "src/core/lib/iomgr/error.h"
76
+ #include "src/core/lib/iomgr/exec_ctx.h"
77
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
47
78
  #include "src/core/lib/iomgr/timer.h"
48
- #include "src/core/lib/profiling/timers.h"
49
- #include "src/core/lib/resource_quota/api.h"
79
+ #include "src/core/lib/promise/poll.h"
80
+ #include "src/core/lib/resource_quota/arena.h"
81
+ #include "src/core/lib/resource_quota/memory_quota.h"
82
+ #include "src/core/lib/resource_quota/resource_quota.h"
50
83
  #include "src/core/lib/resource_quota/trace.h"
84
+ #include "src/core/lib/slice/slice.h"
85
+ #include "src/core/lib/slice/slice_buffer.h"
51
86
  #include "src/core/lib/slice/slice_internal.h"
52
- #include "src/core/lib/slice/slice_string_helpers.h"
87
+ #include "src/core/lib/transport/bdp_estimator.h"
88
+ #include "src/core/lib/transport/connectivity_state.h"
53
89
  #include "src/core/lib/transport/error_utils.h"
54
90
  #include "src/core/lib/transport/http2_errors.h"
91
+ #include "src/core/lib/transport/metadata_batch.h"
55
92
  #include "src/core/lib/transport/status_conversion.h"
56
- #include "src/core/lib/transport/timeout_encoding.h"
57
93
  #include "src/core/lib/transport/transport.h"
58
94
  #include "src/core/lib/transport/transport_impl.h"
59
- #include "src/core/lib/uri/uri_parser.h"
60
-
61
- GPR_GLOBAL_CONFIG_DEFINE_BOOL(
62
- grpc_experimental_disable_flow_control, false,
63
- "If set, flow control will be effectively disabled. Max out all values and "
64
- "assume the remote peer does the same. Thus we can ignore any flow control "
65
- "bookkeeping, error checking, and decision making");
66
95
 
67
96
  #define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
68
97
  #define MAX_WINDOW 0x7fffffffu
@@ -70,13 +99,13 @@ GPR_GLOBAL_CONFIG_DEFINE_BOOL(
70
99
  #define DEFAULT_MAX_HEADER_LIST_SIZE (8 * 1024)
71
100
 
72
101
  #define DEFAULT_CLIENT_KEEPALIVE_TIME_MS INT_MAX
73
- #define DEFAULT_CLIENT_KEEPALIVE_TIMEOUT_MS 20000 /* 20 seconds */
74
- #define DEFAULT_SERVER_KEEPALIVE_TIME_MS 7200000 /* 2 hours */
75
- #define DEFAULT_SERVER_KEEPALIVE_TIMEOUT_MS 20000 /* 20 seconds */
102
+ #define DEFAULT_CLIENT_KEEPALIVE_TIMEOUT_MS 20000 // 20 seconds
103
+ #define DEFAULT_SERVER_KEEPALIVE_TIME_MS 7200000 // 2 hours
104
+ #define DEFAULT_SERVER_KEEPALIVE_TIMEOUT_MS 20000 // 20 seconds
76
105
  #define DEFAULT_KEEPALIVE_PERMIT_WITHOUT_CALLS false
77
106
  #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
78
107
 
79
- #define DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS 300000 /* 5 minutes */
108
+ #define DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS 300000 // 5 minutes
80
109
  #define DEFAULT_MAX_PINGS_BETWEEN_DATA 2
81
110
  #define DEFAULT_MAX_PING_STRIKES 2
82
111
 
@@ -101,7 +130,6 @@ static int g_default_max_pings_without_data = DEFAULT_MAX_PINGS_BETWEEN_DATA;
101
130
  static int g_default_max_ping_strikes = DEFAULT_MAX_PING_STRIKES;
102
131
 
103
132
  #define MAX_CLIENT_STREAM_ID 0x7fffffffu
104
- grpc_core::TraceFlag grpc_http_trace(false, "http");
105
133
  grpc_core::TraceFlag grpc_keepalive_trace(false, "http_keepalive");
106
134
  grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount(false,
107
135
  "chttp2_refcount");
@@ -116,8 +144,6 @@ static void read_action(void* t, grpc_error_handle error);
116
144
  static void read_action_locked(void* t, grpc_error_handle error);
117
145
  static void continue_read_action_locked(grpc_chttp2_transport* t);
118
146
 
119
- static void complete_fetch(void* gs, grpc_error_handle error);
120
- static void complete_fetch_locked(void* gs, grpc_error_handle error);
121
147
  // Set a transport level setting, and push it to our peer
122
148
  static void queue_setting_update(grpc_chttp2_transport* t,
123
149
  grpc_chttp2_setting_id id, uint32_t value);
@@ -148,26 +174,28 @@ static void start_bdp_ping(void* tp, grpc_error_handle error);
148
174
  static void finish_bdp_ping(void* tp, grpc_error_handle error);
149
175
  static void start_bdp_ping_locked(void* tp, grpc_error_handle error);
150
176
  static void finish_bdp_ping_locked(void* tp, grpc_error_handle error);
151
- static void next_bdp_ping_timer_expired(void* tp, grpc_error_handle error);
152
- static void next_bdp_ping_timer_expired_locked(void* tp,
153
- grpc_error_handle error);
177
+ static void next_bdp_ping_timer_expired(grpc_chttp2_transport* t);
178
+ static void next_bdp_ping_timer_expired_locked(
179
+ void* tp, GRPC_UNUSED grpc_error_handle error);
154
180
 
155
181
  static void cancel_pings(grpc_chttp2_transport* t, grpc_error_handle error);
156
182
  static void send_ping_locked(grpc_chttp2_transport* t,
157
183
  grpc_closure* on_initiate, grpc_closure* on_ack);
158
- static void retry_initiate_ping_locked(void* tp, grpc_error_handle error);
184
+ static void retry_initiate_ping_locked(void* tp,
185
+ GRPC_UNUSED grpc_error_handle error);
159
186
 
160
187
  // keepalive-relevant functions
161
- static void init_keepalive_ping(void* arg, grpc_error_handle error);
162
- static void init_keepalive_ping_locked(void* arg, grpc_error_handle error);
188
+ static void init_keepalive_ping(grpc_chttp2_transport* t);
189
+ static void init_keepalive_ping_locked(void* arg,
190
+ GRPC_UNUSED grpc_error_handle error);
163
191
  static void start_keepalive_ping(void* arg, grpc_error_handle error);
164
192
  static void finish_keepalive_ping(void* arg, grpc_error_handle error);
165
193
  static void start_keepalive_ping_locked(void* arg, grpc_error_handle error);
166
194
  static void finish_keepalive_ping_locked(void* arg, grpc_error_handle error);
167
- static void keepalive_watchdog_fired(void* arg, grpc_error_handle error);
168
- static void keepalive_watchdog_fired_locked(void* arg, grpc_error_handle error);
169
-
170
- static void reset_byte_stream(void* arg, grpc_error_handle error);
195
+ static void keepalive_watchdog_fired(grpc_chttp2_transport* t);
196
+ static void keepalive_watchdog_fired_locked(
197
+ void* arg, GRPC_UNUSED grpc_error_handle error);
198
+ static void maybe_reset_keepalive_ping_timer_locked(grpc_chttp2_transport* t);
171
199
 
172
200
  namespace grpc_core {
173
201
 
@@ -202,25 +230,25 @@ void TestOnlyGlobalHttp2TransportDisableTransientFailureStateNotification(
202
230
  grpc_chttp2_transport::~grpc_chttp2_transport() {
203
231
  size_t i;
204
232
 
233
+ event_engine.reset();
234
+
205
235
  if (channelz_socket != nullptr) {
206
236
  channelz_socket.reset();
207
237
  }
208
238
 
209
239
  grpc_endpoint_destroy(ep);
210
240
 
211
- grpc_slice_buffer_destroy_internal(&qbuf);
241
+ grpc_slice_buffer_destroy(&qbuf);
212
242
 
213
- grpc_slice_buffer_destroy_internal(&outbuf);
243
+ grpc_slice_buffer_destroy(&outbuf);
214
244
 
215
- grpc_error_handle error =
216
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed");
245
+ grpc_error_handle error = GRPC_ERROR_CREATE("Transport destroyed");
217
246
  // ContextList::Execute follows semantics of a callback function and does not
218
247
  // take a ref on error
219
248
  grpc_core::ContextList::Execute(cl, nullptr, error);
220
- GRPC_ERROR_UNREF(error);
221
249
  cl = nullptr;
222
250
 
223
- grpc_slice_buffer_destroy_internal(&read_buffer);
251
+ grpc_slice_buffer_destroy(&read_buffer);
224
252
  grpc_chttp2_goaway_parser_destroy(&goaway_parser);
225
253
 
226
254
  for (i = 0; i < STREAM_LIST_COUNT; i++) {
@@ -228,16 +256,13 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
228
256
  GPR_ASSERT(lists[i].tail == nullptr);
229
257
  }
230
258
 
231
- GRPC_ERROR_UNREF(goaway_error);
232
-
233
259
  GPR_ASSERT(grpc_chttp2_stream_map_size(&stream_map) == 0);
234
260
 
235
261
  grpc_chttp2_stream_map_destroy(&stream_map);
236
262
 
237
263
  GRPC_COMBINER_UNREF(combiner, "chttp2_transport");
238
264
 
239
- cancel_pings(this,
240
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed"));
265
+ cancel_pings(this, GRPC_ERROR_CREATE("Transport destroyed"));
241
266
 
242
267
  while (write_cb_pool) {
243
268
  grpc_chttp2_write_cb* next = write_cb_pool->next;
@@ -245,9 +270,6 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
245
270
  write_cb_pool = next;
246
271
  }
247
272
 
248
- flow_control.Destroy();
249
-
250
- GRPC_ERROR_UNREF(closed_with_error);
251
273
  gpr_free(ping_acks);
252
274
  if (grpc_core::test_only_destruct_callback != nullptr) {
253
275
  grpc_core::test_only_destruct_callback();
@@ -256,155 +278,145 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
256
278
 
257
279
  static const grpc_transport_vtable* get_vtable(void);
258
280
 
259
- // Returns whether bdp is enabled
260
- static bool read_channel_args(grpc_chttp2_transport* t,
261
- const grpc_channel_args* channel_args,
281
+ static void read_channel_args(grpc_chttp2_transport* t,
282
+ const grpc_core::ChannelArgs& channel_args,
262
283
  bool is_client) {
263
- bool enable_bdp = true;
264
- bool channelz_enabled = GRPC_ENABLE_CHANNELZ_DEFAULT;
265
- size_t i;
266
- int j;
267
-
268
- for (i = 0; i < channel_args->num_args; i++) {
269
- if (0 == strcmp(channel_args->args[i].key,
270
- GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER)) {
271
- const grpc_integer_options options = {-1, 0, INT_MAX};
272
- const int value =
273
- grpc_channel_arg_get_integer(&channel_args->args[i], options);
274
- if (value >= 0) {
275
- if ((t->next_stream_id & 1) != (value & 1)) {
276
- gpr_log(GPR_ERROR, "%s: low bit must be %d on %s",
277
- GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER, t->next_stream_id & 1,
278
- is_client ? "client" : "server");
279
- } else {
280
- t->next_stream_id = static_cast<uint32_t>(value);
281
- }
282
- }
283
- } else if (0 == strcmp(channel_args->args[i].key,
284
- GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER)) {
285
- const grpc_integer_options options = {-1, 0, INT_MAX};
286
- const int value =
287
- grpc_channel_arg_get_integer(&channel_args->args[i], options);
288
- if (value >= 0) {
289
- t->hpack_compressor.SetMaxUsableSize(value);
290
- }
291
- } else if (0 == strcmp(channel_args->args[i].key,
292
- GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA)) {
293
- t->ping_policy.max_pings_without_data = grpc_channel_arg_get_integer(
294
- &channel_args->args[i],
295
- {g_default_max_pings_without_data, 0, INT_MAX});
296
- } else if (0 == strcmp(channel_args->args[i].key,
297
- GRPC_ARG_HTTP2_MAX_PING_STRIKES)) {
298
- t->ping_policy.max_ping_strikes = grpc_channel_arg_get_integer(
299
- &channel_args->args[i], {g_default_max_ping_strikes, 0, INT_MAX});
300
- } else if (0 ==
301
- strcmp(channel_args->args[i].key,
302
- GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)) {
303
- t->ping_policy.min_recv_ping_interval_without_data =
304
- grpc_core::Duration::Milliseconds(grpc_channel_arg_get_integer(
305
- &channel_args->args[i],
306
- grpc_integer_options{
307
- g_default_min_recv_ping_interval_without_data_ms, 0,
308
- INT_MAX}));
309
- } else if (0 == strcmp(channel_args->args[i].key,
310
- GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE)) {
311
- t->write_buffer_size = static_cast<uint32_t>(grpc_channel_arg_get_integer(
312
- &channel_args->args[i], {0, 0, MAX_WRITE_BUFFER_SIZE}));
313
- } else if (0 ==
314
- strcmp(channel_args->args[i].key, GRPC_ARG_HTTP2_BDP_PROBE)) {
315
- enable_bdp = grpc_channel_arg_get_bool(&channel_args->args[i], true);
316
- } else if (0 ==
317
- strcmp(channel_args->args[i].key, GRPC_ARG_KEEPALIVE_TIME_MS)) {
318
- const int value = grpc_channel_arg_get_integer(
319
- &channel_args->args[i],
320
- grpc_integer_options{t->is_client
321
- ? g_default_client_keepalive_time_ms
322
- : g_default_server_keepalive_time_ms,
323
- 1, INT_MAX});
324
- t->keepalive_time = value == INT_MAX
325
- ? grpc_core::Duration::Infinity()
326
- : grpc_core::Duration::Milliseconds(value);
327
- } else if (0 == strcmp(channel_args->args[i].key,
328
- GRPC_ARG_KEEPALIVE_TIMEOUT_MS)) {
329
- const int value = grpc_channel_arg_get_integer(
330
- &channel_args->args[i],
331
- grpc_integer_options{t->is_client
332
- ? g_default_client_keepalive_timeout_ms
333
- : g_default_server_keepalive_timeout_ms,
334
- 0, INT_MAX});
335
- t->keepalive_timeout = value == INT_MAX
336
- ? grpc_core::Duration::Infinity()
337
- : grpc_core::Duration::Milliseconds(value);
338
- } else if (0 == strcmp(channel_args->args[i].key,
339
- GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS)) {
340
- t->keepalive_permit_without_calls = static_cast<uint32_t>(
341
- grpc_channel_arg_get_integer(&channel_args->args[i], {0, 0, 1}));
342
- } else if (0 == strcmp(channel_args->args[i].key,
343
- GRPC_ARG_OPTIMIZATION_TARGET)) {
344
- gpr_log(GPR_INFO, "GRPC_ARG_OPTIMIZATION_TARGET is deprecated");
345
- } else if (0 ==
346
- strcmp(channel_args->args[i].key, GRPC_ARG_ENABLE_CHANNELZ)) {
347
- channelz_enabled = grpc_channel_arg_get_bool(
348
- &channel_args->args[i], GRPC_ENABLE_CHANNELZ_DEFAULT);
284
+ const int initial_sequence_number =
285
+ channel_args.GetInt(GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER).value_or(-1);
286
+ if (initial_sequence_number > 0) {
287
+ if ((t->next_stream_id & 1) != (initial_sequence_number & 1)) {
288
+ gpr_log(GPR_ERROR, "%s: low bit must be %d on %s",
289
+ GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER, t->next_stream_id & 1,
290
+ is_client ? "client" : "server");
349
291
  } else {
350
- static const struct {
351
- const char* channel_arg_name;
352
- grpc_chttp2_setting_id setting_id;
353
- grpc_integer_options integer_options;
354
- bool availability[2] /* server, client */;
355
- } settings_map[] = {{GRPC_ARG_MAX_CONCURRENT_STREAMS,
356
- GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS,
357
- {-1, 0, INT32_MAX},
358
- {true, false}},
359
- {GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER,
360
- GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE,
361
- {-1, 0, INT32_MAX},
362
- {true, true}},
363
- {GRPC_ARG_MAX_METADATA_SIZE,
364
- GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
365
- {-1, 0, INT32_MAX},
366
- {true, true}},
367
- {GRPC_ARG_HTTP2_MAX_FRAME_SIZE,
368
- GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
369
- {-1, 16384, 16777215},
370
- {true, true}},
371
- {GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY,
372
- GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA,
373
- {1, 0, 1},
374
- {true, true}},
375
- {GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES,
376
- GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
377
- {-1, 5, INT32_MAX},
378
- {true, true}}};
379
- for (j = 0; j < static_cast<int> GPR_ARRAY_SIZE(settings_map); j++) {
380
- if (0 == strcmp(channel_args->args[i].key,
381
- settings_map[j].channel_arg_name)) {
382
- if (!settings_map[j].availability[is_client]) {
383
- gpr_log(GPR_DEBUG, "%s is not available on %s",
384
- settings_map[j].channel_arg_name,
385
- is_client ? "clients" : "servers");
386
- } else {
387
- int value = grpc_channel_arg_get_integer(
388
- &channel_args->args[i], settings_map[j].integer_options);
389
- if (value >= 0) {
390
- queue_setting_update(t, settings_map[j].setting_id,
391
- static_cast<uint32_t>(value));
392
- }
393
- }
394
- break;
395
- }
396
- }
292
+ t->next_stream_id = static_cast<uint32_t>(initial_sequence_number);
397
293
  }
398
294
  }
399
- if (channelz_enabled) {
295
+
296
+ const int max_hpack_table_size =
297
+ channel_args.GetInt(GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER).value_or(-1);
298
+ if (max_hpack_table_size >= 0) {
299
+ t->hpack_compressor.SetMaxUsableSize(max_hpack_table_size);
300
+ }
301
+
302
+ t->ping_policy.max_pings_without_data =
303
+ std::max(0, channel_args.GetInt(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA)
304
+ .value_or(g_default_max_pings_without_data));
305
+ t->ping_policy.max_ping_strikes =
306
+ std::max(0, channel_args.GetInt(GRPC_ARG_HTTP2_MAX_PING_STRIKES)
307
+ .value_or(g_default_max_ping_strikes));
308
+ t->ping_policy.min_recv_ping_interval_without_data =
309
+ std::max(grpc_core::Duration::Zero(),
310
+ channel_args
311
+ .GetDurationFromIntMillis(
312
+ GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)
313
+ .value_or(grpc_core::Duration::Milliseconds(
314
+ g_default_min_recv_ping_interval_without_data_ms)));
315
+ t->write_buffer_size =
316
+ std::max(0, channel_args.GetInt(GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE)
317
+ .value_or(grpc_core::chttp2::kDefaultWindow));
318
+ t->keepalive_time =
319
+ std::max(grpc_core::Duration::Milliseconds(1),
320
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_KEEPALIVE_TIME_MS)
321
+ .value_or(grpc_core::Duration::Milliseconds(
322
+ t->is_client ? g_default_client_keepalive_time_ms
323
+ : g_default_server_keepalive_time_ms)));
324
+ t->keepalive_timeout = std::max(
325
+ grpc_core::Duration::Zero(),
326
+ channel_args.GetDurationFromIntMillis(GRPC_ARG_KEEPALIVE_TIMEOUT_MS)
327
+ .value_or(grpc_core::Duration::Milliseconds(
328
+ t->is_client ? g_default_client_keepalive_timeout_ms
329
+ : g_default_server_keepalive_timeout_ms)));
330
+ t->keepalive_permit_without_calls =
331
+ channel_args.GetBool(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS)
332
+ .value_or(false);
333
+ // Only send the prefered rx frame size http2 setting if we are instructed
334
+ // to auto size the buffers allocated at tcp level and we also can adjust
335
+ // sending frame size.
336
+ t->enable_preferred_rx_crypto_frame_advertisement =
337
+ channel_args
338
+ .GetBool(GRPC_ARG_EXPERIMENTAL_HTTP2_PREFERRED_CRYPTO_FRAME_SIZE)
339
+ .value_or(false);
340
+
341
+ if (channel_args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
342
+ .value_or(GRPC_ENABLE_CHANNELZ_DEFAULT)) {
400
343
  t->channelz_socket =
401
344
  grpc_core::MakeRefCounted<grpc_core::channelz::SocketNode>(
402
345
  std::string(grpc_endpoint_get_local_address(t->ep)), t->peer_string,
403
346
  absl::StrFormat("%s %s", get_vtable()->name, t->peer_string),
404
- grpc_core::channelz::SocketNode::Security::GetFromChannelArgs(
405
- channel_args));
347
+ channel_args
348
+ .GetObjectRef<grpc_core::channelz::SocketNode::Security>());
349
+ }
350
+
351
+ static const struct {
352
+ absl::string_view channel_arg_name;
353
+ grpc_chttp2_setting_id setting_id;
354
+ int default_value;
355
+ int min;
356
+ int max;
357
+ bool availability[2] /* server, client */;
358
+ } settings_map[] = {{GRPC_ARG_MAX_CONCURRENT_STREAMS,
359
+ GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS,
360
+ -1,
361
+ 0,
362
+ INT32_MAX,
363
+ {true, false}},
364
+ {GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER,
365
+ GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE,
366
+ -1,
367
+ 0,
368
+ INT32_MAX,
369
+ {true, true}},
370
+ {GRPC_ARG_MAX_METADATA_SIZE,
371
+ GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
372
+ -1,
373
+ 0,
374
+ INT32_MAX,
375
+ {true, true}},
376
+ {GRPC_ARG_HTTP2_MAX_FRAME_SIZE,
377
+ GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
378
+ -1,
379
+ 16384,
380
+ 16777215,
381
+ {true, true}},
382
+ {GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY,
383
+ GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA,
384
+ 1,
385
+ 0,
386
+ 1,
387
+ {true, true}},
388
+ {GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES,
389
+ GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
390
+ -1,
391
+ 5,
392
+ INT32_MAX,
393
+ {true, true}}};
394
+
395
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(settings_map); i++) {
396
+ const auto& setting = settings_map[i];
397
+ if (setting.availability[is_client]) {
398
+ const int value = channel_args.GetInt(setting.channel_arg_name)
399
+ .value_or(setting.default_value);
400
+ if (value >= 0) {
401
+ queue_setting_update(t, setting.setting_id,
402
+ grpc_core::Clamp(value, setting.min, setting.max));
403
+ }
404
+ } else if (channel_args.Contains(setting.channel_arg_name)) {
405
+ gpr_log(GPR_DEBUG, "%s is not available on %s",
406
+ std::string(setting.channel_arg_name).c_str(),
407
+ is_client ? "clients" : "servers");
408
+ }
409
+ }
410
+
411
+ if (t->enable_preferred_rx_crypto_frame_advertisement) {
412
+ const grpc_chttp2_setting_parameters* sp =
413
+ &grpc_chttp2_settings_parameters
414
+ [GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
415
+ queue_setting_update(
416
+ t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
417
+ grpc_core::Clamp(INT_MAX, static_cast<int>(sp->min_value),
418
+ static_cast<int>(sp->max_value)));
406
419
  }
407
- return enable_bdp;
408
420
  }
409
421
 
410
422
  static void init_transport_keepalive_settings(grpc_chttp2_transport* t) {
@@ -441,30 +453,35 @@ static void configure_transport_ping_policy(grpc_chttp2_transport* t) {
441
453
  g_default_min_recv_ping_interval_without_data_ms);
442
454
  }
443
455
 
444
- static void init_keepalive_pings_if_enabled(grpc_chttp2_transport* t) {
456
+ static void init_keepalive_pings_if_enabled_locked(
457
+ void* arg, GRPC_UNUSED grpc_error_handle error) {
458
+ GPR_DEBUG_ASSERT(error.ok());
459
+ grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
445
460
  if (t->keepalive_time != grpc_core::Duration::Infinity()) {
446
461
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
447
462
  GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
448
- GRPC_CLOSURE_INIT(&t->init_keepalive_ping_locked, init_keepalive_ping, t,
449
- grpc_schedule_on_exec_ctx);
450
- grpc_timer_init(&t->keepalive_ping_timer,
451
- grpc_core::ExecCtx::Get()->Now() + t->keepalive_time,
452
- &t->init_keepalive_ping_locked);
463
+ t->keepalive_ping_timer_handle =
464
+ t->event_engine->RunAfter(t->keepalive_time, [t] {
465
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
466
+ grpc_core::ExecCtx exec_ctx;
467
+ init_keepalive_ping(t);
468
+ });
453
469
  } else {
454
470
  // Use GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED to indicate there are no
455
- // inflight keeaplive timers
471
+ // inflight keepalive timers
456
472
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED;
457
473
  }
458
474
  }
459
475
 
460
476
  grpc_chttp2_transport::grpc_chttp2_transport(
461
- const grpc_channel_args* channel_args, grpc_endpoint* ep, bool is_client)
477
+ const grpc_core::ChannelArgs& channel_args, grpc_endpoint* ep,
478
+ bool is_client)
462
479
  : refs(1, GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_refcount)
463
480
  ? "chttp2_refcount"
464
481
  : nullptr),
465
482
  ep(ep),
466
483
  peer_string(grpc_endpoint_get_peer(ep)),
467
- memory_owner(grpc_core::ResourceQuotaFromChannelArgs(channel_args)
484
+ memory_owner(channel_args.GetObject<grpc_core::ResourceQuota>()
468
485
  ->memory_quota()
469
486
  ->CreateMemoryOwner(absl::StrCat(
470
487
  grpc_endpoint_get_peer(ep), ":client_transport"))),
@@ -475,7 +492,14 @@ grpc_chttp2_transport::grpc_chttp2_transport(
475
492
  GRPC_CHANNEL_READY),
476
493
  is_client(is_client),
477
494
  next_stream_id(is_client ? 1 : 2),
478
- deframe_state(is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0) {
495
+ flow_control(
496
+ peer_string.c_str(),
497
+ channel_args.GetBool(GRPC_ARG_HTTP2_BDP_PROBE).value_or(true),
498
+ &memory_owner),
499
+ deframe_state(is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0),
500
+ event_engine(
501
+ channel_args
502
+ .GetObjectRef<grpc_event_engine::experimental::EventEngine>()) {
479
503
  GPR_ASSERT(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
480
504
  GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
481
505
  base.vtable = get_vtable();
@@ -516,34 +540,24 @@ grpc_chttp2_transport::grpc_chttp2_transport(
516
540
  configure_transport_ping_policy(this);
517
541
  init_transport_keepalive_settings(this);
518
542
 
519
- bool enable_bdp = true;
520
- if (channel_args) {
521
- enable_bdp = read_channel_args(this, channel_args, is_client);
522
- }
523
-
524
- static const bool kEnableFlowControl =
525
- !GPR_GLOBAL_CONFIG_GET(grpc_experimental_disable_flow_control);
526
- if (kEnableFlowControl) {
527
- flow_control.Init<grpc_core::chttp2::TransportFlowControl>(this,
528
- enable_bdp);
529
- } else {
530
- flow_control.Init<grpc_core::chttp2::TransportFlowControlDisabled>(this);
531
- enable_bdp = false;
532
- }
543
+ read_channel_args(this, channel_args, is_client);
533
544
 
534
545
  // No pings allowed before receiving a header or data frame.
535
546
  ping_state.pings_before_data_required = 0;
536
- ping_state.is_delayed_ping_timer_set = false;
537
547
  ping_state.last_ping_sent_time = grpc_core::Timestamp::InfPast();
538
548
 
539
549
  ping_recv_state.last_ping_recv_time = grpc_core::Timestamp::InfPast();
540
550
  ping_recv_state.ping_strikes = 0;
541
551
 
542
- init_keepalive_pings_if_enabled(this);
552
+ grpc_core::ExecCtx exec_ctx;
553
+ combiner->Run(
554
+ GRPC_CLOSURE_INIT(&init_keepalive_ping_locked,
555
+ init_keepalive_pings_if_enabled_locked, this, nullptr),
556
+ absl::OkStatus());
543
557
 
544
- if (enable_bdp) {
558
+ if (flow_control.bdp_probe()) {
545
559
  bdp_ping_blocked = true;
546
- grpc_chttp2_act_on_flowctl_action(flow_control->PeriodicUpdate(), this,
560
+ grpc_chttp2_act_on_flowctl_action(flow_control.PeriodicUpdate(), this,
547
561
  nullptr);
548
562
  }
549
563
 
@@ -558,9 +572,9 @@ static void destroy_transport_locked(void* tp, grpc_error_handle /*error*/) {
558
572
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
559
573
  t->destroying = 1;
560
574
  close_transport_locked(
561
- t, grpc_error_set_int(
562
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed"),
563
- GRPC_ERROR_INT_OCCURRED_DURING_WRITE, t->write_state));
575
+ t, grpc_error_set_int(GRPC_ERROR_CREATE("Transport destroyed"),
576
+ grpc_core::StatusIntProperty::kOccurredDuringWrite,
577
+ t->write_state));
564
578
  t->memory_owner.Reset();
565
579
  // Must be the last line.
566
580
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "destroy");
@@ -569,45 +583,66 @@ static void destroy_transport_locked(void* tp, grpc_error_handle /*error*/) {
569
583
  static void destroy_transport(grpc_transport* gt) {
570
584
  grpc_chttp2_transport* t = reinterpret_cast<grpc_chttp2_transport*>(gt);
571
585
  t->combiner->Run(GRPC_CLOSURE_CREATE(destroy_transport_locked, t, nullptr),
572
- GRPC_ERROR_NONE);
586
+ absl::OkStatus());
573
587
  }
574
588
 
575
589
  static void close_transport_locked(grpc_chttp2_transport* t,
576
590
  grpc_error_handle error) {
577
- end_all_the_calls(t, GRPC_ERROR_REF(error));
578
- cancel_pings(t, GRPC_ERROR_REF(error));
579
- if (t->closed_with_error == GRPC_ERROR_NONE) {
591
+ end_all_the_calls(t, error);
592
+ cancel_pings(t, error);
593
+ if (t->closed_with_error.ok()) {
580
594
  if (!grpc_error_has_clear_grpc_status(error)) {
581
- error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS,
582
- GRPC_STATUS_UNAVAILABLE);
595
+ error =
596
+ grpc_error_set_int(error, grpc_core::StatusIntProperty::kRpcStatus,
597
+ GRPC_STATUS_UNAVAILABLE);
583
598
  }
584
599
  if (t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE) {
585
- if (t->close_transport_on_writes_finished == GRPC_ERROR_NONE) {
600
+ if (t->close_transport_on_writes_finished.ok()) {
586
601
  t->close_transport_on_writes_finished =
587
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
588
- "Delayed close due to in-progress write");
602
+ GRPC_ERROR_CREATE("Delayed close due to in-progress write");
589
603
  }
590
604
  t->close_transport_on_writes_finished =
591
605
  grpc_error_add_child(t->close_transport_on_writes_finished, error);
592
606
  return;
593
607
  }
594
- GPR_ASSERT(error != GRPC_ERROR_NONE);
595
- t->closed_with_error = GRPC_ERROR_REF(error);
608
+ GPR_ASSERT(!error.ok());
609
+ t->closed_with_error = error;
596
610
  connectivity_state_set(t, GRPC_CHANNEL_SHUTDOWN, absl::Status(),
597
611
  "close_transport");
598
- if (t->ping_state.is_delayed_ping_timer_set) {
599
- grpc_timer_cancel(&t->ping_state.delayed_ping_timer);
612
+ if (t->ping_state.delayed_ping_timer_handle.has_value()) {
613
+ if (t->event_engine->Cancel(*t->ping_state.delayed_ping_timer_handle)) {
614
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "retry_initiate_ping_locked");
615
+ t->ping_state.delayed_ping_timer_handle.reset();
616
+ }
600
617
  }
601
- if (t->have_next_bdp_ping_timer) {
602
- grpc_timer_cancel(&t->next_bdp_ping_timer);
618
+ if (t->next_bdp_ping_timer_handle.has_value()) {
619
+ if (t->event_engine->Cancel(*t->next_bdp_ping_timer_handle)) {
620
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "bdp_ping");
621
+ t->next_bdp_ping_timer_handle.reset();
622
+ }
603
623
  }
604
624
  switch (t->keepalive_state) {
605
625
  case GRPC_CHTTP2_KEEPALIVE_STATE_WAITING:
606
- grpc_timer_cancel(&t->keepalive_ping_timer);
626
+ if (t->keepalive_ping_timer_handle.has_value()) {
627
+ if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
628
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "init keepalive ping");
629
+ t->keepalive_ping_timer_handle.reset();
630
+ }
631
+ }
607
632
  break;
608
633
  case GRPC_CHTTP2_KEEPALIVE_STATE_PINGING:
609
- grpc_timer_cancel(&t->keepalive_ping_timer);
610
- grpc_timer_cancel(&t->keepalive_watchdog_timer);
634
+ if (t->keepalive_ping_timer_handle.has_value()) {
635
+ if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
636
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "init keepalive ping");
637
+ t->keepalive_ping_timer_handle.reset();
638
+ }
639
+ }
640
+ if (t->keepalive_watchdog_timer_handle.has_value()) {
641
+ if (t->event_engine->Cancel(*t->keepalive_watchdog_timer_handle)) {
642
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "keepalive watchdog");
643
+ t->keepalive_watchdog_timer_handle.reset();
644
+ }
645
+ }
611
646
  break;
612
647
  case GRPC_CHTTP2_KEEPALIVE_STATE_DYING:
613
648
  case GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED:
@@ -621,19 +656,17 @@ static void close_transport_locked(grpc_chttp2_transport* t,
621
656
  GRPC_CHTTP2_STREAM_UNREF(s, "chttp2_writing:close");
622
657
  }
623
658
  GPR_ASSERT(t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE);
624
- grpc_endpoint_shutdown(t->ep, GRPC_ERROR_REF(error));
659
+ grpc_endpoint_shutdown(t->ep, error);
625
660
  }
626
661
  if (t->notify_on_receive_settings != nullptr) {
627
662
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, t->notify_on_receive_settings,
628
- GRPC_ERROR_REF(error));
663
+ error);
629
664
  t->notify_on_receive_settings = nullptr;
630
665
  }
631
666
  if (t->notify_on_close != nullptr) {
632
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, t->notify_on_close,
633
- GRPC_ERROR_REF(error));
667
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, t->notify_on_close, error);
634
668
  t->notify_on_close = nullptr;
635
669
  }
636
- GRPC_ERROR_UNREF(error);
637
670
  }
638
671
 
639
672
  #ifndef NDEBUG
@@ -668,29 +701,27 @@ grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
668
701
  refcount(refcount),
669
702
  reffer(this),
670
703
  initial_metadata_buffer(arena),
671
- trailing_metadata_buffer(arena) {
704
+ trailing_metadata_buffer(arena),
705
+ flow_control(&t->flow_control) {
672
706
  if (server_data) {
673
707
  id = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(server_data));
708
+ if (grpc_http_trace.enabled()) {
709
+ gpr_log(GPR_DEBUG, "HTTP:%p/%p creating accept stream %d [from %p]", t,
710
+ this, id, server_data);
711
+ }
674
712
  *t->accepting_stream = this;
675
713
  grpc_chttp2_stream_map_add(&t->stream_map, id, this);
676
714
  post_destructive_reclaimer(t);
677
715
  }
678
- if (t->flow_control->flow_control_enabled()) {
679
- flow_control.Init<grpc_core::chttp2::StreamFlowControl>(
680
- static_cast<grpc_core::chttp2::TransportFlowControl*>(
681
- t->flow_control.get()),
682
- this);
683
- } else {
684
- flow_control.Init<grpc_core::chttp2::StreamFlowControlDisabled>();
685
- }
686
716
 
687
717
  grpc_slice_buffer_init(&frame_storage);
688
- grpc_slice_buffer_init(&unprocessed_incoming_frames_buffer);
689
718
  grpc_slice_buffer_init(&flow_controlled_buffer);
690
- GRPC_CLOSURE_INIT(&reset_byte_stream, ::reset_byte_stream, this, nullptr);
691
719
  }
692
720
 
693
721
  grpc_chttp2_stream::~grpc_chttp2_stream() {
722
+ grpc_chttp2_list_remove_stalled_by_stream(t, this);
723
+ grpc_chttp2_list_remove_stalled_by_transport(t, this);
724
+
694
725
  if (t->channelz_socket != nullptr) {
695
726
  if ((t->is_client && eos_received) || (!t->is_client && eos_sent)) {
696
727
  t->channelz_socket->RecordStreamSucceeded();
@@ -704,57 +735,48 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
704
735
  GPR_ASSERT(grpc_chttp2_stream_map_find(&t->stream_map, id) == nullptr);
705
736
  }
706
737
 
707
- grpc_slice_buffer_destroy_internal(&unprocessed_incoming_frames_buffer);
708
- grpc_slice_buffer_destroy_internal(&frame_storage);
738
+ grpc_slice_buffer_destroy(&frame_storage);
709
739
 
710
740
  for (int i = 0; i < STREAM_LIST_COUNT; i++) {
711
- if (GPR_UNLIKELY(included[i])) {
712
- gpr_log(GPR_ERROR, "%s stream %d still included in list %d",
713
- t->is_client ? "client" : "server", id, i);
714
- abort();
741
+ if (GPR_UNLIKELY(included.is_set(i))) {
742
+ grpc_core::Crash(absl::StrFormat("%s stream %d still included in list %d",
743
+ t->is_client ? "client" : "server", id,
744
+ i));
715
745
  }
716
746
  }
717
747
 
718
748
  GPR_ASSERT(send_initial_metadata_finished == nullptr);
719
- GPR_ASSERT(fetching_send_message == nullptr);
720
749
  GPR_ASSERT(send_trailing_metadata_finished == nullptr);
721
750
  GPR_ASSERT(recv_initial_metadata_ready == nullptr);
722
751
  GPR_ASSERT(recv_message_ready == nullptr);
723
752
  GPR_ASSERT(recv_trailing_metadata_finished == nullptr);
724
- grpc_slice_buffer_destroy_internal(&flow_controlled_buffer);
725
- GRPC_ERROR_UNREF(read_closed_error);
726
- GRPC_ERROR_UNREF(write_closed_error);
727
- GRPC_ERROR_UNREF(byte_stream_error);
728
- flow_control.Destroy();
753
+ grpc_slice_buffer_destroy(&flow_controlled_buffer);
729
754
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "stream");
730
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, destroy_stream_arg, GRPC_ERROR_NONE);
755
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, destroy_stream_arg, absl::OkStatus());
731
756
  }
732
757
 
733
758
  static int init_stream(grpc_transport* gt, grpc_stream* gs,
734
759
  grpc_stream_refcount* refcount, const void* server_data,
735
760
  grpc_core::Arena* arena) {
736
- GPR_TIMER_SCOPE("init_stream", 0);
737
761
  grpc_chttp2_transport* t = reinterpret_cast<grpc_chttp2_transport*>(gt);
738
762
  new (gs) grpc_chttp2_stream(t, refcount, server_data, arena);
739
763
  return 0;
740
764
  }
741
765
 
742
766
  static void destroy_stream_locked(void* sp, grpc_error_handle /*error*/) {
743
- GPR_TIMER_SCOPE("destroy_stream", 0);
744
767
  grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(sp);
745
768
  s->~grpc_chttp2_stream();
746
769
  }
747
770
 
748
771
  static void destroy_stream(grpc_transport* gt, grpc_stream* gs,
749
772
  grpc_closure* then_schedule_closure) {
750
- GPR_TIMER_SCOPE("destroy_stream", 0);
751
773
  grpc_chttp2_transport* t = reinterpret_cast<grpc_chttp2_transport*>(gt);
752
774
  grpc_chttp2_stream* s = reinterpret_cast<grpc_chttp2_stream*>(gs);
753
775
 
754
776
  s->destroy_stream_arg = then_schedule_closure;
755
777
  t->combiner->Run(
756
778
  GRPC_CLOSURE_INIT(&s->destroy_stream, destroy_stream_locked, s, nullptr),
757
- GRPC_ERROR_NONE);
779
+ absl::OkStatus());
758
780
  }
759
781
 
760
782
  grpc_chttp2_stream* grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport* t,
@@ -802,90 +824,18 @@ static void set_write_state(grpc_chttp2_transport* t,
802
824
  // from peer while we had some pending writes)
803
825
  if (st == GRPC_CHTTP2_WRITE_STATE_IDLE) {
804
826
  grpc_core::ExecCtx::RunList(DEBUG_LOCATION, &t->run_after_write);
805
- if (t->close_transport_on_writes_finished != GRPC_ERROR_NONE) {
827
+ if (!t->close_transport_on_writes_finished.ok()) {
806
828
  grpc_error_handle err = t->close_transport_on_writes_finished;
807
- t->close_transport_on_writes_finished = GRPC_ERROR_NONE;
829
+ t->close_transport_on_writes_finished = absl::OkStatus();
808
830
  close_transport_locked(t, err);
809
831
  }
810
832
  }
811
833
  }
812
834
 
813
- static void inc_initiate_write_reason(
814
- grpc_chttp2_initiate_write_reason reason) {
815
- switch (reason) {
816
- case GRPC_CHTTP2_INITIATE_WRITE_INITIAL_WRITE:
817
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_INITIAL_WRITE();
818
- break;
819
- case GRPC_CHTTP2_INITIATE_WRITE_START_NEW_STREAM:
820
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_START_NEW_STREAM();
821
- break;
822
- case GRPC_CHTTP2_INITIATE_WRITE_SEND_MESSAGE:
823
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_MESSAGE();
824
- break;
825
- case GRPC_CHTTP2_INITIATE_WRITE_SEND_INITIAL_METADATA:
826
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_INITIAL_METADATA();
827
- break;
828
- case GRPC_CHTTP2_INITIATE_WRITE_SEND_TRAILING_METADATA:
829
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_TRAILING_METADATA();
830
- break;
831
- case GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING:
832
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_RETRY_SEND_PING();
833
- break;
834
- case GRPC_CHTTP2_INITIATE_WRITE_CONTINUE_PINGS:
835
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_CONTINUE_PINGS();
836
- break;
837
- case GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT:
838
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_GOAWAY_SENT();
839
- break;
840
- case GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM:
841
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_RST_STREAM();
842
- break;
843
- case GRPC_CHTTP2_INITIATE_WRITE_CLOSE_FROM_API:
844
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_CLOSE_FROM_API();
845
- break;
846
- case GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL:
847
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_STREAM_FLOW_CONTROL();
848
- break;
849
- case GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL:
850
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_TRANSPORT_FLOW_CONTROL();
851
- break;
852
- case GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS:
853
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_SETTINGS();
854
- break;
855
- case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_SETTING:
856
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FLOW_CONTROL_UNSTALLED_BY_SETTING();
857
- break;
858
- case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_UPDATE:
859
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FLOW_CONTROL_UNSTALLED_BY_UPDATE();
860
- break;
861
- case GRPC_CHTTP2_INITIATE_WRITE_APPLICATION_PING:
862
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_APPLICATION_PING();
863
- break;
864
- case GRPC_CHTTP2_INITIATE_WRITE_BDP_PING:
865
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_BDP_ESTIMATOR_PING();
866
- break;
867
- case GRPC_CHTTP2_INITIATE_WRITE_KEEPALIVE_PING:
868
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_KEEPALIVE_PING();
869
- break;
870
- case GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL_UNSTALLED:
871
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_TRANSPORT_FLOW_CONTROL_UNSTALLED();
872
- break;
873
- case GRPC_CHTTP2_INITIATE_WRITE_PING_RESPONSE:
874
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_PING_RESPONSE();
875
- break;
876
- case GRPC_CHTTP2_INITIATE_WRITE_FORCE_RST_STREAM:
877
- GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FORCE_RST_STREAM();
878
- break;
879
- }
880
- }
881
-
882
835
  void grpc_chttp2_initiate_write(grpc_chttp2_transport* t,
883
836
  grpc_chttp2_initiate_write_reason reason) {
884
- GPR_TIMER_SCOPE("grpc_chttp2_initiate_write", 0);
885
-
886
837
  switch (t->write_state) {
887
838
  case GRPC_CHTTP2_WRITE_STATE_IDLE:
888
- inc_initiate_write_reason(reason);
889
839
  set_write_state(t, GRPC_CHTTP2_WRITE_STATE_WRITING,
890
840
  grpc_chttp2_initiate_write_reason_string(reason));
891
841
  GRPC_CHTTP2_REF_TRANSPORT(t, "writing");
@@ -908,7 +858,7 @@ void grpc_chttp2_initiate_write(grpc_chttp2_transport* t,
908
858
  t->combiner->FinallyRun(
909
859
  GRPC_CLOSURE_INIT(&t->write_action_begin_locked,
910
860
  write_action_begin_locked, t, nullptr),
911
- GRPC_ERROR_NONE);
861
+ absl::OkStatus());
912
862
  break;
913
863
  case GRPC_CHTTP2_WRITE_STATE_WRITING:
914
864
  set_write_state(t, GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE,
@@ -921,8 +871,7 @@ void grpc_chttp2_initiate_write(grpc_chttp2_transport* t,
921
871
 
922
872
  void grpc_chttp2_mark_stream_writable(grpc_chttp2_transport* t,
923
873
  grpc_chttp2_stream* s) {
924
- if (t->closed_with_error == GRPC_ERROR_NONE &&
925
- grpc_chttp2_list_add_writable_stream(t, s)) {
874
+ if (t->closed_with_error.ok() && grpc_chttp2_list_add_writable_stream(t, s)) {
926
875
  GRPC_CHTTP2_STREAM_REF(s, "chttp2_writing:become");
927
876
  }
928
877
  }
@@ -937,24 +886,20 @@ static const char* begin_writing_desc(bool partial) {
937
886
 
938
887
  static void write_action_begin_locked(void* gt,
939
888
  grpc_error_handle /*error_ignored*/) {
940
- GPR_TIMER_SCOPE("write_action_begin_locked", 0);
941
889
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(gt);
942
890
  GPR_ASSERT(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
943
891
  grpc_chttp2_begin_write_result r;
944
- if (t->closed_with_error != GRPC_ERROR_NONE) {
892
+ if (!t->closed_with_error.ok()) {
945
893
  r.writing = false;
946
894
  } else {
947
895
  r = grpc_chttp2_begin_write(t);
948
896
  }
949
897
  if (r.writing) {
950
- if (r.partial) {
951
- GRPC_STATS_INC_HTTP2_PARTIAL_WRITES();
952
- }
953
898
  set_write_state(t,
954
899
  r.partial ? GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE
955
900
  : GRPC_CHTTP2_WRITE_STATE_WRITING,
956
901
  begin_writing_desc(r.partial));
957
- write_action(t, GRPC_ERROR_NONE);
902
+ write_action(t, absl::OkStatus());
958
903
  if (t->reading_paused_on_pending_induced_frames) {
959
904
  GPR_ASSERT(t->num_pending_induced_frames == 0);
960
905
  // We had paused reading, because we had many induced frames (SETTINGS
@@ -969,49 +914,56 @@ static void write_action_begin_locked(void* gt,
969
914
  continue_read_action_locked(t);
970
915
  }
971
916
  } else {
972
- GRPC_STATS_INC_HTTP2_SPURIOUS_WRITES_BEGUN();
973
917
  set_write_state(t, GRPC_CHTTP2_WRITE_STATE_IDLE, "begin writing nothing");
974
918
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "writing");
975
919
  }
976
920
  }
977
921
 
978
922
  static void write_action(void* gt, grpc_error_handle /*error*/) {
979
- GPR_TIMER_SCOPE("write_action", 0);
980
923
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(gt);
981
924
  void* cl = t->cl;
982
925
  t->cl = nullptr;
926
+ // Choose max_frame_size as the prefered rx crypto frame size indicated by the
927
+ // peer.
928
+ int max_frame_size =
929
+ t->settings
930
+ [GRPC_PEER_SETTINGS]
931
+ [GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
932
+ // Note: max frame size is 0 if the remote peer does not support adjusting the
933
+ // sending frame size.
934
+ if (max_frame_size == 0) {
935
+ max_frame_size = INT_MAX;
936
+ }
983
937
  grpc_endpoint_write(
984
938
  t->ep, &t->outbuf,
985
939
  GRPC_CLOSURE_INIT(&t->write_action_end_locked, write_action_end, t,
986
940
  grpc_schedule_on_exec_ctx),
987
- cl);
941
+ cl, max_frame_size);
988
942
  }
989
943
 
990
944
  static void write_action_end(void* tp, grpc_error_handle error) {
991
945
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
992
946
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->write_action_end_locked,
993
947
  write_action_end_locked, t, nullptr),
994
- GRPC_ERROR_REF(error));
948
+ error);
995
949
  }
996
950
 
997
951
  // Callback from the grpc_endpoint after bytes have been written by calling
998
952
  // sendmsg
999
953
  static void write_action_end_locked(void* tp, grpc_error_handle error) {
1000
- GPR_TIMER_SCOPE("terminate_writing_with_lock", 0);
1001
954
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
1002
955
 
1003
956
  bool closed = false;
1004
- if (error != GRPC_ERROR_NONE) {
1005
- close_transport_locked(t, GRPC_ERROR_REF(error));
957
+ if (!error.ok()) {
958
+ close_transport_locked(t, error);
1006
959
  closed = true;
1007
960
  }
1008
961
 
1009
- if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED) {
1010
- t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SENT;
962
+ if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED) {
963
+ t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SENT;
1011
964
  closed = true;
1012
965
  if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) {
1013
- close_transport_locked(
1014
- t, GRPC_ERROR_CREATE_FROM_STATIC_STRING("goaway sent"));
966
+ close_transport_locked(t, GRPC_ERROR_CREATE("goaway sent"));
1015
967
  }
1016
968
  }
1017
969
 
@@ -1019,11 +971,9 @@ static void write_action_end_locked(void* tp, grpc_error_handle error) {
1019
971
  case GRPC_CHTTP2_WRITE_STATE_IDLE:
1020
972
  GPR_UNREACHABLE_CODE(break);
1021
973
  case GRPC_CHTTP2_WRITE_STATE_WRITING:
1022
- GPR_TIMER_MARK("state=writing", 0);
1023
974
  set_write_state(t, GRPC_CHTTP2_WRITE_STATE_IDLE, "finish writing");
1024
975
  break;
1025
976
  case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE:
1026
- GPR_TIMER_MARK("state=writing_stale_no_poller", 0);
1027
977
  set_write_state(t, GRPC_CHTTP2_WRITE_STATE_WRITING, "continue writing");
1028
978
  GRPC_CHTTP2_REF_TRANSPORT(t, "writing");
1029
979
  // If the transport is closed, we will retry writing on the endpoint
@@ -1037,11 +987,11 @@ static void write_action_end_locked(void* tp, grpc_error_handle error) {
1037
987
  t->combiner->FinallyRun(
1038
988
  GRPC_CLOSURE_INIT(&t->write_action_begin_locked,
1039
989
  write_action_begin_locked, t, nullptr),
1040
- GRPC_ERROR_NONE);
990
+ absl::OkStatus());
1041
991
  break;
1042
992
  }
1043
993
 
1044
- grpc_chttp2_end_write(t, GRPC_ERROR_REF(error));
994
+ grpc_chttp2_end_write(t, error);
1045
995
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "writing");
1046
996
  }
1047
997
 
@@ -1070,26 +1020,27 @@ static void cancel_unstarted_streams(grpc_chttp2_transport* t,
1070
1020
  s->trailing_metadata_buffer.Set(
1071
1021
  grpc_core::GrpcStreamNetworkState(),
1072
1022
  grpc_core::GrpcStreamNetworkState::kNotSentOnWire);
1073
- grpc_chttp2_cancel_stream(t, s, GRPC_ERROR_REF(error));
1023
+ grpc_chttp2_cancel_stream(t, s, error);
1074
1024
  }
1075
- GRPC_ERROR_UNREF(error);
1076
1025
  }
1077
1026
 
1078
1027
  void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1079
1028
  uint32_t goaway_error,
1080
1029
  uint32_t last_stream_id,
1081
1030
  absl::string_view goaway_text) {
1082
- // Discard the error from a previous goaway frame (if any)
1083
- if (t->goaway_error != GRPC_ERROR_NONE) {
1084
- GRPC_ERROR_UNREF(t->goaway_error);
1085
- }
1086
1031
  t->goaway_error = grpc_error_set_str(
1087
1032
  grpc_error_set_int(
1088
1033
  grpc_error_set_int(
1089
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("GOAWAY received"),
1090
- GRPC_ERROR_INT_HTTP2_ERROR, static_cast<intptr_t>(goaway_error)),
1091
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE),
1092
- GRPC_ERROR_STR_RAW_BYTES, goaway_text);
1034
+ grpc_core::StatusCreate(
1035
+ absl::StatusCode::kUnavailable,
1036
+ absl::StrFormat(
1037
+ "GOAWAY received; Error code: %u; Debug Text: %s",
1038
+ goaway_error, goaway_text),
1039
+ DEBUG_LOCATION, {}),
1040
+ grpc_core::StatusIntProperty::kHttp2Error,
1041
+ static_cast<intptr_t>(goaway_error)),
1042
+ grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE),
1043
+ grpc_core::StatusStrProperty::kRawBytes, goaway_text);
1093
1044
 
1094
1045
  GRPC_CHTTP2_IF_TRACING(
1095
1046
  gpr_log(GPR_INFO, "transport %p got goaway with last stream id %d", t,
@@ -1098,24 +1049,25 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1098
1049
  // received a GOAWAY with a non NO_ERROR code.
1099
1050
  if (goaway_error != GRPC_HTTP2_NO_ERROR) {
1100
1051
  gpr_log(GPR_INFO, "%s: Got goaway [%d] err=%s", t->peer_string.c_str(),
1101
- goaway_error, grpc_error_std_string(t->goaway_error).c_str());
1102
- }
1103
- cancel_unstarted_streams(t, GRPC_ERROR_REF(t->goaway_error));
1104
- // Cancel all unseen streams
1105
- grpc_chttp2_stream_map_for_each(
1106
- &t->stream_map,
1107
- [](void* user_data, uint32_t /* key */, void* stream) {
1108
- uint32_t last_stream_id = *(static_cast<uint32_t*>(user_data));
1109
- grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(stream);
1110
- if (s->id > last_stream_id) {
1111
- s->trailing_metadata_buffer.Set(
1112
- grpc_core::GrpcStreamNetworkState(),
1113
- grpc_core::GrpcStreamNetworkState::kNotSeenByServer);
1114
- grpc_chttp2_cancel_stream(s->t, s,
1115
- GRPC_ERROR_REF(s->t->goaway_error));
1116
- }
1117
- },
1118
- &last_stream_id);
1052
+ goaway_error, grpc_core::StatusToString(t->goaway_error).c_str());
1053
+ }
1054
+ if (t->is_client) {
1055
+ cancel_unstarted_streams(t, t->goaway_error);
1056
+ // Cancel all unseen streams
1057
+ grpc_chttp2_stream_map_for_each(
1058
+ &t->stream_map,
1059
+ [](void* user_data, uint32_t /* key */, void* stream) {
1060
+ uint32_t last_stream_id = *(static_cast<uint32_t*>(user_data));
1061
+ grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(stream);
1062
+ if (s->id > last_stream_id) {
1063
+ s->trailing_metadata_buffer.Set(
1064
+ grpc_core::GrpcStreamNetworkState(),
1065
+ grpc_core::GrpcStreamNetworkState::kNotSeenByServer);
1066
+ grpc_chttp2_cancel_stream(s->t, s, s->t->goaway_error);
1067
+ }
1068
+ },
1069
+ &last_stream_id);
1070
+ }
1119
1071
  absl::Status status = grpc_error_to_absl_status(t->goaway_error);
1120
1072
  // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug
1121
1073
  // data equal to "too_many_pings", it should log the occurrence at a log level
@@ -1125,16 +1077,18 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
1125
1077
  goaway_error == GRPC_HTTP2_ENHANCE_YOUR_CALM &&
1126
1078
  goaway_text == "too_many_pings")) {
1127
1079
  gpr_log(GPR_ERROR,
1128
- "Received a GOAWAY with error code ENHANCE_YOUR_CALM and debug "
1129
- "data equal to \"too_many_pings\"");
1130
- constexpr auto max_keepalive_time = grpc_core::Duration::Milliseconds(
1131
- INT_MAX / KEEPALIVE_TIME_BACKOFF_MULTIPLIER);
1132
- t->keepalive_time =
1133
- t->keepalive_time > max_keepalive_time
1134
- ? grpc_core::Duration::Infinity()
1135
- : t->keepalive_time * KEEPALIVE_TIME_BACKOFF_MULTIPLIER;
1080
+ "%s: Received a GOAWAY with error code ENHANCE_YOUR_CALM and debug "
1081
+ "data equal to \"too_many_pings\". Current keepalive time (before "
1082
+ "throttling): %s",
1083
+ t->peer_string.c_str(), t->keepalive_time.ToString().c_str());
1084
+ constexpr int max_keepalive_time_millis =
1085
+ INT_MAX / KEEPALIVE_TIME_BACKOFF_MULTIPLIER;
1086
+ int64_t throttled_keepalive_time =
1087
+ t->keepalive_time.millis() > max_keepalive_time_millis
1088
+ ? INT_MAX
1089
+ : t->keepalive_time.millis() * KEEPALIVE_TIME_BACKOFF_MULTIPLIER;
1136
1090
  status.SetPayload(grpc_core::kKeepaliveThrottlingKey,
1137
- absl::Cord(std::to_string(t->keepalive_time.millis())));
1091
+ absl::Cord(std::to_string(throttled_keepalive_time)));
1138
1092
  }
1139
1093
  // lie: use transient failure from the transport to indicate goaway has been
1140
1094
  // received.
@@ -1148,8 +1102,8 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
1148
1102
  grpc_chttp2_stream* s;
1149
1103
  // maybe cancel out streams that haven't yet started if we have received a
1150
1104
  // GOAWAY
1151
- if (t->goaway_error != GRPC_ERROR_NONE) {
1152
- cancel_unstarted_streams(t, GRPC_ERROR_REF(t->goaway_error));
1105
+ if (!t->goaway_error.ok()) {
1106
+ cancel_unstarted_streams(t, t->goaway_error);
1153
1107
  return;
1154
1108
  }
1155
1109
  // start streams where we have free grpc_chttp2_stream ids and free
@@ -1189,9 +1143,9 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
1189
1143
  grpc_core::GrpcStreamNetworkState::kNotSentOnWire);
1190
1144
  grpc_chttp2_cancel_stream(
1191
1145
  t, s,
1192
- grpc_error_set_int(
1193
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Stream IDs exhausted"),
1194
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
1146
+ grpc_error_set_int(GRPC_ERROR_CREATE("Stream IDs exhausted"),
1147
+ grpc_core::StatusIntProperty::kRpcStatus,
1148
+ GRPC_STATUS_UNAVAILABLE));
1195
1149
  }
1196
1150
  }
1197
1151
  }
@@ -1212,7 +1166,13 @@ static grpc_closure* add_closure_barrier(grpc_closure* closure) {
1212
1166
  static void null_then_sched_closure(grpc_closure** closure) {
1213
1167
  grpc_closure* c = *closure;
1214
1168
  *closure = nullptr;
1215
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, c, GRPC_ERROR_NONE);
1169
+ // null_then_schedule_closure might be run during a start_batch which might
1170
+ // subsequently examine the batch for more operations contained within.
1171
+ // However, the closure run might make it back to the call object, push a
1172
+ // completion, have the application see it, and make a new operation on the
1173
+ // call which recycles the batch BEFORE the call to start_batch completes,
1174
+ // forcing a race.
1175
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, c, absl::OkStatus());
1216
1176
  }
1217
1177
 
1218
1178
  void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
@@ -1223,7 +1183,6 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
1223
1183
  grpc_closure* closure = *pclosure;
1224
1184
  *pclosure = nullptr;
1225
1185
  if (closure == nullptr) {
1226
- GRPC_ERROR_UNREF(error);
1227
1186
  return;
1228
1187
  }
1229
1188
  closure->next_data.scratch -= CLOSURE_BARRIER_FIRST_REF_BIT;
@@ -1237,42 +1196,31 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
1237
1196
  CLOSURE_BARRIER_FIRST_REF_BIT),
1238
1197
  static_cast<int>(closure->next_data.scratch %
1239
1198
  CLOSURE_BARRIER_FIRST_REF_BIT),
1240
- desc, grpc_error_std_string(error).c_str(),
1199
+ desc, grpc_core::StatusToString(error).c_str(),
1241
1200
  write_state_name(t->write_state));
1242
1201
  }
1243
- if (error != GRPC_ERROR_NONE) {
1244
- #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1202
+ if (!error.ok()) {
1245
1203
  grpc_error_handle cl_err =
1246
1204
  grpc_core::internal::StatusMoveFromHeapPtr(closure->error_data.error);
1247
- #else
1248
- grpc_error_handle cl_err =
1249
- reinterpret_cast<grpc_error_handle>(closure->error_data.error);
1250
- #endif
1251
- if (cl_err == GRPC_ERROR_NONE) {
1252
- cl_err = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1253
- "Error in HTTP transport completing operation");
1254
- cl_err = grpc_error_set_str(cl_err, GRPC_ERROR_STR_TARGET_ADDRESS,
1255
- t->peer_string);
1205
+ if (cl_err.ok()) {
1206
+ cl_err = GRPC_ERROR_CREATE(absl::StrCat(
1207
+ "Error in HTTP transport completing operation: ", desc,
1208
+ " write_state=", write_state_name(t->write_state), " refs=",
1209
+ closure->next_data.scratch / CLOSURE_BARRIER_FIRST_REF_BIT, " flags=",
1210
+ closure->next_data.scratch % CLOSURE_BARRIER_FIRST_REF_BIT));
1211
+ cl_err = grpc_error_set_str(
1212
+ cl_err, grpc_core::StatusStrProperty::kTargetAddress, t->peer_string);
1256
1213
  }
1257
1214
  cl_err = grpc_error_add_child(cl_err, error);
1258
- #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1259
1215
  closure->error_data.error = grpc_core::internal::StatusAllocHeapPtr(cl_err);
1260
- #else
1261
- closure->error_data.error = reinterpret_cast<intptr_t>(cl_err);
1262
- #endif
1263
1216
  }
1264
1217
  if (closure->next_data.scratch < CLOSURE_BARRIER_FIRST_REF_BIT) {
1265
1218
  if ((t->write_state == GRPC_CHTTP2_WRITE_STATE_IDLE) ||
1266
1219
  !(closure->next_data.scratch & CLOSURE_BARRIER_MAY_COVER_WRITE)) {
1267
1220
  // Using GRPC_CLOSURE_SCHED instead of GRPC_CLOSURE_RUN to avoid running
1268
1221
  // closures earlier than when it is safe to do so.
1269
- #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1270
1222
  grpc_error_handle run_error =
1271
1223
  grpc_core::internal::StatusMoveFromHeapPtr(closure->error_data.error);
1272
- #else
1273
- grpc_error_handle run_error =
1274
- reinterpret_cast<grpc_error_handle>(closure->error_data.error);
1275
- #endif
1276
1224
  closure->error_data.error = 0;
1277
1225
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, run_error);
1278
1226
  } else {
@@ -1286,96 +1234,9 @@ static bool contains_non_ok_status(grpc_metadata_batch* batch) {
1286
1234
  GRPC_STATUS_OK;
1287
1235
  }
1288
1236
 
1289
- static void maybe_become_writable_due_to_send_msg(grpc_chttp2_transport* t,
1290
- grpc_chttp2_stream* s) {
1291
- if (s->id != 0 && (!s->write_buffering ||
1292
- s->flow_controlled_buffer.length > t->write_buffer_size)) {
1293
- grpc_chttp2_mark_stream_writable(t, s);
1294
- grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_SEND_MESSAGE);
1295
- }
1296
- }
1297
-
1298
- static void add_fetched_slice_locked(grpc_chttp2_transport* t,
1299
- grpc_chttp2_stream* s) {
1300
- s->fetched_send_message_length +=
1301
- static_cast<uint32_t> GRPC_SLICE_LENGTH(s->fetching_slice);
1302
- grpc_slice_buffer_add(&s->flow_controlled_buffer, s->fetching_slice);
1303
- maybe_become_writable_due_to_send_msg(t, s);
1304
- }
1305
-
1306
- static void continue_fetching_send_locked(grpc_chttp2_transport* t,
1307
- grpc_chttp2_stream* s) {
1308
- for (;;) {
1309
- if (s->fetching_send_message == nullptr) {
1310
- // Stream was cancelled before message fetch completed
1311
- abort(); /* TODO(ctiller): what cleanup here? */
1312
- }
1313
- if (s->fetched_send_message_length == s->fetching_send_message->length()) {
1314
- int64_t notify_offset = s->next_message_end_offset;
1315
- if (notify_offset <= s->flow_controlled_bytes_written) {
1316
- grpc_chttp2_complete_closure_step(
1317
- t, s, &s->fetching_send_message_finished, GRPC_ERROR_NONE,
1318
- "fetching_send_message_finished");
1319
- } else {
1320
- grpc_chttp2_write_cb* cb = t->write_cb_pool;
1321
- if (cb == nullptr) {
1322
- cb = static_cast<grpc_chttp2_write_cb*>(gpr_malloc(sizeof(*cb)));
1323
- } else {
1324
- t->write_cb_pool = cb->next;
1325
- }
1326
- cb->call_at_byte = notify_offset;
1327
- cb->closure = s->fetching_send_message_finished;
1328
- s->fetching_send_message_finished = nullptr;
1329
- grpc_chttp2_write_cb** list =
1330
- s->fetching_send_message->flags() & GRPC_WRITE_THROUGH
1331
- ? &s->on_write_finished_cbs
1332
- : &s->on_flow_controlled_cbs;
1333
- cb->next = *list;
1334
- *list = cb;
1335
- }
1336
- s->fetching_send_message.reset();
1337
- return; /* early out */
1338
- } else if (s->fetching_send_message->Next(
1339
- UINT32_MAX, GRPC_CLOSURE_INIT(&s->complete_fetch_locked,
1340
- ::complete_fetch, s,
1341
- grpc_schedule_on_exec_ctx))) {
1342
- grpc_error_handle error =
1343
- s->fetching_send_message->Pull(&s->fetching_slice);
1344
- if (error != GRPC_ERROR_NONE) {
1345
- s->fetching_send_message.reset();
1346
- grpc_chttp2_cancel_stream(t, s, error);
1347
- } else {
1348
- add_fetched_slice_locked(t, s);
1349
- }
1350
- }
1351
- }
1352
- }
1353
-
1354
- static void complete_fetch(void* gs, grpc_error_handle error) {
1355
- grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(gs);
1356
- s->t->combiner->Run(GRPC_CLOSURE_INIT(&s->complete_fetch_locked,
1357
- ::complete_fetch_locked, s, nullptr),
1358
- GRPC_ERROR_REF(error));
1359
- }
1360
-
1361
- static void complete_fetch_locked(void* gs, grpc_error_handle error) {
1362
- grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(gs);
1363
- grpc_chttp2_transport* t = s->t;
1364
- if (error == GRPC_ERROR_NONE) {
1365
- error = s->fetching_send_message->Pull(&s->fetching_slice);
1366
- if (error == GRPC_ERROR_NONE) {
1367
- add_fetched_slice_locked(t, s);
1368
- continue_fetching_send_locked(t, s);
1369
- }
1370
- }
1371
- if (error != GRPC_ERROR_NONE) {
1372
- s->fetching_send_message.reset();
1373
- grpc_chttp2_cancel_stream(t, s, error);
1374
- }
1375
- }
1376
-
1377
1237
  static void log_metadata(const grpc_metadata_batch* md_batch, uint32_t id,
1378
1238
  bool is_client, bool is_initial) {
1239
+ gpr_log(GPR_INFO, "--metadata--");
1379
1240
  const std::string prefix = absl::StrCat(
1380
1241
  "HTTP:", id, is_initial ? ":HDR" : ":TRL", is_client ? ":CLI:" : ":SVR:");
1381
1242
  md_batch->Log([&prefix](absl::string_view key, absl::string_view value) {
@@ -1385,8 +1246,6 @@ static void log_metadata(const grpc_metadata_batch* md_batch, uint32_t id,
1385
1246
 
1386
1247
  static void perform_stream_op_locked(void* stream_op,
1387
1248
  grpc_error_handle /*error_ignored*/) {
1388
- GPR_TIMER_SCOPE("perform_stream_op_locked", 0);
1389
-
1390
1249
  grpc_transport_stream_op_batch* op =
1391
1250
  static_cast<grpc_transport_stream_op_batch*>(stream_op);
1392
1251
  grpc_chttp2_stream* s =
@@ -1394,8 +1253,6 @@ static void perform_stream_op_locked(void* stream_op,
1394
1253
  grpc_transport_stream_op_batch_payload* op_payload = op->payload;
1395
1254
  grpc_chttp2_transport* t = s->t;
1396
1255
 
1397
- GRPC_STATS_INC_HTTP2_OP_BATCHES();
1398
-
1399
1256
  s->context = op->payload->context;
1400
1257
  s->traced = op->is_traced;
1401
1258
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
@@ -1423,7 +1280,6 @@ static void perform_stream_op_locked(void* stream_op,
1423
1280
  }
1424
1281
 
1425
1282
  if (op->cancel_stream) {
1426
- GRPC_STATS_INC_HTTP2_OP_CANCEL();
1427
1283
  grpc_chttp2_cancel_stream(t, s, op_payload->cancel_stream.cancel_error);
1428
1284
  }
1429
1285
 
@@ -1431,7 +1287,6 @@ static void perform_stream_op_locked(void* stream_op,
1431
1287
  if (t->is_client && t->channelz_socket != nullptr) {
1432
1288
  t->channelz_socket->RecordStreamStartedFromLocal();
1433
1289
  }
1434
- GRPC_STATS_INC_HTTP2_OP_SEND_INITIAL_METADATA();
1435
1290
  GPR_ASSERT(s->send_initial_metadata_finished == nullptr);
1436
1291
  on_complete->next_data.scratch |= CLOSURE_BARRIER_MAY_COVER_WRITE;
1437
1292
 
@@ -1449,7 +1304,7 @@ static void perform_stream_op_locked(void* stream_op,
1449
1304
  }
1450
1305
  if (!s->write_closed) {
1451
1306
  if (t->is_client) {
1452
- if (t->closed_with_error == GRPC_ERROR_NONE) {
1307
+ if (t->closed_with_error.ok()) {
1453
1308
  GPR_ASSERT(s->id == 0);
1454
1309
  grpc_chttp2_list_add_waiting_for_concurrency(t, s);
1455
1310
  maybe_start_some_streams(t);
@@ -1460,16 +1315,16 @@ static void perform_stream_op_locked(void* stream_op,
1460
1315
  grpc_chttp2_cancel_stream(
1461
1316
  t, s,
1462
1317
  grpc_error_set_int(
1463
- GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1464
- "Transport closed", &t->closed_with_error, 1),
1465
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
1318
+ GRPC_ERROR_CREATE_REFERENCING("Transport closed",
1319
+ &t->closed_with_error, 1),
1320
+ grpc_core::StatusIntProperty::kRpcStatus,
1321
+ GRPC_STATUS_UNAVAILABLE));
1466
1322
  }
1467
1323
  } else {
1468
1324
  GPR_ASSERT(s->id != 0);
1469
1325
  grpc_chttp2_mark_stream_writable(t, s);
1470
1326
  if (!(op->send_message &&
1471
- (op->payload->send_message.send_message->flags() &
1472
- GRPC_WRITE_BUFFER_HINT))) {
1327
+ (op->payload->send_message.flags & GRPC_WRITE_BUFFER_HINT))) {
1473
1328
  grpc_chttp2_initiate_write(
1474
1329
  t, GRPC_CHTTP2_INITIATE_WRITE_SEND_INITIAL_METADATA);
1475
1330
  }
@@ -1478,7 +1333,7 @@ static void perform_stream_op_locked(void* stream_op,
1478
1333
  s->send_initial_metadata = nullptr;
1479
1334
  grpc_chttp2_complete_closure_step(
1480
1335
  t, s, &s->send_initial_metadata_finished,
1481
- GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1336
+ GRPC_ERROR_CREATE_REFERENCING(
1482
1337
  "Attempt to send initial metadata after stream was closed",
1483
1338
  &s->write_closed_error, 1),
1484
1339
  "send_initial_metadata_finished");
@@ -1490,35 +1345,30 @@ static void perform_stream_op_locked(void* stream_op,
1490
1345
  }
1491
1346
 
1492
1347
  if (op->send_message) {
1493
- GRPC_STATS_INC_HTTP2_OP_SEND_MESSAGE();
1494
1348
  t->num_messages_in_next_write++;
1495
- GRPC_STATS_INC_HTTP2_SEND_MESSAGE_SIZE(
1496
- op->payload->send_message.send_message->length());
1349
+ grpc_core::global_stats().IncrementHttp2SendMessageSize(
1350
+ op->payload->send_message.send_message->Length());
1497
1351
  on_complete->next_data.scratch |= CLOSURE_BARRIER_MAY_COVER_WRITE;
1498
- s->fetching_send_message_finished = add_closure_barrier(op->on_complete);
1352
+ s->send_message_finished = add_closure_barrier(op->on_complete);
1353
+ const uint32_t flags = op_payload->send_message.flags;
1499
1354
  if (s->write_closed) {
1500
1355
  op->payload->send_message.stream_write_closed = true;
1501
1356
  // We should NOT return an error here, so as to avoid a cancel OP being
1502
1357
  // started. The surface layer will notice that the stream has been closed
1503
1358
  // for writes and fail the send message op.
1504
- op->payload->send_message.send_message.reset();
1505
- grpc_chttp2_complete_closure_step(
1506
- t, s, &s->fetching_send_message_finished, GRPC_ERROR_NONE,
1507
- "fetching_send_message_finished");
1359
+ grpc_chttp2_complete_closure_step(t, s, &s->send_message_finished,
1360
+ absl::OkStatus(),
1361
+ "fetching_send_message_finished");
1508
1362
  } else {
1509
- GPR_ASSERT(s->fetching_send_message == nullptr);
1510
1363
  uint8_t* frame_hdr = grpc_slice_buffer_tiny_add(
1511
1364
  &s->flow_controlled_buffer, GRPC_HEADER_SIZE_IN_BYTES);
1512
- uint32_t flags = op_payload->send_message.send_message->flags();
1513
1365
  frame_hdr[0] = (flags & GRPC_WRITE_INTERNAL_COMPRESS) != 0;
1514
- size_t len = op_payload->send_message.send_message->length();
1366
+ size_t len = op_payload->send_message.send_message->Length();
1515
1367
  frame_hdr[1] = static_cast<uint8_t>(len >> 24);
1516
1368
  frame_hdr[2] = static_cast<uint8_t>(len >> 16);
1517
1369
  frame_hdr[3] = static_cast<uint8_t>(len >> 8);
1518
1370
  frame_hdr[4] = static_cast<uint8_t>(len);
1519
- s->fetching_send_message =
1520
- std::move(op_payload->send_message.send_message);
1521
- s->fetched_send_message_length = 0;
1371
+
1522
1372
  s->next_message_end_offset =
1523
1373
  s->flow_controlled_bytes_written +
1524
1374
  static_cast<int64_t>(s->flow_controlled_buffer.length) +
@@ -1529,13 +1379,48 @@ static void perform_stream_op_locked(void* stream_op,
1529
1379
  } else {
1530
1380
  s->write_buffering = false;
1531
1381
  }
1532
- continue_fetching_send_locked(t, s);
1533
- maybe_become_writable_due_to_send_msg(t, s);
1382
+
1383
+ grpc_slice* const slices =
1384
+ op_payload->send_message.send_message->c_slice_buffer()->slices;
1385
+ grpc_slice* const end =
1386
+ slices + op_payload->send_message.send_message->Count();
1387
+ for (grpc_slice* slice = slices; slice != end; slice++) {
1388
+ grpc_slice_buffer_add(&s->flow_controlled_buffer,
1389
+ grpc_core::CSliceRef(*slice));
1390
+ }
1391
+
1392
+ int64_t notify_offset = s->next_message_end_offset;
1393
+ if (notify_offset <= s->flow_controlled_bytes_written) {
1394
+ grpc_chttp2_complete_closure_step(t, s, &s->send_message_finished,
1395
+ absl::OkStatus(),
1396
+ "fetching_send_message_finished");
1397
+ } else {
1398
+ grpc_chttp2_write_cb* cb = t->write_cb_pool;
1399
+ if (cb == nullptr) {
1400
+ cb = static_cast<grpc_chttp2_write_cb*>(gpr_malloc(sizeof(*cb)));
1401
+ } else {
1402
+ t->write_cb_pool = cb->next;
1403
+ }
1404
+ cb->call_at_byte = notify_offset;
1405
+ cb->closure = s->send_message_finished;
1406
+ s->send_message_finished = nullptr;
1407
+ grpc_chttp2_write_cb** list = flags & GRPC_WRITE_THROUGH
1408
+ ? &s->on_write_finished_cbs
1409
+ : &s->on_flow_controlled_cbs;
1410
+ cb->next = *list;
1411
+ *list = cb;
1412
+ }
1413
+
1414
+ if (s->id != 0 &&
1415
+ (!s->write_buffering ||
1416
+ s->flow_controlled_buffer.length > t->write_buffer_size)) {
1417
+ grpc_chttp2_mark_stream_writable(t, s);
1418
+ grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_SEND_MESSAGE);
1419
+ }
1534
1420
  }
1535
1421
  }
1536
1422
 
1537
1423
  if (op->send_trailing_metadata) {
1538
- GRPC_STATS_INC_HTTP2_OP_SEND_TRAILING_METADATA();
1539
1424
  GPR_ASSERT(s->send_trailing_metadata_finished == nullptr);
1540
1425
  on_complete->next_data.scratch |= CLOSURE_BARRIER_MAY_COVER_WRITE;
1541
1426
  s->send_trailing_metadata_finished = add_closure_barrier(on_complete);
@@ -1552,10 +1437,9 @@ static void perform_stream_op_locked(void* stream_op,
1552
1437
  grpc_chttp2_complete_closure_step(
1553
1438
  t, s, &s->send_trailing_metadata_finished,
1554
1439
  op->payload->send_trailing_metadata.send_trailing_metadata->empty()
1555
- ? GRPC_ERROR_NONE
1556
- : GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1557
- "Attempt to send trailing metadata after "
1558
- "stream was closed"),
1440
+ ? absl::OkStatus()
1441
+ : GRPC_ERROR_CREATE("Attempt to send trailing metadata after "
1442
+ "stream was closed"),
1559
1443
  "send_trailing_metadata_finished");
1560
1444
  } else if (s->id != 0) {
1561
1445
  // TODO(ctiller): check if there's flow control for any outstanding
@@ -1567,7 +1451,6 @@ static void perform_stream_op_locked(void* stream_op,
1567
1451
  }
1568
1452
 
1569
1453
  if (op->recv_initial_metadata) {
1570
- GRPC_STATS_INC_HTTP2_OP_RECV_INITIAL_METADATA();
1571
1454
  GPR_ASSERT(s->recv_initial_metadata_ready == nullptr);
1572
1455
  s->recv_initial_metadata_ready =
1573
1456
  op_payload->recv_initial_metadata.recv_initial_metadata_ready;
@@ -1575,6 +1458,9 @@ static void perform_stream_op_locked(void* stream_op,
1575
1458
  op_payload->recv_initial_metadata.recv_initial_metadata;
1576
1459
  s->trailing_metadata_available =
1577
1460
  op_payload->recv_initial_metadata.trailing_metadata_available;
1461
+ if (s->parsed_trailers_only && s->trailing_metadata_available != nullptr) {
1462
+ *s->trailing_metadata_available = true;
1463
+ }
1578
1464
  if (op_payload->recv_initial_metadata.peer_string != nullptr) {
1579
1465
  gpr_atm_rel_store(op_payload->recv_initial_metadata.peer_string,
1580
1466
  (gpr_atm)t->peer_string.c_str());
@@ -1583,33 +1469,17 @@ static void perform_stream_op_locked(void* stream_op,
1583
1469
  }
1584
1470
 
1585
1471
  if (op->recv_message) {
1586
- GRPC_STATS_INC_HTTP2_OP_RECV_MESSAGE();
1587
- size_t before = 0;
1588
1472
  GPR_ASSERT(s->recv_message_ready == nullptr);
1589
- GPR_ASSERT(!s->pending_byte_stream);
1590
1473
  s->recv_message_ready = op_payload->recv_message.recv_message_ready;
1591
1474
  s->recv_message = op_payload->recv_message.recv_message;
1475
+ s->recv_message->emplace();
1476
+ s->recv_message_flags = op_payload->recv_message.flags;
1592
1477
  s->call_failed_before_recv_message =
1593
1478
  op_payload->recv_message.call_failed_before_recv_message;
1594
- if (s->id != 0) {
1595
- if (!s->read_closed) {
1596
- before = s->frame_storage.length +
1597
- s->unprocessed_incoming_frames_buffer.length;
1598
- }
1599
- }
1600
- grpc_chttp2_maybe_complete_recv_message(t, s);
1601
- if (s->id != 0) {
1602
- if (!s->read_closed && s->frame_storage.length == 0) {
1603
- size_t after = s->unprocessed_incoming_frames_buffer_cached_length;
1604
- s->flow_control->IncomingByteStreamUpdate(GRPC_HEADER_SIZE_IN_BYTES,
1605
- before - after);
1606
- grpc_chttp2_act_on_flowctl_action(s->flow_control->MakeAction(), t, s);
1607
- }
1608
- }
1479
+ grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
1609
1480
  }
1610
1481
 
1611
1482
  if (op->recv_trailing_metadata) {
1612
- GRPC_STATS_INC_HTTP2_OP_RECV_TRAILING_METADATA();
1613
1483
  GPR_ASSERT(s->collecting_stats == nullptr);
1614
1484
  s->collecting_stats = op_payload->recv_trailing_metadata.collect_stats;
1615
1485
  GPR_ASSERT(s->recv_trailing_metadata_finished == nullptr);
@@ -1622,7 +1492,7 @@ static void perform_stream_op_locked(void* stream_op,
1622
1492
  }
1623
1493
 
1624
1494
  if (on_complete != nullptr) {
1625
- grpc_chttp2_complete_closure_step(t, s, &on_complete, GRPC_ERROR_NONE,
1495
+ grpc_chttp2_complete_closure_step(t, s, &on_complete, absl::OkStatus(),
1626
1496
  "op->on_complete");
1627
1497
  }
1628
1498
 
@@ -1631,7 +1501,6 @@ static void perform_stream_op_locked(void* stream_op,
1631
1501
 
1632
1502
  static void perform_stream_op(grpc_transport* gt, grpc_stream* gs,
1633
1503
  grpc_transport_stream_op_batch* op) {
1634
- GPR_TIMER_SCOPE("perform_stream_op", 0);
1635
1504
  grpc_chttp2_transport* t = reinterpret_cast<grpc_chttp2_transport*>(gt);
1636
1505
  grpc_chttp2_stream* s = reinterpret_cast<grpc_chttp2_stream*>(gs);
1637
1506
 
@@ -1657,49 +1526,46 @@ static void perform_stream_op(grpc_transport* gt, grpc_stream* gs,
1657
1526
  op->handler_private.extra_arg = gs;
1658
1527
  t->combiner->Run(GRPC_CLOSURE_INIT(&op->handler_private.closure,
1659
1528
  perform_stream_op_locked, op, nullptr),
1660
- GRPC_ERROR_NONE);
1529
+ absl::OkStatus());
1661
1530
  }
1662
1531
 
1663
1532
  static void cancel_pings(grpc_chttp2_transport* t, grpc_error_handle error) {
1664
1533
  // callback remaining pings: they're not allowed to call into the transport,
1665
1534
  // and maybe they hold resources that need to be freed
1666
1535
  grpc_chttp2_ping_queue* pq = &t->ping_queue;
1667
- GPR_ASSERT(error != GRPC_ERROR_NONE);
1536
+ GPR_ASSERT(!error.ok());
1668
1537
  for (size_t j = 0; j < GRPC_CHTTP2_PCL_COUNT; j++) {
1669
- grpc_closure_list_fail_all(&pq->lists[j], GRPC_ERROR_REF(error));
1538
+ grpc_closure_list_fail_all(&pq->lists[j], error);
1670
1539
  grpc_core::ExecCtx::RunList(DEBUG_LOCATION, &pq->lists[j]);
1671
1540
  }
1672
- GRPC_ERROR_UNREF(error);
1673
1541
  }
1674
1542
 
1675
1543
  static void send_ping_locked(grpc_chttp2_transport* t,
1676
1544
  grpc_closure* on_initiate, grpc_closure* on_ack) {
1677
- if (t->closed_with_error != GRPC_ERROR_NONE) {
1678
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_initiate,
1679
- GRPC_ERROR_REF(t->closed_with_error));
1680
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_ack,
1681
- GRPC_ERROR_REF(t->closed_with_error));
1545
+ if (!t->closed_with_error.ok()) {
1546
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_initiate, t->closed_with_error);
1547
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_ack, t->closed_with_error);
1682
1548
  return;
1683
1549
  }
1684
1550
  grpc_chttp2_ping_queue* pq = &t->ping_queue;
1685
1551
  grpc_closure_list_append(&pq->lists[GRPC_CHTTP2_PCL_INITIATE], on_initiate,
1686
- GRPC_ERROR_NONE);
1552
+ absl::OkStatus());
1687
1553
  grpc_closure_list_append(&pq->lists[GRPC_CHTTP2_PCL_NEXT], on_ack,
1688
- GRPC_ERROR_NONE);
1554
+ absl::OkStatus());
1689
1555
  }
1690
1556
 
1691
1557
  // Specialized form of send_ping_locked for keepalive ping. If there is already
1692
1558
  // a ping in progress, the keepalive ping would piggyback onto that ping,
1693
1559
  // instead of waiting for that ping to complete and then starting a new ping.
1694
1560
  static void send_keepalive_ping_locked(grpc_chttp2_transport* t) {
1695
- if (t->closed_with_error != GRPC_ERROR_NONE) {
1561
+ if (!t->closed_with_error.ok()) {
1696
1562
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->start_keepalive_ping_locked,
1697
1563
  start_keepalive_ping_locked, t, nullptr),
1698
- GRPC_ERROR_REF(t->closed_with_error));
1564
+ t->closed_with_error);
1699
1565
  t->combiner->Run(
1700
1566
  GRPC_CLOSURE_INIT(&t->finish_keepalive_ping_locked,
1701
1567
  finish_keepalive_ping_locked, t, nullptr),
1702
- GRPC_ERROR_REF(t->closed_with_error));
1568
+ t->closed_with_error);
1703
1569
  return;
1704
1570
  }
1705
1571
  grpc_chttp2_ping_queue* pq = &t->ping_queue;
@@ -1707,39 +1573,39 @@ static void send_keepalive_ping_locked(grpc_chttp2_transport* t) {
1707
1573
  // There is a ping in flight. Add yourself to the inflight closure list.
1708
1574
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->start_keepalive_ping_locked,
1709
1575
  start_keepalive_ping_locked, t, nullptr),
1710
- GRPC_ERROR_REF(t->closed_with_error));
1576
+ t->closed_with_error);
1711
1577
  grpc_closure_list_append(
1712
1578
  &pq->lists[GRPC_CHTTP2_PCL_INFLIGHT],
1713
1579
  GRPC_CLOSURE_INIT(&t->finish_keepalive_ping_locked,
1714
1580
  finish_keepalive_ping, t, grpc_schedule_on_exec_ctx),
1715
- GRPC_ERROR_NONE);
1581
+ absl::OkStatus());
1716
1582
  return;
1717
1583
  }
1718
1584
  grpc_closure_list_append(
1719
1585
  &pq->lists[GRPC_CHTTP2_PCL_INITIATE],
1720
1586
  GRPC_CLOSURE_INIT(&t->start_keepalive_ping_locked, start_keepalive_ping,
1721
1587
  t, grpc_schedule_on_exec_ctx),
1722
- GRPC_ERROR_NONE);
1588
+ absl::OkStatus());
1723
1589
  grpc_closure_list_append(
1724
1590
  &pq->lists[GRPC_CHTTP2_PCL_NEXT],
1725
1591
  GRPC_CLOSURE_INIT(&t->finish_keepalive_ping_locked, finish_keepalive_ping,
1726
1592
  t, grpc_schedule_on_exec_ctx),
1727
- GRPC_ERROR_NONE);
1593
+ absl::OkStatus());
1728
1594
  }
1729
1595
 
1730
- void grpc_chttp2_retry_initiate_ping(void* tp, grpc_error_handle error) {
1731
- grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
1596
+ void grpc_chttp2_retry_initiate_ping(grpc_chttp2_transport* t) {
1732
1597
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->retry_initiate_ping_locked,
1733
1598
  retry_initiate_ping_locked, t, nullptr),
1734
- GRPC_ERROR_REF(error));
1599
+ absl::OkStatus());
1735
1600
  }
1736
1601
 
1737
- static void retry_initiate_ping_locked(void* tp, grpc_error_handle error) {
1602
+ static void retry_initiate_ping_locked(void* tp,
1603
+ GRPC_UNUSED grpc_error_handle error) {
1604
+ GPR_DEBUG_ASSERT(error.ok());
1738
1605
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
1739
- t->ping_state.is_delayed_ping_timer_set = false;
1740
- if (error == GRPC_ERROR_NONE) {
1741
- grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING);
1742
- }
1606
+ GPR_ASSERT(t->ping_state.delayed_ping_timer_handle.has_value());
1607
+ t->ping_state.delayed_ping_timer_handle.reset();
1608
+ grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING);
1743
1609
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "retry_initiate_ping_locked");
1744
1610
  }
1745
1611
 
@@ -1757,34 +1623,144 @@ void grpc_chttp2_ack_ping(grpc_chttp2_transport* t, uint64_t id) {
1757
1623
  }
1758
1624
  }
1759
1625
 
1760
- static void send_goaway(grpc_chttp2_transport* t, grpc_error_handle error) {
1761
- // We want to log this irrespective of whether http tracing is enabled
1762
- gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(),
1763
- grpc_error_std_string(error).c_str());
1764
- t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED;
1626
+ namespace {
1627
+
1628
+ // Fire and forget (deletes itself on completion). Does a graceful shutdown by
1629
+ // sending a GOAWAY frame with the last stream id set to 2^31-1, sending a ping
1630
+ // and waiting for an ack (effective waiting for an RTT) and then sending a
1631
+ // final GOAWAY freame with an updated last stream identifier. This helps ensure
1632
+ // that a connection can be cleanly shut down without losing requests.
1633
+ // In the event, that the client does not respond to the ping for some reason,
1634
+ // we add a 20 second deadline, after which we send the second goaway.
1635
+ class GracefulGoaway : public grpc_core::RefCounted<GracefulGoaway> {
1636
+ public:
1637
+ static void Start(grpc_chttp2_transport* t) { new GracefulGoaway(t); }
1638
+
1639
+ ~GracefulGoaway() override {
1640
+ GRPC_CHTTP2_UNREF_TRANSPORT(t_, "graceful goaway");
1641
+ }
1642
+
1643
+ private:
1644
+ explicit GracefulGoaway(grpc_chttp2_transport* t) : t_(t) {
1645
+ t->sent_goaway_state = GRPC_CHTTP2_GRACEFUL_GOAWAY;
1646
+ GRPC_CHTTP2_REF_TRANSPORT(t_, "graceful goaway");
1647
+ grpc_chttp2_goaway_append((1u << 31) - 1, 0, grpc_empty_slice(), &t->qbuf);
1648
+ send_ping_locked(
1649
+ t, nullptr, GRPC_CLOSURE_INIT(&on_ping_ack_, OnPingAck, this, nullptr));
1650
+ grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT);
1651
+ Ref().release(); // Ref for the timer
1652
+ grpc_timer_init(
1653
+ &timer_, grpc_core::Timestamp::Now() + grpc_core::Duration::Seconds(20),
1654
+ GRPC_CLOSURE_INIT(&on_timer_, OnTimer, this, nullptr));
1655
+ }
1656
+
1657
+ void MaybeSendFinalGoawayLocked() {
1658
+ if (t_->sent_goaway_state != GRPC_CHTTP2_GRACEFUL_GOAWAY) {
1659
+ // We already sent the final GOAWAY.
1660
+ return;
1661
+ }
1662
+ if (t_->destroying || !t_->closed_with_error.ok()) {
1663
+ GRPC_CHTTP2_IF_TRACING(gpr_log(
1664
+ GPR_INFO,
1665
+ "transport:%p %s peer:%s Transport already shutting down. "
1666
+ "Graceful GOAWAY abandoned.",
1667
+ t_, t_->is_client ? "CLIENT" : "SERVER", t_->peer_string.c_str()));
1668
+ return;
1669
+ }
1670
+ // Ping completed. Send final goaway.
1671
+ GRPC_CHTTP2_IF_TRACING(
1672
+ gpr_log(GPR_INFO,
1673
+ "transport:%p %s peer:%s Graceful shutdown: Ping received. "
1674
+ "Sending final GOAWAY with stream_id:%d",
1675
+ t_, t_->is_client ? "CLIENT" : "SERVER",
1676
+ t_->peer_string.c_str(), t_->last_new_stream_id));
1677
+ t_->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED;
1678
+ grpc_chttp2_goaway_append(t_->last_new_stream_id, 0, grpc_empty_slice(),
1679
+ &t_->qbuf);
1680
+ grpc_chttp2_initiate_write(t_, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT);
1681
+ }
1682
+
1683
+ static void OnPingAck(void* arg, grpc_error_handle /* error */) {
1684
+ auto* self = static_cast<GracefulGoaway*>(arg);
1685
+ self->t_->combiner->Run(
1686
+ GRPC_CLOSURE_INIT(&self->on_ping_ack_, OnPingAckLocked, self, nullptr),
1687
+ absl::OkStatus());
1688
+ }
1689
+
1690
+ static void OnPingAckLocked(void* arg, grpc_error_handle /* error */) {
1691
+ auto* self = static_cast<GracefulGoaway*>(arg);
1692
+ grpc_timer_cancel(&self->timer_);
1693
+ self->MaybeSendFinalGoawayLocked();
1694
+ self->Unref();
1695
+ }
1696
+
1697
+ static void OnTimer(void* arg, grpc_error_handle error) {
1698
+ auto* self = static_cast<GracefulGoaway*>(arg);
1699
+ if (!error.ok()) {
1700
+ self->Unref();
1701
+ return;
1702
+ }
1703
+ self->t_->combiner->Run(
1704
+ GRPC_CLOSURE_INIT(&self->on_timer_, OnTimerLocked, self, nullptr),
1705
+ absl::OkStatus());
1706
+ }
1707
+
1708
+ static void OnTimerLocked(void* arg, grpc_error_handle /* error */) {
1709
+ auto* self = static_cast<GracefulGoaway*>(arg);
1710
+ self->MaybeSendFinalGoawayLocked();
1711
+ self->Unref();
1712
+ }
1713
+
1714
+ grpc_chttp2_transport* t_;
1715
+ grpc_closure on_ping_ack_;
1716
+ grpc_timer timer_;
1717
+ grpc_closure on_timer_;
1718
+ };
1719
+
1720
+ } // namespace
1721
+
1722
+ static void send_goaway(grpc_chttp2_transport* t, grpc_error_handle error,
1723
+ bool immediate_disconnect_hint) {
1765
1724
  grpc_http2_error_code http_error;
1766
1725
  std::string message;
1767
1726
  grpc_error_get_status(error, grpc_core::Timestamp::InfFuture(), nullptr,
1768
1727
  &message, &http_error, nullptr);
1769
- grpc_chttp2_goaway_append(
1770
- t->last_new_stream_id, static_cast<uint32_t>(http_error),
1771
- grpc_slice_from_cpp_string(std::move(message)), &t->qbuf);
1728
+ if (!t->is_client && http_error == GRPC_HTTP2_NO_ERROR &&
1729
+ !immediate_disconnect_hint) {
1730
+ // Do a graceful shutdown.
1731
+ if (t->sent_goaway_state == GRPC_CHTTP2_NO_GOAWAY_SEND) {
1732
+ GracefulGoaway::Start(t);
1733
+ } else {
1734
+ // Graceful GOAWAY is already in progress.
1735
+ }
1736
+ } else if (t->sent_goaway_state == GRPC_CHTTP2_NO_GOAWAY_SEND ||
1737
+ t->sent_goaway_state == GRPC_CHTTP2_GRACEFUL_GOAWAY) {
1738
+ // We want to log this irrespective of whether http tracing is enabled
1739
+ gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(),
1740
+ grpc_core::StatusToString(error).c_str());
1741
+ t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED;
1742
+ grpc_chttp2_goaway_append(
1743
+ t->last_new_stream_id, static_cast<uint32_t>(http_error),
1744
+ grpc_slice_from_cpp_string(std::move(message)), &t->qbuf);
1745
+ } else {
1746
+ // Final GOAWAY has already been sent.
1747
+ }
1772
1748
  grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT);
1773
- GRPC_ERROR_UNREF(error);
1774
1749
  }
1775
1750
 
1776
1751
  void grpc_chttp2_add_ping_strike(grpc_chttp2_transport* t) {
1777
1752
  if (++t->ping_recv_state.ping_strikes > t->ping_policy.max_ping_strikes &&
1778
1753
  t->ping_policy.max_ping_strikes != 0) {
1779
1754
  send_goaway(t,
1780
- grpc_error_set_int(
1781
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("too_many_pings"),
1782
- GRPC_ERROR_INT_HTTP2_ERROR, GRPC_HTTP2_ENHANCE_YOUR_CALM));
1755
+ grpc_error_set_int(GRPC_ERROR_CREATE("too_many_pings"),
1756
+ grpc_core::StatusIntProperty::kHttp2Error,
1757
+ GRPC_HTTP2_ENHANCE_YOUR_CALM),
1758
+ /*immediate_disconnect_hint=*/true);
1783
1759
  // The transport will be closed after the write is done
1784
1760
  close_transport_locked(
1785
- t, grpc_error_set_int(
1786
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Too many pings"),
1787
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
1761
+ t, grpc_error_set_int(GRPC_ERROR_CREATE("Too many pings"),
1762
+ grpc_core::StatusIntProperty::kRpcStatus,
1763
+ GRPC_STATUS_UNAVAILABLE));
1788
1764
  }
1789
1765
  }
1790
1766
 
@@ -1803,8 +1779,8 @@ static void perform_transport_op_locked(void* stream_op,
1803
1779
  grpc_chttp2_transport* t =
1804
1780
  static_cast<grpc_chttp2_transport*>(op->handler_private.extra_arg);
1805
1781
 
1806
- if (op->goaway_error != GRPC_ERROR_NONE) {
1807
- send_goaway(t, op->goaway_error);
1782
+ if (!op->goaway_error.ok()) {
1783
+ send_goaway(t, op->goaway_error, /*immediate_disconnect_hint=*/false);
1808
1784
  }
1809
1785
 
1810
1786
  if (op->set_accept_stream) {
@@ -1833,11 +1809,13 @@ static void perform_transport_op_locked(void* stream_op,
1833
1809
  t->state_tracker.RemoveWatcher(op->stop_connectivity_watch);
1834
1810
  }
1835
1811
 
1836
- if (op->disconnect_with_error != GRPC_ERROR_NONE) {
1812
+ if (!op->disconnect_with_error.ok()) {
1813
+ send_goaway(t, op->disconnect_with_error,
1814
+ /*immediate_disconnect_hint=*/true);
1837
1815
  close_transport_locked(t, op->disconnect_with_error);
1838
1816
  }
1839
1817
 
1840
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->on_consumed, GRPC_ERROR_NONE);
1818
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->on_consumed, absl::OkStatus());
1841
1819
 
1842
1820
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "transport_op");
1843
1821
  }
@@ -1852,25 +1830,22 @@ static void perform_transport_op(grpc_transport* gt, grpc_transport_op* op) {
1852
1830
  GRPC_CHTTP2_REF_TRANSPORT(t, "transport_op");
1853
1831
  t->combiner->Run(GRPC_CLOSURE_INIT(&op->handler_private.closure,
1854
1832
  perform_transport_op_locked, op, nullptr),
1855
- GRPC_ERROR_NONE);
1833
+ absl::OkStatus());
1856
1834
  }
1857
1835
 
1858
1836
  //
1859
1837
  // INPUT PROCESSING - GENERAL
1860
1838
  //
1861
1839
 
1862
- void grpc_chttp2_maybe_complete_recv_initial_metadata(
1863
- grpc_chttp2_transport* /*t*/, grpc_chttp2_stream* s) {
1840
+ void grpc_chttp2_maybe_complete_recv_initial_metadata(grpc_chttp2_transport* t,
1841
+ grpc_chttp2_stream* s) {
1864
1842
  if (s->recv_initial_metadata_ready != nullptr &&
1865
1843
  s->published_metadata[0] != GRPC_METADATA_NOT_PUBLISHED) {
1866
1844
  if (s->seen_error) {
1867
- grpc_slice_buffer_reset_and_unref_internal(&s->frame_storage);
1868
- if (!s->pending_byte_stream) {
1869
- grpc_slice_buffer_reset_and_unref_internal(
1870
- &s->unprocessed_incoming_frames_buffer);
1871
- }
1845
+ grpc_slice_buffer_reset_and_unref(&s->frame_storage);
1872
1846
  }
1873
1847
  *s->recv_initial_metadata = std::move(s->initial_metadata_buffer);
1848
+ s->recv_initial_metadata->Set(grpc_core::PeerString(), t->peer_string);
1874
1849
  // If we didn't receive initial metadata from the wire and instead faked a
1875
1850
  // status (due to stream cancellations for example), let upper layers know
1876
1851
  // that trailing metadata is immediately available.
@@ -1884,88 +1859,108 @@ void grpc_chttp2_maybe_complete_recv_initial_metadata(
1884
1859
  }
1885
1860
  }
1886
1861
 
1887
- void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* /*t*/,
1862
+ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
1888
1863
  grpc_chttp2_stream* s) {
1889
- grpc_error_handle error = GRPC_ERROR_NONE;
1890
- if (s->recv_message_ready != nullptr) {
1891
- *s->recv_message = nullptr;
1892
- if (s->final_metadata_requested && s->seen_error) {
1893
- grpc_slice_buffer_reset_and_unref_internal(&s->frame_storage);
1894
- if (!s->pending_byte_stream) {
1895
- grpc_slice_buffer_reset_and_unref_internal(
1896
- &s->unprocessed_incoming_frames_buffer);
1897
- }
1864
+ if (s->recv_message_ready == nullptr) return;
1865
+
1866
+ grpc_core::chttp2::StreamFlowControl::IncomingUpdateContext upd(
1867
+ &s->flow_control);
1868
+ grpc_error_handle error;
1869
+
1870
+ // Lambda is immediately invoked as a big scoped section that can be
1871
+ // exited out of at any point by returning.
1872
+ [&]() {
1873
+ if (grpc_http_trace.enabled()) {
1874
+ gpr_log(GPR_DEBUG,
1875
+ "maybe_complete_recv_message %p final_metadata_requested=%d "
1876
+ "seen_error=%d",
1877
+ s, s->final_metadata_requested, s->seen_error);
1898
1878
  }
1899
- if (!s->pending_byte_stream) {
1900
- while (s->unprocessed_incoming_frames_buffer.length > 0 ||
1901
- s->frame_storage.length > 0) {
1902
- if (s->unprocessed_incoming_frames_buffer.length == 0) {
1903
- grpc_slice_buffer_swap(&s->unprocessed_incoming_frames_buffer,
1904
- &s->frame_storage);
1905
- }
1906
- error = grpc_deframe_unprocessed_incoming_frames(
1907
- &s->data_parser, s, &s->unprocessed_incoming_frames_buffer, nullptr,
1908
- s->recv_message);
1909
- if (error != GRPC_ERROR_NONE) {
1910
- s->seen_error = true;
1911
- grpc_slice_buffer_reset_and_unref_internal(&s->frame_storage);
1912
- grpc_slice_buffer_reset_and_unref_internal(
1913
- &s->unprocessed_incoming_frames_buffer);
1914
- break;
1915
- } else if (*s->recv_message != nullptr) {
1916
- break;
1879
+ if (s->final_metadata_requested && s->seen_error) {
1880
+ grpc_slice_buffer_reset_and_unref(&s->frame_storage);
1881
+ s->recv_message->reset();
1882
+ } else {
1883
+ if (s->frame_storage.length != 0) {
1884
+ while (true) {
1885
+ GPR_ASSERT(s->frame_storage.length > 0);
1886
+ int64_t min_progress_size;
1887
+ auto r = grpc_deframe_unprocessed_incoming_frames(
1888
+ s, &min_progress_size, &**s->recv_message, s->recv_message_flags);
1889
+ if (grpc_http_trace.enabled()) {
1890
+ gpr_log(GPR_DEBUG, "Deframe data frame: %s",
1891
+ grpc_core::PollToString(r, [](absl::Status r) {
1892
+ return r.ToString();
1893
+ }).c_str());
1894
+ }
1895
+ if (r.pending()) {
1896
+ if (s->read_closed) {
1897
+ grpc_slice_buffer_reset_and_unref(&s->frame_storage);
1898
+ s->recv_message->reset();
1899
+ break;
1900
+ } else {
1901
+ upd.SetMinProgressSize(min_progress_size);
1902
+ return; // Out of lambda to enclosing function
1903
+ }
1904
+ } else {
1905
+ error = std::move(r.value());
1906
+ if (!error.ok()) {
1907
+ s->seen_error = true;
1908
+ grpc_slice_buffer_reset_and_unref(&s->frame_storage);
1909
+ break;
1910
+ } else {
1911
+ if (t->channelz_socket != nullptr) {
1912
+ t->channelz_socket->RecordMessageReceived();
1913
+ }
1914
+ break;
1915
+ }
1916
+ }
1917
1917
  }
1918
+ } else if (s->read_closed) {
1919
+ s->recv_message->reset();
1920
+ } else {
1921
+ upd.SetMinProgressSize(GRPC_HEADER_SIZE_IN_BYTES);
1922
+ return; // Out of lambda to enclosing function
1918
1923
  }
1919
1924
  }
1920
1925
  // save the length of the buffer before handing control back to application
1921
1926
  // threads. Needed to support correct flow control bookkeeping
1922
- s->unprocessed_incoming_frames_buffer_cached_length =
1923
- s->unprocessed_incoming_frames_buffer.length;
1924
- if (error == GRPC_ERROR_NONE && *s->recv_message != nullptr) {
1927
+ if (error.ok() && s->recv_message->has_value()) {
1925
1928
  null_then_sched_closure(&s->recv_message_ready);
1926
1929
  } else if (s->published_metadata[1] != GRPC_METADATA_NOT_PUBLISHED) {
1927
- *s->recv_message = nullptr;
1928
1930
  if (s->call_failed_before_recv_message != nullptr) {
1929
1931
  *s->call_failed_before_recv_message =
1930
1932
  (s->published_metadata[1] != GRPC_METADATA_PUBLISHED_AT_CLOSE);
1931
1933
  }
1932
1934
  null_then_sched_closure(&s->recv_message_ready);
1933
1935
  }
1934
- GRPC_ERROR_UNREF(error);
1935
- }
1936
+ }();
1937
+
1938
+ upd.SetPendingSize(s->frame_storage.length);
1939
+ grpc_chttp2_act_on_flowctl_action(upd.MakeAction(), t, s);
1936
1940
  }
1937
1941
 
1938
1942
  void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_chttp2_transport* t,
1939
1943
  grpc_chttp2_stream* s) {
1940
1944
  grpc_chttp2_maybe_complete_recv_message(t, s);
1945
+ if (grpc_http_trace.enabled()) {
1946
+ gpr_log(GPR_DEBUG,
1947
+ "maybe_complete_recv_trailing_metadata cli=%d s=%p closure=%p "
1948
+ "read_closed=%d "
1949
+ "write_closed=%d %" PRIdPTR,
1950
+ t->is_client, s, s->recv_trailing_metadata_finished, s->read_closed,
1951
+ s->write_closed, s->frame_storage.length);
1952
+ }
1941
1953
  if (s->recv_trailing_metadata_finished != nullptr && s->read_closed &&
1942
1954
  s->write_closed) {
1943
1955
  if (s->seen_error || !t->is_client) {
1944
- grpc_slice_buffer_reset_and_unref_internal(&s->frame_storage);
1945
- if (!s->pending_byte_stream) {
1946
- grpc_slice_buffer_reset_and_unref_internal(
1947
- &s->unprocessed_incoming_frames_buffer);
1948
- }
1949
- }
1950
- bool pending_data = s->pending_byte_stream ||
1951
- s->unprocessed_incoming_frames_buffer.length > 0;
1952
- if (s->read_closed && s->frame_storage.length > 0 && !pending_data &&
1953
- !s->seen_error && s->recv_trailing_metadata_finished != nullptr) {
1954
- // Maybe some SYNC_FLUSH data is left in frame_storage. Consume them and
1955
- // maybe decompress the next 5 bytes in the stream.
1956
- grpc_slice_buffer_move_first(
1957
- &s->frame_storage,
1958
- std::min(s->frame_storage.length, size_t(GRPC_HEADER_SIZE_IN_BYTES)),
1959
- &s->unprocessed_incoming_frames_buffer);
1960
- if (s->unprocessed_incoming_frames_buffer.length > 0) {
1961
- pending_data = true;
1962
- }
1956
+ grpc_slice_buffer_reset_and_unref(&s->frame_storage);
1963
1957
  }
1964
- if (s->read_closed && s->frame_storage.length == 0 && !pending_data &&
1958
+ if (s->read_closed && s->frame_storage.length == 0 &&
1965
1959
  s->recv_trailing_metadata_finished != nullptr) {
1966
1960
  grpc_transport_move_stats(&s->stats, s->collecting_stats);
1967
1961
  s->collecting_stats = nullptr;
1968
1962
  *s->recv_trailing_metadata = std::move(s->trailing_metadata_buffer);
1963
+ s->recv_trailing_metadata->Set(grpc_core::PeerString(), t->peer_string);
1969
1964
  null_then_sched_closure(&s->recv_trailing_metadata_finished);
1970
1965
  }
1971
1966
  }
@@ -1980,26 +1975,12 @@ static void remove_stream(grpc_chttp2_transport* t, uint32_t id,
1980
1975
  t->incoming_stream = nullptr;
1981
1976
  grpc_chttp2_parsing_become_skip_parser(t);
1982
1977
  }
1983
- if (s->pending_byte_stream) {
1984
- if (s->on_next != nullptr) {
1985
- grpc_core::Chttp2IncomingByteStream* bs = s->data_parser.parsing_frame;
1986
- if (error == GRPC_ERROR_NONE) {
1987
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message");
1988
- }
1989
- bs->PublishError(error);
1990
- bs->Unref();
1991
- s->data_parser.parsing_frame = nullptr;
1992
- } else {
1993
- GRPC_ERROR_UNREF(s->byte_stream_error);
1994
- s->byte_stream_error = GRPC_ERROR_REF(error);
1995
- }
1996
- }
1997
1978
 
1998
1979
  if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) {
1999
1980
  post_benign_reclaimer(t);
2000
- if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SENT) {
1981
+ if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) {
2001
1982
  close_transport_locked(
2002
- t, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1983
+ t, GRPC_ERROR_CREATE_REFERENCING(
2003
1984
  "Last stream closed after sending GOAWAY", &error, 1));
2004
1985
  }
2005
1986
  }
@@ -2009,8 +1990,6 @@ static void remove_stream(grpc_chttp2_transport* t, uint32_t id,
2009
1990
  grpc_chttp2_list_remove_stalled_by_stream(t, s);
2010
1991
  grpc_chttp2_list_remove_stalled_by_transport(t, s);
2011
1992
 
2012
- GRPC_ERROR_UNREF(error);
2013
-
2014
1993
  maybe_start_some_streams(t);
2015
1994
  }
2016
1995
 
@@ -2032,7 +2011,7 @@ void grpc_chttp2_cancel_stream(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2032
2011
  grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM);
2033
2012
  }
2034
2013
  }
2035
- if (due_to_error != GRPC_ERROR_NONE && !s->seen_error) {
2014
+ if (!due_to_error.ok() && !s->seen_error) {
2036
2015
  s->seen_error = true;
2037
2016
  }
2038
2017
  grpc_chttp2_mark_stream_closed(t, s, 1, 1, due_to_error);
@@ -2054,7 +2033,8 @@ void grpc_chttp2_fake_status(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2054
2033
  // what we want - which is safe because we haven't told anyone
2055
2034
  // about the metadata yet
2056
2035
  if (s->published_metadata[1] == GRPC_METADATA_NOT_PUBLISHED ||
2057
- s->recv_trailing_metadata_finished != nullptr) {
2036
+ s->recv_trailing_metadata_finished != nullptr ||
2037
+ !s->final_metadata_requested) {
2058
2038
  s->trailing_metadata_buffer.Set(grpc_core::GrpcStatusMetadata(), status);
2059
2039
  if (!message.empty()) {
2060
2040
  s->trailing_metadata_buffer.Set(
@@ -2064,13 +2044,11 @@ void grpc_chttp2_fake_status(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2064
2044
  s->published_metadata[1] = GRPC_METADATA_SYNTHESIZED_FROM_FAKE;
2065
2045
  grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
2066
2046
  }
2067
-
2068
- GRPC_ERROR_UNREF(error);
2069
2047
  }
2070
2048
 
2071
2049
  static void add_error(grpc_error_handle error, grpc_error_handle* refs,
2072
2050
  size_t* nrefs) {
2073
- if (error == GRPC_ERROR_NONE) return;
2051
+ if (error.ok()) return;
2074
2052
  for (size_t i = 0; i < *nrefs; i++) {
2075
2053
  if (error == refs[i]) {
2076
2054
  return;
@@ -2088,12 +2066,10 @@ static grpc_error_handle removal_error(grpc_error_handle extra_error,
2088
2066
  add_error(s->read_closed_error, refs, &nrefs);
2089
2067
  add_error(s->write_closed_error, refs, &nrefs);
2090
2068
  add_error(extra_error, refs, &nrefs);
2091
- grpc_error_handle error = GRPC_ERROR_NONE;
2069
+ grpc_error_handle error;
2092
2070
  if (nrefs > 0) {
2093
- error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(main_error_msg,
2094
- refs, nrefs);
2071
+ error = GRPC_ERROR_CREATE_REFERENCING(main_error_msg, refs, nrefs);
2095
2072
  }
2096
- GRPC_ERROR_UNREF(extra_error);
2097
2073
  return error;
2098
2074
  }
2099
2075
 
@@ -2103,12 +2079,11 @@ static void flush_write_list(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2103
2079
  while (*list) {
2104
2080
  grpc_chttp2_write_cb* cb = *list;
2105
2081
  *list = cb->next;
2106
- grpc_chttp2_complete_closure_step(t, s, &cb->closure, GRPC_ERROR_REF(error),
2082
+ grpc_chttp2_complete_closure_step(t, s, &cb->closure, error,
2107
2083
  "on_write_finished_cb");
2108
2084
  cb->next = t->write_cb_pool;
2109
2085
  t->write_cb_pool = cb;
2110
2086
  }
2111
- GRPC_ERROR_UNREF(error);
2112
2087
  }
2113
2088
 
2114
2089
  void grpc_chttp2_fail_pending_writes(grpc_chttp2_transport* t,
@@ -2118,30 +2093,34 @@ void grpc_chttp2_fail_pending_writes(grpc_chttp2_transport* t,
2118
2093
  removal_error(error, s, "Pending writes failed due to stream closure");
2119
2094
  s->send_initial_metadata = nullptr;
2120
2095
  grpc_chttp2_complete_closure_step(t, s, &s->send_initial_metadata_finished,
2121
- GRPC_ERROR_REF(error),
2122
- "send_initial_metadata_finished");
2096
+ error, "send_initial_metadata_finished");
2123
2097
 
2124
2098
  s->send_trailing_metadata = nullptr;
2125
2099
  s->sent_trailing_metadata_op = nullptr;
2126
2100
  grpc_chttp2_complete_closure_step(t, s, &s->send_trailing_metadata_finished,
2127
- GRPC_ERROR_REF(error),
2128
- "send_trailing_metadata_finished");
2101
+ error, "send_trailing_metadata_finished");
2129
2102
 
2130
- s->fetching_send_message.reset();
2131
- grpc_chttp2_complete_closure_step(t, s, &s->fetching_send_message_finished,
2132
- GRPC_ERROR_REF(error),
2103
+ grpc_chttp2_complete_closure_step(t, s, &s->send_message_finished, error,
2133
2104
  "fetching_send_message_finished");
2134
- flush_write_list(t, s, &s->on_write_finished_cbs, GRPC_ERROR_REF(error));
2105
+ flush_write_list(t, s, &s->on_write_finished_cbs, error);
2135
2106
  flush_write_list(t, s, &s->on_flow_controlled_cbs, error);
2136
2107
  }
2137
2108
 
2138
2109
  void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport* t,
2139
2110
  grpc_chttp2_stream* s, int close_reads,
2140
2111
  int close_writes, grpc_error_handle error) {
2112
+ if (grpc_http_trace.enabled()) {
2113
+ gpr_log(
2114
+ GPR_DEBUG, "MARK_STREAM_CLOSED: t=%p s=%p(id=%d) %s [%s]", t, s, s->id,
2115
+ (close_reads && close_writes)
2116
+ ? "read+write"
2117
+ : (close_reads ? "read" : (close_writes ? "write" : "nothing??")),
2118
+ error.ToString().c_str());
2119
+ }
2141
2120
  if (s->read_closed && s->write_closed) {
2142
2121
  // already closed, but we should still fake the status if needed.
2143
2122
  grpc_error_handle overall_error = removal_error(error, s, "Stream removed");
2144
- if (overall_error != GRPC_ERROR_NONE) {
2123
+ if (!overall_error.ok()) {
2145
2124
  grpc_chttp2_fake_status(t, s, overall_error);
2146
2125
  }
2147
2126
  grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
@@ -2150,26 +2129,25 @@ void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport* t,
2150
2129
  bool closed_read = false;
2151
2130
  bool became_closed = false;
2152
2131
  if (close_reads && !s->read_closed) {
2153
- s->read_closed_error = GRPC_ERROR_REF(error);
2132
+ s->read_closed_error = error;
2154
2133
  s->read_closed = true;
2155
2134
  closed_read = true;
2156
2135
  }
2157
2136
  if (close_writes && !s->write_closed) {
2158
- s->write_closed_error = GRPC_ERROR_REF(error);
2137
+ s->write_closed_error = error;
2159
2138
  s->write_closed = true;
2160
- grpc_chttp2_fail_pending_writes(t, s, GRPC_ERROR_REF(error));
2139
+ grpc_chttp2_fail_pending_writes(t, s, error);
2161
2140
  }
2162
2141
  if (s->read_closed && s->write_closed) {
2163
2142
  became_closed = true;
2164
- grpc_error_handle overall_error =
2165
- removal_error(GRPC_ERROR_REF(error), s, "Stream removed");
2143
+ grpc_error_handle overall_error = removal_error(error, s, "Stream removed");
2166
2144
  if (s->id != 0) {
2167
- remove_stream(t, s->id, GRPC_ERROR_REF(overall_error));
2145
+ remove_stream(t, s->id, overall_error);
2168
2146
  } else {
2169
2147
  // Purge streams waiting on concurrency still waiting for id assignment
2170
2148
  grpc_chttp2_list_remove_waiting_for_concurrency(t, s);
2171
2149
  }
2172
- if (overall_error != GRPC_ERROR_NONE) {
2150
+ if (!overall_error.ok()) {
2173
2151
  grpc_chttp2_fake_status(t, s, overall_error);
2174
2152
  }
2175
2153
  }
@@ -2183,10 +2161,11 @@ void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport* t,
2183
2161
  grpc_chttp2_maybe_complete_recv_message(t, s);
2184
2162
  }
2185
2163
  if (became_closed) {
2164
+ s->stats.latency =
2165
+ gpr_time_sub(gpr_now(GPR_CLOCK_MONOTONIC), s->creation_time);
2186
2166
  grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
2187
2167
  GRPC_CHTTP2_STREAM_UNREF(s, "chttp2");
2188
2168
  }
2189
- GRPC_ERROR_UNREF(error);
2190
2169
  }
2191
2170
 
2192
2171
  static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
@@ -2269,8 +2248,8 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2269
2248
 
2270
2249
  status_hdr = GRPC_SLICE_MALLOC(15 + (grpc_status >= 10));
2271
2250
  p = GRPC_SLICE_START_PTR(status_hdr);
2272
- *p++ = 0x00; /* literal header, not indexed */
2273
- *p++ = 11; /* len(grpc-status) */
2251
+ *p++ = 0x00; // literal header, not indexed
2252
+ *p++ = 11; // len(grpc-status)
2274
2253
  *p++ = 'g';
2275
2254
  *p++ = 'r';
2276
2255
  *p++ = 'p';
@@ -2295,11 +2274,11 @@ static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
2295
2274
 
2296
2275
  size_t msg_len = message.length();
2297
2276
  GPR_ASSERT(msg_len <= UINT32_MAX);
2298
- grpc_core::VarintWriter<1> msg_len_writer(msg_len);
2277
+ grpc_core::VarintWriter<1> msg_len_writer(static_cast<uint32_t>(msg_len));
2299
2278
  message_pfx = GRPC_SLICE_MALLOC(14 + msg_len_writer.length());
2300
2279
  p = GRPC_SLICE_START_PTR(message_pfx);
2301
- *p++ = 0x00; /* literal header, not indexed */
2302
- *p++ = 12; /* len(grpc-message) */
2280
+ *p++ = 0x00; // literal header, not indexed
2281
+ *p++ = 12; // len(grpc-message)
2303
2282
  *p++ = 'g';
2304
2283
  *p++ = 'r';
2305
2284
  *p++ = 'p';
@@ -2356,7 +2335,7 @@ struct cancel_stream_cb_args {
2356
2335
  static void cancel_stream_cb(void* user_data, uint32_t /*key*/, void* stream) {
2357
2336
  cancel_stream_cb_args* args = static_cast<cancel_stream_cb_args*>(user_data);
2358
2337
  grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(stream);
2359
- grpc_chttp2_cancel_stream(args->t, s, GRPC_ERROR_REF(args->error));
2338
+ grpc_chttp2_cancel_stream(args->t, s, args->error);
2360
2339
  }
2361
2340
 
2362
2341
  static void end_all_the_calls(grpc_chttp2_transport* t,
@@ -2364,14 +2343,14 @@ static void end_all_the_calls(grpc_chttp2_transport* t,
2364
2343
  intptr_t http2_error;
2365
2344
  // If there is no explicit grpc or HTTP/2 error, set to UNAVAILABLE on server.
2366
2345
  if (!t->is_client && !grpc_error_has_clear_grpc_status(error) &&
2367
- !grpc_error_get_int(error, GRPC_ERROR_INT_HTTP2_ERROR, &http2_error)) {
2368
- error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS,
2346
+ !grpc_error_get_int(error, grpc_core::StatusIntProperty::kHttp2Error,
2347
+ &http2_error)) {
2348
+ error = grpc_error_set_int(error, grpc_core::StatusIntProperty::kRpcStatus,
2369
2349
  GRPC_STATUS_UNAVAILABLE);
2370
2350
  }
2371
- cancel_unstarted_streams(t, GRPC_ERROR_REF(error));
2351
+ cancel_unstarted_streams(t, error);
2372
2352
  cancel_stream_cb_args args = {error, t};
2373
2353
  grpc_chttp2_stream_map_for_each(&t->stream_map, cancel_stream_cb, &args);
2374
- GRPC_ERROR_UNREF(error);
2375
2354
  }
2376
2355
 
2377
2356
  //
@@ -2398,8 +2377,11 @@ void grpc_chttp2_act_on_flowctl_action(
2398
2377
  const grpc_core::chttp2::FlowControlAction& action,
2399
2378
  grpc_chttp2_transport* t, grpc_chttp2_stream* s) {
2400
2379
  WithUrgency(t, action.send_stream_update(),
2401
- GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL,
2402
- [t, s]() { grpc_chttp2_mark_stream_writable(t, s); });
2380
+ GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL, [t, s]() {
2381
+ if (s->id != 0 && !s->read_closed) {
2382
+ grpc_chttp2_mark_stream_writable(t, s);
2383
+ }
2384
+ });
2403
2385
  WithUrgency(t, action.send_transport_update(),
2404
2386
  GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL, []() {});
2405
2387
  WithUrgency(t, action.send_initial_window_update(),
@@ -2413,31 +2395,39 @@ void grpc_chttp2_act_on_flowctl_action(
2413
2395
  queue_setting_update(t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
2414
2396
  action.max_frame_size());
2415
2397
  });
2398
+ if (t->enable_preferred_rx_crypto_frame_advertisement) {
2399
+ WithUrgency(
2400
+ t, action.preferred_rx_crypto_frame_size_update(),
2401
+ GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2402
+ queue_setting_update(
2403
+ t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
2404
+ action.preferred_rx_crypto_frame_size());
2405
+ });
2406
+ }
2416
2407
  }
2417
2408
 
2418
2409
  static grpc_error_handle try_http_parsing(grpc_chttp2_transport* t) {
2419
2410
  grpc_http_parser parser;
2420
2411
  size_t i = 0;
2421
- grpc_error_handle error = GRPC_ERROR_NONE;
2412
+ grpc_error_handle error;
2422
2413
  grpc_http_response response;
2423
2414
 
2424
2415
  grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
2425
2416
 
2426
- grpc_error_handle parse_error = GRPC_ERROR_NONE;
2427
- for (; i < t->read_buffer.count && parse_error == GRPC_ERROR_NONE; i++) {
2417
+ grpc_error_handle parse_error;
2418
+ for (; i < t->read_buffer.count && parse_error.ok(); i++) {
2428
2419
  parse_error =
2429
2420
  grpc_http_parser_parse(&parser, t->read_buffer.slices[i], nullptr);
2430
2421
  }
2431
- if (parse_error == GRPC_ERROR_NONE &&
2432
- (parse_error = grpc_http_parser_eof(&parser)) == GRPC_ERROR_NONE) {
2422
+ if (parse_error.ok() &&
2423
+ (parse_error = grpc_http_parser_eof(&parser)) == absl::OkStatus()) {
2433
2424
  error = grpc_error_set_int(
2434
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2435
- "Trying to connect an http1.x server"),
2436
- GRPC_ERROR_INT_HTTP_STATUS, response.status),
2437
- GRPC_ERROR_INT_GRPC_STATUS,
2425
+ grpc_error_set_int(
2426
+ GRPC_ERROR_CREATE("Trying to connect an http1.x server"),
2427
+ grpc_core::StatusIntProperty::kHttpStatus, response.status),
2428
+ grpc_core::StatusIntProperty::kRpcStatus,
2438
2429
  grpc_http2_status_to_grpc_status(response.status));
2439
2430
  }
2440
- GRPC_ERROR_UNREF(parse_error);
2441
2431
 
2442
2432
  grpc_http_parser_destroy(&parser);
2443
2433
  grpc_http_response_destroy(&response);
@@ -2448,44 +2438,31 @@ static void read_action(void* tp, grpc_error_handle error) {
2448
2438
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2449
2439
  t->combiner->Run(
2450
2440
  GRPC_CLOSURE_INIT(&t->read_action_locked, read_action_locked, t, nullptr),
2451
- GRPC_ERROR_REF(error));
2441
+ error);
2452
2442
  }
2453
2443
 
2454
2444
  static void read_action_locked(void* tp, grpc_error_handle error) {
2455
- GPR_TIMER_SCOPE("reading_action_locked", 0);
2456
-
2457
2445
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2458
2446
 
2459
- (void)GRPC_ERROR_REF(error);
2460
-
2461
2447
  grpc_error_handle err = error;
2462
- if (err != GRPC_ERROR_NONE) {
2463
- err = grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2464
- "Endpoint read failed", &err, 1),
2465
- GRPC_ERROR_INT_OCCURRED_DURING_WRITE,
2466
- t->write_state);
2448
+ if (!err.ok()) {
2449
+ err = grpc_error_set_int(
2450
+ GRPC_ERROR_CREATE_REFERENCING("Endpoint read failed", &err, 1),
2451
+ grpc_core::StatusIntProperty::kOccurredDuringWrite, t->write_state);
2467
2452
  }
2468
2453
  std::swap(err, error);
2469
- GRPC_ERROR_UNREF(err);
2470
- if (t->closed_with_error == GRPC_ERROR_NONE) {
2471
- GPR_TIMER_SCOPE("reading_action.parse", 0);
2454
+ if (t->closed_with_error.ok()) {
2472
2455
  size_t i = 0;
2473
- grpc_error_handle errors[3] = {GRPC_ERROR_REF(error), GRPC_ERROR_NONE,
2474
- GRPC_ERROR_NONE};
2475
- for (; i < t->read_buffer.count && errors[1] == GRPC_ERROR_NONE; i++) {
2456
+ grpc_error_handle errors[3] = {error, absl::OkStatus(), absl::OkStatus()};
2457
+ for (; i < t->read_buffer.count && errors[1] == absl::OkStatus(); i++) {
2476
2458
  errors[1] = grpc_chttp2_perform_read(t, t->read_buffer.slices[i]);
2477
2459
  }
2478
- if (errors[1] != GRPC_ERROR_NONE) {
2460
+ if (errors[1] != absl::OkStatus()) {
2479
2461
  errors[2] = try_http_parsing(t);
2480
- GRPC_ERROR_UNREF(error);
2481
- error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2482
- "Failed parsing HTTP/2", errors, GPR_ARRAY_SIZE(errors));
2483
- }
2484
- for (i = 0; i < GPR_ARRAY_SIZE(errors); i++) {
2485
- GRPC_ERROR_UNREF(errors[i]);
2462
+ error = GRPC_ERROR_CREATE_REFERENCING("Failed parsing HTTP/2", errors,
2463
+ GPR_ARRAY_SIZE(errors));
2486
2464
  }
2487
2465
 
2488
- GPR_TIMER_SCOPE("post_parse_locked", 0);
2489
2466
  if (t->initial_window_update != 0) {
2490
2467
  if (t->initial_window_update > 0) {
2491
2468
  grpc_chttp2_stream* s;
@@ -2499,29 +2476,28 @@ static void read_action_locked(void* tp, grpc_error_handle error) {
2499
2476
  }
2500
2477
  }
2501
2478
 
2502
- GPR_TIMER_SCOPE("post_reading_action_locked", 0);
2503
2479
  bool keep_reading = false;
2504
- if (error == GRPC_ERROR_NONE && t->closed_with_error != GRPC_ERROR_NONE) {
2505
- error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2506
- "Transport closed", &t->closed_with_error, 1);
2480
+ if (error.ok() && !t->closed_with_error.ok()) {
2481
+ error = GRPC_ERROR_CREATE_REFERENCING("Transport closed",
2482
+ &t->closed_with_error, 1);
2507
2483
  }
2508
- if (error != GRPC_ERROR_NONE) {
2484
+ if (!error.ok()) {
2509
2485
  // If a goaway frame was received, this might be the reason why the read
2510
2486
  // failed. Add this info to the error
2511
- if (t->goaway_error != GRPC_ERROR_NONE) {
2512
- error = grpc_error_add_child(error, GRPC_ERROR_REF(t->goaway_error));
2487
+ if (!t->goaway_error.ok()) {
2488
+ error = grpc_error_add_child(error, t->goaway_error);
2513
2489
  }
2514
2490
 
2515
- close_transport_locked(t, GRPC_ERROR_REF(error));
2491
+ close_transport_locked(t, error);
2516
2492
  t->endpoint_reading = 0;
2517
- } else if (t->closed_with_error == GRPC_ERROR_NONE) {
2493
+ } else if (t->closed_with_error.ok()) {
2518
2494
  keep_reading = true;
2519
2495
  // Since we have read a byte, reset the keepalive timer
2520
2496
  if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING) {
2521
- grpc_timer_cancel(&t->keepalive_ping_timer);
2497
+ maybe_reset_keepalive_ping_timer_locked(t);
2522
2498
  }
2523
2499
  }
2524
- grpc_slice_buffer_reset_and_unref_internal(&t->read_buffer);
2500
+ grpc_slice_buffer_reset_and_unref(&t->read_buffer);
2525
2501
 
2526
2502
  if (keep_reading) {
2527
2503
  if (t->num_pending_induced_frames >= DEFAULT_MAX_PENDING_INDUCED_FRAMES) {
@@ -2537,22 +2513,20 @@ static void read_action_locked(void* tp, grpc_error_handle error) {
2537
2513
  } else {
2538
2514
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "reading_action");
2539
2515
  }
2540
-
2541
- GRPC_ERROR_UNREF(error);
2542
2516
  }
2543
2517
 
2544
2518
  static void continue_read_action_locked(grpc_chttp2_transport* t) {
2545
- const bool urgent = t->goaway_error != GRPC_ERROR_NONE;
2519
+ const bool urgent = !t->goaway_error.ok();
2546
2520
  GRPC_CLOSURE_INIT(&t->read_action_locked, read_action, t,
2547
2521
  grpc_schedule_on_exec_ctx);
2548
- grpc_endpoint_read(t->ep, &t->read_buffer, &t->read_action_locked, urgent);
2549
- grpc_chttp2_act_on_flowctl_action(t->flow_control->MakeAction(), t, nullptr);
2522
+ grpc_endpoint_read(t->ep, &t->read_buffer, &t->read_action_locked, urgent,
2523
+ grpc_chttp2_min_read_progress_size(t));
2550
2524
  }
2551
2525
 
2552
2526
  // t is reffed prior to calling the first time, and once the callback chain
2553
2527
  // that kicks off finishes, it's unreffed
2554
2528
  void schedule_bdp_ping_locked(grpc_chttp2_transport* t) {
2555
- t->flow_control->bdp_estimator()->SchedulePing();
2529
+ t->flow_control.bdp_estimator()->SchedulePing();
2556
2530
  send_ping_locked(
2557
2531
  t,
2558
2532
  GRPC_CLOSURE_INIT(&t->start_bdp_ping_locked, start_bdp_ping, t,
@@ -2566,23 +2540,23 @@ static void start_bdp_ping(void* tp, grpc_error_handle error) {
2566
2540
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2567
2541
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->start_bdp_ping_locked,
2568
2542
  start_bdp_ping_locked, t, nullptr),
2569
- GRPC_ERROR_REF(error));
2543
+ error);
2570
2544
  }
2571
2545
 
2572
2546
  static void start_bdp_ping_locked(void* tp, grpc_error_handle error) {
2573
2547
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2574
2548
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
2575
2549
  gpr_log(GPR_INFO, "%s: Start BDP ping err=%s", t->peer_string.c_str(),
2576
- grpc_error_std_string(error).c_str());
2550
+ grpc_core::StatusToString(error).c_str());
2577
2551
  }
2578
- if (error != GRPC_ERROR_NONE || t->closed_with_error != GRPC_ERROR_NONE) {
2552
+ if (!error.ok() || !t->closed_with_error.ok()) {
2579
2553
  return;
2580
2554
  }
2581
2555
  // Reset the keepalive ping timer
2582
2556
  if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING) {
2583
- grpc_timer_cancel(&t->keepalive_ping_timer);
2557
+ maybe_reset_keepalive_ping_timer_locked(t);
2584
2558
  }
2585
- t->flow_control->bdp_estimator()->StartPing();
2559
+ t->flow_control.bdp_estimator()->StartPing();
2586
2560
  t->bdp_ping_started = true;
2587
2561
  }
2588
2562
 
@@ -2590,16 +2564,16 @@ static void finish_bdp_ping(void* tp, grpc_error_handle error) {
2590
2564
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2591
2565
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->finish_bdp_ping_locked,
2592
2566
  finish_bdp_ping_locked, t, nullptr),
2593
- GRPC_ERROR_REF(error));
2567
+ error);
2594
2568
  }
2595
2569
 
2596
2570
  static void finish_bdp_ping_locked(void* tp, grpc_error_handle error) {
2597
2571
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2598
2572
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
2599
2573
  gpr_log(GPR_INFO, "%s: Complete BDP ping err=%s", t->peer_string.c_str(),
2600
- grpc_error_std_string(error).c_str());
2574
+ grpc_core::StatusToString(error).c_str());
2601
2575
  }
2602
- if (error != GRPC_ERROR_NONE || t->closed_with_error != GRPC_ERROR_NONE) {
2576
+ if (!error.ok() || !t->closed_with_error.ok()) {
2603
2577
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "bdp_ping");
2604
2578
  return;
2605
2579
  }
@@ -2608,40 +2582,37 @@ static void finish_bdp_ping_locked(void* tp, grpc_error_handle error) {
2608
2582
  // finish_bdp_ping_locked to be run later.
2609
2583
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->finish_bdp_ping_locked,
2610
2584
  finish_bdp_ping_locked, t, nullptr),
2611
- GRPC_ERROR_REF(error));
2585
+ error);
2612
2586
  return;
2613
2587
  }
2614
2588
  t->bdp_ping_started = false;
2615
2589
  grpc_core::Timestamp next_ping =
2616
- t->flow_control->bdp_estimator()->CompletePing();
2617
- grpc_chttp2_act_on_flowctl_action(t->flow_control->PeriodicUpdate(), t,
2590
+ t->flow_control.bdp_estimator()->CompletePing();
2591
+ grpc_chttp2_act_on_flowctl_action(t->flow_control.PeriodicUpdate(), t,
2618
2592
  nullptr);
2619
- GPR_ASSERT(!t->have_next_bdp_ping_timer);
2620
- t->have_next_bdp_ping_timer = true;
2621
- GRPC_CLOSURE_INIT(&t->next_bdp_ping_timer_expired_locked,
2622
- next_bdp_ping_timer_expired, t, grpc_schedule_on_exec_ctx);
2623
- grpc_timer_init(&t->next_bdp_ping_timer, next_ping,
2624
- &t->next_bdp_ping_timer_expired_locked);
2593
+ GPR_ASSERT(!t->next_bdp_ping_timer_handle.has_value());
2594
+ t->next_bdp_ping_timer_handle =
2595
+ t->event_engine->RunAfter(next_ping - grpc_core::Timestamp::Now(), [t] {
2596
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2597
+ grpc_core::ExecCtx exec_ctx;
2598
+ next_bdp_ping_timer_expired(t);
2599
+ });
2625
2600
  }
2626
2601
 
2627
- static void next_bdp_ping_timer_expired(void* tp, grpc_error_handle error) {
2628
- grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2602
+ static void next_bdp_ping_timer_expired(grpc_chttp2_transport* t) {
2629
2603
  t->combiner->Run(
2630
2604
  GRPC_CLOSURE_INIT(&t->next_bdp_ping_timer_expired_locked,
2631
2605
  next_bdp_ping_timer_expired_locked, t, nullptr),
2632
- GRPC_ERROR_REF(error));
2606
+ absl::OkStatus());
2633
2607
  }
2634
2608
 
2635
- static void next_bdp_ping_timer_expired_locked(void* tp,
2636
- grpc_error_handle error) {
2609
+ static void next_bdp_ping_timer_expired_locked(
2610
+ void* tp, GRPC_UNUSED grpc_error_handle error) {
2611
+ GPR_DEBUG_ASSERT(error.ok());
2637
2612
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
2638
- GPR_ASSERT(t->have_next_bdp_ping_timer);
2639
- t->have_next_bdp_ping_timer = false;
2640
- if (error != GRPC_ERROR_NONE) {
2641
- GRPC_CHTTP2_UNREF_TRANSPORT(t, "bdp_ping");
2642
- return;
2643
- }
2644
- if (t->flow_control->bdp_estimator()->accumulator() == 0) {
2613
+ GPR_ASSERT(t->next_bdp_ping_timer_handle.has_value());
2614
+ t->next_bdp_ping_timer_handle.reset();
2615
+ if (t->flow_control.bdp_estimator()->accumulator() == 0) {
2645
2616
  // Block the bdp ping till we receive more data.
2646
2617
  t->bdp_ping_blocked = true;
2647
2618
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "bdp_ping");
@@ -2709,42 +2680,37 @@ void grpc_chttp2_config_default_keepalive_args(grpc_channel_args* args,
2709
2680
  }
2710
2681
  }
2711
2682
 
2712
- static void init_keepalive_ping(void* arg, grpc_error_handle error) {
2713
- grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2683
+ static void init_keepalive_ping(grpc_chttp2_transport* t) {
2714
2684
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->init_keepalive_ping_locked,
2715
2685
  init_keepalive_ping_locked, t, nullptr),
2716
- GRPC_ERROR_REF(error));
2686
+ absl::OkStatus());
2717
2687
  }
2718
2688
 
2719
- static void init_keepalive_ping_locked(void* arg, grpc_error_handle error) {
2689
+ static void init_keepalive_ping_locked(void* arg,
2690
+ GRPC_UNUSED grpc_error_handle error) {
2691
+ GPR_DEBUG_ASSERT(error.ok());
2720
2692
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2721
2693
  GPR_ASSERT(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING);
2722
- if (t->destroying || t->closed_with_error != GRPC_ERROR_NONE) {
2694
+ GPR_ASSERT(t->keepalive_ping_timer_handle.has_value());
2695
+ t->keepalive_ping_timer_handle.reset();
2696
+ if (t->destroying || !t->closed_with_error.ok()) {
2723
2697
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING;
2724
- } else if (error == GRPC_ERROR_NONE) {
2698
+ } else {
2725
2699
  if (t->keepalive_permit_without_calls ||
2726
2700
  grpc_chttp2_stream_map_size(&t->stream_map) > 0) {
2727
2701
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_PINGING;
2728
2702
  GRPC_CHTTP2_REF_TRANSPORT(t, "keepalive ping end");
2729
- grpc_timer_init_unset(&t->keepalive_watchdog_timer);
2730
2703
  send_keepalive_ping_locked(t);
2731
2704
  grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_KEEPALIVE_PING);
2732
2705
  } else {
2733
2706
  GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
2734
- GRPC_CLOSURE_INIT(&t->init_keepalive_ping_locked, init_keepalive_ping, t,
2735
- grpc_schedule_on_exec_ctx);
2736
- grpc_timer_init(&t->keepalive_ping_timer,
2737
- grpc_core::ExecCtx::Get()->Now() + t->keepalive_time,
2738
- &t->init_keepalive_ping_locked);
2739
- }
2740
- } else if (error == GRPC_ERROR_CANCELLED) {
2741
- // The keepalive ping timer may be cancelled by bdp
2742
- GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
2743
- GRPC_CLOSURE_INIT(&t->init_keepalive_ping_locked, init_keepalive_ping, t,
2744
- grpc_schedule_on_exec_ctx);
2745
- grpc_timer_init(&t->keepalive_ping_timer,
2746
- grpc_core::ExecCtx::Get()->Now() + t->keepalive_time,
2747
- &t->init_keepalive_ping_locked);
2707
+ t->keepalive_ping_timer_handle =
2708
+ t->event_engine->RunAfter(t->keepalive_time, [t] {
2709
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2710
+ grpc_core::ExecCtx exec_ctx;
2711
+ init_keepalive_ping(t);
2712
+ });
2713
+ }
2748
2714
  }
2749
2715
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "init keepalive ping");
2750
2716
  }
@@ -2753,12 +2719,12 @@ static void start_keepalive_ping(void* arg, grpc_error_handle error) {
2753
2719
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2754
2720
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->start_keepalive_ping_locked,
2755
2721
  start_keepalive_ping_locked, t, nullptr),
2756
- GRPC_ERROR_REF(error));
2722
+ error);
2757
2723
  }
2758
2724
 
2759
2725
  static void start_keepalive_ping_locked(void* arg, grpc_error_handle error) {
2760
2726
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2761
- if (error != GRPC_ERROR_NONE) {
2727
+ if (!error.ok()) {
2762
2728
  return;
2763
2729
  }
2764
2730
  if (t->channelz_socket != nullptr) {
@@ -2769,11 +2735,12 @@ static void start_keepalive_ping_locked(void* arg, grpc_error_handle error) {
2769
2735
  gpr_log(GPR_INFO, "%s: Start keepalive ping", t->peer_string.c_str());
2770
2736
  }
2771
2737
  GRPC_CHTTP2_REF_TRANSPORT(t, "keepalive watchdog");
2772
- GRPC_CLOSURE_INIT(&t->keepalive_watchdog_fired_locked,
2773
- keepalive_watchdog_fired, t, grpc_schedule_on_exec_ctx);
2774
- grpc_timer_init(&t->keepalive_watchdog_timer,
2775
- grpc_core::ExecCtx::Get()->Now() + t->keepalive_timeout,
2776
- &t->keepalive_watchdog_fired_locked);
2738
+ t->keepalive_watchdog_timer_handle =
2739
+ t->event_engine->RunAfter(t->keepalive_timeout, [t] {
2740
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2741
+ grpc_core::ExecCtx exec_ctx;
2742
+ keepalive_watchdog_fired(t);
2743
+ });
2777
2744
  t->keepalive_ping_started = true;
2778
2745
  }
2779
2746
 
@@ -2781,13 +2748,13 @@ static void finish_keepalive_ping(void* arg, grpc_error_handle error) {
2781
2748
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2782
2749
  t->combiner->Run(GRPC_CLOSURE_INIT(&t->finish_keepalive_ping_locked,
2783
2750
  finish_keepalive_ping_locked, t, nullptr),
2784
- GRPC_ERROR_REF(error));
2751
+ error);
2785
2752
  }
2786
2753
 
2787
2754
  static void finish_keepalive_ping_locked(void* arg, grpc_error_handle error) {
2788
2755
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2789
2756
  if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_PINGING) {
2790
- if (error == GRPC_ERROR_NONE) {
2757
+ if (error.ok()) {
2791
2758
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
2792
2759
  GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) {
2793
2760
  gpr_log(GPR_INFO, "%s: Finish keepalive ping", t->peer_string.c_str());
@@ -2798,56 +2765,81 @@ static void finish_keepalive_ping_locked(void* arg, grpc_error_handle error) {
2798
2765
  t->combiner->Run(
2799
2766
  GRPC_CLOSURE_INIT(&t->finish_keepalive_ping_locked,
2800
2767
  finish_keepalive_ping_locked, t, nullptr),
2801
- GRPC_ERROR_REF(error));
2768
+ error);
2802
2769
  return;
2803
2770
  }
2804
2771
  t->keepalive_ping_started = false;
2805
2772
  t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
2806
- grpc_timer_cancel(&t->keepalive_watchdog_timer);
2773
+ if (t->keepalive_watchdog_timer_handle.has_value()) {
2774
+ if (t->event_engine->Cancel(*t->keepalive_watchdog_timer_handle)) {
2775
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "keepalive watchdog");
2776
+ t->keepalive_watchdog_timer_handle.reset();
2777
+ }
2778
+ }
2779
+ GPR_ASSERT(!t->keepalive_ping_timer_handle.has_value());
2807
2780
  GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
2808
- GRPC_CLOSURE_INIT(&t->init_keepalive_ping_locked, init_keepalive_ping, t,
2809
- grpc_schedule_on_exec_ctx);
2810
- grpc_timer_init(&t->keepalive_ping_timer,
2811
- grpc_core::ExecCtx::Get()->Now() + t->keepalive_time,
2812
- &t->init_keepalive_ping_locked);
2781
+ t->keepalive_ping_timer_handle =
2782
+ t->event_engine->RunAfter(t->keepalive_time, [t] {
2783
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2784
+ grpc_core::ExecCtx exec_ctx;
2785
+ init_keepalive_ping(t);
2786
+ });
2813
2787
  }
2814
2788
  }
2815
2789
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "keepalive ping end");
2816
2790
  }
2817
2791
 
2818
- static void keepalive_watchdog_fired(void* arg, grpc_error_handle error) {
2819
- grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2792
+ static void keepalive_watchdog_fired(grpc_chttp2_transport* t) {
2820
2793
  t->combiner->Run(
2821
2794
  GRPC_CLOSURE_INIT(&t->keepalive_watchdog_fired_locked,
2822
2795
  keepalive_watchdog_fired_locked, t, nullptr),
2823
- GRPC_ERROR_REF(error));
2796
+ absl::OkStatus());
2824
2797
  }
2825
2798
 
2826
- static void keepalive_watchdog_fired_locked(void* arg,
2827
- grpc_error_handle error) {
2799
+ static void keepalive_watchdog_fired_locked(
2800
+ void* arg, GRPC_UNUSED grpc_error_handle error) {
2801
+ GPR_DEBUG_ASSERT(error.ok());
2828
2802
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
2803
+ GPR_ASSERT(t->keepalive_watchdog_timer_handle.has_value());
2804
+ t->keepalive_watchdog_timer_handle.reset();
2829
2805
  if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_PINGING) {
2830
- if (error == GRPC_ERROR_NONE) {
2831
- gpr_log(GPR_INFO, "%s: Keepalive watchdog fired. Closing transport.",
2832
- t->peer_string.c_str());
2833
- t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING;
2834
- close_transport_locked(
2835
- t, grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2836
- "keepalive watchdog timeout"),
2837
- GRPC_ERROR_INT_GRPC_STATUS,
2838
- GRPC_STATUS_UNAVAILABLE));
2839
- }
2806
+ gpr_log(GPR_INFO, "%s: Keepalive watchdog fired. Closing transport.",
2807
+ t->peer_string.c_str());
2808
+ t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING;
2809
+ close_transport_locked(
2810
+ t, grpc_error_set_int(GRPC_ERROR_CREATE("keepalive watchdog timeout"),
2811
+ grpc_core::StatusIntProperty::kRpcStatus,
2812
+ GRPC_STATUS_UNAVAILABLE));
2840
2813
  } else {
2841
- // The watchdog timer should have been cancelled by
2842
- // finish_keepalive_ping_locked.
2843
- if (GPR_UNLIKELY(error != GRPC_ERROR_CANCELLED)) {
2844
- gpr_log(GPR_ERROR, "keepalive_ping_end state error: %d (expect: %d)",
2845
- t->keepalive_state, GRPC_CHTTP2_KEEPALIVE_STATE_PINGING);
2846
- }
2814
+ // If keepalive_state is not PINGING, we consider it as an error. Maybe the
2815
+ // cancellation failed in finish_keepalive_ping_locked. Users have seen
2816
+ // other states: https://github.com/grpc/grpc/issues/32085.
2817
+ gpr_log(GPR_ERROR, "keepalive_ping_end state error: %d (expect: %d)",
2818
+ t->keepalive_state, GRPC_CHTTP2_KEEPALIVE_STATE_PINGING);
2847
2819
  }
2848
2820
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "keepalive watchdog");
2849
2821
  }
2850
2822
 
2823
+ static void maybe_reset_keepalive_ping_timer_locked(grpc_chttp2_transport* t) {
2824
+ if (t->keepalive_ping_timer_handle.has_value()) {
2825
+ if (t->event_engine->Cancel(*t->keepalive_ping_timer_handle)) {
2826
+ // Cancel succeeds, resets the keepalive ping timer. Note that we don't
2827
+ // need to Ref or Unref here since we still hold the Ref.
2828
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
2829
+ GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) {
2830
+ gpr_log(GPR_INFO, "%s: Keepalive ping cancelled. Resetting timer.",
2831
+ t->peer_string.c_str());
2832
+ }
2833
+ t->keepalive_ping_timer_handle =
2834
+ t->event_engine->RunAfter(t->keepalive_time, [t] {
2835
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2836
+ grpc_core::ExecCtx exec_ctx;
2837
+ init_keepalive_ping(t);
2838
+ });
2839
+ }
2840
+ }
2841
+ }
2842
+
2851
2843
  //
2852
2844
  // CALLBACK LOOP
2853
2845
  //
@@ -2877,187 +2869,6 @@ static void set_pollset_set(grpc_transport* gt, grpc_stream* /*gs*/,
2877
2869
  grpc_endpoint_add_to_pollset_set(t->ep, pollset_set);
2878
2870
  }
2879
2871
 
2880
- //
2881
- // BYTE STREAM
2882
- //
2883
-
2884
- static void reset_byte_stream(void* arg, grpc_error_handle error) {
2885
- grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(arg);
2886
- s->pending_byte_stream = false;
2887
- if (error == GRPC_ERROR_NONE) {
2888
- grpc_chttp2_maybe_complete_recv_message(s->t, s);
2889
- grpc_chttp2_maybe_complete_recv_trailing_metadata(s->t, s);
2890
- } else {
2891
- GPR_ASSERT(error != GRPC_ERROR_NONE);
2892
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, s->on_next, GRPC_ERROR_REF(error));
2893
- s->on_next = nullptr;
2894
- GRPC_ERROR_UNREF(s->byte_stream_error);
2895
- s->byte_stream_error = GRPC_ERROR_NONE;
2896
- grpc_chttp2_cancel_stream(s->t, s, GRPC_ERROR_REF(error));
2897
- s->byte_stream_error = GRPC_ERROR_REF(error);
2898
- }
2899
- }
2900
-
2901
- namespace grpc_core {
2902
-
2903
- Chttp2IncomingByteStream::Chttp2IncomingByteStream(
2904
- grpc_chttp2_transport* transport, grpc_chttp2_stream* stream,
2905
- uint32_t frame_size, uint32_t flags)
2906
- : ByteStream(frame_size, flags),
2907
- transport_(transport),
2908
- stream_(stream),
2909
- refs_(2),
2910
- remaining_bytes_(frame_size) {
2911
- GRPC_ERROR_UNREF(stream->byte_stream_error);
2912
- stream->byte_stream_error = GRPC_ERROR_NONE;
2913
- }
2914
-
2915
- void Chttp2IncomingByteStream::OrphanLocked(
2916
- void* arg, grpc_error_handle /*error_ignored*/) {
2917
- Chttp2IncomingByteStream* bs = static_cast<Chttp2IncomingByteStream*>(arg);
2918
- grpc_chttp2_stream* s = bs->stream_;
2919
- grpc_chttp2_transport* t = s->t;
2920
- bs->Unref();
2921
- s->pending_byte_stream = false;
2922
- grpc_chttp2_maybe_complete_recv_message(t, s);
2923
- grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
2924
- }
2925
-
2926
- void Chttp2IncomingByteStream::Orphan() {
2927
- GPR_TIMER_SCOPE("incoming_byte_stream_destroy", 0);
2928
- transport_->combiner->Run(
2929
- GRPC_CLOSURE_INIT(&destroy_action_,
2930
- &Chttp2IncomingByteStream::OrphanLocked, this, nullptr),
2931
- GRPC_ERROR_NONE);
2932
- }
2933
-
2934
- void Chttp2IncomingByteStream::NextLocked(void* arg,
2935
- grpc_error_handle /*error_ignored*/) {
2936
- Chttp2IncomingByteStream* bs = static_cast<Chttp2IncomingByteStream*>(arg);
2937
- grpc_chttp2_transport* t = bs->transport_;
2938
- grpc_chttp2_stream* s = bs->stream_;
2939
- size_t cur_length = s->frame_storage.length;
2940
- if (!s->read_closed) {
2941
- s->flow_control->IncomingByteStreamUpdate(bs->next_action_.max_size_hint,
2942
- cur_length);
2943
- grpc_chttp2_act_on_flowctl_action(s->flow_control->MakeAction(), t, s);
2944
- }
2945
- GPR_ASSERT(s->unprocessed_incoming_frames_buffer.length == 0);
2946
- if (s->frame_storage.length > 0) {
2947
- grpc_slice_buffer_swap(&s->frame_storage,
2948
- &s->unprocessed_incoming_frames_buffer);
2949
- ExecCtx::Run(DEBUG_LOCATION, bs->next_action_.on_complete, GRPC_ERROR_NONE);
2950
- } else if (s->byte_stream_error != GRPC_ERROR_NONE) {
2951
- ExecCtx::Run(DEBUG_LOCATION, bs->next_action_.on_complete,
2952
- GRPC_ERROR_REF(s->byte_stream_error));
2953
- if (s->data_parser.parsing_frame != nullptr) {
2954
- s->data_parser.parsing_frame->Unref();
2955
- s->data_parser.parsing_frame = nullptr;
2956
- }
2957
- } else if (s->read_closed) {
2958
- if (bs->remaining_bytes_ != 0) {
2959
- s->byte_stream_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2960
- "Truncated message", &s->read_closed_error, 1);
2961
- ExecCtx::Run(DEBUG_LOCATION, bs->next_action_.on_complete,
2962
- GRPC_ERROR_REF(s->byte_stream_error));
2963
- if (s->data_parser.parsing_frame != nullptr) {
2964
- s->data_parser.parsing_frame->Unref();
2965
- s->data_parser.parsing_frame = nullptr;
2966
- }
2967
- } else {
2968
- // Should never reach here.
2969
- GPR_ASSERT(false);
2970
- }
2971
- } else {
2972
- s->on_next = bs->next_action_.on_complete;
2973
- }
2974
- bs->Unref();
2975
- }
2976
-
2977
- bool Chttp2IncomingByteStream::Next(size_t max_size_hint,
2978
- grpc_closure* on_complete) {
2979
- GPR_TIMER_SCOPE("incoming_byte_stream_next", 0);
2980
- if (stream_->unprocessed_incoming_frames_buffer.length > 0) {
2981
- return true;
2982
- } else {
2983
- Ref();
2984
- next_action_.max_size_hint = max_size_hint;
2985
- next_action_.on_complete = on_complete;
2986
- transport_->combiner->Run(
2987
- GRPC_CLOSURE_INIT(&next_action_.closure,
2988
- &Chttp2IncomingByteStream::NextLocked, this, nullptr),
2989
- GRPC_ERROR_NONE);
2990
- return false;
2991
- }
2992
- }
2993
-
2994
- grpc_error_handle Chttp2IncomingByteStream::Pull(grpc_slice* slice) {
2995
- GPR_TIMER_SCOPE("incoming_byte_stream_pull", 0);
2996
- grpc_error_handle error;
2997
- if (stream_->unprocessed_incoming_frames_buffer.length > 0) {
2998
- error = grpc_deframe_unprocessed_incoming_frames(
2999
- &stream_->data_parser, stream_,
3000
- &stream_->unprocessed_incoming_frames_buffer, slice, nullptr);
3001
- if (error != GRPC_ERROR_NONE) {
3002
- return error;
3003
- }
3004
- } else {
3005
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message");
3006
- stream_->t->combiner->Run(&stream_->reset_byte_stream,
3007
- GRPC_ERROR_REF(error));
3008
- return error;
3009
- }
3010
- return GRPC_ERROR_NONE;
3011
- }
3012
-
3013
- void Chttp2IncomingByteStream::PublishError(grpc_error_handle error) {
3014
- GPR_ASSERT(error != GRPC_ERROR_NONE);
3015
- ExecCtx::Run(DEBUG_LOCATION, stream_->on_next, GRPC_ERROR_REF(error));
3016
- stream_->on_next = nullptr;
3017
- GRPC_ERROR_UNREF(stream_->byte_stream_error);
3018
- stream_->byte_stream_error = GRPC_ERROR_REF(error);
3019
- grpc_chttp2_cancel_stream(transport_, stream_, GRPC_ERROR_REF(error));
3020
- }
3021
-
3022
- grpc_error_handle Chttp2IncomingByteStream::Push(const grpc_slice& slice,
3023
- grpc_slice* slice_out) {
3024
- if (remaining_bytes_ < GRPC_SLICE_LENGTH(slice)) {
3025
- grpc_error_handle error =
3026
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Too many bytes in stream");
3027
- transport_->combiner->Run(&stream_->reset_byte_stream,
3028
- GRPC_ERROR_REF(error));
3029
- grpc_slice_unref_internal(slice);
3030
- return error;
3031
- } else {
3032
- remaining_bytes_ -= static_cast<uint32_t> GRPC_SLICE_LENGTH(slice);
3033
- if (slice_out != nullptr) {
3034
- *slice_out = slice;
3035
- }
3036
- return GRPC_ERROR_NONE;
3037
- }
3038
- }
3039
-
3040
- grpc_error_handle Chttp2IncomingByteStream::Finished(grpc_error_handle error,
3041
- bool reset_on_error) {
3042
- if (error == GRPC_ERROR_NONE) {
3043
- if (remaining_bytes_ != 0) {
3044
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message");
3045
- }
3046
- }
3047
- if (error != GRPC_ERROR_NONE && reset_on_error) {
3048
- transport_->combiner->Run(&stream_->reset_byte_stream,
3049
- GRPC_ERROR_REF(error));
3050
- }
3051
- Unref();
3052
- return error;
3053
- }
3054
-
3055
- void Chttp2IncomingByteStream::Shutdown(grpc_error_handle error) {
3056
- GRPC_ERROR_UNREF(Finished(error, true /* reset_on_error */));
3057
- }
3058
-
3059
- } // namespace grpc_core
3060
-
3061
2872
  //
3062
2873
  // RESOURCE QUOTAS
3063
2874
  //
@@ -3074,7 +2885,7 @@ static void post_benign_reclaimer(grpc_chttp2_transport* t) {
3074
2885
  benign_reclaimer_locked, t,
3075
2886
  grpc_schedule_on_exec_ctx);
3076
2887
  t->active_reclamation = std::move(*sweep);
3077
- t->combiner->Run(&t->benign_reclaimer_locked, GRPC_ERROR_NONE);
2888
+ t->combiner->Run(&t->benign_reclaimer_locked, absl::OkStatus());
3078
2889
  } else {
3079
2890
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "benign_reclaimer");
3080
2891
  }
@@ -3094,9 +2905,10 @@ static void post_destructive_reclaimer(grpc_chttp2_transport* t) {
3094
2905
  destructive_reclaimer_locked, t,
3095
2906
  grpc_schedule_on_exec_ctx);
3096
2907
  t->active_reclamation = std::move(*sweep);
3097
- t->combiner->Run(&t->destructive_reclaimer_locked, GRPC_ERROR_NONE);
2908
+ t->combiner->Run(&t->destructive_reclaimer_locked,
2909
+ absl::OkStatus());
3098
2910
  } else {
3099
- GRPC_CHTTP2_UNREF_TRANSPORT(t, "benign_reclaimer");
2911
+ GRPC_CHTTP2_UNREF_TRANSPORT(t, "destructive_reclaimer");
3100
2912
  }
3101
2913
  });
3102
2914
  }
@@ -3104,8 +2916,7 @@ static void post_destructive_reclaimer(grpc_chttp2_transport* t) {
3104
2916
 
3105
2917
  static void benign_reclaimer_locked(void* arg, grpc_error_handle error) {
3106
2918
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
3107
- if (error == GRPC_ERROR_NONE &&
3108
- grpc_chttp2_stream_map_size(&t->stream_map) == 0) {
2919
+ if (error.ok() && grpc_chttp2_stream_map_size(&t->stream_map) == 0) {
3109
2920
  // Channel with no active streams: send a goaway to try and make it
3110
2921
  // disconnect cleanly
3111
2922
  if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
@@ -3113,11 +2924,11 @@ static void benign_reclaimer_locked(void* arg, grpc_error_handle error) {
3113
2924
  t->peer_string.c_str());
3114
2925
  }
3115
2926
  send_goaway(t,
3116
- grpc_error_set_int(
3117
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Buffers full"),
3118
- GRPC_ERROR_INT_HTTP2_ERROR, GRPC_HTTP2_ENHANCE_YOUR_CALM));
3119
- } else if (error == GRPC_ERROR_NONE &&
3120
- GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
2927
+ grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"),
2928
+ grpc_core::StatusIntProperty::kHttp2Error,
2929
+ GRPC_HTTP2_ENHANCE_YOUR_CALM),
2930
+ /*immediate_disconnect_hint=*/true);
2931
+ } else if (error.ok() && GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
3121
2932
  gpr_log(GPR_INFO,
3122
2933
  "HTTP2: %s - skip benign reclamation, there are still %" PRIdPTR
3123
2934
  " streams",
@@ -3125,7 +2936,7 @@ static void benign_reclaimer_locked(void* arg, grpc_error_handle error) {
3125
2936
  grpc_chttp2_stream_map_size(&t->stream_map));
3126
2937
  }
3127
2938
  t->benign_reclaimer_registered = false;
3128
- if (error != GRPC_ERROR_CANCELLED) {
2939
+ if (error != absl::CancelledError()) {
3129
2940
  t->active_reclamation.Finish();
3130
2941
  }
3131
2942
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "benign_reclaimer");
@@ -3135,7 +2946,7 @@ static void destructive_reclaimer_locked(void* arg, grpc_error_handle error) {
3135
2946
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(arg);
3136
2947
  size_t n = grpc_chttp2_stream_map_size(&t->stream_map);
3137
2948
  t->destructive_reclaimer_registered = false;
3138
- if (error == GRPC_ERROR_NONE && n > 0) {
2949
+ if (error.ok() && n > 0) {
3139
2950
  grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(
3140
2951
  grpc_chttp2_stream_map_rand(&t->stream_map));
3141
2952
  if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
@@ -3144,8 +2955,8 @@ static void destructive_reclaimer_locked(void* arg, grpc_error_handle error) {
3144
2955
  }
3145
2956
  grpc_chttp2_cancel_stream(
3146
2957
  t, s,
3147
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Buffers full"),
3148
- GRPC_ERROR_INT_HTTP2_ERROR,
2958
+ grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"),
2959
+ grpc_core::StatusIntProperty::kHttp2Error,
3149
2960
  GRPC_HTTP2_ENHANCE_YOUR_CALM));
3150
2961
  if (n > 1) {
3151
2962
  // Since we cancel one stream per destructive reclamation, if
@@ -3155,7 +2966,7 @@ static void destructive_reclaimer_locked(void* arg, grpc_error_handle error) {
3155
2966
  post_destructive_reclaimer(t);
3156
2967
  }
3157
2968
  }
3158
- if (error != GRPC_ERROR_CANCELLED) {
2969
+ if (error != absl::CancelledError()) {
3159
2970
  t->active_reclamation.Finish();
3160
2971
  }
3161
2972
  GRPC_CHTTP2_UNREF_TRANSPORT(t, "destructive_reclaimer");
@@ -3194,6 +3005,8 @@ const char* grpc_chttp2_initiate_write_reason_string(
3194
3005
  return "TRANSPORT_FLOW_CONTROL";
3195
3006
  case GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS:
3196
3007
  return "SEND_SETTINGS";
3008
+ case GRPC_CHTTP2_INITIATE_WRITE_SETTINGS_ACK:
3009
+ return "SETTINGS_ACK";
3197
3010
  case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_SETTING:
3198
3011
  return "FLOW_CONTROL_UNSTALLED_BY_SETTING";
3199
3012
  case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_UPDATE:
@@ -3240,7 +3053,8 @@ grpc_chttp2_transport_get_socket_node(grpc_transport* transport) {
3240
3053
  }
3241
3054
 
3242
3055
  grpc_transport* grpc_create_chttp2_transport(
3243
- const grpc_channel_args* channel_args, grpc_endpoint* ep, bool is_client) {
3056
+ const grpc_core::ChannelArgs& channel_args, grpc_endpoint* ep,
3057
+ bool is_client) {
3244
3058
  auto t = new grpc_chttp2_transport(channel_args, ep, is_client);
3245
3059
  return &t->base;
3246
3060
  }
@@ -3251,7 +3065,7 @@ void grpc_chttp2_transport_start_reading(
3251
3065
  grpc_chttp2_transport* t =
3252
3066
  reinterpret_cast<grpc_chttp2_transport*>(transport);
3253
3067
  GRPC_CHTTP2_REF_TRANSPORT(
3254
- t, "reading_action"); /* matches unref inside reading_action */
3068
+ t, "reading_action"); // matches unref inside reading_action
3255
3069
  if (read_buffer != nullptr) {
3256
3070
  grpc_slice_buffer_move_into(read_buffer, &t->read_buffer);
3257
3071
  gpr_free(read_buffer);
@@ -3260,5 +3074,5 @@ void grpc_chttp2_transport_start_reading(
3260
3074
  t->notify_on_close = notify_on_close;
3261
3075
  t->combiner->Run(
3262
3076
  GRPC_CLOSURE_INIT(&t->read_action_locked, read_action_locked, t, nullptr),
3263
- GRPC_ERROR_NONE);
3077
+ absl::OkStatus());
3264
3078
  }