grpc 1.42.0 → 1.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (2080) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +705 -451
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/endpoint_config.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +122 -44
  6. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  7. data/include/grpc/event_engine/memory_allocator.h +27 -26
  8. data/include/grpc/event_engine/memory_request.h +57 -0
  9. data/include/grpc/event_engine/port.h +1 -1
  10. data/include/grpc/event_engine/slice.h +286 -0
  11. data/include/grpc/event_engine/slice_buffer.h +135 -0
  12. data/include/grpc/grpc.h +43 -27
  13. data/include/grpc/grpc_posix.h +20 -19
  14. data/include/grpc/grpc_security.h +323 -195
  15. data/include/grpc/grpc_security_constants.h +1 -14
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +19 -28
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +0 -2
  18. data/include/grpc/impl/codegen/atm_windows.h +0 -2
  19. data/include/grpc/impl/codegen/compression_types.h +2 -3
  20. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  21. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  22. data/include/grpc/impl/codegen/grpc_types.h +31 -30
  23. data/include/grpc/impl/codegen/port_platform.h +107 -47
  24. data/include/grpc/impl/codegen/slice.h +5 -2
  25. data/include/grpc/slice.h +0 -11
  26. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  27. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
  28. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
  29. data/src/core/ext/filters/channel_idle/idle_filter_state.cc +96 -0
  30. data/src/core/ext/filters/channel_idle/idle_filter_state.h +68 -0
  31. data/src/core/ext/filters/client_channel/backend_metric.cc +20 -16
  32. data/src/core/ext/filters/client_channel/backend_metric.h +19 -8
  33. data/src/core/ext/filters/client_channel/backup_poller.cc +23 -19
  34. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  35. data/src/core/ext/filters/client_channel/channel_connectivity.cc +54 -30
  36. data/src/core/ext/filters/client_channel/client_channel.cc +684 -615
  37. data/src/core/ext/filters/client_channel/client_channel.h +103 -58
  38. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -6
  39. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  40. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -26
  41. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -8
  42. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -41
  43. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  44. data/src/core/ext/filters/client_channel/client_channel_service_config.h +111 -0
  45. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  46. data/src/core/ext/filters/client_channel/config_selector.h +21 -11
  47. data/src/core/ext/filters/client_channel/connector.h +13 -8
  48. data/src/core/ext/filters/client_channel/dynamic_filters.cc +36 -51
  49. data/src/core/ext/filters/client_channel/dynamic_filters.h +19 -10
  50. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +4 -22
  51. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +6 -15
  52. data/src/core/ext/filters/client_channel/health/health_check_client.cc +139 -583
  53. data/src/core/ext/filters/client_channel/health/health_check_client.h +26 -160
  54. data/src/core/ext/filters/client_channel/http_proxy.cc +96 -130
  55. data/src/core/ext/filters/client_channel/http_proxy.h +25 -1
  56. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +12 -8
  57. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  58. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  59. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +36 -15
  60. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +15 -9
  61. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +21 -19
  62. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  63. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +380 -313
  64. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  65. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  66. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +6 -2
  67. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +2 -5
  68. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +8 -2
  69. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +26 -16
  70. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +10 -8
  71. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +415 -0
  72. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  73. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1152 -0
  74. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  75. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +228 -207
  76. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +491 -452
  77. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +523 -391
  78. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +16 -6
  79. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +636 -626
  80. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +280 -254
  81. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +147 -134
  82. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +275 -223
  83. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +266 -249
  84. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  85. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +64 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +288 -277
  87. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +213 -182
  88. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +589 -737
  89. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  90. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  91. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  92. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +43 -33
  93. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +676 -334
  94. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +30 -13
  95. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +29 -24
  96. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +51 -71
  97. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +358 -357
  98. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +55 -40
  99. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +3 -2
  100. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  101. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  102. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +124 -255
  103. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +37 -49
  104. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +18 -3
  105. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +190 -102
  106. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +258 -0
  107. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +123 -0
  108. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +56 -61
  109. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +648 -503
  110. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  111. data/src/core/ext/filters/client_channel/retry_filter.cc +382 -294
  112. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  113. data/src/core/ext/filters/client_channel/retry_service_config.cc +198 -232
  114. data/src/core/ext/filters/client_channel/retry_service_config.h +41 -32
  115. data/src/core/ext/filters/client_channel/retry_throttle.cc +18 -39
  116. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -13
  117. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +37 -19
  118. data/src/core/ext/filters/client_channel/subchannel.cc +272 -319
  119. data/src/core/ext/filters/client_channel/subchannel.h +100 -47
  120. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  121. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  122. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +20 -26
  123. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
  124. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  125. data/src/core/ext/filters/deadline/deadline_filter.cc +48 -39
  126. data/src/core/ext/filters/deadline/deadline_filter.h +11 -4
  127. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +179 -403
  128. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +38 -6
  129. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  130. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +112 -0
  131. data/src/core/ext/filters/http/client/http_client_filter.cc +106 -551
  132. data/src/core/ext/filters/http/client/http_client_filter.h +35 -5
  133. data/src/core/ext/filters/http/client_authority_filter.cc +43 -112
  134. data/src/core/ext/filters/http/client_authority_filter.h +28 -6
  135. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -28
  136. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +112 -333
  137. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  138. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +85 -161
  139. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  140. data/src/core/ext/filters/http/server/http_server_filter.cc +100 -476
  141. data/src/core/ext/filters/http/server/http_server_filter.h +37 -3
  142. data/src/core/ext/filters/message_size/message_size_filter.cc +130 -159
  143. data/src/core/ext/filters/message_size/message_size_filter.h +41 -17
  144. data/src/core/ext/filters/rbac/rbac_filter.cc +174 -0
  145. data/src/core/ext/filters/rbac/rbac_filter.h +84 -0
  146. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +819 -0
  147. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +86 -0
  148. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +62 -0
  149. data/src/core/ext/filters/server_config_selector/server_config_selector.h +85 -0
  150. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +160 -0
  151. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +33 -0
  152. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +268 -110
  153. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -9
  154. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +387 -216
  155. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -5
  156. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  157. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  158. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +2 -1
  159. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  160. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +791 -1179
  161. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +16 -5
  162. data/src/core/ext/transport/chttp2/transport/context_list.cc +6 -3
  163. data/src/core/ext/transport/chttp2/transport/context_list.h +6 -4
  164. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +287 -0
  165. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1018 -0
  166. data/src/core/ext/transport/chttp2/transport/flow_control.cc +297 -285
  167. data/src/core/ext/transport/chttp2/transport/flow_control.h +191 -293
  168. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  169. data/src/core/ext/transport/chttp2/transport/frame_data.cc +66 -218
  170. data/src/core/ext/transport/chttp2/transport/frame_data.h +13 -36
  171. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +16 -13
  172. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  173. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +12 -7
  174. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  175. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +21 -9
  176. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  177. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +27 -59
  178. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  179. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +15 -16
  180. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  181. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  182. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +381 -260
  183. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +106 -147
  184. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +5 -2
  185. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +12 -1
  186. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +157 -229
  187. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -2
  188. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +143 -42
  189. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +50 -50
  190. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  191. data/src/core/ext/transport/chttp2/transport/internal.h +74 -163
  192. data/src/core/ext/transport/chttp2/transport/parsing.cc +170 -91
  193. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +11 -11
  194. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  196. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  197. data/src/core/ext/transport/chttp2/transport/varint.h +13 -8
  198. data/src/core/ext/transport/chttp2/transport/writing.cc +150 -183
  199. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -5
  200. data/src/core/ext/transport/inproc/inproc_transport.cc +237 -323
  201. data/src/core/ext/transport/inproc/inproc_transport.h +4 -5
  202. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  203. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +502 -0
  204. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  205. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +569 -0
  206. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +60 -341
  207. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +280 -1355
  208. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  209. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  210. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  211. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +159 -0
  212. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +64 -0
  213. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +189 -0
  214. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  215. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +128 -0
  216. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  217. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +106 -0
  218. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  219. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +101 -0
  220. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  221. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +613 -0
  222. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  223. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +107 -0
  224. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +43 -0
  225. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +51 -0
  226. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +30 -4
  227. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -17
  228. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +143 -116
  229. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +730 -385
  230. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +241 -199
  231. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1360 -663
  232. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +49 -28
  233. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +213 -90
  234. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +321 -271
  235. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1776 -826
  236. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +20 -7
  237. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +47 -23
  238. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +60 -27
  239. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +277 -98
  240. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  241. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1437 -0
  242. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +74 -53
  243. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +383 -189
  244. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +21 -7
  245. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +50 -24
  246. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +215 -176
  247. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1179 -583
  248. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +105 -45
  249. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +554 -166
  250. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +19 -6
  251. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +43 -23
  252. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +16 -22
  253. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +46 -100
  254. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  255. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +159 -0
  256. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +145 -117
  257. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +821 -409
  258. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +141 -92
  259. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +773 -348
  260. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +21 -8
  261. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +62 -30
  262. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +204 -125
  263. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +1068 -398
  264. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +17 -4
  265. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +33 -16
  266. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +27 -13
  267. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +92 -48
  268. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +22 -9
  269. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +80 -33
  270. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +26 -13
  271. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +98 -48
  272. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +21 -8
  273. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +51 -25
  274. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +51 -35
  275. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +207 -108
  276. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +74 -55
  277. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +374 -189
  278. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +70 -53
  279. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +378 -187
  280. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +19 -6
  281. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +39 -20
  282. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +122 -71
  283. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +660 -259
  284. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +104 -79
  285. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +589 -300
  286. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +31 -16
  287. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +109 -48
  288. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +27 -10
  289. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +98 -39
  290. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  291. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +140 -0
  292. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +82 -61
  293. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +446 -234
  294. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +86 -65
  295. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +443 -236
  296. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +139 -103
  297. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +649 -293
  298. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +45 -41
  299. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +255 -165
  300. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +706 -570
  301. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +4125 -1898
  302. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +38 -19
  303. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +161 -71
  304. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +241 -0
  305. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1191 -0
  306. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  307. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +92 -0
  308. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  309. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +107 -0
  310. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +27 -13
  311. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +86 -45
  312. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  313. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +138 -0
  314. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  315. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +254 -0
  316. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  317. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  318. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  319. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +98 -0
  320. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  321. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +221 -0
  322. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +33 -0
  323. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +43 -0
  324. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  325. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +226 -0
  326. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  327. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +150 -0
  328. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +17 -4
  329. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +39 -23
  330. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +45 -28
  331. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +208 -111
  332. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +51 -36
  333. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +273 -131
  334. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +71 -0
  335. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +237 -0
  336. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +26 -13
  337. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +91 -42
  338. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +292 -224
  339. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1679 -733
  340. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  341. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +168 -0
  342. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  343. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  344. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +9 -0
  345. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -3
  346. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +107 -60
  347. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +607 -234
  348. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +41 -26
  349. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +169 -86
  350. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +126 -83
  351. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +651 -262
  352. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  353. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +168 -0
  354. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +15 -2
  355. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +26 -14
  356. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +206 -72
  357. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +1095 -255
  358. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +31 -17
  359. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +116 -61
  360. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +74 -57
  361. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +368 -185
  362. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  363. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +116 -0
  364. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +34 -18
  365. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +140 -80
  366. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  367. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +230 -0
  368. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +28 -14
  369. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +108 -56
  370. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +21 -8
  371. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +55 -30
  372. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +20 -7
  373. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +53 -26
  374. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +19 -6
  375. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +43 -23
  376. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +35 -20
  377. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +130 -68
  378. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +31 -17
  379. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +132 -64
  380. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +26 -12
  381. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +94 -52
  382. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +37 -22
  383. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +163 -82
  384. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +50 -31
  385. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -144
  386. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +53 -36
  387. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +256 -130
  388. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  389. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +213 -0
  390. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +9 -0
  391. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -0
  392. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  393. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +143 -0
  394. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +23 -9
  395. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +71 -35
  396. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +30 -15
  397. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -51
  398. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  399. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  400. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  401. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  402. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +19 -6
  403. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +45 -18
  404. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  405. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +131 -0
  406. data/src/core/ext/upb-generated/google/api/annotations.upb.c +22 -0
  407. data/src/core/ext/upb-generated/google/api/annotations.upb.h +23 -0
  408. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +154 -125
  409. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +765 -381
  410. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +158 -126
  411. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +844 -401
  412. data/src/core/ext/upb-generated/google/api/http.upb.c +43 -28
  413. data/src/core/ext/upb-generated/google/api/http.upb.h +229 -114
  414. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  415. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +115 -0
  416. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +18 -5
  417. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +43 -21
  418. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +374 -282
  419. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2199 -1029
  420. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +18 -5
  421. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +41 -19
  422. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +15 -2
  423. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +26 -14
  424. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +47 -31
  425. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +190 -92
  426. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +18 -5
  427. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +41 -19
  428. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +57 -36
  429. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +277 -148
  430. data/src/core/ext/upb-generated/google/rpc/status.upb.c +21 -8
  431. data/src/core/ext/upb-generated/google/rpc/status.upb.h +57 -29
  432. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  433. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +335 -0
  434. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +32 -18
  435. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +108 -47
  436. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +135 -107
  437. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +726 -358
  438. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +27 -12
  439. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +85 -40
  440. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +22 -8
  441. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +65 -34
  442. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +81 -61
  443. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +435 -237
  444. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +34 -19
  445. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +124 -62
  446. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  447. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  448. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +75 -13
  449. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +206 -56
  450. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -5
  451. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +59 -17
  452. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +21 -0
  453. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +16 -0
  454. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +31 -5
  455. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +61 -19
  456. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +30 -4
  457. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +54 -17
  458. data/src/core/ext/upb-generated/validate/validate.upb.c +406 -310
  459. data/src/core/ext/upb-generated/validate/validate.upb.h +2822 -1164
  460. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  461. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +290 -0
  462. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  463. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +112 -0
  464. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  465. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  466. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +64 -17
  467. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +191 -67
  468. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  469. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +103 -0
  470. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +17 -4
  471. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +35 -18
  472. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +30 -16
  473. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +107 -54
  474. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +25 -11
  475. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +58 -29
  476. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  477. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +107 -0
  478. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +22 -9
  479. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +60 -29
  480. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +33 -19
  481. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +139 -69
  482. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +22 -9
  483. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +63 -29
  484. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +36 -21
  485. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +106 -45
  486. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  487. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  488. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  489. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +914 -0
  490. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  491. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +151 -0
  492. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  493. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +226 -0
  494. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +20 -7
  495. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +47 -23
  496. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  497. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  498. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  499. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  500. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +75 -327
  501. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +16 -101
  502. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  503. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  504. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  505. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  506. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +56 -0
  507. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  508. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  509. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  510. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  511. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  512. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  513. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  514. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  515. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  516. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  517. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  518. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +10 -8
  519. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  520. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +10 -13
  521. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  522. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +120 -150
  523. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  524. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +253 -280
  525. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  526. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +60 -62
  527. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  528. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +387 -424
  529. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  530. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +16 -18
  531. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  532. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +25 -23
  533. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  534. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  535. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  536. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +17 -32
  537. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  538. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +17 -19
  539. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  540. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +203 -246
  541. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  542. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +140 -116
  543. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +26 -16
  544. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +16 -19
  545. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  546. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +24 -43
  547. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +4 -9
  548. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  549. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  550. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +23 -51
  551. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  552. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +179 -187
  553. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +30 -25
  554. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +16 -19
  555. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  556. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +254 -254
  557. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  558. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +14 -16
  559. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  560. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +16 -20
  561. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  562. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +16 -18
  563. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  564. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +26 -28
  565. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  566. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +15 -18
  567. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  568. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +20 -28
  569. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  570. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +21 -33
  571. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  572. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +20 -30
  573. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  574. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +16 -18
  575. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  576. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +180 -165
  577. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +24 -19
  578. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +155 -166
  579. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  580. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +21 -23
  581. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  582. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +46 -42
  583. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  584. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  585. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  586. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +19 -35
  587. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  588. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +19 -37
  589. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  590. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +194 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +75 -0
  592. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -85
  593. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +7 -12
  594. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +874 -917
  595. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +170 -160
  596. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +54 -48
  597. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  598. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +199 -0
  599. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +90 -0
  600. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  602. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  603. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  604. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +17 -21
  605. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  606. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  607. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  608. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  609. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  611. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  612. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  613. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  615. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +61 -0
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  621. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +17 -18
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +19 -29
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +20 -26
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +80 -0
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +19 -20
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  632. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +405 -410
  633. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +63 -58
  634. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +17 -13
  635. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  636. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +174 -157
  637. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  638. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +21 -27
  639. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  640. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +219 -216
  641. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +24 -19
  642. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  643. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  644. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +16 -18
  645. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  646. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +162 -107
  647. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +57 -22
  648. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +18 -22
  649. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  650. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +125 -135
  651. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  652. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  653. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  654. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +15 -23
  655. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  656. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  657. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  658. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +17 -21
  659. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  660. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +17 -19
  661. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  662. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +17 -19
  663. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  664. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +17 -19
  665. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  666. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +38 -43
  667. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  668. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +17 -21
  669. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  670. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +16 -21
  671. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  672. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +18 -24
  673. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  674. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +15 -29
  675. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  676. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +16 -26
  677. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  678. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  679. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  680. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +12 -10
  681. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  682. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  683. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  684. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +14 -19
  685. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  686. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +13 -19
  687. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  688. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  689. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  690. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  691. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  692. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +13 -16
  693. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  694. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  695. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  696. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +7 -7
  697. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  698. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  699. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  700. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  701. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  702. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +5 -14
  703. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  704. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  705. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  706. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +5 -10
  707. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  708. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +96 -151
  709. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  710. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +5 -10
  711. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  712. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +5 -10
  713. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  714. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +5 -16
  715. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  716. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +5 -10
  717. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  718. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +5 -26
  719. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  720. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +6 -11
  721. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  722. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  723. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  724. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  725. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  726. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +6 -15
  727. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  728. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +7 -12
  729. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  730. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -6
  731. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  732. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +6 -11
  733. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  734. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +6 -11
  735. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  736. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +8 -57
  737. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  738. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  739. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  740. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  741. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  742. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  743. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  744. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +6 -17
  745. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  746. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  747. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  748. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +7 -12
  749. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  750. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +9 -16
  751. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  752. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +6 -13
  753. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  754. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  755. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  756. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +8 -13
  757. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  758. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +8 -15
  759. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  760. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +8 -13
  761. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  762. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  763. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  764. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  765. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  766. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  767. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  768. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +7 -12
  769. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  770. data/src/core/ext/xds/certificate_provider_store.cc +75 -3
  771. data/src/core/ext/xds/certificate_provider_store.h +28 -2
  772. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +20 -14
  773. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +11 -3
  774. data/src/core/ext/xds/upb_utils.h +45 -0
  775. data/src/core/ext/xds/xds_api.cc +329 -3648
  776. data/src/core/ext/xds/xds_api.h +78 -630
  777. data/src/core/ext/xds/xds_bootstrap.cc +10 -443
  778. data/src/core/ext/xds/xds_bootstrap.h +44 -81
  779. data/src/core/ext/xds/xds_bootstrap_grpc.cc +361 -0
  780. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  781. data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
  782. data/src/core/ext/xds/xds_certificate_provider.h +35 -3
  783. data/src/core/ext/xds/xds_channel_stack_modifier.cc +27 -21
  784. data/src/core/ext/xds/xds_channel_stack_modifier.h +17 -4
  785. data/src/core/ext/xds/xds_client.cc +1278 -2037
  786. data/src/core/ext/xds/xds_client.h +158 -197
  787. data/src/core/ext/xds/xds_client_grpc.cc +210 -0
  788. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  789. data/src/core/ext/xds/xds_client_stats.cc +18 -19
  790. data/src/core/ext/xds/xds_client_stats.h +9 -7
  791. data/src/core/ext/xds/xds_cluster.cc +659 -0
  792. data/src/core/ext/xds/xds_cluster.h +116 -0
  793. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +152 -0
  794. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +92 -0
  795. data/src/core/ext/xds/xds_common_types.cc +501 -0
  796. data/src/core/ext/xds/xds_common_types.h +108 -0
  797. data/src/core/ext/xds/xds_endpoint.cc +468 -0
  798. data/src/core/ext/xds/xds_endpoint.h +139 -0
  799. data/src/core/ext/xds/xds_http_fault_filter.cc +67 -59
  800. data/src/core/ext/xds/xds_http_fault_filter.h +18 -24
  801. data/src/core/ext/xds/xds_http_filters.cc +66 -66
  802. data/src/core/ext/xds/xds_http_filters.h +72 -24
  803. data/src/core/ext/xds/xds_http_rbac_filter.cc +505 -0
  804. data/src/core/ext/xds/xds_http_rbac_filter.h +58 -0
  805. data/src/core/ext/xds/xds_lb_policy_registry.cc +243 -0
  806. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  807. data/src/core/ext/xds/xds_listener.cc +1144 -0
  808. data/src/core/ext/xds/xds_listener.h +224 -0
  809. data/src/core/ext/xds/xds_resource_type.h +104 -0
  810. data/src/core/ext/xds/xds_resource_type_impl.h +86 -0
  811. data/src/core/ext/xds/xds_route_config.cc +1166 -0
  812. data/src/core/ext/xds/xds_route_config.h +241 -0
  813. data/src/core/ext/xds/xds_routing.cc +264 -0
  814. data/src/core/ext/xds/xds_routing.h +106 -0
  815. data/src/core/ext/xds/xds_server_config_fetcher.cc +1155 -324
  816. data/src/core/ext/xds/xds_transport.h +86 -0
  817. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  818. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  819. data/src/core/lib/address_utils/parse_address.cc +36 -16
  820. data/src/core/lib/address_utils/parse_address.h +11 -2
  821. data/src/core/lib/address_utils/sockaddr_utils.cc +82 -51
  822. data/src/core/lib/address_utils/sockaddr_utils.h +9 -19
  823. data/src/core/lib/avl/avl.h +476 -88
  824. data/src/core/lib/backoff/backoff.cc +9 -40
  825. data/src/core/lib/backoff/backoff.h +12 -12
  826. data/src/core/lib/channel/call_finalization.h +88 -0
  827. data/src/core/lib/channel/call_tracer.h +16 -7
  828. data/src/core/lib/channel/channel_args.cc +274 -48
  829. data/src/core/lib/channel/channel_args.h +413 -12
  830. data/src/core/lib/channel/channel_args_preconditioning.cc +43 -0
  831. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  832. data/src/core/lib/channel/channel_fwd.h +26 -0
  833. data/src/core/lib/channel/channel_stack.cc +64 -17
  834. data/src/core/lib/channel/channel_stack.h +96 -14
  835. data/src/core/lib/channel/channel_stack_builder.cc +18 -280
  836. data/src/core/lib/channel/channel_stack_builder.h +112 -150
  837. data/src/core/lib/channel/channel_stack_builder_impl.cc +113 -0
  838. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  839. data/src/core/lib/channel/channel_trace.cc +12 -22
  840. data/src/core/lib/channel/channel_trace.h +6 -3
  841. data/src/core/lib/channel/channelz.cc +36 -49
  842. data/src/core/lib/channel/channelz.h +24 -7
  843. data/src/core/lib/channel/channelz_registry.cc +11 -19
  844. data/src/core/lib/channel/channelz_registry.h +10 -9
  845. data/src/core/lib/channel/connected_channel.cc +704 -48
  846. data/src/core/lib/channel/connected_channel.h +3 -4
  847. data/src/core/lib/channel/context.h +11 -0
  848. data/src/core/lib/channel/promise_based_filter.cc +2126 -0
  849. data/src/core/lib/channel/promise_based_filter.h +848 -0
  850. data/src/core/lib/channel/status_util.cc +29 -0
  851. data/src/core/lib/channel/status_util.h +9 -2
  852. data/src/core/lib/compression/compression.cc +26 -113
  853. data/src/core/lib/compression/compression_internal.cc +170 -204
  854. data/src/core/lib/compression/compression_internal.h +68 -72
  855. data/src/core/lib/compression/message_compress.cc +18 -16
  856. data/src/core/lib/compression/message_compress.h +4 -5
  857. data/src/core/lib/config/core_configuration.cc +18 -3
  858. data/src/core/lib/config/core_configuration.h +133 -36
  859. data/src/core/lib/debug/event_log.cc +88 -0
  860. data/src/core/lib/debug/event_log.h +81 -0
  861. data/src/core/lib/debug/histogram_view.cc +69 -0
  862. data/src/core/lib/debug/histogram_view.h +37 -0
  863. data/src/core/lib/debug/stats.cc +31 -135
  864. data/src/core/lib/debug/stats.h +30 -37
  865. data/src/core/lib/debug/stats_data.cc +290 -638
  866. data/src/core/lib/debug/stats_data.h +263 -527
  867. data/src/core/lib/debug/trace.cc +0 -2
  868. data/src/core/lib/debug/trace.h +15 -14
  869. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +40 -0
  870. data/src/core/lib/event_engine/channel_args_endpoint_config.h +49 -0
  871. data/src/core/lib/event_engine/common_closures.h +71 -0
  872. data/src/core/lib/event_engine/default_event_engine.cc +94 -0
  873. data/src/core/lib/event_engine/default_event_engine.h +49 -0
  874. data/src/core/lib/event_engine/default_event_engine_factory.cc +48 -0
  875. data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
  876. data/src/core/lib/event_engine/executor/executor.h +38 -0
  877. data/src/core/lib/event_engine/forkable.cc +101 -0
  878. data/src/core/lib/event_engine/forkable.h +61 -0
  879. data/src/core/lib/event_engine/handle_containers.h +67 -0
  880. data/src/core/lib/event_engine/memory_allocator.cc +74 -0
  881. data/src/core/lib/event_engine/poller.h +62 -0
  882. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  883. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  884. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  885. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  886. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  887. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  888. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  889. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  890. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  891. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  892. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  893. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  894. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  895. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +577 -0
  896. data/src/core/lib/event_engine/posix_engine/posix_engine.h +245 -0
  897. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  898. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  899. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  900. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  901. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  902. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  903. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  904. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +174 -0
  905. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  906. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  907. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  908. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  909. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  910. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  911. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  912. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  913. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  914. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  915. data/src/core/lib/event_engine/resolved_address.cc +41 -0
  916. data/src/core/lib/event_engine/slice.cc +103 -0
  917. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  918. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  919. data/src/core/lib/event_engine/thread_pool.cc +276 -0
  920. data/src/core/lib/event_engine/thread_pool.h +137 -0
  921. data/src/core/lib/event_engine/time_util.cc +30 -0
  922. data/src/core/lib/event_engine/time_util.h +32 -0
  923. data/src/core/lib/event_engine/trace.cc +18 -0
  924. data/src/core/lib/event_engine/trace.h +30 -0
  925. data/src/core/lib/event_engine/utils.cc +44 -0
  926. data/src/core/lib/event_engine/utils.h +36 -0
  927. data/src/core/lib/event_engine/windows/iocp.cc +155 -0
  928. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  929. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  930. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  931. data/src/core/lib/event_engine/windows/windows_engine.cc +165 -0
  932. data/src/core/lib/event_engine/windows/windows_engine.h +124 -0
  933. data/src/core/lib/experiments/config.cc +146 -0
  934. data/src/core/lib/experiments/config.h +43 -0
  935. data/src/core/lib/experiments/experiments.cc +86 -0
  936. data/src/core/lib/experiments/experiments.h +63 -0
  937. data/src/core/lib/gpr/alloc.cc +1 -9
  938. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  939. data/src/core/lib/gpr/log.cc +5 -0
  940. data/src/core/lib/gpr/log_linux.cc +3 -4
  941. data/src/core/lib/gpr/log_windows.cc +0 -1
  942. data/src/core/lib/gpr/string.h +1 -1
  943. data/src/core/lib/gpr/string_util_windows.cc +3 -30
  944. data/src/core/lib/gpr/sync_abseil.cc +0 -14
  945. data/src/core/lib/gpr/sync_posix.cc +1 -14
  946. data/src/core/lib/gpr/time.cc +13 -10
  947. data/src/core/lib/gpr/time_posix.cc +6 -15
  948. data/src/core/lib/gpr/time_precise.h +1 -1
  949. data/src/core/lib/gpr/time_windows.cc +10 -7
  950. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  951. data/src/core/lib/gpr/tmpfile_windows.cc +5 -7
  952. data/src/core/lib/gpr/useful.h +58 -0
  953. data/src/core/lib/gprpp/bitset.h +27 -14
  954. data/src/core/lib/gprpp/chunked_vector.h +49 -3
  955. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  956. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  957. data/src/core/lib/gprpp/debug_location.h +41 -7
  958. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  959. data/src/core/lib/gprpp/env.h +53 -0
  960. data/src/core/lib/gprpp/env_linux.cc +80 -0
  961. data/src/core/lib/gprpp/env_posix.cc +47 -0
  962. data/src/core/lib/gprpp/env_windows.cc +56 -0
  963. data/src/core/lib/gprpp/examine_stack.h +0 -1
  964. data/src/core/lib/gprpp/fork.cc +17 -28
  965. data/src/core/lib/gprpp/fork.h +0 -8
  966. data/src/core/lib/gprpp/global_config.h +2 -4
  967. data/src/core/lib/gprpp/global_config_env.cc +16 -14
  968. data/src/core/lib/gprpp/global_config_env.h +5 -3
  969. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  970. data/src/core/lib/gprpp/host_port.cc +2 -0
  971. data/src/core/lib/gprpp/load_file.cc +75 -0
  972. data/src/core/lib/gprpp/load_file.h +33 -0
  973. data/src/core/lib/gprpp/manual_constructor.h +0 -70
  974. data/src/core/lib/gprpp/match.h +2 -0
  975. data/src/core/lib/gprpp/memory.h +1 -5
  976. data/src/core/lib/gprpp/no_destruct.h +94 -0
  977. data/src/core/lib/gprpp/notification.h +67 -0
  978. data/src/core/lib/gprpp/orphanable.h +2 -5
  979. data/src/core/lib/gprpp/packed_table.h +40 -0
  980. data/src/core/lib/gprpp/per_cpu.h +46 -0
  981. data/src/core/lib/gprpp/ref_counted.h +4 -4
  982. data/src/core/lib/gprpp/ref_counted_ptr.h +23 -39
  983. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  984. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  985. data/src/core/lib/gprpp/stat.h +0 -2
  986. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  987. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  988. data/src/core/lib/gprpp/status_helper.cc +75 -48
  989. data/src/core/lib/gprpp/status_helper.h +16 -21
  990. data/src/core/lib/gprpp/strerror.cc +41 -0
  991. data/src/core/lib/gprpp/strerror.h +29 -0
  992. data/src/core/lib/gprpp/sync.h +3 -1
  993. data/src/core/lib/gprpp/table.h +42 -2
  994. data/src/core/lib/gprpp/tchar.cc +49 -0
  995. data/src/core/lib/gprpp/tchar.h +33 -0
  996. data/src/core/lib/gprpp/thd.h +2 -5
  997. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  998. data/src/core/lib/gprpp/thd_windows.cc +3 -2
  999. data/src/core/lib/gprpp/time.cc +234 -0
  1000. data/src/core/lib/gprpp/time.h +367 -0
  1001. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  1002. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  1003. data/src/core/lib/gprpp/time_util.cc +4 -0
  1004. data/src/core/lib/gprpp/time_util.h +1 -1
  1005. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  1006. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  1007. data/src/core/lib/gprpp/validation_errors.h +127 -0
  1008. data/src/core/lib/gprpp/work_serializer.cc +247 -0
  1009. data/src/core/lib/gprpp/work_serializer.h +86 -0
  1010. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  1011. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  1012. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  1013. data/src/core/lib/http/format_request.cc +62 -29
  1014. data/src/core/lib/http/format_request.h +10 -7
  1015. data/src/core/lib/http/httpcli.cc +313 -244
  1016. data/src/core/lib/http/httpcli.h +234 -90
  1017. data/src/core/lib/http/httpcli_security_connector.cc +84 -86
  1018. data/src/core/lib/http/httpcli_ssl_credentials.h +39 -0
  1019. data/src/core/lib/http/parser.cc +124 -65
  1020. data/src/core/lib/http/parser.h +18 -2
  1021. data/src/core/lib/iomgr/buffer_list.cc +110 -121
  1022. data/src/core/lib/iomgr/buffer_list.h +68 -52
  1023. data/src/core/lib/iomgr/call_combiner.cc +17 -40
  1024. data/src/core/lib/iomgr/call_combiner.h +3 -4
  1025. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  1026. data/src/core/lib/iomgr/closure.h +68 -14
  1027. data/src/core/lib/iomgr/combiner.cc +11 -9
  1028. data/src/core/lib/iomgr/endpoint.cc +4 -4
  1029. data/src/core/lib/iomgr/endpoint.h +7 -6
  1030. data/src/core/lib/iomgr/endpoint_cfstream.cc +40 -53
  1031. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  1032. data/src/core/lib/iomgr/endpoint_pair_posix.cc +15 -11
  1033. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  1034. data/src/core/lib/iomgr/error.cc +30 -813
  1035. data/src/core/lib/iomgr/error.h +22 -295
  1036. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  1037. data/src/core/lib/iomgr/ev_apple.cc +10 -9
  1038. data/src/core/lib/iomgr/ev_epoll1_linux.cc +88 -84
  1039. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  1040. data/src/core/lib/iomgr/ev_poll_posix.cc +123 -109
  1041. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  1042. data/src/core/lib/iomgr/ev_posix.cc +58 -100
  1043. data/src/core/lib/iomgr/ev_posix.h +6 -4
  1044. data/src/core/lib/iomgr/exec_ctx.cc +14 -109
  1045. data/src/core/lib/iomgr/exec_ctx.h +24 -66
  1046. data/src/core/lib/iomgr/executor.cc +16 -21
  1047. data/src/core/lib/iomgr/executor.h +1 -4
  1048. data/src/core/lib/iomgr/fork_posix.cc +1 -0
  1049. data/src/core/lib/iomgr/internal_errqueue.cc +40 -47
  1050. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  1051. data/src/core/lib/iomgr/iocp_windows.cc +10 -10
  1052. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  1053. data/src/core/lib/iomgr/iomgr.cc +6 -2
  1054. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  1055. data/src/core/lib/iomgr/iomgr_posix.cc +4 -3
  1056. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +4 -2
  1057. data/src/core/lib/iomgr/iomgr_windows.cc +3 -2
  1058. data/src/core/lib/iomgr/load_file.cc +5 -9
  1059. data/src/core/lib/iomgr/lockfree_event.cc +10 -27
  1060. data/src/core/lib/iomgr/polling_entity.h +6 -0
  1061. data/src/core/lib/iomgr/pollset.cc +1 -1
  1062. data/src/core/lib/iomgr/pollset.h +5 -5
  1063. data/src/core/lib/iomgr/pollset_set.h +1 -3
  1064. data/src/core/lib/iomgr/pollset_windows.cc +6 -6
  1065. data/src/core/lib/iomgr/port.h +29 -12
  1066. data/src/core/lib/iomgr/python_util.h +2 -2
  1067. data/src/core/lib/iomgr/resolve_address.cc +16 -22
  1068. data/src/core/lib/iomgr/resolve_address.h +79 -46
  1069. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  1070. data/src/core/lib/iomgr/resolve_address_posix.cc +112 -78
  1071. data/src/core/lib/iomgr/resolve_address_posix.h +63 -0
  1072. data/src/core/lib/iomgr/resolve_address_windows.cc +125 -81
  1073. data/src/core/lib/iomgr/resolve_address_windows.h +63 -0
  1074. data/src/core/lib/iomgr/resolved_address.h +39 -0
  1075. data/src/core/lib/iomgr/sockaddr.h +2 -3
  1076. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  1077. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +63 -0
  1078. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  1079. data/src/core/lib/iomgr/socket_utils_common_posix.cc +44 -81
  1080. data/src/core/lib/iomgr/socket_utils_posix.cc +84 -1
  1081. data/src/core/lib/iomgr/socket_utils_posix.h +98 -6
  1082. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  1083. data/src/core/lib/iomgr/socket_windows.h +0 -2
  1084. data/src/core/lib/iomgr/tcp_client.cc +11 -9
  1085. data/src/core/lib/iomgr/tcp_client.h +25 -15
  1086. data/src/core/lib/iomgr/tcp_client_cfstream.cc +28 -26
  1087. data/src/core/lib/iomgr/tcp_client_posix.cc +194 -85
  1088. data/src/core/lib/iomgr/tcp_client_posix.h +14 -12
  1089. data/src/core/lib/iomgr/tcp_client_windows.cc +33 -35
  1090. data/src/core/lib/iomgr/tcp_posix.cc +465 -254
  1091. data/src/core/lib/iomgr/tcp_posix.h +4 -4
  1092. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  1093. data/src/core/lib/iomgr/tcp_server.h +5 -4
  1094. data/src/core/lib/iomgr/tcp_server_posix.cc +109 -101
  1095. data/src/core/lib/iomgr/tcp_server_utils_posix.h +21 -20
  1096. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +50 -49
  1097. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +19 -16
  1098. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  1099. data/src/core/lib/iomgr/tcp_server_windows.cc +45 -48
  1100. data/src/core/lib/iomgr/tcp_windows.cc +43 -46
  1101. data/src/core/lib/iomgr/tcp_windows.h +1 -3
  1102. data/src/core/lib/iomgr/timer.cc +2 -2
  1103. data/src/core/lib/iomgr/timer.h +18 -13
  1104. data/src/core/lib/iomgr/timer_generic.cc +108 -97
  1105. data/src/core/lib/iomgr/timer_manager.cc +14 -14
  1106. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -34
  1107. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  1108. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  1109. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -5
  1110. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  1111. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  1112. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  1113. data/src/core/lib/json/json.h +20 -24
  1114. data/src/core/lib/json/json_args.h +34 -0
  1115. data/src/core/lib/json/json_channel_args.h +42 -0
  1116. data/src/core/lib/json/json_object_loader.cc +207 -0
  1117. data/src/core/lib/json/json_object_loader.h +620 -0
  1118. data/src/core/lib/json/json_reader.cc +155 -75
  1119. data/src/core/lib/json/json_util.cc +17 -37
  1120. data/src/core/lib/json/json_util.h +18 -9
  1121. data/src/core/lib/json/json_writer.cc +6 -1
  1122. data/src/core/lib/load_balancing/lb_policy.cc +93 -0
  1123. data/src/core/lib/load_balancing/lb_policy.h +439 -0
  1124. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1125. data/src/core/lib/load_balancing/lb_policy_registry.cc +141 -0
  1126. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1127. data/src/core/lib/load_balancing/subchannel_interface.h +133 -0
  1128. data/src/core/lib/matchers/matchers.cc +10 -8
  1129. data/src/core/lib/matchers/matchers.h +2 -0
  1130. data/src/core/lib/promise/activity.cc +134 -0
  1131. data/src/core/lib/promise/activity.h +604 -0
  1132. data/src/core/lib/promise/arena_promise.h +230 -0
  1133. data/src/core/lib/promise/context.h +92 -0
  1134. data/src/core/lib/promise/detail/basic_seq.h +497 -0
  1135. data/src/core/lib/promise/detail/promise_factory.h +235 -0
  1136. data/src/core/lib/promise/detail/promise_like.h +85 -0
  1137. data/src/core/lib/promise/detail/status.h +78 -0
  1138. data/src/core/lib/promise/detail/switch.h +1455 -0
  1139. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +50 -0
  1140. data/src/core/lib/promise/for_each.h +129 -0
  1141. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  1142. data/src/core/lib/promise/latch.h +103 -0
  1143. data/src/core/lib/promise/loop.h +138 -0
  1144. data/src/core/lib/promise/map.h +87 -0
  1145. data/src/core/lib/promise/map_pipe.h +87 -0
  1146. data/src/core/lib/promise/pipe.cc +19 -0
  1147. data/src/core/lib/promise/pipe.h +505 -0
  1148. data/src/core/lib/promise/poll.h +79 -0
  1149. data/src/core/lib/promise/promise.h +96 -0
  1150. data/src/core/lib/promise/race.h +83 -0
  1151. data/src/core/lib/promise/seq.h +106 -0
  1152. data/src/core/lib/promise/sleep.cc +90 -0
  1153. data/src/core/lib/promise/sleep.h +84 -0
  1154. data/src/core/lib/promise/try_concurrently.h +341 -0
  1155. data/src/core/lib/promise/try_seq.h +174 -0
  1156. data/src/core/lib/resolver/resolver.cc +37 -0
  1157. data/src/core/lib/resolver/resolver.h +138 -0
  1158. data/src/core/lib/resolver/resolver_factory.h +77 -0
  1159. data/src/core/lib/resolver/resolver_registry.cc +149 -0
  1160. data/src/core/lib/resolver/resolver_registry.h +123 -0
  1161. data/src/core/lib/resolver/server_address.cc +181 -0
  1162. data/src/core/lib/resolver/server_address.h +145 -0
  1163. data/src/core/lib/resource_quota/api.cc +104 -0
  1164. data/src/core/lib/resource_quota/api.h +49 -0
  1165. data/src/core/lib/resource_quota/arena.cc +138 -0
  1166. data/src/core/lib/resource_quota/arena.h +252 -0
  1167. data/src/core/lib/resource_quota/memory_quota.cc +603 -0
  1168. data/src/core/lib/resource_quota/memory_quota.h +530 -0
  1169. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1170. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1171. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  1172. data/src/core/lib/resource_quota/resource_quota.h +74 -0
  1173. data/src/core/lib/resource_quota/thread_quota.cc +45 -0
  1174. data/src/core/lib/resource_quota/thread_quota.h +61 -0
  1175. data/src/core/lib/resource_quota/trace.cc +19 -0
  1176. data/src/core/lib/resource_quota/trace.h +24 -0
  1177. data/src/core/lib/security/authorization/authorization_policy_provider.h +14 -0
  1178. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  1179. data/src/core/lib/security/authorization/evaluate_args.cc +53 -45
  1180. data/src/core/lib/security/authorization/evaluate_args.h +9 -5
  1181. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +64 -0
  1182. data/src/core/lib/security/authorization/grpc_authorization_engine.h +69 -0
  1183. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +122 -0
  1184. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +61 -0
  1185. data/src/core/lib/security/authorization/matchers.cc +241 -0
  1186. data/src/core/lib/security/authorization/matchers.h +218 -0
  1187. data/src/core/lib/security/authorization/rbac_policy.cc +445 -0
  1188. data/src/core/lib/security/authorization/rbac_policy.h +178 -0
  1189. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +66 -0
  1190. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1191. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1192. data/src/core/lib/security/context/security_context.cc +9 -4
  1193. data/src/core/lib/security/context/security_context.h +33 -4
  1194. data/src/core/lib/security/credentials/alts/alts_credentials.cc +18 -10
  1195. data/src/core/lib/security/credentials/alts/alts_credentials.h +18 -4
  1196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  1197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  1198. data/src/core/lib/security/credentials/call_creds_util.cc +97 -0
  1199. data/src/core/lib/security/credentials/call_creds_util.h +43 -0
  1200. data/src/core/lib/security/credentials/channel_creds_registry.h +103 -0
  1201. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +80 -0
  1202. data/src/core/lib/security/credentials/composite/composite_credentials.cc +32 -91
  1203. data/src/core/lib/security/credentials/composite/composite_credentials.h +42 -16
  1204. data/src/core/lib/security/credentials/credentials.cc +6 -11
  1205. data/src/core/lib/security/credentials/credentials.h +106 -99
  1206. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +249 -107
  1207. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +19 -0
  1208. data/src/core/lib/security/credentials/external/aws_request_signer.cc +13 -3
  1209. data/src/core/lib/security/credentials/external/external_account_credentials.cc +137 -103
  1210. data/src/core/lib/security/credentials/external/external_account_credentials.h +16 -9
  1211. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -27
  1212. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  1213. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +76 -45
  1214. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +11 -0
  1215. data/src/core/lib/security/credentials/fake/fake_credentials.cc +43 -43
  1216. data/src/core/lib/security/credentials/fake/fake_credentials.h +35 -26
  1217. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +6 -8
  1218. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +118 -80
  1219. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +20 -7
  1220. data/src/core/lib/security/credentials/iam/iam_credentials.cc +32 -30
  1221. data/src/core/lib/security/credentials/iam/iam_credentials.h +25 -9
  1222. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +35 -26
  1223. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1224. data/src/core/lib/security/credentials/jwt/json_token.cc +21 -12
  1225. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  1226. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +46 -55
  1227. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +30 -12
  1228. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +96 -61
  1229. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +6 -4
  1230. data/src/core/lib/security/credentials/local/local_credentials.cc +19 -13
  1231. data/src/core/lib/security/credentials/local/local_credentials.h +19 -3
  1232. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +214 -222
  1233. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +81 -34
  1234. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +104 -156
  1235. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +80 -27
  1236. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +31 -35
  1237. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +29 -6
  1238. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +21 -29
  1239. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +13 -14
  1240. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +75 -58
  1241. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +73 -14
  1242. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +241 -0
  1243. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +168 -0
  1244. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +37 -92
  1245. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +73 -149
  1246. data/src/core/lib/security/credentials/tls/tls_credentials.cc +59 -42
  1247. data/src/core/lib/security/credentials/tls/tls_credentials.h +13 -4
  1248. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1249. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  1250. data/src/core/lib/security/credentials/xds/xds_credentials.cc +81 -89
  1251. data/src/core/lib/security/credentials/xds/xds_credentials.h +53 -8
  1252. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +46 -45
  1253. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +9 -6
  1254. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +58 -70
  1255. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -5
  1256. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +23 -24
  1257. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +34 -27
  1258. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  1259. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +175 -0
  1260. data/src/core/lib/security/security_connector/load_system_roots_supported.h +46 -0
  1261. data/src/core/lib/security/security_connector/local/local_security_connector.cc +52 -40
  1262. data/src/core/lib/security/security_connector/local/local_security_connector.h +7 -3
  1263. data/src/core/lib/security/security_connector/security_connector.cc +22 -32
  1264. data/src/core/lib/security/security_connector/security_connector.h +49 -31
  1265. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -34
  1266. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  1267. data/src/core/lib/security/security_connector/ssl_utils.cc +54 -40
  1268. data/src/core/lib/security/security_connector/ssl_utils.h +23 -24
  1269. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  1270. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +391 -230
  1271. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +97 -54
  1272. data/src/core/lib/security/transport/auth_filters.h +45 -5
  1273. data/src/core/lib/security/transport/client_auth_filter.cc +122 -368
  1274. data/src/core/lib/security/transport/secure_endpoint.cc +282 -158
  1275. data/src/core/lib/security/transport/secure_endpoint.h +5 -4
  1276. data/src/core/lib/security/transport/security_handshaker.cc +123 -92
  1277. data/src/core/lib/security/transport/security_handshaker.h +7 -2
  1278. data/src/core/lib/security/transport/server_auth_filter.cc +87 -58
  1279. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  1280. data/src/core/lib/security/util/json_util.cc +7 -7
  1281. data/src/core/lib/security/util/json_util.h +0 -2
  1282. data/src/core/lib/service_config/service_config.h +89 -0
  1283. data/src/core/lib/service_config/service_config_call_data.h +76 -0
  1284. data/src/core/lib/service_config/service_config_impl.cc +191 -0
  1285. data/src/core/lib/service_config/service_config_impl.h +125 -0
  1286. data/src/core/lib/service_config/service_config_parser.cc +81 -0
  1287. data/src/core/lib/service_config/service_config_parser.h +105 -0
  1288. data/src/core/lib/slice/b64.cc +2 -2
  1289. data/src/core/lib/slice/b64.h +2 -0
  1290. data/src/core/lib/slice/percent_encoding.cc +35 -97
  1291. data/src/core/lib/slice/percent_encoding.h +4 -16
  1292. data/src/core/lib/slice/slice.cc +94 -184
  1293. data/src/core/lib/slice/slice.h +402 -0
  1294. data/src/core/lib/slice/slice_buffer.cc +92 -33
  1295. data/src/core/lib/slice/slice_buffer.h +137 -0
  1296. data/src/core/lib/slice/slice_internal.h +22 -48
  1297. data/src/core/lib/slice/slice_refcount.h +32 -93
  1298. data/src/core/lib/slice/slice_string_helpers.cc +0 -16
  1299. data/src/core/lib/slice/slice_string_helpers.h +1 -8
  1300. data/src/core/lib/surface/builtins.cc +11 -6
  1301. data/src/core/lib/surface/byte_buffer.cc +9 -4
  1302. data/src/core/lib/surface/byte_buffer_reader.cc +7 -7
  1303. data/src/core/lib/surface/call.cc +2324 -1337
  1304. data/src/core/lib/surface/call.h +69 -21
  1305. data/src/core/lib/surface/call_details.cc +6 -6
  1306. data/src/core/lib/surface/call_log_batch.cc +7 -1
  1307. data/src/core/lib/surface/call_test_only.h +4 -1
  1308. data/src/core/lib/surface/call_trace.cc +113 -0
  1309. data/src/core/lib/surface/call_trace.h +30 -0
  1310. data/src/core/lib/surface/channel.cc +230 -328
  1311. data/src/core/lib/surface/channel.h +110 -74
  1312. data/src/core/lib/surface/channel_init.cc +2 -3
  1313. data/src/core/lib/surface/channel_init.h +4 -6
  1314. data/src/core/lib/surface/channel_ping.cc +9 -3
  1315. data/src/core/lib/surface/channel_stack_type.cc +4 -2
  1316. data/src/core/lib/surface/channel_stack_type.h +2 -2
  1317. data/src/core/lib/surface/completion_queue.cc +76 -94
  1318. data/src/core/lib/surface/completion_queue.h +8 -6
  1319. data/src/core/lib/surface/completion_queue_factory.cc +6 -0
  1320. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  1321. data/src/core/lib/surface/event_string.cc +1 -7
  1322. data/src/core/lib/surface/event_string.h +1 -1
  1323. data/src/core/lib/surface/init.cc +87 -78
  1324. data/src/core/lib/surface/init.h +0 -10
  1325. data/src/core/lib/surface/init_internally.cc +24 -0
  1326. data/src/core/lib/surface/init_internally.h +36 -0
  1327. data/src/core/lib/surface/lame_client.cc +69 -107
  1328. data/src/core/lib/surface/lame_client.h +41 -3
  1329. data/src/core/lib/surface/metadata_array.cc +2 -0
  1330. data/src/core/lib/surface/server.cc +153 -206
  1331. data/src/core/lib/surface/server.h +64 -36
  1332. data/src/core/lib/surface/validate_metadata.cc +17 -31
  1333. data/src/core/lib/surface/validate_metadata.h +3 -0
  1334. data/src/core/lib/surface/version.cc +2 -2
  1335. data/src/core/lib/transport/bdp_estimator.cc +11 -12
  1336. data/src/core/lib/transport/bdp_estimator.h +4 -5
  1337. data/src/core/lib/transport/connectivity_state.cc +7 -6
  1338. data/src/core/lib/transport/connectivity_state.h +3 -4
  1339. data/src/core/lib/transport/error_utils.cc +45 -65
  1340. data/src/core/lib/transport/error_utils.h +10 -5
  1341. data/src/core/lib/transport/handshaker.cc +225 -0
  1342. data/src/core/lib/transport/handshaker.h +167 -0
  1343. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1344. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1345. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1346. data/src/core/lib/transport/http_connect_handshaker.cc +400 -0
  1347. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1348. data/src/core/lib/transport/metadata_batch.cc +266 -69
  1349. data/src/core/lib/transport/metadata_batch.h +1108 -837
  1350. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  1351. data/src/core/lib/transport/parsed_metadata.h +239 -93
  1352. data/src/core/lib/transport/pid_controller.cc +4 -4
  1353. data/src/core/lib/transport/status_conversion.cc +3 -3
  1354. data/src/core/lib/transport/status_conversion.h +3 -3
  1355. data/src/core/lib/transport/tcp_connect_handshaker.cc +246 -0
  1356. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1357. data/src/core/lib/transport/timeout_encoding.cc +203 -70
  1358. data/src/core/lib/transport/timeout_encoding.h +44 -10
  1359. data/src/core/lib/transport/transport.cc +82 -58
  1360. data/src/core/lib/transport/transport.h +154 -35
  1361. data/src/core/lib/transport/transport_fwd.h +20 -0
  1362. data/src/core/lib/transport/transport_impl.h +24 -0
  1363. data/src/core/lib/transport/transport_op_string.cc +24 -66
  1364. data/src/core/lib/uri/uri_parser.cc +248 -66
  1365. data/src/core/lib/uri/uri_parser.h +39 -25
  1366. data/src/core/plugin_registry/grpc_plugin_registry.cc +56 -140
  1367. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +61 -0
  1368. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +76 -52
  1369. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  1370. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1371. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -28
  1372. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  1373. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -3
  1374. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1375. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  1376. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1377. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  1378. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  1379. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  1380. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +14 -6
  1381. data/src/core/tsi/fake_transport_security.cc +69 -34
  1382. data/src/core/tsi/fake_transport_security.h +6 -0
  1383. data/src/core/tsi/local_transport_security.cc +24 -28
  1384. data/src/core/tsi/local_transport_security.h +1 -4
  1385. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +145 -0
  1386. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1387. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -3
  1388. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +3 -1
  1389. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +13 -6
  1390. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +8 -2
  1391. data/src/core/tsi/ssl_transport_security.cc +249 -68
  1392. data/src/core/tsi/ssl_transport_security.h +47 -8
  1393. data/src/core/tsi/transport_security.cc +18 -6
  1394. data/src/core/tsi/transport_security.h +2 -1
  1395. data/src/core/tsi/transport_security_grpc.cc +3 -2
  1396. data/src/core/tsi/transport_security_grpc.h +5 -2
  1397. data/src/core/tsi/transport_security_interface.h +19 -5
  1398. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  1399. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  1400. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  1401. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  1402. data/src/ruby/ext/grpc/extconf.rb +61 -21
  1403. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  1404. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -36
  1405. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +40 -55
  1406. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1407. data/src/ruby/ext/grpc/rb_server.c +7 -4
  1408. data/src/ruby/lib/grpc/errors.rb +1 -1
  1409. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1410. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1411. data/src/ruby/lib/grpc/version.rb +1 -1
  1412. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1414. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  1415. data/src/ruby/pb/test/client.rb +769 -0
  1416. data/src/ruby/pb/test/server.rb +252 -0
  1417. data/src/ruby/pb/test/xds_client.rb +415 -0
  1418. data/src/ruby/spec/channel_spec.rb +5 -43
  1419. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1420. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1421. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1422. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1423. data/third_party/abseil-cpp/absl/algorithm/container.h +102 -92
  1424. data/third_party/abseil-cpp/absl/base/attributes.h +112 -52
  1425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1426. data/third_party/abseil-cpp/absl/base/config.h +245 -74
  1427. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  1428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1429. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  1430. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  1431. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1432. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +50 -0
  1433. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1434. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  1436. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  1437. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  1438. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +11 -1
  1439. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1440. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  1441. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1442. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1443. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +68 -0
  1444. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1445. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  1446. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +22 -7
  1447. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +15 -6
  1448. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1449. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1450. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  1451. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  1452. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1453. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1454. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1455. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -5
  1456. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1457. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +510 -0
  1458. data/third_party/abseil-cpp/absl/container/inlined_vector.h +118 -99
  1459. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  1460. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  1461. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  1462. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +77 -113
  1463. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +62 -85
  1464. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +417 -431
  1465. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  1466. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +18 -8
  1467. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +724 -262
  1468. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1469. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  1470. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -11
  1471. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +7 -2
  1472. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  1473. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1474. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +13 -5
  1475. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1476. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1477. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +236 -0
  1478. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +33 -10
  1479. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1480. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +35 -4
  1481. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1482. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +7 -0
  1483. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +60 -7
  1484. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1485. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  1486. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1487. data/third_party/abseil-cpp/absl/functional/function_ref.h +6 -2
  1488. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  1489. data/third_party/abseil-cpp/absl/hash/hash.h +104 -8
  1490. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1491. data/third_party/abseil-cpp/absl/hash/internal/hash.h +297 -51
  1492. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +123 -0
  1493. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +50 -0
  1494. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1495. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1496. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  1497. data/third_party/abseil-cpp/absl/numeric/int128.cc +7 -12
  1498. data/third_party/abseil-cpp/absl/numeric/int128.h +148 -75
  1499. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1500. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1501. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +93 -0
  1502. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.h +130 -0
  1503. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +245 -0
  1504. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1505. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1506. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1507. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1508. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1509. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1510. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1511. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1512. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +95 -0
  1513. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +269 -0
  1514. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1515. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1516. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1517. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +161 -0
  1518. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1519. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1520. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1521. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1522. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1523. data/third_party/abseil-cpp/absl/random/internal/randen.h +96 -0
  1524. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +225 -0
  1525. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1526. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +264 -0
  1527. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1528. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1529. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1530. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1531. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1532. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1533. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +165 -0
  1534. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1535. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1536. data/third_party/abseil-cpp/absl/random/internal/traits.h +149 -0
  1537. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1538. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +96 -0
  1539. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +256 -0
  1540. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +261 -0
  1541. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1542. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1543. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1544. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1545. data/third_party/abseil-cpp/absl/random/seed_sequences.h +111 -0
  1546. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1547. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1548. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +272 -0
  1549. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +22 -5
  1550. data/third_party/abseil-cpp/absl/status/status.cc +183 -19
  1551. data/third_party/abseil-cpp/absl/status/status.h +41 -27
  1552. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1553. data/third_party/abseil-cpp/absl/status/statusor.h +40 -24
  1554. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1555. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1556. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1557. data/third_party/abseil-cpp/absl/strings/cord.cc +469 -1094
  1558. data/third_party/abseil-cpp/absl/strings/cord.h +392 -144
  1559. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1560. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1561. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1562. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  1563. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1564. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1565. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +23 -29
  1566. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +208 -96
  1567. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1228 -0
  1568. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +924 -0
  1569. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +187 -0
  1570. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +267 -0
  1571. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +69 -0
  1572. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +212 -0
  1573. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +62 -0
  1574. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1575. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  1576. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  1577. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +60 -19
  1578. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +48 -172
  1579. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1580. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1581. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1582. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1583. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1584. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1585. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +418 -0
  1586. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1587. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +88 -0
  1588. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1589. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +123 -0
  1590. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  1591. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  1592. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1593. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  1594. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +9 -1
  1595. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1596. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +39 -8
  1597. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  1598. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +10 -11
  1599. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +41 -20
  1600. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1601. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1602. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +28 -18
  1603. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1604. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1605. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1606. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1607. data/third_party/abseil-cpp/absl/strings/numbers.cc +9 -9
  1608. data/third_party/abseil-cpp/absl/strings/numbers.h +60 -23
  1609. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1610. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  1611. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1612. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1613. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1614. data/third_party/abseil-cpp/absl/strings/string_view.cc +18 -34
  1615. data/third_party/abseil-cpp/absl/strings/string_view.h +123 -41
  1616. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1617. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1618. data/third_party/abseil-cpp/absl/strings/substitute.h +109 -76
  1619. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1620. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1621. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1622. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1623. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1624. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1625. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -26
  1626. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1627. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  1628. data/third_party/abseil-cpp/absl/synchronization/mutex.h +20 -12
  1629. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  1630. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1631. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  1632. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1633. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1634. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1635. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1636. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1637. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1638. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1639. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1640. data/third_party/abseil-cpp/absl/time/time.h +82 -47
  1641. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1642. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1643. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1644. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  1645. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1646. data/third_party/abseil-cpp/absl/types/span.h +5 -4
  1647. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  1648. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1649. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1650. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1651. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1652. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1653. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1654. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  1655. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1656. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1657. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1658. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1659. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1660. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1661. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1662. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1663. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1664. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1665. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1666. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1667. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1668. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1669. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1670. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1671. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1672. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1673. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1674. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1675. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1676. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1677. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1678. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1679. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1680. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1681. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1682. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1683. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1684. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1685. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  1686. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1687. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  1688. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1689. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1690. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1691. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1692. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1693. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1694. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1695. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1696. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1697. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1698. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1699. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1700. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +29 -11
  1701. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  1702. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1703. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1704. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1705. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1706. data/third_party/cares/cares/include/ares.h +742 -0
  1707. data/third_party/cares/cares/include/ares_dns.h +112 -0
  1708. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1709. data/third_party/cares/cares/include/ares_version.h +24 -0
  1710. data/third_party/cares/cares/src/lib/ares__close_sockets.c +61 -0
  1711. data/third_party/cares/cares/src/lib/ares__get_hostent.c +260 -0
  1712. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1713. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1714. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1715. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1716. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1717. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1718. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1719. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1720. data/third_party/cares/cares/src/lib/ares_create_query.c +197 -0
  1721. data/third_party/cares/cares/src/lib/ares_data.c +240 -0
  1722. data/third_party/cares/cares/src/lib/ares_data.h +74 -0
  1723. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1724. data/third_party/cares/cares/src/lib/ares_expand_name.c +300 -0
  1725. data/third_party/cares/cares/src/lib/ares_expand_string.c +67 -0
  1726. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1727. data/third_party/cares/cares/src/lib/ares_free_hostent.c +43 -0
  1728. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1729. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1730. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1731. data/third_party/cares/cares/src/lib/ares_getenv.c +28 -0
  1732. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1733. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +287 -0
  1734. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +534 -0
  1735. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +447 -0
  1736. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1737. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1738. data/third_party/cares/cares/src/lib/ares_init.c +2654 -0
  1739. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1740. data/third_party/cares/cares/src/lib/ares_ipv6.h +85 -0
  1741. data/third_party/cares/cares/src/lib/ares_library_init.c +200 -0
  1742. data/third_party/cares/cares/src/lib/ares_library_init.h +43 -0
  1743. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1744. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1745. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1746. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1747. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1748. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1749. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1750. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1751. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1752. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1753. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +164 -0
  1754. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +183 -0
  1755. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +177 -0
  1756. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +228 -0
  1757. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1758. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +168 -0
  1759. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +214 -0
  1760. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1761. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1762. data/third_party/cares/cares/src/lib/ares_private.h +423 -0
  1763. data/third_party/cares/cares/src/lib/ares_process.c +1548 -0
  1764. data/third_party/cares/cares/src/lib/ares_query.c +180 -0
  1765. data/third_party/cares/cares/src/lib/ares_search.c +321 -0
  1766. data/third_party/cares/cares/src/lib/ares_send.c +131 -0
  1767. data/third_party/cares/cares/src/lib/ares_setup.h +220 -0
  1768. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1769. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1770. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1771. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1772. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1773. data/third_party/cares/cares/src/lib/ares_strsplit.c +178 -0
  1774. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1775. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1776. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1777. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1778. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1779. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1780. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1781. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1782. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1783. data/third_party/cares/cares/src/lib/inet_net_pton.c +444 -0
  1784. data/third_party/cares/cares/src/lib/inet_ntop.c +201 -0
  1785. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1786. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1787. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1788. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1789. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1790. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1791. data/third_party/upb/upb/arena.c +277 -0
  1792. data/third_party/upb/upb/arena.h +225 -0
  1793. data/third_party/upb/upb/array.c +114 -0
  1794. data/third_party/upb/upb/array.h +83 -0
  1795. data/third_party/upb/upb/collections.h +36 -0
  1796. data/third_party/upb/upb/decode.c +832 -382
  1797. data/third_party/upb/upb/decode.h +44 -17
  1798. data/third_party/upb/upb/decode_fast.c +304 -302
  1799. data/third_party/upb/upb/decode_fast.h +18 -18
  1800. data/third_party/upb/upb/def.c +2083 -982
  1801. data/third_party/upb/upb/def.h +339 -260
  1802. data/third_party/upb/upb/def.hpp +144 -171
  1803. data/third_party/upb/upb/encode.c +287 -185
  1804. data/third_party/upb/upb/encode.h +24 -16
  1805. data/third_party/upb/upb/extension_registry.c +93 -0
  1806. data/third_party/upb/upb/extension_registry.h +84 -0
  1807. data/third_party/upb/upb/internal/decode.h +211 -0
  1808. data/third_party/upb/upb/internal/table.h +385 -0
  1809. data/third_party/upb/upb/internal/upb.h +68 -0
  1810. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1811. data/third_party/upb/upb/json_decode.c +1512 -0
  1812. data/third_party/upb/upb/json_decode.h +47 -0
  1813. data/third_party/upb/upb/json_encode.c +780 -0
  1814. data/third_party/upb/upb/json_encode.h +65 -0
  1815. data/third_party/upb/upb/map.c +108 -0
  1816. data/third_party/upb/upb/map.h +117 -0
  1817. data/third_party/upb/upb/message_value.h +66 -0
  1818. data/third_party/upb/upb/mini_table.c +1147 -0
  1819. data/third_party/upb/upb/mini_table.h +189 -0
  1820. data/third_party/upb/upb/mini_table.hpp +112 -0
  1821. data/third_party/upb/upb/msg.c +132 -161
  1822. data/third_party/upb/upb/msg.h +18 -55
  1823. data/third_party/upb/upb/msg_internal.h +404 -254
  1824. data/third_party/upb/upb/port_def.inc +10 -1
  1825. data/third_party/upb/upb/port_undef.inc +2 -0
  1826. data/third_party/upb/upb/reflection.c +203 -280
  1827. data/third_party/upb/upb/reflection.h +40 -126
  1828. data/third_party/upb/upb/reflection.hpp +6 -6
  1829. data/third_party/upb/upb/status.c +86 -0
  1830. data/third_party/upb/upb/status.h +66 -0
  1831. data/third_party/upb/upb/table.c +233 -149
  1832. data/third_party/upb/upb/table_internal.h +9 -324
  1833. data/third_party/upb/upb/text_encode.c +116 -92
  1834. data/third_party/upb/upb/text_encode.h +10 -10
  1835. data/third_party/upb/upb/upb.c +34 -273
  1836. data/third_party/upb/upb/upb.h +79 -262
  1837. data/third_party/upb/upb/upb.hpp +31 -28
  1838. data/third_party/xxhash/xxhash.h +607 -352
  1839. data/third_party/zlib/compress.c +3 -3
  1840. data/third_party/zlib/crc32.c +975 -292
  1841. data/third_party/zlib/crc32.h +9441 -436
  1842. data/third_party/zlib/deflate.c +183 -129
  1843. data/third_party/zlib/deflate.h +12 -15
  1844. data/third_party/zlib/gzguts.h +3 -2
  1845. data/third_party/zlib/gzlib.c +6 -4
  1846. data/third_party/zlib/gzread.c +8 -12
  1847. data/third_party/zlib/gzwrite.c +26 -14
  1848. data/third_party/zlib/infback.c +12 -8
  1849. data/third_party/zlib/inffast.c +14 -14
  1850. data/third_party/zlib/inflate.c +44 -10
  1851. data/third_party/zlib/inflate.h +3 -2
  1852. data/third_party/zlib/inftrees.c +3 -3
  1853. data/third_party/zlib/inftrees.h +1 -1
  1854. data/third_party/zlib/trees.c +85 -107
  1855. data/third_party/zlib/uncompr.c +2 -2
  1856. data/third_party/zlib/zconf.h +16 -3
  1857. data/third_party/zlib/zlib.h +129 -106
  1858. data/third_party/zlib/zutil.c +11 -9
  1859. data/third_party/zlib/zutil.h +13 -9
  1860. metadata +713 -295
  1861. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +0 -392
  1862. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1863. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1864. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1865. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -60
  1866. data/src/core/ext/filters/client_channel/lb_policy.cc +0 -131
  1867. data/src/core/ext/filters/client_channel/lb_policy.h +0 -425
  1868. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1869. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1870. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1871. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1872. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1873. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1874. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  1875. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +0 -28
  1876. data/src/core/ext/filters/client_channel/resolver.cc +0 -87
  1877. data/src/core/ext/filters/client_channel/resolver.h +0 -136
  1878. data/src/core/ext/filters/client_channel/resolver_factory.h +0 -75
  1879. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -195
  1880. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  1881. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -189
  1882. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -99
  1883. data/src/core/ext/filters/client_channel/server_address.cc +0 -170
  1884. data/src/core/ext/filters/client_channel/server_address.h +0 -144
  1885. data/src/core/ext/filters/client_channel/subchannel_interface.h +0 -130
  1886. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -264
  1887. data/src/core/ext/filters/client_idle/idle_filter_state.cc +0 -96
  1888. data/src/core/ext/filters/client_idle/idle_filter_state.h +0 -66
  1889. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -181
  1890. data/src/core/ext/filters/fault_injection/service_config_parser.h +0 -85
  1891. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -560
  1892. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  1893. data/src/core/ext/service_config/service_config.cc +0 -227
  1894. data/src/core/ext/service_config/service_config.h +0 -127
  1895. data/src/core/ext/service_config/service_config_call_data.h +0 -72
  1896. data/src/core/ext/service_config/service_config_parser.cc +0 -89
  1897. data/src/core/ext/service_config/service_config_parser.h +0 -97
  1898. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -119
  1899. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -95
  1900. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -189
  1901. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -53
  1902. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -83
  1903. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1904. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1905. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1906. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1907. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +0 -30
  1908. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1909. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -27
  1910. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -62
  1911. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -27
  1912. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -62
  1913. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -27
  1914. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -62
  1915. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -27
  1916. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -62
  1917. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -27
  1918. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -62
  1919. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -72
  1920. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1921. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -73
  1922. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1923. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -72
  1924. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1925. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -80
  1926. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1927. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -74
  1928. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1929. data/src/core/ext/xds/certificate_provider_factory.h +0 -61
  1930. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1931. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1932. data/src/core/lib/avl/avl.cc +0 -306
  1933. data/src/core/lib/channel/handshaker.cc +0 -222
  1934. data/src/core/lib/channel/handshaker.h +0 -161
  1935. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1936. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1937. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1938. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1939. data/src/core/lib/compression/compression_args.cc +0 -138
  1940. data/src/core/lib/compression/compression_args.h +0 -56
  1941. data/src/core/lib/compression/stream_compression.cc +0 -81
  1942. data/src/core/lib/compression/stream_compression.h +0 -117
  1943. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1944. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1945. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1946. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1947. data/src/core/lib/event_engine/endpoint_config.cc +0 -45
  1948. data/src/core/lib/event_engine/endpoint_config_internal.h +0 -42
  1949. data/src/core/lib/event_engine/event_engine.cc +0 -50
  1950. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1951. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1952. data/src/core/lib/gpr/env.h +0 -40
  1953. data/src/core/lib/gpr/env_linux.cc +0 -75
  1954. data/src/core/lib/gpr/env_posix.cc +0 -46
  1955. data/src/core/lib/gpr/env_windows.cc +0 -74
  1956. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1957. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1958. data/src/core/lib/gpr/string_windows.h +0 -32
  1959. data/src/core/lib/gpr/tls.h +0 -151
  1960. data/src/core/lib/gprpp/arena.cc +0 -104
  1961. data/src/core/lib/gprpp/arena.h +0 -131
  1962. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
  1963. data/src/core/lib/iomgr/error_internal.h +0 -66
  1964. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1654
  1965. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1966. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  1967. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  1968. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -173
  1969. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1970. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -104
  1971. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1972. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -88
  1973. data/src/core/lib/iomgr/event_engine/pollset.h +0 -25
  1974. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  1975. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -41
  1976. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -35
  1977. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -114
  1978. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -293
  1979. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1980. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1981. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1982. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1983. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1984. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1985. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1986. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1987. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1988. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1989. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1990. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1991. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1992. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1993. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1994. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  1995. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1996. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1997. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -152
  1998. data/src/core/lib/iomgr/tcp_custom.cc +0 -377
  1999. data/src/core/lib/iomgr/tcp_custom.h +0 -86
  2000. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -467
  2001. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  2002. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  2003. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  2004. data/src/core/lib/iomgr/timer_custom.h +0 -43
  2005. data/src/core/lib/iomgr/work_serializer.cc +0 -155
  2006. data/src/core/lib/iomgr/work_serializer.h +0 -81
  2007. data/src/core/lib/profiling/basic_timers.cc +0 -295
  2008. data/src/core/lib/profiling/stap_timers.cc +0 -50
  2009. data/src/core/lib/profiling/timers.h +0 -94
  2010. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -171
  2011. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  2012. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  2013. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +0 -171
  2014. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  2015. data/src/core/lib/slice/slice_api.cc +0 -39
  2016. data/src/core/lib/slice/slice_intern.cc +0 -367
  2017. data/src/core/lib/slice/slice_refcount.cc +0 -17
  2018. data/src/core/lib/slice/slice_refcount_base.h +0 -173
  2019. data/src/core/lib/slice/slice_split.cc +0 -100
  2020. data/src/core/lib/slice/slice_split.h +0 -40
  2021. data/src/core/lib/slice/slice_utils.h +0 -200
  2022. data/src/core/lib/slice/static_slice.cc +0 -529
  2023. data/src/core/lib/slice/static_slice.h +0 -331
  2024. data/src/core/lib/surface/init_secure.cc +0 -103
  2025. data/src/core/lib/transport/byte_stream.cc +0 -158
  2026. data/src/core/lib/transport/byte_stream.h +0 -166
  2027. data/src/core/lib/transport/metadata.cc +0 -714
  2028. data/src/core/lib/transport/metadata.h +0 -449
  2029. data/src/core/lib/transport/static_metadata.cc +0 -1117
  2030. data/src/core/lib/transport/static_metadata.h +0 -340
  2031. data/src/core/lib/transport/status_metadata.cc +0 -63
  2032. data/src/core/lib/transport/status_metadata.h +0 -48
  2033. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +0 -93
  2034. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +0 -130
  2035. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
  2036. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +0 -111
  2037. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +0 -48
  2038. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  2039. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  2040. data/third_party/cares/cares/ares.h +0 -670
  2041. data/third_party/cares/cares/ares__close_sockets.c +0 -61
  2042. data/third_party/cares/cares/ares__get_hostent.c +0 -261
  2043. data/third_party/cares/cares/ares_create_query.c +0 -206
  2044. data/third_party/cares/cares/ares_data.c +0 -222
  2045. data/third_party/cares/cares/ares_data.h +0 -72
  2046. data/third_party/cares/cares/ares_dns.h +0 -103
  2047. data/third_party/cares/cares/ares_expand_name.c +0 -209
  2048. data/third_party/cares/cares/ares_expand_string.c +0 -70
  2049. data/third_party/cares/cares/ares_free_hostent.c +0 -41
  2050. data/third_party/cares/cares/ares_getenv.c +0 -30
  2051. data/third_party/cares/cares/ares_gethostbyaddr.c +0 -294
  2052. data/third_party/cares/cares/ares_gethostbyname.c +0 -529
  2053. data/third_party/cares/cares/ares_getnameinfo.c +0 -453
  2054. data/third_party/cares/cares/ares_getopt.c +0 -122
  2055. data/third_party/cares/cares/ares_getopt.h +0 -53
  2056. data/third_party/cares/cares/ares_init.c +0 -2615
  2057. data/third_party/cares/cares/ares_ipv6.h +0 -78
  2058. data/third_party/cares/cares/ares_library_init.c +0 -195
  2059. data/third_party/cares/cares/ares_library_init.h +0 -43
  2060. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  2061. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  2062. data/third_party/cares/cares/ares_parse_mx_reply.c +0 -170
  2063. data/third_party/cares/cares/ares_parse_naptr_reply.c +0 -194
  2064. data/third_party/cares/cares/ares_parse_ns_reply.c +0 -183
  2065. data/third_party/cares/cares/ares_parse_ptr_reply.c +0 -221
  2066. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
  2067. data/third_party/cares/cares/ares_parse_srv_reply.c +0 -179
  2068. data/third_party/cares/cares/ares_parse_txt_reply.c +0 -220
  2069. data/third_party/cares/cares/ares_private.h +0 -382
  2070. data/third_party/cares/cares/ares_process.c +0 -1473
  2071. data/third_party/cares/cares/ares_query.c +0 -186
  2072. data/third_party/cares/cares/ares_search.c +0 -323
  2073. data/third_party/cares/cares/ares_send.c +0 -137
  2074. data/third_party/cares/cares/ares_setup.h +0 -217
  2075. data/third_party/cares/cares/ares_strsplit.c +0 -174
  2076. data/third_party/cares/cares/ares_version.h +0 -24
  2077. data/third_party/cares/cares/inet_net_pton.c +0 -450
  2078. data/third_party/cares/cares/inet_ntop.c +0 -207
  2079. data/third_party/upb/upb/decode_internal.h +0 -193
  2080. data/third_party/upb/upb/upb_internal.h +0 -58
@@ -20,39 +20,73 @@
20
20
 
21
21
  #include "src/core/lib/surface/call.h"
22
22
 
23
- #include <assert.h>
23
+ #include <inttypes.h>
24
24
  #include <limits.h>
25
- #include <stdio.h>
26
25
  #include <stdlib.h>
27
- #include <string.h>
28
26
 
27
+ #include <algorithm>
28
+ #include <atomic>
29
+ #include <memory>
30
+ #include <new>
29
31
  #include <string>
32
+ #include <utility>
33
+ #include <vector>
30
34
 
35
+ #include "absl/base/thread_annotations.h"
36
+ #include "absl/cleanup/cleanup.h"
37
+ #include "absl/meta/type_traits.h"
38
+ #include "absl/status/status.h"
31
39
  #include "absl/strings/str_cat.h"
32
40
  #include "absl/strings/str_format.h"
41
+ #include "absl/strings/str_join.h"
42
+ #include "absl/strings/string_view.h"
43
+ #include "absl/types/variant.h"
33
44
 
45
+ #include <grpc/byte_buffer.h>
34
46
  #include <grpc/compression.h>
47
+ #include <grpc/event_engine/event_engine.h>
35
48
  #include <grpc/grpc.h>
49
+ #include <grpc/impl/codegen/gpr_types.h>
50
+ #include <grpc/impl/codegen/propagation_bits.h>
36
51
  #include <grpc/slice.h>
52
+ #include <grpc/slice_buffer.h>
53
+ #include <grpc/status.h>
37
54
  #include <grpc/support/alloc.h>
55
+ #include <grpc/support/atm.h>
38
56
  #include <grpc/support/log.h>
39
57
  #include <grpc/support/string_util.h>
40
58
 
59
+ #include "src/core/lib/channel/call_finalization.h"
41
60
  #include "src/core/lib/channel/channel_stack.h"
42
- #include "src/core/lib/compression/algorithm_metadata.h"
61
+ #include "src/core/lib/channel/channelz.h"
62
+ #include "src/core/lib/channel/context.h"
63
+ #include "src/core/lib/channel/status_util.h"
64
+ #include "src/core/lib/compression/compression_internal.h"
43
65
  #include "src/core/lib/debug/stats.h"
66
+ #include "src/core/lib/debug/stats_data.h"
67
+ #include "src/core/lib/experiments/experiments.h"
44
68
  #include "src/core/lib/gpr/alloc.h"
45
- #include "src/core/lib/gpr/string.h"
46
69
  #include "src/core/lib/gpr/time_precise.h"
47
70
  #include "src/core/lib/gpr/useful.h"
48
- #include "src/core/lib/gprpp/arena.h"
49
- #include "src/core/lib/gprpp/manual_constructor.h"
71
+ #include "src/core/lib/gprpp/bitset.h"
72
+ #include "src/core/lib/gprpp/cpp_impl_of.h"
73
+ #include "src/core/lib/gprpp/debug_location.h"
50
74
  #include "src/core/lib/gprpp/ref_counted.h"
51
- #include "src/core/lib/iomgr/timer.h"
52
- #include "src/core/lib/profiling/timers.h"
53
- #include "src/core/lib/slice/slice_split.h"
54
- #include "src/core/lib/slice/slice_string_helpers.h"
55
- #include "src/core/lib/slice/slice_utils.h"
75
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
76
+ #include "src/core/lib/gprpp/status_helper.h"
77
+ #include "src/core/lib/gprpp/sync.h"
78
+ #include "src/core/lib/iomgr/call_combiner.h"
79
+ #include "src/core/lib/iomgr/exec_ctx.h"
80
+ #include "src/core/lib/iomgr/polling_entity.h"
81
+ #include "src/core/lib/promise/activity.h"
82
+ #include "src/core/lib/promise/arena_promise.h"
83
+ #include "src/core/lib/promise/context.h"
84
+ #include "src/core/lib/promise/latch.h"
85
+ #include "src/core/lib/promise/pipe.h"
86
+ #include "src/core/lib/promise/poll.h"
87
+ #include "src/core/lib/resource_quota/arena.h"
88
+ #include "src/core/lib/slice/slice_buffer.h"
89
+ #include "src/core/lib/slice/slice_internal.h"
56
90
  #include "src/core/lib/surface/api_trace.h"
57
91
  #include "src/core/lib/surface/call_test_only.h"
58
92
  #include "src/core/lib/surface/channel.h"
@@ -60,188 +94,496 @@
60
94
  #include "src/core/lib/surface/server.h"
61
95
  #include "src/core/lib/surface/validate_metadata.h"
62
96
  #include "src/core/lib/transport/error_utils.h"
63
- #include "src/core/lib/transport/metadata.h"
64
- #include "src/core/lib/transport/static_metadata.h"
65
- #include "src/core/lib/transport/status_metadata.h"
97
+ #include "src/core/lib/transport/metadata_batch.h"
66
98
  #include "src/core/lib/transport/transport.h"
67
99
 
68
- /** The maximum number of concurrent batches possible.
69
- Based upon the maximum number of individually queueable ops in the batch
70
- api:
71
- - initial metadata send
72
- - message send
73
- - status/close send (depending on client/server)
74
- - initial metadata recv
75
- - message recv
76
- - status/close recv (depending on client/server) */
77
- #define MAX_CONCURRENT_BATCHES 6
78
-
79
- #define MAX_SEND_EXTRA_METADATA_COUNT 3
80
-
81
- // Used to create arena for the first call.
82
- #define ESTIMATED_MDELEM_COUNT 16
83
-
84
- struct batch_control {
85
- batch_control() = default;
86
-
87
- grpc_call* call = nullptr;
88
- grpc_transport_stream_op_batch op;
89
- /* Share memory for cq_completion and notify_tag as they are never needed
90
- simultaneously. Each byte used in this data structure count as six bytes
91
- per call, so any savings we can make are worthwhile,
92
-
93
- We use notify_tag to determine whether or not to send notification to the
94
- completion queue. Once we've made that determination, we can reuse the
95
- memory for cq_completion. */
96
- union {
97
- grpc_cq_completion cq_completion;
98
- struct {
99
- /* Any given op indicates completion by either (a) calling a closure or
100
- (b) sending a notification on the call's completion queue. If
101
- \a is_closure is true, \a tag indicates a closure to be invoked;
102
- otherwise, \a tag indicates the tag to be used in the notification to
103
- be sent to the completion queue. */
104
- void* tag;
105
- bool is_closure;
106
- } notify_tag;
107
- } completion_data;
108
- grpc_closure start_batch;
109
- grpc_closure finish_batch;
110
- std::atomic<intptr_t> steps_to_complete{0};
111
- AtomicError batch_error;
112
- void set_num_steps_to_complete(uintptr_t steps) {
113
- steps_to_complete.store(steps, std::memory_order_release);
100
+ grpc_core::TraceFlag grpc_call_error_trace(false, "call_error");
101
+ grpc_core::TraceFlag grpc_compression_trace(false, "compression");
102
+ grpc_core::TraceFlag grpc_call_trace(false, "call");
103
+ grpc_core::TraceFlag grpc_call_refcount_trace(false, "call_refcount");
104
+
105
+ namespace grpc_core {
106
+
107
+ ///////////////////////////////////////////////////////////////////////////////
108
+ // Call
109
+
110
+ class Call : public CppImplOf<Call, grpc_call> {
111
+ public:
112
+ Arena* arena() { return arena_; }
113
+ bool is_client() const { return is_client_; }
114
+
115
+ virtual void ContextSet(grpc_context_index elem, void* value,
116
+ void (*destroy)(void* value)) = 0;
117
+ virtual void* ContextGet(grpc_context_index elem) const = 0;
118
+ virtual bool Completed() = 0;
119
+ void CancelWithStatus(grpc_status_code status, const char* description);
120
+ virtual void CancelWithError(grpc_error_handle error) = 0;
121
+ virtual void SetCompletionQueue(grpc_completion_queue* cq) = 0;
122
+ char* GetPeer();
123
+ virtual grpc_call_error StartBatch(const grpc_op* ops, size_t nops,
124
+ void* notify_tag,
125
+ bool is_notify_tag_closure) = 0;
126
+ virtual bool failed_before_recv_message() const = 0;
127
+ virtual bool is_trailers_only() const = 0;
128
+ virtual absl::string_view GetServerAuthority() const = 0;
129
+ virtual void ExternalRef() = 0;
130
+ virtual void ExternalUnref() = 0;
131
+ virtual void InternalRef(const char* reason) = 0;
132
+ virtual void InternalUnref(const char* reason) = 0;
133
+
134
+ virtual grpc_compression_algorithm test_only_compression_algorithm() = 0;
135
+ virtual uint32_t test_only_message_flags() = 0;
136
+ virtual uint32_t test_only_encodings_accepted_by_peer() = 0;
137
+ virtual grpc_compression_algorithm compression_for_level(
138
+ grpc_compression_level level) = 0;
139
+
140
+ // This should return nullptr for the promise stack (and alternative means
141
+ // for that functionality be invented)
142
+ virtual grpc_call_stack* call_stack() = 0;
143
+
144
+ gpr_atm* peer_string_atm_ptr() { return &peer_string_; }
145
+
146
+ protected:
147
+ // The maximum number of concurrent batches possible.
148
+ // Based upon the maximum number of individually queueable ops in the batch
149
+ // api:
150
+ // - initial metadata send
151
+ // - message send
152
+ // - status/close send (depending on client/server)
153
+ // - initial metadata recv
154
+ // - message recv
155
+ // - status/close recv (depending on client/server)
156
+ static constexpr size_t kMaxConcurrentBatches = 6;
157
+
158
+ struct ParentCall {
159
+ Mutex child_list_mu;
160
+ Call* first_child ABSL_GUARDED_BY(child_list_mu) = nullptr;
161
+ };
162
+
163
+ struct ChildCall {
164
+ explicit ChildCall(Call* parent) : parent(parent) {}
165
+ Call* parent;
166
+ /** siblings: children of the same parent form a list, and this list is
167
+ protected under
168
+ parent->mu */
169
+ Call* sibling_next = nullptr;
170
+ Call* sibling_prev = nullptr;
171
+ };
172
+
173
+ Call(Arena* arena, bool is_client, Timestamp send_deadline,
174
+ RefCountedPtr<Channel> channel)
175
+ : channel_(std::move(channel)),
176
+ arena_(arena),
177
+ send_deadline_(send_deadline),
178
+ is_client_(is_client) {
179
+ GPR_DEBUG_ASSERT(arena_ != nullptr);
180
+ GPR_DEBUG_ASSERT(channel_ != nullptr);
181
+ }
182
+ virtual ~Call() = default;
183
+
184
+ void DeleteThis();
185
+
186
+ ParentCall* GetOrCreateParentCall();
187
+ ParentCall* parent_call();
188
+ Channel* channel() {
189
+ GPR_DEBUG_ASSERT(channel_ != nullptr);
190
+ return channel_.get();
191
+ }
192
+
193
+ absl::Status InitParent(Call* parent, uint32_t propagation_mask);
194
+ void PublishToParent(Call* parent);
195
+ void MaybeUnpublishFromParent();
196
+ void PropagateCancellationToChildren();
197
+
198
+ Timestamp send_deadline() const { return send_deadline_; }
199
+ void set_send_deadline(Timestamp send_deadline) {
200
+ send_deadline_ = send_deadline;
201
+ }
202
+
203
+ void ClearPeerString() { gpr_atm_rel_store(&peer_string_, 0); }
204
+
205
+ private:
206
+ RefCountedPtr<Channel> channel_;
207
+ Arena* const arena_;
208
+ std::atomic<ParentCall*> parent_call_{nullptr};
209
+ ChildCall* child_ = nullptr;
210
+ Timestamp send_deadline_;
211
+ const bool is_client_;
212
+ // flag indicating that cancellation is inherited
213
+ bool cancellation_is_inherited_ = false;
214
+ // A char* indicating the peer name.
215
+ gpr_atm peer_string_ = 0;
216
+ };
217
+
218
+ Call::ParentCall* Call::GetOrCreateParentCall() {
219
+ ParentCall* p = parent_call_.load(std::memory_order_acquire);
220
+ if (p == nullptr) {
221
+ p = arena_->New<ParentCall>();
222
+ ParentCall* expected = nullptr;
223
+ if (!parent_call_.compare_exchange_strong(expected, p,
224
+ std::memory_order_release,
225
+ std::memory_order_relaxed)) {
226
+ p->~ParentCall();
227
+ p = expected;
228
+ }
229
+ }
230
+ return p;
231
+ }
232
+
233
+ Call::ParentCall* Call::parent_call() {
234
+ return parent_call_.load(std::memory_order_acquire);
235
+ }
236
+
237
+ absl::Status Call::InitParent(Call* parent, uint32_t propagation_mask) {
238
+ child_ = arena()->New<ChildCall>(parent);
239
+
240
+ parent->InternalRef("child");
241
+ GPR_ASSERT(is_client_);
242
+ GPR_ASSERT(!parent->is_client_);
243
+
244
+ if (propagation_mask & GRPC_PROPAGATE_DEADLINE) {
245
+ send_deadline_ = std::min(send_deadline_, parent->send_deadline_);
114
246
  }
115
- bool completed_batch_step() {
116
- return steps_to_complete.fetch_sub(1, std::memory_order_acq_rel) == 1;
247
+ /* for now GRPC_PROPAGATE_TRACING_CONTEXT *MUST* be passed with
248
+ * GRPC_PROPAGATE_STATS_CONTEXT */
249
+ /* TODO(ctiller): This should change to use the appropriate census start_op
250
+ * call. */
251
+ if (propagation_mask & GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT) {
252
+ if (0 == (propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT)) {
253
+ return absl::UnknownError(
254
+ "Census tracing propagation requested without Census context "
255
+ "propagation");
256
+ }
257
+ ContextSet(GRPC_CONTEXT_TRACING, parent->ContextGet(GRPC_CONTEXT_TRACING),
258
+ nullptr);
259
+ } else if (propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT) {
260
+ return absl::UnknownError(
261
+ "Census context propagation requested without Census tracing "
262
+ "propagation");
263
+ }
264
+ if (propagation_mask & GRPC_PROPAGATE_CANCELLATION) {
265
+ cancellation_is_inherited_ = true;
266
+ }
267
+ return absl::OkStatus();
268
+ }
269
+
270
+ void Call::PublishToParent(Call* parent) {
271
+ ChildCall* cc = child_;
272
+ ParentCall* pc = parent->GetOrCreateParentCall();
273
+ MutexLock lock(&pc->child_list_mu);
274
+ if (pc->first_child == nullptr) {
275
+ pc->first_child = this;
276
+ cc->sibling_next = cc->sibling_prev = this;
277
+ } else {
278
+ cc->sibling_next = pc->first_child;
279
+ cc->sibling_prev = pc->first_child->child_->sibling_prev;
280
+ cc->sibling_next->child_->sibling_prev =
281
+ cc->sibling_prev->child_->sibling_next = this;
117
282
  }
118
- };
283
+ if (parent->Completed()) {
284
+ CancelWithError(absl::CancelledError());
285
+ }
286
+ }
119
287
 
120
- struct parent_call {
121
- parent_call() { gpr_mu_init(&child_list_mu); }
122
- ~parent_call() { gpr_mu_destroy(&child_list_mu); }
288
+ void Call::MaybeUnpublishFromParent() {
289
+ ChildCall* cc = child_;
290
+ if (cc == nullptr) return;
123
291
 
124
- gpr_mu child_list_mu;
125
- grpc_call* first_child = nullptr;
126
- };
292
+ ParentCall* pc = cc->parent->parent_call();
293
+ {
294
+ MutexLock lock(&pc->child_list_mu);
295
+ if (this == pc->first_child) {
296
+ pc->first_child = cc->sibling_next;
297
+ if (this == pc->first_child) {
298
+ pc->first_child = nullptr;
299
+ }
300
+ }
301
+ cc->sibling_prev->child_->sibling_next = cc->sibling_next;
302
+ cc->sibling_next->child_->sibling_prev = cc->sibling_prev;
303
+ }
304
+ cc->parent->InternalUnref("child");
305
+ }
127
306
 
128
- struct child_call {
129
- explicit child_call(grpc_call* parent) : parent(parent) {}
130
- grpc_call* parent;
131
- /** siblings: children of the same parent form a list, and this list is
132
- protected under
133
- parent->mu */
134
- grpc_call* sibling_next = nullptr;
135
- grpc_call* sibling_prev = nullptr;
136
- };
307
+ void Call::CancelWithStatus(grpc_status_code status, const char* description) {
308
+ // copying 'description' is needed to ensure the grpc_call_cancel_with_status
309
+ // guarantee that can be short-lived.
310
+ CancelWithError(grpc_error_set_int(
311
+ grpc_error_set_str(GRPC_ERROR_CREATE(description),
312
+ StatusStrProperty::kGrpcMessage, description),
313
+ StatusIntProperty::kRpcStatus, status));
314
+ }
315
+
316
+ void Call::PropagateCancellationToChildren() {
317
+ ParentCall* pc = parent_call();
318
+ if (pc != nullptr) {
319
+ Call* child;
320
+ MutexLock lock(&pc->child_list_mu);
321
+ child = pc->first_child;
322
+ if (child != nullptr) {
323
+ do {
324
+ Call* next_child_call = child->child_->sibling_next;
325
+ if (child->cancellation_is_inherited_) {
326
+ child->InternalRef("propagate_cancel");
327
+ child->CancelWithError(absl::CancelledError());
328
+ child->InternalUnref("propagate_cancel");
329
+ }
330
+ child = next_child_call;
331
+ } while (child != pc->first_child);
332
+ }
333
+ }
334
+ }
335
+
336
+ char* Call::GetPeer() {
337
+ char* peer_string = reinterpret_cast<char*>(gpr_atm_acq_load(&peer_string_));
338
+ if (peer_string != nullptr) return gpr_strdup(peer_string);
339
+ peer_string = grpc_channel_get_target(channel_->c_ptr());
340
+ if (peer_string != nullptr) return peer_string;
341
+ return gpr_strdup("unknown");
342
+ }
137
343
 
138
- #define RECV_NONE ((gpr_atm)0)
139
- #define RECV_INITIAL_METADATA_FIRST ((gpr_atm)1)
344
+ void Call::DeleteThis() {
345
+ RefCountedPtr<Channel> channel = std::move(channel_);
346
+ Arena* arena = arena_;
347
+ this->~Call();
348
+ channel->UpdateCallSizeEstimate(arena->Destroy());
349
+ }
140
350
 
141
- struct grpc_call {
142
- grpc_call(grpc_core::Arena* arena, const grpc_call_create_args& args)
143
- : arena(arena),
144
- cq(args.cq),
145
- channel(args.channel),
146
- is_client(args.server_transport_data == nullptr),
147
- stream_op_payload(context) {}
351
+ ///////////////////////////////////////////////////////////////////////////////
352
+ // FilterStackCall
353
+ // To be removed once promise conversion is complete
148
354
 
149
- ~grpc_call() {
355
+ class FilterStackCall final : public Call {
356
+ public:
357
+ ~FilterStackCall() override {
150
358
  for (int i = 0; i < GRPC_CONTEXT_COUNT; ++i) {
151
- if (context[i].destroy) {
152
- context[i].destroy(context[i].value);
359
+ if (context_[i].destroy) {
360
+ context_[i].destroy(context_[i].value);
153
361
  }
154
362
  }
155
- gpr_free(static_cast<void*>(const_cast<char*>(final_info.error_string)));
363
+ gpr_free(static_cast<void*>(const_cast<char*>(final_info_.error_string)));
364
+ }
365
+
366
+ bool Completed() override {
367
+ return gpr_atm_acq_load(&received_final_op_atm_) != 0;
368
+ }
369
+
370
+ // TODO(ctiller): return absl::StatusOr<SomeSmartPointer<Call>>?
371
+ static grpc_error_handle Create(grpc_call_create_args* args,
372
+ grpc_call** out_call);
373
+
374
+ static Call* FromTopElem(grpc_call_element* elem) {
375
+ return FromCallStack(grpc_call_stack_from_top_element(elem));
376
+ }
377
+
378
+ grpc_call_stack* call_stack() override {
379
+ return reinterpret_cast<grpc_call_stack*>(
380
+ reinterpret_cast<char*>(this) +
381
+ GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(*this)));
382
+ }
383
+
384
+ grpc_call_element* call_elem(size_t idx) {
385
+ return grpc_call_stack_element(call_stack(), idx);
386
+ }
387
+
388
+ CallCombiner* call_combiner() { return &call_combiner_; }
389
+
390
+ void CancelWithError(grpc_error_handle error) override;
391
+ void SetCompletionQueue(grpc_completion_queue* cq) override;
392
+ grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag,
393
+ bool is_notify_tag_closure) override;
394
+ void ExternalRef() override { ext_ref_.Ref(); }
395
+ void ExternalUnref() override;
396
+ void InternalRef(const char* reason) override {
397
+ GRPC_CALL_STACK_REF(call_stack(), reason);
398
+ }
399
+ void InternalUnref(const char* reason) override {
400
+ GRPC_CALL_STACK_UNREF(call_stack(), reason);
401
+ }
402
+
403
+ void ContextSet(grpc_context_index elem, void* value,
404
+ void (*destroy)(void* value)) override;
405
+ void* ContextGet(grpc_context_index elem) const override {
406
+ return context_[elem].value;
156
407
  }
157
408
 
158
- grpc_core::RefCount ext_ref;
159
- grpc_core::Arena* arena;
160
- grpc_core::CallCombiner call_combiner;
161
- grpc_completion_queue* cq;
162
- grpc_polling_entity pollent;
163
- grpc_channel* channel;
164
- gpr_cycle_counter start_time = gpr_get_cycle_counter();
165
- /* parent_call* */ gpr_atm parent_call_atm = 0;
166
- child_call* child = nullptr;
409
+ grpc_compression_algorithm compression_for_level(
410
+ grpc_compression_level level) override {
411
+ return encodings_accepted_by_peer_.CompressionAlgorithmForLevel(level);
412
+ }
413
+
414
+ bool is_trailers_only() const override {
415
+ bool result = is_trailers_only_;
416
+ GPR_DEBUG_ASSERT(!result || recv_initial_metadata_.TransportSize() == 0);
417
+ return result;
418
+ }
419
+
420
+ bool failed_before_recv_message() const override {
421
+ return call_failed_before_recv_message_;
422
+ }
423
+
424
+ absl::string_view GetServerAuthority() const override {
425
+ const Slice* authority_metadata =
426
+ recv_initial_metadata_.get_pointer(HttpAuthorityMetadata());
427
+ if (authority_metadata == nullptr) return "";
428
+ return authority_metadata->as_string_view();
429
+ }
430
+
431
+ grpc_compression_algorithm test_only_compression_algorithm() override {
432
+ return incoming_compression_algorithm_;
433
+ }
434
+
435
+ uint32_t test_only_message_flags() override {
436
+ return test_only_last_message_flags_;
437
+ }
438
+
439
+ uint32_t test_only_encodings_accepted_by_peer() override {
440
+ return encodings_accepted_by_peer_.ToLegacyBitmask();
441
+ }
442
+
443
+ static size_t InitialSizeEstimate() {
444
+ return sizeof(FilterStackCall) +
445
+ sizeof(BatchControl) * kMaxConcurrentBatches;
446
+ }
447
+
448
+ private:
449
+ static constexpr gpr_atm kRecvNone = 0;
450
+ static constexpr gpr_atm kRecvInitialMetadataFirst = 1;
451
+
452
+ struct BatchControl {
453
+ FilterStackCall* call_ = nullptr;
454
+ grpc_transport_stream_op_batch op_;
455
+ /* Share memory for cq_completion and notify_tag as they are never needed
456
+ simultaneously. Each byte used in this data structure count as six bytes
457
+ per call, so any savings we can make are worthwhile,
458
+
459
+ We use notify_tag to determine whether or not to send notification to the
460
+ completion queue. Once we've made that determination, we can reuse the
461
+ memory for cq_completion. */
462
+ union {
463
+ grpc_cq_completion cq_completion;
464
+ struct {
465
+ /* Any given op indicates completion by either (a) calling a closure or
466
+ (b) sending a notification on the call's completion queue. If
467
+ \a is_closure is true, \a tag indicates a closure to be invoked;
468
+ otherwise, \a tag indicates the tag to be used in the notification to
469
+ be sent to the completion queue. */
470
+ void* tag;
471
+ bool is_closure;
472
+ } notify_tag;
473
+ } completion_data_;
474
+ grpc_closure start_batch_;
475
+ grpc_closure finish_batch_;
476
+ std::atomic<intptr_t> steps_to_complete_{0};
477
+ AtomicError batch_error_;
478
+ void set_num_steps_to_complete(uintptr_t steps) {
479
+ steps_to_complete_.store(steps, std::memory_order_release);
480
+ }
481
+ bool completed_batch_step() {
482
+ return steps_to_complete_.fetch_sub(1, std::memory_order_acq_rel) == 1;
483
+ }
484
+
485
+ void PostCompletion();
486
+ void FinishStep();
487
+ void ProcessDataAfterMetadata();
488
+ void ReceivingStreamReady(grpc_error_handle error);
489
+ void ValidateFilteredMetadata();
490
+ void ReceivingInitialMetadataReady(grpc_error_handle error);
491
+ void ReceivingTrailingMetadataReady(grpc_error_handle error);
492
+ void FinishBatch(grpc_error_handle error);
493
+ };
494
+
495
+ FilterStackCall(Arena* arena, const grpc_call_create_args& args)
496
+ : Call(arena, args.server_transport_data == nullptr, args.send_deadline,
497
+ args.channel->Ref()),
498
+ cq_(args.cq),
499
+ stream_op_payload_(context_) {}
500
+
501
+ static void ReleaseCall(void* call, grpc_error_handle);
502
+ static void DestroyCall(void* call, grpc_error_handle);
503
+
504
+ static FilterStackCall* FromCallStack(grpc_call_stack* call_stack) {
505
+ return reinterpret_cast<FilterStackCall*>(
506
+ reinterpret_cast<char*>(call_stack) -
507
+ GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(FilterStackCall)));
508
+ }
509
+
510
+ void ExecuteBatch(grpc_transport_stream_op_batch* batch,
511
+ grpc_closure* start_batch_closure);
512
+ void SetFinalStatus(grpc_error_handle error);
513
+ BatchControl* ReuseOrAllocateBatchControl(const grpc_op* ops);
514
+ void HandleCompressionAlgorithmDisabled(
515
+ grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE;
516
+ void HandleCompressionAlgorithmNotAccepted(
517
+ grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE;
518
+ bool PrepareApplicationMetadata(size_t count, grpc_metadata* metadata,
519
+ bool is_trailing);
520
+ void PublishAppMetadata(grpc_metadata_batch* b, bool is_trailing);
521
+ void RecvInitialFilter(grpc_metadata_batch* b);
522
+ void RecvTrailingFilter(grpc_metadata_batch* b,
523
+ grpc_error_handle batch_error);
524
+
525
+ RefCount ext_ref_;
526
+ CallCombiner call_combiner_;
527
+ grpc_completion_queue* cq_;
528
+ grpc_polling_entity pollent_;
529
+ gpr_cycle_counter start_time_ = gpr_get_cycle_counter();
167
530
 
168
- /* client or server call */
169
- bool is_client;
170
531
  /** has grpc_call_unref been called */
171
- bool destroy_called = false;
172
- /** flag indicating that cancellation is inherited */
173
- bool cancellation_is_inherited = false;
532
+ bool destroy_called_ = false;
174
533
  // Trailers-only response status
175
- bool is_trailers_only = false;
534
+ bool is_trailers_only_ = false;
176
535
  /** which ops are in-flight */
177
- bool sent_initial_metadata = false;
178
- bool sending_message = false;
179
- bool sent_final_op = false;
180
- bool received_initial_metadata = false;
181
- bool receiving_message = false;
182
- bool requested_final_op = false;
183
- gpr_atm any_ops_sent_atm = 0;
184
- gpr_atm received_final_op_atm = 0;
185
-
186
- batch_control* active_batches[MAX_CONCURRENT_BATCHES] = {};
187
- grpc_transport_stream_op_batch_payload stream_op_payload;
536
+ bool sent_initial_metadata_ = false;
537
+ bool sending_message_ = false;
538
+ bool sent_final_op_ = false;
539
+ bool received_initial_metadata_ = false;
540
+ bool receiving_message_ = false;
541
+ bool requested_final_op_ = false;
542
+ gpr_atm received_final_op_atm_ = 0;
543
+
544
+ BatchControl* active_batches_[kMaxConcurrentBatches] = {};
545
+ grpc_transport_stream_op_batch_payload stream_op_payload_;
188
546
 
189
547
  /* first idx: is_receiving, second idx: is_trailing */
190
- grpc_metadata_batch send_initial_metadata{arena};
191
- grpc_metadata_batch send_trailing_metadata{arena};
192
- grpc_metadata_batch recv_initial_metadata{arena};
193
- grpc_metadata_batch recv_trailing_metadata{arena};
548
+ grpc_metadata_batch send_initial_metadata_{arena()};
549
+ grpc_metadata_batch send_trailing_metadata_{arena()};
550
+ grpc_metadata_batch recv_initial_metadata_{arena()};
551
+ grpc_metadata_batch recv_trailing_metadata_{arena()};
194
552
 
195
553
  /* Buffered read metadata waiting to be returned to the application.
196
554
  Element 0 is initial metadata, element 1 is trailing metadata. */
197
- grpc_metadata_array* buffered_metadata[2] = {};
198
-
199
- grpc_metadata compression_md;
200
-
201
- // A char* indicating the peer name.
202
- gpr_atm peer_string = 0;
555
+ grpc_metadata_array* buffered_metadata_[2] = {};
203
556
 
204
557
  /* Call data useful used for reporting. Only valid after the call has
205
558
  * completed */
206
- grpc_call_final_info final_info;
559
+ grpc_call_final_info final_info_;
207
560
 
208
561
  /* Compression algorithm for *incoming* data */
209
- grpc_message_compression_algorithm incoming_message_compression_algorithm =
210
- GRPC_MESSAGE_COMPRESS_NONE;
211
- /* Stream compression algorithm for *incoming* data */
212
- grpc_stream_compression_algorithm incoming_stream_compression_algorithm =
213
- GRPC_STREAM_COMPRESS_NONE;
562
+ grpc_compression_algorithm incoming_compression_algorithm_ =
563
+ GRPC_COMPRESS_NONE;
214
564
  /* Supported encodings (compression algorithms), a bitset.
215
565
  * Always support no compression. */
216
- uint32_t encodings_accepted_by_peer = 1 << GRPC_MESSAGE_COMPRESS_NONE;
217
- /* Supported stream encodings (stream compression algorithms), a bitset */
218
- uint32_t stream_encodings_accepted_by_peer = 0;
566
+ CompressionAlgorithmSet encodings_accepted_by_peer_{GRPC_COMPRESS_NONE};
219
567
 
220
568
  /* Contexts for various subsystems (security, tracing, ...). */
221
- grpc_call_context_element context[GRPC_CONTEXT_COUNT] = {};
222
-
223
- /* for the client, extra metadata is initial metadata; for the
224
- server, it's trailing metadata */
225
- grpc_linked_mdelem send_extra_metadata[MAX_SEND_EXTRA_METADATA_COUNT];
226
- int send_extra_metadata_count;
227
- grpc_millis send_deadline;
228
-
229
- grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> sending_stream;
230
-
231
- grpc_core::OrphanablePtr<grpc_core::ByteStream> receiving_stream;
232
- bool call_failed_before_recv_message = false;
233
- grpc_byte_buffer** receiving_buffer = nullptr;
234
- grpc_slice receiving_slice = grpc_empty_slice();
235
- grpc_closure receiving_slice_ready;
236
- grpc_closure receiving_stream_ready;
237
- grpc_closure receiving_initial_metadata_ready;
238
- grpc_closure receiving_trailing_metadata_ready;
239
- uint32_t test_only_last_message_flags = 0;
569
+ grpc_call_context_element context_[GRPC_CONTEXT_COUNT] = {};
570
+
571
+ SliceBuffer send_slice_buffer_;
572
+ absl::optional<SliceBuffer> receiving_slice_buffer_;
573
+ uint32_t receiving_stream_flags_;
574
+
575
+ bool call_failed_before_recv_message_ = false;
576
+ grpc_byte_buffer** receiving_buffer_ = nullptr;
577
+ grpc_slice receiving_slice_ = grpc_empty_slice();
578
+ grpc_closure receiving_stream_ready_;
579
+ grpc_closure receiving_initial_metadata_ready_;
580
+ grpc_closure receiving_trailing_metadata_ready_;
581
+ uint32_t test_only_last_message_flags_ = 0;
240
582
  // Status about operation of call
241
- bool sent_server_trailing_metadata = false;
242
- gpr_atm cancelled_with_error = 0;
583
+ bool sent_server_trailing_metadata_ = false;
584
+ gpr_atm cancelled_with_error_ = 0;
243
585
 
244
- grpc_closure release_call;
586
+ grpc_closure release_call_;
245
587
 
246
588
  union {
247
589
  struct {
@@ -252,10 +594,10 @@ struct grpc_call {
252
594
  struct {
253
595
  int* cancelled;
254
596
  // backpointer to owning server if this is a server side call.
255
- grpc_core::Server* core_server;
597
+ Server* core_server;
256
598
  } server;
257
- } final_op;
258
- AtomicError status_error;
599
+ } final_op_;
600
+ AtomicError status_error_;
259
601
 
260
602
  /* recv_state can contain one of the following values:
261
603
  RECV_NONE : : no initial metadata and messages received
@@ -273,835 +615,435 @@ struct grpc_call {
273
615
 
274
616
  For 1, 4: See receiving_initial_metadata_ready() function
275
617
  For 2, 3: See receiving_stream_ready() function */
276
- gpr_atm recv_state = 0;
618
+ gpr_atm recv_state_ = 0;
277
619
  };
278
620
 
279
- grpc_core::TraceFlag grpc_call_error_trace(false, "call_error");
280
- grpc_core::TraceFlag grpc_compression_trace(false, "compression");
621
+ grpc_error_handle FilterStackCall::Create(grpc_call_create_args* args,
622
+ grpc_call** out_call) {
623
+ Channel* channel = args->channel.get();
281
624
 
282
- #define CALL_STACK_FROM_CALL(call) \
283
- (grpc_call_stack*)((char*)(call) + \
284
- GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call)))
285
- #define CALL_FROM_CALL_STACK(call_stack) \
286
- (grpc_call*)(((char*)(call_stack)) - \
287
- GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call)))
288
-
289
- #define CALL_ELEM_FROM_CALL(call, idx) \
290
- grpc_call_stack_element(CALL_STACK_FROM_CALL(call), idx)
291
- #define CALL_FROM_TOP_ELEM(top_elem) \
292
- CALL_FROM_CALL_STACK(grpc_call_stack_from_top_element(top_elem))
293
-
294
- static void execute_batch(grpc_call* call,
295
- grpc_transport_stream_op_batch* batch,
296
- grpc_closure* start_batch_closure);
297
-
298
- static void cancel_with_status(grpc_call* c, grpc_status_code status,
299
- const char* description);
300
- static void cancel_with_error(grpc_call* c, grpc_error_handle error);
301
- static void destroy_call(void* call_stack, grpc_error_handle error);
302
- static void receiving_slice_ready(void* bctlp, grpc_error_handle error);
303
- static void set_final_status(grpc_call* call, grpc_error_handle error);
304
- static void process_data_after_md(batch_control* bctl);
305
- static void post_batch_completion(batch_control* bctl);
306
-
307
- static void add_init_error(grpc_error_handle* composite,
625
+ auto add_init_error = [](grpc_error_handle* composite,
308
626
  grpc_error_handle new_err) {
309
- if (new_err == GRPC_ERROR_NONE) return;
310
- if (*composite == GRPC_ERROR_NONE) {
311
- *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Call creation failed");
312
- }
313
- *composite = grpc_error_add_child(*composite, new_err);
314
- }
315
-
316
- void* grpc_call_arena_alloc(grpc_call* call, size_t size) {
317
- return call->arena->Alloc(size);
318
- }
319
-
320
- static parent_call* get_or_create_parent_call(grpc_call* call) {
321
- parent_call* p =
322
- reinterpret_cast<parent_call*>(gpr_atm_acq_load(&call->parent_call_atm));
323
- if (p == nullptr) {
324
- p = call->arena->New<parent_call>();
325
- if (!gpr_atm_rel_cas(&call->parent_call_atm,
326
- reinterpret_cast<gpr_atm>(nullptr),
327
- reinterpret_cast<gpr_atm>(p))) {
328
- p->~parent_call();
329
- p = reinterpret_cast<parent_call*>(
330
- gpr_atm_acq_load(&call->parent_call_atm));
627
+ if (new_err.ok()) return;
628
+ if (composite->ok()) {
629
+ *composite = GRPC_ERROR_CREATE("Call creation failed");
331
630
  }
332
- }
333
- return p;
334
- }
335
-
336
- static parent_call* get_parent_call(grpc_call* call) {
337
- return reinterpret_cast<parent_call*>(
338
- gpr_atm_acq_load(&call->parent_call_atm));
339
- }
340
-
341
- size_t grpc_call_get_initial_size_estimate() {
342
- return sizeof(grpc_call) + sizeof(batch_control) * MAX_CONCURRENT_BATCHES +
343
- sizeof(grpc_linked_mdelem) * ESTIMATED_MDELEM_COUNT;
344
- }
631
+ *composite = grpc_error_add_child(*composite, new_err);
632
+ };
345
633
 
346
- grpc_error_handle grpc_call_create(const grpc_call_create_args* args,
347
- grpc_call** out_call) {
348
- GPR_TIMER_SCOPE("grpc_call_create", 0);
349
-
350
- GRPC_CHANNEL_INTERNAL_REF(args->channel, "call");
351
-
352
- grpc_core::Arena* arena;
353
- grpc_call* call;
354
- grpc_error_handle error = GRPC_ERROR_NONE;
355
- grpc_channel_stack* channel_stack =
356
- grpc_channel_get_channel_stack(args->channel);
357
- size_t initial_size = grpc_channel_get_call_size_estimate(args->channel);
358
- GRPC_STATS_INC_CALL_INITIAL_SIZE(initial_size);
359
- size_t call_and_stack_size =
360
- GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call)) +
361
- channel_stack->call_stack_size;
634
+ Arena* arena;
635
+ FilterStackCall* call;
636
+ grpc_error_handle error;
637
+ grpc_channel_stack* channel_stack = channel->channel_stack();
638
+ size_t initial_size = channel->CallSizeEstimate();
639
+ global_stats().IncrementCallInitialSize(initial_size);
362
640
  size_t call_alloc_size =
363
- call_and_stack_size + (args->parent ? sizeof(child_call) : 0);
641
+ GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(FilterStackCall)) +
642
+ channel_stack->call_stack_size;
364
643
 
365
- std::pair<grpc_core::Arena*, void*> arena_with_call =
366
- grpc_core::Arena::CreateWithAlloc(initial_size, call_alloc_size);
644
+ std::pair<Arena*, void*> arena_with_call = Arena::CreateWithAlloc(
645
+ initial_size, call_alloc_size, channel->allocator());
367
646
  arena = arena_with_call.first;
368
- call = new (arena_with_call.second) grpc_call(arena, *args);
369
- *out_call = call;
647
+ call = new (arena_with_call.second) FilterStackCall(arena, *args);
648
+ GPR_DEBUG_ASSERT(FromC(call->c_ptr()) == call);
649
+ GPR_DEBUG_ASSERT(FromCallStack(call->call_stack()) == call);
650
+ *out_call = call->c_ptr();
370
651
  grpc_slice path = grpc_empty_slice();
371
- if (call->is_client) {
372
- call->final_op.client.status_details = nullptr;
373
- call->final_op.client.status = nullptr;
374
- call->final_op.client.error_string = nullptr;
375
- GRPC_STATS_INC_CLIENT_CALLS_CREATED();
376
- GPR_ASSERT(args->add_initial_metadata_count <
377
- MAX_SEND_EXTRA_METADATA_COUNT);
378
- for (size_t i = 0; i < args->add_initial_metadata_count; i++) {
379
- call->send_extra_metadata[i].md = args->add_initial_metadata[i];
380
- if (grpc_slice_eq_static_interned(
381
- GRPC_MDKEY(args->add_initial_metadata[i]), GRPC_MDSTR_PATH)) {
382
- path = grpc_slice_ref_internal(
383
- GRPC_MDVALUE(args->add_initial_metadata[i]));
384
- }
652
+ if (call->is_client()) {
653
+ call->final_op_.client.status_details = nullptr;
654
+ call->final_op_.client.status = nullptr;
655
+ call->final_op_.client.error_string = nullptr;
656
+ global_stats().IncrementClientCallsCreated();
657
+ path = CSliceRef(args->path->c_slice());
658
+ call->send_initial_metadata_.Set(HttpPathMetadata(),
659
+ std::move(*args->path));
660
+ if (args->authority.has_value()) {
661
+ call->send_initial_metadata_.Set(HttpAuthorityMetadata(),
662
+ std::move(*args->authority));
385
663
  }
386
- call->send_extra_metadata_count =
387
- static_cast<int>(args->add_initial_metadata_count);
388
664
  } else {
389
- GRPC_STATS_INC_SERVER_CALLS_CREATED();
390
- call->final_op.server.cancelled = nullptr;
391
- call->final_op.server.core_server = args->server;
392
- GPR_ASSERT(args->add_initial_metadata_count == 0);
393
- call->send_extra_metadata_count = 0;
665
+ global_stats().IncrementServerCallsCreated();
666
+ call->final_op_.server.cancelled = nullptr;
667
+ call->final_op_.server.core_server = args->server;
394
668
  }
395
669
 
396
- grpc_millis send_deadline = args->send_deadline;
397
- bool immediately_cancel = false;
398
-
399
- if (args->parent != nullptr) {
400
- call->child = new (reinterpret_cast<char*>(arena_with_call.second) +
401
- call_and_stack_size) child_call(args->parent);
402
-
403
- GRPC_CALL_INTERNAL_REF(args->parent, "child");
404
- GPR_ASSERT(call->is_client);
405
- GPR_ASSERT(!args->parent->is_client);
406
-
407
- if (args->propagation_mask & GRPC_PROPAGATE_DEADLINE) {
408
- send_deadline = std::min(send_deadline, args->parent->send_deadline);
409
- }
410
- /* for now GRPC_PROPAGATE_TRACING_CONTEXT *MUST* be passed with
411
- * GRPC_PROPAGATE_STATS_CONTEXT */
412
- /* TODO(ctiller): This should change to use the appropriate census start_op
413
- * call. */
414
- if (args->propagation_mask & GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT) {
415
- if (0 == (args->propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT)) {
416
- add_init_error(&error, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
417
- "Census tracing propagation requested "
418
- "without Census context propagation"));
419
- }
420
- grpc_call_context_set(call, GRPC_CONTEXT_TRACING,
421
- args->parent->context[GRPC_CONTEXT_TRACING].value,
422
- nullptr);
423
- } else if (args->propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT) {
424
- add_init_error(&error, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
425
- "Census context propagation requested "
426
- "without Census tracing propagation"));
427
- }
428
- if (args->propagation_mask & GRPC_PROPAGATE_CANCELLATION) {
429
- call->cancellation_is_inherited = true;
430
- if (gpr_atm_acq_load(&args->parent->received_final_op_atm)) {
431
- immediately_cancel = true;
432
- }
433
- }
670
+ Call* parent = Call::FromC(args->parent);
671
+ if (parent != nullptr) {
672
+ add_init_error(&error, absl_status_to_grpc_error(call->InitParent(
673
+ parent, args->propagation_mask)));
434
674
  }
435
- call->send_deadline = send_deadline;
436
675
  /* initial refcount dropped by grpc_call_unref */
437
- grpc_call_element_args call_args = {CALL_STACK_FROM_CALL(call),
438
- args->server_transport_data,
439
- call->context,
440
- path,
441
- call->start_time,
442
- send_deadline,
443
- call->arena,
444
- &call->call_combiner};
445
- add_init_error(&error, grpc_call_stack_init(channel_stack, 1, destroy_call,
676
+ grpc_call_element_args call_args = {
677
+ call->call_stack(), args->server_transport_data,
678
+ call->context_, path,
679
+ call->start_time_, call->send_deadline(),
680
+ call->arena(), &call->call_combiner_};
681
+ add_init_error(&error, grpc_call_stack_init(channel_stack, 1, DestroyCall,
446
682
  call, &call_args));
447
683
  // Publish this call to parent only after the call stack has been initialized.
448
- if (args->parent != nullptr) {
449
- child_call* cc = call->child;
450
- parent_call* pc = get_or_create_parent_call(args->parent);
451
- gpr_mu_lock(&pc->child_list_mu);
452
- if (pc->first_child == nullptr) {
453
- pc->first_child = call;
454
- cc->sibling_next = cc->sibling_prev = call;
455
- } else {
456
- cc->sibling_next = pc->first_child;
457
- cc->sibling_prev = pc->first_child->child->sibling_prev;
458
- cc->sibling_next->child->sibling_prev =
459
- cc->sibling_prev->child->sibling_next = call;
460
- }
461
- gpr_mu_unlock(&pc->child_list_mu);
684
+ if (parent != nullptr) {
685
+ call->PublishToParent(parent);
462
686
  }
463
687
 
464
- if (error != GRPC_ERROR_NONE) {
465
- cancel_with_error(call, GRPC_ERROR_REF(error));
466
- }
467
- if (immediately_cancel) {
468
- cancel_with_error(call, GRPC_ERROR_CANCELLED);
688
+ if (!error.ok()) {
689
+ call->CancelWithError(error);
469
690
  }
470
691
  if (args->cq != nullptr) {
471
692
  GPR_ASSERT(args->pollset_set_alternative == nullptr &&
472
693
  "Only one of 'cq' and 'pollset_set_alternative' should be "
473
694
  "non-nullptr.");
474
695
  GRPC_CQ_INTERNAL_REF(args->cq, "bind");
475
- call->pollent =
696
+ call->pollent_ =
476
697
  grpc_polling_entity_create_from_pollset(grpc_cq_pollset(args->cq));
477
698
  }
478
699
  if (args->pollset_set_alternative != nullptr) {
479
- call->pollent = grpc_polling_entity_create_from_pollset_set(
700
+ call->pollent_ = grpc_polling_entity_create_from_pollset_set(
480
701
  args->pollset_set_alternative);
481
702
  }
482
- if (!grpc_polling_entity_is_empty(&call->pollent)) {
483
- grpc_call_stack_set_pollset_or_pollset_set(CALL_STACK_FROM_CALL(call),
484
- &call->pollent);
703
+ if (!grpc_polling_entity_is_empty(&call->pollent_)) {
704
+ grpc_call_stack_set_pollset_or_pollset_set(call->call_stack(),
705
+ &call->pollent_);
485
706
  }
486
707
 
487
- if (call->is_client) {
488
- grpc_core::channelz::ChannelNode* channelz_channel =
489
- grpc_channel_get_channelz_node(call->channel);
708
+ if (call->is_client()) {
709
+ channelz::ChannelNode* channelz_channel = channel->channelz_node();
490
710
  if (channelz_channel != nullptr) {
491
711
  channelz_channel->RecordCallStarted();
492
712
  }
493
- } else if (call->final_op.server.core_server != nullptr) {
494
- grpc_core::channelz::ServerNode* channelz_node =
495
- call->final_op.server.core_server->channelz_node();
713
+ } else if (call->final_op_.server.core_server != nullptr) {
714
+ channelz::ServerNode* channelz_node =
715
+ call->final_op_.server.core_server->channelz_node();
496
716
  if (channelz_node != nullptr) {
497
717
  channelz_node->RecordCallStarted();
498
718
  }
499
719
  }
500
720
 
501
- grpc_slice_unref_internal(path);
721
+ CSliceUnref(path);
502
722
 
503
723
  return error;
504
724
  }
505
725
 
506
- void grpc_call_set_completion_queue(grpc_call* call,
507
- grpc_completion_queue* cq) {
726
+ void FilterStackCall::SetCompletionQueue(grpc_completion_queue* cq) {
508
727
  GPR_ASSERT(cq);
509
728
 
510
- if (grpc_polling_entity_pollset_set(&call->pollent) != nullptr) {
729
+ if (grpc_polling_entity_pollset_set(&pollent_) != nullptr) {
511
730
  gpr_log(GPR_ERROR, "A pollset_set is already registered for this call.");
512
731
  abort();
513
732
  }
514
- call->cq = cq;
733
+ cq_ = cq;
515
734
  GRPC_CQ_INTERNAL_REF(cq, "bind");
516
- call->pollent = grpc_polling_entity_create_from_pollset(grpc_cq_pollset(cq));
517
- grpc_call_stack_set_pollset_or_pollset_set(CALL_STACK_FROM_CALL(call),
518
- &call->pollent);
519
- }
520
-
521
- #ifndef NDEBUG
522
- #define REF_REASON reason
523
- #define REF_ARG , const char* reason
524
- #else
525
- #define REF_REASON ""
526
- #define REF_ARG
527
- #endif
528
- void grpc_call_internal_ref(grpc_call* c REF_ARG) {
529
- GRPC_CALL_STACK_REF(CALL_STACK_FROM_CALL(c), REF_REASON);
530
- }
531
- void grpc_call_internal_unref(grpc_call* c REF_ARG) {
532
- GRPC_CALL_STACK_UNREF(CALL_STACK_FROM_CALL(c), REF_REASON);
735
+ pollent_ = grpc_polling_entity_create_from_pollset(grpc_cq_pollset(cq));
736
+ grpc_call_stack_set_pollset_or_pollset_set(call_stack(), &pollent_);
533
737
  }
534
738
 
535
- static void release_call(void* call, grpc_error_handle /*error*/) {
536
- grpc_call* c = static_cast<grpc_call*>(call);
537
- grpc_channel* channel = c->channel;
538
- grpc_core::Arena* arena = c->arena;
539
- c->~grpc_call();
540
- grpc_channel_update_call_size_estimate(channel, arena->Destroy());
541
- GRPC_CHANNEL_INTERNAL_UNREF(channel, "call");
739
+ void FilterStackCall::ReleaseCall(void* call, grpc_error_handle /*error*/) {
740
+ static_cast<FilterStackCall*>(call)->DeleteThis();
542
741
  }
543
742
 
544
- static void destroy_call(void* call, grpc_error_handle /*error*/) {
545
- GPR_TIMER_SCOPE("destroy_call", 0);
546
- grpc_call* c = static_cast<grpc_call*>(call);
547
- c->recv_initial_metadata.Clear();
548
- c->recv_trailing_metadata.Clear();
549
- c->receiving_stream.reset();
550
- parent_call* pc = get_parent_call(c);
743
+ void FilterStackCall::DestroyCall(void* call, grpc_error_handle /*error*/) {
744
+ auto* c = static_cast<FilterStackCall*>(call);
745
+ c->recv_initial_metadata_.Clear();
746
+ c->recv_trailing_metadata_.Clear();
747
+ c->receiving_slice_buffer_.reset();
748
+ ParentCall* pc = c->parent_call();
551
749
  if (pc != nullptr) {
552
- pc->~parent_call();
750
+ pc->~ParentCall();
553
751
  }
554
- for (int i = 0; i < c->send_extra_metadata_count; i++) {
555
- GRPC_MDELEM_UNREF(c->send_extra_metadata[i].md);
556
- }
557
- if (c->cq) {
558
- GRPC_CQ_INTERNAL_UNREF(c->cq, "bind");
752
+ if (c->cq_) {
753
+ GRPC_CQ_INTERNAL_UNREF(c->cq_, "bind");
559
754
  }
560
755
 
561
- grpc_error_handle status_error = c->status_error.get();
562
- grpc_error_get_status(status_error, c->send_deadline,
563
- &c->final_info.final_status, nullptr, nullptr,
564
- &(c->final_info.error_string));
565
- c->status_error.set(GRPC_ERROR_NONE);
566
- c->final_info.stats.latency =
567
- gpr_cycle_counter_sub(gpr_get_cycle_counter(), c->start_time);
568
- grpc_call_stack_destroy(CALL_STACK_FROM_CALL(c), &c->final_info,
569
- GRPC_CLOSURE_INIT(&c->release_call, release_call, c,
756
+ grpc_error_handle status_error = c->status_error_.get();
757
+ grpc_error_get_status(status_error, c->send_deadline(),
758
+ &c->final_info_.final_status, nullptr, nullptr,
759
+ &(c->final_info_.error_string));
760
+ c->status_error_.set(absl::OkStatus());
761
+ c->final_info_.stats.latency =
762
+ gpr_cycle_counter_sub(gpr_get_cycle_counter(), c->start_time_);
763
+ grpc_call_stack_destroy(c->call_stack(), &c->final_info_,
764
+ GRPC_CLOSURE_INIT(&c->release_call_, ReleaseCall, c,
570
765
  grpc_schedule_on_exec_ctx));
571
766
  }
572
767
 
573
- void grpc_call_ref(grpc_call* c) { c->ext_ref.Ref(); }
574
-
575
- void grpc_call_unref(grpc_call* c) {
576
- if (GPR_LIKELY(!c->ext_ref.Unref())) return;
577
-
578
- GPR_TIMER_SCOPE("grpc_call_unref", 0);
768
+ void FilterStackCall::ExternalUnref() {
769
+ if (GPR_LIKELY(!ext_ref_.Unref())) return;
579
770
 
580
- child_call* cc = c->child;
581
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
582
- grpc_core::ExecCtx exec_ctx;
771
+ ApplicationCallbackExecCtx callback_exec_ctx;
772
+ ExecCtx exec_ctx;
583
773
 
584
- GRPC_API_TRACE("grpc_call_unref(c=%p)", 1, (c));
774
+ GRPC_API_TRACE("grpc_call_unref(c=%p)", 1, (this));
585
775
 
586
- if (cc) {
587
- parent_call* pc = get_parent_call(cc->parent);
588
- gpr_mu_lock(&pc->child_list_mu);
589
- if (c == pc->first_child) {
590
- pc->first_child = cc->sibling_next;
591
- if (c == pc->first_child) {
592
- pc->first_child = nullptr;
593
- }
594
- }
595
- cc->sibling_prev->child->sibling_next = cc->sibling_next;
596
- cc->sibling_next->child->sibling_prev = cc->sibling_prev;
597
- gpr_mu_unlock(&pc->child_list_mu);
598
- GRPC_CALL_INTERNAL_UNREF(cc->parent, "child");
599
- }
776
+ MaybeUnpublishFromParent();
600
777
 
601
- GPR_ASSERT(!c->destroy_called);
602
- c->destroy_called = true;
603
- bool cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) != 0 &&
604
- gpr_atm_acq_load(&c->received_final_op_atm) == 0;
778
+ GPR_ASSERT(!destroy_called_);
779
+ destroy_called_ = true;
780
+ bool cancel = gpr_atm_acq_load(&received_final_op_atm_) == 0;
605
781
  if (cancel) {
606
- cancel_with_error(c, GRPC_ERROR_CANCELLED);
782
+ CancelWithError(absl::CancelledError());
607
783
  } else {
608
784
  // Unset the call combiner cancellation closure. This has the
609
785
  // effect of scheduling the previously set cancellation closure, if
610
786
  // any, so that it can release any internal references it may be
611
787
  // holding to the call stack.
612
- c->call_combiner.SetNotifyOnCancel(nullptr);
788
+ call_combiner_.SetNotifyOnCancel(nullptr);
613
789
  }
614
- GRPC_CALL_INTERNAL_UNREF(c, "destroy");
615
- }
616
-
617
- grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved) {
618
- GRPC_API_TRACE("grpc_call_cancel(call=%p, reserved=%p)", 2, (call, reserved));
619
- GPR_ASSERT(!reserved);
620
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
621
- grpc_core::ExecCtx exec_ctx;
622
- cancel_with_error(call, GRPC_ERROR_CANCELLED);
623
- return GRPC_CALL_OK;
624
- }
625
-
626
- // This is called via the call combiner to start sending a batch down
627
- // the filter stack.
628
- static void execute_batch_in_call_combiner(void* arg,
629
- grpc_error_handle /*ignored*/) {
630
- GPR_TIMER_SCOPE("execute_batch_in_call_combiner", 0);
631
- grpc_transport_stream_op_batch* batch =
632
- static_cast<grpc_transport_stream_op_batch*>(arg);
633
- grpc_call* call = static_cast<grpc_call*>(batch->handler_private.extra_arg);
634
- grpc_call_element* elem = CALL_ELEM_FROM_CALL(call, 0);
635
- GRPC_CALL_LOG_OP(GPR_INFO, elem, batch);
636
- elem->filter->start_transport_stream_op_batch(elem, batch);
790
+ InternalUnref("destroy");
637
791
  }
638
792
 
639
793
  // start_batch_closure points to a caller-allocated closure to be used
640
794
  // for entering the call combiner.
641
- static void execute_batch(grpc_call* call,
642
- grpc_transport_stream_op_batch* batch,
643
- grpc_closure* start_batch_closure) {
644
- batch->handler_private.extra_arg = call;
795
+ void FilterStackCall::ExecuteBatch(grpc_transport_stream_op_batch* batch,
796
+ grpc_closure* start_batch_closure) {
797
+ // This is called via the call combiner to start sending a batch down
798
+ // the filter stack.
799
+ auto execute_batch_in_call_combiner = [](void* arg, grpc_error_handle) {
800
+ grpc_transport_stream_op_batch* batch =
801
+ static_cast<grpc_transport_stream_op_batch*>(arg);
802
+ auto* call =
803
+ static_cast<FilterStackCall*>(batch->handler_private.extra_arg);
804
+ grpc_call_element* elem = call->call_elem(0);
805
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, batch);
806
+ elem->filter->start_transport_stream_op_batch(elem, batch);
807
+ };
808
+ batch->handler_private.extra_arg = this;
645
809
  GRPC_CLOSURE_INIT(start_batch_closure, execute_batch_in_call_combiner, batch,
646
810
  grpc_schedule_on_exec_ctx);
647
- GRPC_CALL_COMBINER_START(&call->call_combiner, start_batch_closure,
648
- GRPC_ERROR_NONE, "executing batch");
649
- }
650
-
651
- char* grpc_call_get_peer(grpc_call* call) {
652
- char* peer_string =
653
- reinterpret_cast<char*>(gpr_atm_acq_load(&call->peer_string));
654
- if (peer_string != nullptr) return gpr_strdup(peer_string);
655
- peer_string = grpc_channel_get_target(call->channel);
656
- if (peer_string != nullptr) return peer_string;
657
- return gpr_strdup("unknown");
658
- }
659
-
660
- grpc_call* grpc_call_from_top_element(grpc_call_element* surface_element) {
661
- return CALL_FROM_TOP_ELEM(surface_element);
662
- }
663
-
664
- /*******************************************************************************
665
- * CANCELLATION
666
- */
667
-
668
- grpc_call_error grpc_call_cancel_with_status(grpc_call* c,
669
- grpc_status_code status,
670
- const char* description,
671
- void* reserved) {
672
- grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
673
- grpc_core::ExecCtx exec_ctx;
674
- GRPC_API_TRACE(
675
- "grpc_call_cancel_with_status("
676
- "c=%p, status=%d, description=%s, reserved=%p)",
677
- 4, (c, (int)status, description, reserved));
678
- GPR_ASSERT(reserved == nullptr);
679
- cancel_with_status(c, status, description);
680
- return GRPC_CALL_OK;
811
+ GRPC_CALL_COMBINER_START(call_combiner(), start_batch_closure,
812
+ absl::OkStatus(), "executing batch");
681
813
  }
682
814
 
683
- struct cancel_state {
684
- grpc_call* call;
815
+ namespace {
816
+ struct CancelState {
817
+ FilterStackCall* call;
685
818
  grpc_closure start_batch;
686
819
  grpc_closure finish_batch;
687
820
  };
821
+ } // namespace
822
+
688
823
  // The on_complete callback used when sending a cancel_stream batch down
689
824
  // the filter stack. Yields the call combiner when the batch is done.
690
825
  static void done_termination(void* arg, grpc_error_handle /*error*/) {
691
- cancel_state* state = static_cast<cancel_state*>(arg);
692
- GRPC_CALL_COMBINER_STOP(&state->call->call_combiner,
826
+ CancelState* state = static_cast<CancelState*>(arg);
827
+ GRPC_CALL_COMBINER_STOP(state->call->call_combiner(),
693
828
  "on_complete for cancel_stream op");
694
- GRPC_CALL_INTERNAL_UNREF(state->call, "termination");
695
- gpr_free(state);
829
+ state->call->InternalUnref("termination");
830
+ delete state;
696
831
  }
697
832
 
698
- static void cancel_with_error(grpc_call* c, grpc_error_handle error) {
699
- if (!gpr_atm_rel_cas(&c->cancelled_with_error, 0, 1)) {
700
- GRPC_ERROR_UNREF(error);
833
+ void FilterStackCall::CancelWithError(grpc_error_handle error) {
834
+ if (!gpr_atm_rel_cas(&cancelled_with_error_, 0, 1)) {
701
835
  return;
702
836
  }
703
- GRPC_CALL_INTERNAL_REF(c, "termination");
837
+ ClearPeerString();
838
+ InternalRef("termination");
704
839
  // Inform the call combiner of the cancellation, so that it can cancel
705
840
  // any in-flight asynchronous actions that may be holding the call
706
841
  // combiner. This ensures that the cancel_stream batch can be sent
707
842
  // down the filter stack in a timely manner.
708
- c->call_combiner.Cancel(GRPC_ERROR_REF(error));
709
- cancel_state* state = static_cast<cancel_state*>(gpr_malloc(sizeof(*state)));
710
- state->call = c;
843
+ call_combiner_.Cancel(error);
844
+ CancelState* state = new CancelState;
845
+ state->call = this;
711
846
  GRPC_CLOSURE_INIT(&state->finish_batch, done_termination, state,
712
847
  grpc_schedule_on_exec_ctx);
713
848
  grpc_transport_stream_op_batch* op =
714
849
  grpc_make_transport_stream_op(&state->finish_batch);
715
850
  op->cancel_stream = true;
716
851
  op->payload->cancel_stream.cancel_error = error;
717
- execute_batch(c, op, &state->start_batch);
718
- }
719
-
720
- void grpc_call_cancel_internal(grpc_call* call) {
721
- cancel_with_error(call, GRPC_ERROR_CANCELLED);
722
- }
723
-
724
- static grpc_error_handle error_from_status(grpc_status_code status,
725
- const char* description) {
726
- // copying 'description' is needed to ensure the grpc_call_cancel_with_status
727
- // guarantee that can be short-lived.
728
- return grpc_error_set_int(
729
- grpc_error_set_str(GRPC_ERROR_CREATE_FROM_COPIED_STRING(description),
730
- GRPC_ERROR_STR_GRPC_MESSAGE, description),
731
- GRPC_ERROR_INT_GRPC_STATUS, status);
732
- }
733
-
734
- static void cancel_with_status(grpc_call* c, grpc_status_code status,
735
- const char* description) {
736
- cancel_with_error(c, error_from_status(status, description));
852
+ ExecuteBatch(op, &state->start_batch);
737
853
  }
738
854
 
739
- static void set_final_status(grpc_call* call, grpc_error_handle error) {
855
+ void FilterStackCall::SetFinalStatus(grpc_error_handle error) {
740
856
  if (GRPC_TRACE_FLAG_ENABLED(grpc_call_error_trace)) {
741
- gpr_log(GPR_DEBUG, "set_final_status %s", call->is_client ? "CLI" : "SVR");
742
- gpr_log(GPR_DEBUG, "%s", grpc_error_std_string(error).c_str());
857
+ gpr_log(GPR_DEBUG, "set_final_status %s", is_client() ? "CLI" : "SVR");
858
+ gpr_log(GPR_DEBUG, "%s", StatusToString(error).c_str());
743
859
  }
744
- if (call->is_client) {
860
+ if (is_client()) {
745
861
  std::string status_details;
746
- grpc_error_get_status(error, call->send_deadline,
747
- call->final_op.client.status, &status_details,
748
- nullptr, call->final_op.client.error_string);
749
- *call->final_op.client.status_details =
862
+ grpc_error_get_status(error, send_deadline(), final_op_.client.status,
863
+ &status_details, nullptr,
864
+ final_op_.client.error_string);
865
+ *final_op_.client.status_details =
750
866
  grpc_slice_from_cpp_string(std::move(status_details));
751
- call->status_error.set(error);
752
- GRPC_ERROR_UNREF(error);
753
- grpc_core::channelz::ChannelNode* channelz_channel =
754
- grpc_channel_get_channelz_node(call->channel);
867
+ status_error_.set(error);
868
+ channelz::ChannelNode* channelz_channel = channel()->channelz_node();
755
869
  if (channelz_channel != nullptr) {
756
- if (*call->final_op.client.status != GRPC_STATUS_OK) {
870
+ if (*final_op_.client.status != GRPC_STATUS_OK) {
757
871
  channelz_channel->RecordCallFailed();
758
872
  } else {
759
873
  channelz_channel->RecordCallSucceeded();
760
874
  }
761
875
  }
762
876
  } else {
763
- *call->final_op.server.cancelled =
764
- error != GRPC_ERROR_NONE || !call->sent_server_trailing_metadata;
765
- grpc_core::channelz::ServerNode* channelz_node =
766
- call->final_op.server.core_server->channelz_node();
877
+ *final_op_.server.cancelled =
878
+ !error.ok() || !sent_server_trailing_metadata_;
879
+ channelz::ServerNode* channelz_node =
880
+ final_op_.server.core_server->channelz_node();
767
881
  if (channelz_node != nullptr) {
768
- if (*call->final_op.server.cancelled || !call->status_error.ok()) {
882
+ if (*final_op_.server.cancelled || !status_error_.ok()) {
769
883
  channelz_node->RecordCallFailed();
770
884
  } else {
771
885
  channelz_node->RecordCallSucceeded();
772
886
  }
773
887
  }
774
- GRPC_ERROR_UNREF(error);
775
888
  }
776
889
  }
777
890
 
778
- /*******************************************************************************
779
- * COMPRESSION
780
- */
781
-
782
- static void set_incoming_message_compression_algorithm(
783
- grpc_call* call, grpc_message_compression_algorithm algo) {
784
- GPR_ASSERT(algo < GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT);
785
- call->incoming_message_compression_algorithm = algo;
786
- }
787
-
788
- static void set_incoming_stream_compression_algorithm(
789
- grpc_call* call, grpc_stream_compression_algorithm algo) {
790
- GPR_ASSERT(algo < GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT);
791
- call->incoming_stream_compression_algorithm = algo;
792
- }
891
+ bool FilterStackCall::PrepareApplicationMetadata(size_t count,
892
+ grpc_metadata* metadata,
893
+ bool is_trailing) {
894
+ grpc_metadata_batch* batch =
895
+ is_trailing ? &send_trailing_metadata_ : &send_initial_metadata_;
896
+ for (size_t i = 0; i < count; i++) {
897
+ grpc_metadata* md = &metadata[i];
898
+ if (!GRPC_LOG_IF_ERROR("validate_metadata",
899
+ grpc_validate_header_key_is_legal(md->key))) {
900
+ return false;
901
+ } else if (!grpc_is_binary_header_internal(md->key) &&
902
+ !GRPC_LOG_IF_ERROR(
903
+ "validate_metadata",
904
+ grpc_validate_header_nonbin_value_is_legal(md->value))) {
905
+ return false;
906
+ } else if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
907
+ // HTTP2 hpack encoding has a maximum limit.
908
+ return false;
909
+ } else if (grpc_slice_str_cmp(md->key, "content-length") == 0) {
910
+ // Filter "content-length metadata"
911
+ continue;
912
+ }
913
+ batch->Append(StringViewFromSlice(md->key), Slice(CSliceRef(md->value)),
914
+ [md](absl::string_view error, const Slice& value) {
915
+ gpr_log(GPR_DEBUG, "Append error: %s",
916
+ absl::StrCat("key=", StringViewFromSlice(md->key),
917
+ " error=", error,
918
+ " value=", value.as_string_view())
919
+ .c_str());
920
+ });
921
+ }
793
922
 
794
- grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm(
795
- grpc_call* call) {
796
- grpc_compression_algorithm algorithm = GRPC_COMPRESS_NONE;
797
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
798
- &algorithm, call->incoming_message_compression_algorithm,
799
- call->incoming_stream_compression_algorithm);
800
- return algorithm;
923
+ return true;
801
924
  }
802
925
 
803
- static grpc_compression_algorithm compression_algorithm_for_level_locked(
804
- grpc_call* call, grpc_compression_level level) {
805
- return grpc_compression_algorithm_for_level(level,
806
- call->encodings_accepted_by_peer);
807
- }
926
+ namespace {
927
+ class PublishToAppEncoder {
928
+ public:
929
+ explicit PublishToAppEncoder(grpc_metadata_array* dest) : dest_(dest) {}
808
930
 
809
- uint32_t grpc_call_test_only_get_message_flags(grpc_call* call) {
810
- uint32_t flags;
811
- flags = call->test_only_last_message_flags;
812
- return flags;
813
- }
931
+ void Encode(const Slice& key, const Slice& value) {
932
+ Append(key.c_slice(), value.c_slice());
933
+ }
814
934
 
815
- static void destroy_encodings_accepted_by_peer(void* /*p*/) {}
935
+ // Catch anything that is not explicitly handled, and do not publish it to the
936
+ // application. If new metadata is added to a batch that needs to be
937
+ // published, it should be called out here.
938
+ template <typename Which>
939
+ void Encode(Which, const typename Which::ValueType&) {}
816
940
 
817
- static void set_encodings_accepted_by_peer(grpc_call* /*call*/,
818
- grpc_mdelem mdel,
819
- uint32_t* encodings_accepted_by_peer,
820
- bool stream_encoding) {
821
- size_t i;
822
- uint32_t algorithm;
823
- grpc_slice_buffer accept_encoding_parts;
824
- grpc_slice accept_encoding_slice;
825
- void* accepted_user_data;
826
-
827
- accepted_user_data =
828
- grpc_mdelem_get_user_data(mdel, destroy_encodings_accepted_by_peer);
829
- if (accepted_user_data != nullptr) {
830
- *encodings_accepted_by_peer = static_cast<uint32_t>(
831
- reinterpret_cast<uintptr_t>(accepted_user_data) - 1);
832
- return;
941
+ void Encode(UserAgentMetadata, const Slice& slice) {
942
+ Append(UserAgentMetadata::key(), slice);
833
943
  }
834
944
 
835
- *encodings_accepted_by_peer = 0;
836
-
837
- accept_encoding_slice = GRPC_MDVALUE(mdel);
838
- grpc_slice_buffer_init(&accept_encoding_parts);
839
- grpc_slice_split_without_space(accept_encoding_slice, ",",
840
- &accept_encoding_parts);
945
+ void Encode(HostMetadata, const Slice& slice) {
946
+ Append(HostMetadata::key(), slice);
947
+ }
841
948
 
842
- grpc_core::SetBit(encodings_accepted_by_peer, GRPC_COMPRESS_NONE);
843
- for (i = 0; i < accept_encoding_parts.count; i++) {
844
- int r;
845
- grpc_slice accept_encoding_entry_slice = accept_encoding_parts.slices[i];
846
- if (!stream_encoding) {
847
- r = grpc_message_compression_algorithm_parse(
848
- accept_encoding_entry_slice,
849
- reinterpret_cast<grpc_message_compression_algorithm*>(&algorithm));
850
- } else {
851
- r = grpc_stream_compression_algorithm_parse(
852
- accept_encoding_entry_slice,
853
- reinterpret_cast<grpc_stream_compression_algorithm*>(&algorithm));
854
- }
855
- if (r) {
856
- grpc_core::SetBit(encodings_accepted_by_peer, algorithm);
857
- } else {
858
- char* accept_encoding_entry_str =
859
- grpc_slice_to_c_string(accept_encoding_entry_slice);
860
- gpr_log(GPR_DEBUG,
861
- "Unknown entry in accept encoding metadata: '%s'. Ignoring.",
862
- accept_encoding_entry_str);
863
- gpr_free(accept_encoding_entry_str);
864
- }
949
+ void Encode(GrpcPreviousRpcAttemptsMetadata, uint32_t count) {
950
+ Append(GrpcPreviousRpcAttemptsMetadata::key(), count);
865
951
  }
866
952
 
867
- grpc_slice_buffer_destroy_internal(&accept_encoding_parts);
953
+ void Encode(GrpcRetryPushbackMsMetadata, Duration count) {
954
+ Append(GrpcRetryPushbackMsMetadata::key(), count.millis());
955
+ }
868
956
 
869
- grpc_mdelem_set_user_data(
870
- mdel, destroy_encodings_accepted_by_peer,
871
- reinterpret_cast<void*>(
872
- static_cast<uintptr_t>(*encodings_accepted_by_peer) + 1));
873
- }
957
+ void Encode(LbTokenMetadata, const Slice& slice) {
958
+ Append(LbTokenMetadata::key(), slice);
959
+ }
874
960
 
875
- uint32_t grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call* call) {
876
- uint32_t encodings_accepted_by_peer;
877
- encodings_accepted_by_peer = call->encodings_accepted_by_peer;
878
- return encodings_accepted_by_peer;
879
- }
880
-
881
- grpc_stream_compression_algorithm
882
- grpc_call_test_only_get_incoming_stream_encodings(grpc_call* call) {
883
- return call->incoming_stream_compression_algorithm;
884
- }
885
-
886
- static grpc_linked_mdelem* linked_from_md(grpc_metadata* md) {
887
- return reinterpret_cast<grpc_linked_mdelem*>(&md->internal_data);
888
- }
889
-
890
- static grpc_metadata* get_md_elem(grpc_metadata* metadata,
891
- grpc_metadata* additional_metadata, int i,
892
- int count) {
893
- grpc_metadata* res =
894
- i < count ? &metadata[i] : &additional_metadata[i - count];
895
- GPR_ASSERT(res);
896
- return res;
897
- }
898
-
899
- static int prepare_application_metadata(grpc_call* call, int count,
900
- grpc_metadata* metadata,
901
- int is_trailing,
902
- int prepend_extra_metadata,
903
- grpc_metadata* additional_metadata,
904
- int additional_metadata_count) {
905
- int total_count = count + additional_metadata_count;
906
- int i;
907
- grpc_metadata_batch* batch = is_trailing ? &call->send_trailing_metadata
908
- : &call->send_initial_metadata;
909
- for (i = 0; i < total_count; i++) {
910
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
911
- grpc_linked_mdelem* l = linked_from_md(md);
912
- GPR_ASSERT(sizeof(grpc_linked_mdelem) == sizeof(md->internal_data));
913
- if (!GRPC_LOG_IF_ERROR("validate_metadata",
914
- grpc_validate_header_key_is_legal(md->key))) {
915
- break;
916
- } else if (!grpc_is_binary_header_internal(md->key) &&
917
- !GRPC_LOG_IF_ERROR(
918
- "validate_metadata",
919
- grpc_validate_header_nonbin_value_is_legal(md->value))) {
920
- break;
921
- } else if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
922
- // HTTP2 hpack encoding has a maximum limit.
923
- break;
924
- }
925
- l->md = grpc_mdelem_from_grpc_metadata(const_cast<grpc_metadata*>(md));
961
+ private:
962
+ void Append(absl::string_view key, int64_t value) {
963
+ Append(StaticSlice::FromStaticString(key).c_slice(),
964
+ Slice::FromInt64(value).c_slice());
926
965
  }
927
- if (i != total_count) {
928
- for (int j = 0; j < i; j++) {
929
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, j, count);
930
- grpc_linked_mdelem* l = linked_from_md(md);
931
- GRPC_MDELEM_UNREF(l->md);
932
- }
933
- return 0;
966
+
967
+ void Append(absl::string_view key, const Slice& value) {
968
+ Append(StaticSlice::FromStaticString(key).c_slice(), value.c_slice());
934
969
  }
935
- if (prepend_extra_metadata) {
936
- if (call->send_extra_metadata_count == 0) {
937
- prepend_extra_metadata = 0;
938
- } else {
939
- for (i = 0; i < call->send_extra_metadata_count; i++) {
940
- GRPC_LOG_IF_ERROR("prepare_application_metadata",
941
- batch->LinkTail(&call->send_extra_metadata[i]));
942
- }
943
- }
970
+
971
+ void Append(grpc_slice key, grpc_slice value) {
972
+ auto* mdusr = &dest_->metadata[dest_->count++];
973
+ mdusr->key = key;
974
+ mdusr->value = value;
944
975
  }
945
- for (i = 0; i < total_count; i++) {
946
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
947
- grpc_linked_mdelem* l = linked_from_md(md);
948
- grpc_error_handle error = batch->LinkTail(l);
949
- if (error != GRPC_ERROR_NONE) {
950
- GRPC_MDELEM_UNREF(l->md);
951
- }
952
- GRPC_LOG_IF_ERROR("prepare_application_metadata", error);
953
- }
954
- call->send_extra_metadata_count = 0;
955
-
956
- return 1;
957
- }
958
-
959
- static grpc_message_compression_algorithm decode_message_compression(
960
- grpc_mdelem md) {
961
- grpc_message_compression_algorithm algorithm =
962
- grpc_message_compression_algorithm_from_slice(GRPC_MDVALUE(md));
963
- if (algorithm == GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT) {
964
- char* md_c_str = grpc_slice_to_c_string(GRPC_MDVALUE(md));
965
- gpr_log(GPR_ERROR,
966
- "Invalid incoming message compression algorithm: '%s'. "
967
- "Interpreting incoming data as uncompressed.",
968
- md_c_str);
969
- gpr_free(md_c_str);
970
- return GRPC_MESSAGE_COMPRESS_NONE;
971
- }
972
- return algorithm;
973
- }
974
-
975
- static grpc_stream_compression_algorithm decode_stream_compression(
976
- grpc_mdelem md) {
977
- grpc_stream_compression_algorithm algorithm =
978
- grpc_stream_compression_algorithm_from_slice(GRPC_MDVALUE(md));
979
- if (algorithm == GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT) {
980
- char* md_c_str = grpc_slice_to_c_string(GRPC_MDVALUE(md));
981
- gpr_log(GPR_ERROR,
982
- "Invalid incoming stream compression algorithm: '%s'. Interpreting "
983
- "incoming data as uncompressed.",
984
- md_c_str);
985
- gpr_free(md_c_str);
986
- return GRPC_STREAM_COMPRESS_NONE;
987
- }
988
- return algorithm;
989
- }
990
-
991
- static void publish_app_metadata(grpc_call* call, grpc_metadata_batch* b,
992
- int is_trailing) {
993
- if (b->non_deadline_count() == 0) return;
994
- if (!call->is_client && is_trailing) return;
995
- if (is_trailing && call->buffered_metadata[1] == nullptr) return;
996
- GPR_TIMER_SCOPE("publish_app_metadata", 0);
976
+
977
+ grpc_metadata_array* const dest_;
978
+ };
979
+ } // namespace
980
+
981
+ void FilterStackCall::PublishAppMetadata(grpc_metadata_batch* b,
982
+ bool is_trailing) {
983
+ if (b->count() == 0) return;
984
+ if (!is_client() && is_trailing) return;
985
+ if (is_trailing && buffered_metadata_[1] == nullptr) return;
997
986
  grpc_metadata_array* dest;
998
- grpc_metadata* mdusr;
999
- dest = call->buffered_metadata[is_trailing];
1000
- if (dest->count + b->non_deadline_count() > dest->capacity) {
1001
- dest->capacity = std::max(dest->capacity + b->non_deadline_count(),
1002
- dest->capacity * 3 / 2);
987
+ dest = buffered_metadata_[is_trailing];
988
+ if (dest->count + b->count() > dest->capacity) {
989
+ dest->capacity =
990
+ std::max(dest->capacity + b->count(), dest->capacity * 3 / 2);
1003
991
  dest->metadata = static_cast<grpc_metadata*>(
1004
992
  gpr_realloc(dest->metadata, sizeof(grpc_metadata) * dest->capacity));
1005
993
  }
1006
- b->ForEach([&](grpc_mdelem md) {
1007
- mdusr = &dest->metadata[dest->count++];
1008
- /* we pass back borrowed slices that are valid whilst the call is valid */
1009
- mdusr->key = GRPC_MDKEY(md);
1010
- mdusr->value = GRPC_MDVALUE(md);
1011
- });
994
+ PublishToAppEncoder encoder(dest);
995
+ b->Encode(&encoder);
1012
996
  }
1013
997
 
1014
- static void recv_initial_filter(grpc_call* call, grpc_metadata_batch* b) {
1015
- if (b->legacy_index()->named.content_encoding != nullptr) {
1016
- GPR_TIMER_SCOPE("incoming_stream_compression_algorithm", 0);
1017
- set_incoming_stream_compression_algorithm(
1018
- call, decode_stream_compression(
1019
- b->legacy_index()->named.content_encoding->md));
1020
- b->Remove(GRPC_BATCH_CONTENT_ENCODING);
1021
- }
1022
- if (b->legacy_index()->named.grpc_encoding != nullptr) {
1023
- GPR_TIMER_SCOPE("incoming_message_compression_algorithm", 0);
1024
- set_incoming_message_compression_algorithm(
1025
- call,
1026
- decode_message_compression(b->legacy_index()->named.grpc_encoding->md));
1027
- b->Remove(GRPC_BATCH_GRPC_ENCODING);
1028
- }
1029
- uint32_t message_encodings_accepted_by_peer = 1u;
1030
- uint32_t stream_encodings_accepted_by_peer = 1u;
1031
- if (b->legacy_index()->named.grpc_accept_encoding != nullptr) {
1032
- GPR_TIMER_SCOPE("encodings_accepted_by_peer", 0);
1033
- set_encodings_accepted_by_peer(
1034
- call, b->legacy_index()->named.grpc_accept_encoding->md,
1035
- &message_encodings_accepted_by_peer, false);
1036
- b->Remove(GRPC_BATCH_GRPC_ACCEPT_ENCODING);
1037
- }
1038
- if (b->legacy_index()->named.accept_encoding != nullptr) {
1039
- GPR_TIMER_SCOPE("stream_encodings_accepted_by_peer", 0);
1040
- set_encodings_accepted_by_peer(call,
1041
- b->legacy_index()->named.accept_encoding->md,
1042
- &stream_encodings_accepted_by_peer, true);
1043
- b->Remove(GRPC_BATCH_ACCEPT_ENCODING);
1044
- }
1045
- call->encodings_accepted_by_peer =
1046
- grpc_compression_bitset_from_message_stream_compression_bitset(
1047
- message_encodings_accepted_by_peer,
1048
- stream_encodings_accepted_by_peer);
1049
- publish_app_metadata(call, b, false);
1050
- }
1051
-
1052
- static void recv_trailing_filter(void* args, grpc_metadata_batch* b,
1053
- grpc_error_handle batch_error) {
1054
- grpc_call* call = static_cast<grpc_call*>(args);
1055
- if (batch_error != GRPC_ERROR_NONE) {
1056
- set_final_status(call, batch_error);
1057
- } else if (b->legacy_index()->named.grpc_status != nullptr) {
1058
- grpc_status_code status_code = grpc_get_status_code_from_metadata(
1059
- b->legacy_index()->named.grpc_status->md);
1060
- grpc_error_handle error = GRPC_ERROR_NONE;
1061
- if (status_code != GRPC_STATUS_OK) {
1062
- char* peer = grpc_call_get_peer(call);
1063
- error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
1064
- "Error received from peer ", peer)),
1065
- GRPC_ERROR_INT_GRPC_STATUS,
1066
- static_cast<intptr_t>(status_code));
1067
- gpr_free(peer);
1068
- }
1069
- if (b->legacy_index()->named.grpc_message != nullptr) {
1070
- error = grpc_error_set_str(
1071
- error, GRPC_ERROR_STR_GRPC_MESSAGE,
1072
- grpc_core::StringViewFromSlice(
1073
- GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md)));
1074
- b->Remove(GRPC_BATCH_GRPC_MESSAGE);
1075
- } else if (error != GRPC_ERROR_NONE) {
1076
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "");
1077
- }
1078
- set_final_status(call, GRPC_ERROR_REF(error));
1079
- b->Remove(GRPC_BATCH_GRPC_STATUS);
1080
- GRPC_ERROR_UNREF(error);
1081
- } else if (!call->is_client) {
1082
- set_final_status(call, GRPC_ERROR_NONE);
1083
- } else {
1084
- gpr_log(GPR_DEBUG,
1085
- "Received trailing metadata with no error and no status");
1086
- set_final_status(
1087
- call, grpc_error_set_int(
1088
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("No status received"),
1089
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNKNOWN));
1090
- }
1091
- publish_app_metadata(call, b, true);
998
+ void FilterStackCall::RecvInitialFilter(grpc_metadata_batch* b) {
999
+ incoming_compression_algorithm_ =
1000
+ b->Take(GrpcEncodingMetadata()).value_or(GRPC_COMPRESS_NONE);
1001
+ encodings_accepted_by_peer_ =
1002
+ b->Take(GrpcAcceptEncodingMetadata())
1003
+ .value_or(CompressionAlgorithmSet{GRPC_COMPRESS_NONE});
1004
+ PublishAppMetadata(b, false);
1092
1005
  }
1093
1006
 
1094
- grpc_core::Arena* grpc_call_get_arena(grpc_call* call) { return call->arena; }
1095
-
1096
- grpc_call_stack* grpc_call_get_call_stack(grpc_call* call) {
1097
- return CALL_STACK_FROM_CALL(call);
1007
+ void FilterStackCall::RecvTrailingFilter(grpc_metadata_batch* b,
1008
+ grpc_error_handle batch_error) {
1009
+ if (!batch_error.ok()) {
1010
+ SetFinalStatus(batch_error);
1011
+ } else {
1012
+ absl::optional<grpc_status_code> grpc_status =
1013
+ b->Take(GrpcStatusMetadata());
1014
+ if (grpc_status.has_value()) {
1015
+ grpc_status_code status_code = *grpc_status;
1016
+ grpc_error_handle error;
1017
+ if (status_code != GRPC_STATUS_OK) {
1018
+ char* peer = GetPeer();
1019
+ error = grpc_error_set_int(
1020
+ GRPC_ERROR_CREATE(absl::StrCat("Error received from peer ", peer)),
1021
+ StatusIntProperty::kRpcStatus, static_cast<intptr_t>(status_code));
1022
+ gpr_free(peer);
1023
+ }
1024
+ auto grpc_message = b->Take(GrpcMessageMetadata());
1025
+ if (grpc_message.has_value()) {
1026
+ error = grpc_error_set_str(error, StatusStrProperty::kGrpcMessage,
1027
+ grpc_message->as_string_view());
1028
+ } else if (!error.ok()) {
1029
+ error = grpc_error_set_str(error, StatusStrProperty::kGrpcMessage, "");
1030
+ }
1031
+ SetFinalStatus(error);
1032
+ } else if (!is_client()) {
1033
+ SetFinalStatus(absl::OkStatus());
1034
+ } else {
1035
+ gpr_log(GPR_DEBUG,
1036
+ "Received trailing metadata with no error and no status");
1037
+ SetFinalStatus(grpc_error_set_int(GRPC_ERROR_CREATE("No status received"),
1038
+ StatusIntProperty::kRpcStatus,
1039
+ GRPC_STATUS_UNKNOWN));
1040
+ }
1041
+ }
1042
+ PublishAppMetadata(b, true);
1098
1043
  }
1099
1044
 
1100
- /*******************************************************************************
1101
- * BATCH API IMPLEMENTATION
1102
- */
1103
-
1104
- static bool are_write_flags_valid(uint32_t flags) {
1045
+ namespace {
1046
+ bool AreWriteFlagsValid(uint32_t flags) {
1105
1047
  /* check that only bits in GRPC_WRITE_(INTERNAL?)_USED_MASK are set */
1106
1048
  const uint32_t allowed_write_positions =
1107
1049
  (GRPC_WRITE_USED_MASK | GRPC_WRITE_INTERNAL_USED_MASK);
@@ -1109,16 +1051,13 @@ static bool are_write_flags_valid(uint32_t flags) {
1109
1051
  return !(flags & invalid_positions);
1110
1052
  }
1111
1053
 
1112
- static bool are_initial_metadata_flags_valid(uint32_t flags, bool is_client) {
1054
+ bool AreInitialMetadataFlagsValid(uint32_t flags) {
1113
1055
  /* check that only bits in GRPC_WRITE_(INTERNAL?)_USED_MASK are set */
1114
1056
  uint32_t invalid_positions = ~GRPC_INITIAL_METADATA_USED_MASK;
1115
- if (!is_client) {
1116
- invalid_positions |= GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST;
1117
- }
1118
1057
  return !(flags & invalid_positions);
1119
1058
  }
1120
1059
 
1121
- static size_t batch_slot_for_op(grpc_op_type type) {
1060
+ size_t BatchSlotForOp(grpc_op_type type) {
1122
1061
  switch (type) {
1123
1062
  case GRPC_OP_SEND_INITIAL_METADATA:
1124
1063
  return 0;
@@ -1137,353 +1076,203 @@ static size_t batch_slot_for_op(grpc_op_type type) {
1137
1076
  }
1138
1077
  GPR_UNREACHABLE_CODE(return 123456789);
1139
1078
  }
1079
+ } // namespace
1140
1080
 
1141
- static batch_control* reuse_or_allocate_batch_control(grpc_call* call,
1142
- const grpc_op* ops) {
1143
- size_t slot_idx = batch_slot_for_op(ops[0].op);
1144
- batch_control** pslot = &call->active_batches[slot_idx];
1145
- batch_control* bctl;
1081
+ FilterStackCall::BatchControl* FilterStackCall::ReuseOrAllocateBatchControl(
1082
+ const grpc_op* ops) {
1083
+ size_t slot_idx = BatchSlotForOp(ops[0].op);
1084
+ BatchControl** pslot = &active_batches_[slot_idx];
1085
+ BatchControl* bctl;
1146
1086
  if (*pslot != nullptr) {
1147
1087
  bctl = *pslot;
1148
- if (bctl->call != nullptr) {
1088
+ if (bctl->call_ != nullptr) {
1149
1089
  return nullptr;
1150
1090
  }
1151
- bctl->~batch_control();
1152
- bctl->op = {};
1153
- new (&bctl->batch_error) AtomicError();
1091
+ bctl->~BatchControl();
1092
+ bctl->op_ = {};
1093
+ new (&bctl->batch_error_) AtomicError();
1154
1094
  } else {
1155
- bctl = call->arena->New<batch_control>();
1095
+ bctl = arena()->New<BatchControl>();
1156
1096
  *pslot = bctl;
1157
1097
  }
1158
- bctl->call = call;
1159
- bctl->op.payload = &call->stream_op_payload;
1098
+ bctl->call_ = this;
1099
+ bctl->op_.payload = &stream_op_payload_;
1160
1100
  return bctl;
1161
1101
  }
1162
1102
 
1163
- static void finish_batch_completion(void* user_data,
1164
- grpc_cq_completion* /*storage*/) {
1165
- batch_control* bctl = static_cast<batch_control*>(user_data);
1166
- grpc_call* call = bctl->call;
1167
- bctl->call = nullptr;
1168
- GRPC_CALL_INTERNAL_UNREF(call, "completion");
1169
- }
1170
-
1171
- static void reset_batch_errors(batch_control* bctl) {
1172
- bctl->batch_error.set(GRPC_ERROR_NONE);
1173
- }
1174
-
1175
- static void post_batch_completion(batch_control* bctl) {
1176
- grpc_call* next_child_call;
1177
- grpc_call* call = bctl->call;
1178
- grpc_error_handle error = GRPC_ERROR_REF(bctl->batch_error.get());
1103
+ void FilterStackCall::BatchControl::PostCompletion() {
1104
+ FilterStackCall* call = call_;
1105
+ grpc_error_handle error = batch_error_.get();
1179
1106
 
1180
- if (bctl->op.send_initial_metadata) {
1181
- call->send_initial_metadata.Clear();
1107
+ if (op_.send_initial_metadata) {
1108
+ call->send_initial_metadata_.Clear();
1182
1109
  }
1183
- if (bctl->op.send_message) {
1184
- if (bctl->op.payload->send_message.stream_write_closed &&
1185
- error == GRPC_ERROR_NONE) {
1110
+ if (op_.send_message) {
1111
+ if (op_.payload->send_message.stream_write_closed && error.ok()) {
1186
1112
  error = grpc_error_add_child(
1187
- error, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1113
+ error, GRPC_ERROR_CREATE(
1188
1114
  "Attempt to send message after stream was closed."));
1189
1115
  }
1190
- call->sending_message = false;
1116
+ call->sending_message_ = false;
1117
+ call->send_slice_buffer_.Clear();
1191
1118
  }
1192
- if (bctl->op.send_trailing_metadata) {
1193
- call->send_trailing_metadata.Clear();
1119
+ if (op_.send_trailing_metadata) {
1120
+ call->send_trailing_metadata_.Clear();
1194
1121
  }
1195
- if (bctl->op.recv_trailing_metadata) {
1122
+ if (op_.recv_trailing_metadata) {
1196
1123
  /* propagate cancellation to any interested children */
1197
- gpr_atm_rel_store(&call->received_final_op_atm, 1);
1198
- parent_call* pc = get_parent_call(call);
1199
- if (pc != nullptr) {
1200
- grpc_call* child;
1201
- gpr_mu_lock(&pc->child_list_mu);
1202
- child = pc->first_child;
1203
- if (child != nullptr) {
1204
- do {
1205
- next_child_call = child->child->sibling_next;
1206
- if (child->cancellation_is_inherited) {
1207
- GRPC_CALL_INTERNAL_REF(child, "propagate_cancel");
1208
- cancel_with_error(child, GRPC_ERROR_CANCELLED);
1209
- GRPC_CALL_INTERNAL_UNREF(child, "propagate_cancel");
1210
- }
1211
- child = next_child_call;
1212
- } while (child != pc->first_child);
1213
- }
1214
- gpr_mu_unlock(&pc->child_list_mu);
1215
- }
1216
- GRPC_ERROR_UNREF(error);
1217
- error = GRPC_ERROR_NONE;
1124
+ gpr_atm_rel_store(&call->received_final_op_atm_, 1);
1125
+ call->PropagateCancellationToChildren();
1126
+ error = absl::OkStatus();
1218
1127
  }
1219
- if (error != GRPC_ERROR_NONE && bctl->op.recv_message &&
1220
- *call->receiving_buffer != nullptr) {
1221
- grpc_byte_buffer_destroy(*call->receiving_buffer);
1222
- *call->receiving_buffer = nullptr;
1128
+ if (!error.ok() && op_.recv_message && *call->receiving_buffer_ != nullptr) {
1129
+ grpc_byte_buffer_destroy(*call->receiving_buffer_);
1130
+ *call->receiving_buffer_ = nullptr;
1223
1131
  }
1224
- reset_batch_errors(bctl);
1132
+ batch_error_.set(absl::OkStatus());
1225
1133
 
1226
- if (bctl->completion_data.notify_tag.is_closure) {
1134
+ if (completion_data_.notify_tag.is_closure) {
1227
1135
  /* unrefs error */
1228
- bctl->call = nullptr;
1229
- grpc_core::Closure::Run(
1230
- DEBUG_LOCATION,
1231
- static_cast<grpc_closure*>(bctl->completion_data.notify_tag.tag),
1232
- error);
1233
- GRPC_CALL_INTERNAL_UNREF(call, "completion");
1136
+ call_ = nullptr;
1137
+ Closure::Run(DEBUG_LOCATION,
1138
+ static_cast<grpc_closure*>(completion_data_.notify_tag.tag),
1139
+ error);
1140
+ call->InternalUnref("completion");
1234
1141
  } else {
1235
1142
  /* unrefs error */
1236
- grpc_cq_end_op(bctl->call->cq, bctl->completion_data.notify_tag.tag, error,
1237
- finish_batch_completion, bctl,
1238
- &bctl->completion_data.cq_completion);
1239
- }
1240
- }
1241
-
1242
- static void finish_batch_step(batch_control* bctl) {
1243
- if (GPR_UNLIKELY(bctl->completed_batch_step())) {
1244
- post_batch_completion(bctl);
1143
+ grpc_cq_end_op(
1144
+ call->cq_, completion_data_.notify_tag.tag, error,
1145
+ [](void* user_data, grpc_cq_completion* /*storage*/) {
1146
+ BatchControl* bctl = static_cast<BatchControl*>(user_data);
1147
+ Call* call = bctl->call_;
1148
+ bctl->call_ = nullptr;
1149
+ call->InternalUnref("completion");
1150
+ },
1151
+ this, &completion_data_.cq_completion);
1245
1152
  }
1246
1153
  }
1247
1154
 
1248
- static void continue_receiving_slices(batch_control* bctl) {
1249
- grpc_error_handle error;
1250
- grpc_call* call = bctl->call;
1251
- for (;;) {
1252
- size_t remaining = call->receiving_stream->length() -
1253
- (*call->receiving_buffer)->data.raw.slice_buffer.length;
1254
- if (remaining == 0) {
1255
- call->receiving_message = false;
1256
- call->receiving_stream.reset();
1257
- finish_batch_step(bctl);
1258
- return;
1259
- }
1260
- if (call->receiving_stream->Next(remaining, &call->receiving_slice_ready)) {
1261
- error = call->receiving_stream->Pull(&call->receiving_slice);
1262
- if (error == GRPC_ERROR_NONE) {
1263
- grpc_slice_buffer_add(&(*call->receiving_buffer)->data.raw.slice_buffer,
1264
- call->receiving_slice);
1265
- } else {
1266
- call->receiving_stream.reset();
1267
- grpc_byte_buffer_destroy(*call->receiving_buffer);
1268
- *call->receiving_buffer = nullptr;
1269
- call->receiving_message = false;
1270
- finish_batch_step(bctl);
1271
- GRPC_ERROR_UNREF(error);
1272
- return;
1273
- }
1274
- } else {
1275
- return;
1276
- }
1277
- }
1278
- }
1279
-
1280
- static void receiving_slice_ready(void* bctlp, grpc_error_handle error) {
1281
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1282
- grpc_call* call = bctl->call;
1283
- bool release_error = false;
1284
-
1285
- if (error == GRPC_ERROR_NONE) {
1286
- grpc_slice slice;
1287
- error = call->receiving_stream->Pull(&slice);
1288
- if (error == GRPC_ERROR_NONE) {
1289
- grpc_slice_buffer_add(&(*call->receiving_buffer)->data.raw.slice_buffer,
1290
- slice);
1291
- continue_receiving_slices(bctl);
1292
- } else {
1293
- /* Error returned by ByteStream::Pull() needs to be released manually */
1294
- release_error = true;
1295
- }
1296
- }
1297
-
1298
- if (error != GRPC_ERROR_NONE) {
1299
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures)) {
1300
- GRPC_LOG_IF_ERROR("receiving_slice_ready", GRPC_ERROR_REF(error));
1301
- }
1302
- call->receiving_stream.reset();
1303
- grpc_byte_buffer_destroy(*call->receiving_buffer);
1304
- *call->receiving_buffer = nullptr;
1305
- call->receiving_message = false;
1306
- finish_batch_step(bctl);
1307
- if (release_error) {
1308
- GRPC_ERROR_UNREF(error);
1309
- }
1155
+ void FilterStackCall::BatchControl::FinishStep() {
1156
+ if (GPR_UNLIKELY(completed_batch_step())) {
1157
+ PostCompletion();
1310
1158
  }
1311
1159
  }
1312
1160
 
1313
- static void process_data_after_md(batch_control* bctl) {
1314
- grpc_call* call = bctl->call;
1315
- if (call->receiving_stream == nullptr) {
1316
- *call->receiving_buffer = nullptr;
1317
- call->receiving_message = false;
1318
- finish_batch_step(bctl);
1161
+ void FilterStackCall::BatchControl::ProcessDataAfterMetadata() {
1162
+ FilterStackCall* call = call_;
1163
+ if (!call->receiving_slice_buffer_.has_value()) {
1164
+ *call->receiving_buffer_ = nullptr;
1165
+ call->receiving_message_ = false;
1166
+ FinishStep();
1319
1167
  } else {
1320
- call->test_only_last_message_flags = call->receiving_stream->flags();
1321
- if ((call->receiving_stream->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
1322
- (call->incoming_message_compression_algorithm >
1323
- GRPC_MESSAGE_COMPRESS_NONE)) {
1324
- grpc_compression_algorithm algo;
1325
- GPR_ASSERT(
1326
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
1327
- &algo, call->incoming_message_compression_algorithm,
1328
- (grpc_stream_compression_algorithm)0));
1329
- *call->receiving_buffer =
1330
- grpc_raw_compressed_byte_buffer_create(nullptr, 0, algo);
1168
+ call->test_only_last_message_flags_ = call->receiving_stream_flags_;
1169
+ if ((call->receiving_stream_flags_ & GRPC_WRITE_INTERNAL_COMPRESS) &&
1170
+ (call->incoming_compression_algorithm_ != GRPC_COMPRESS_NONE)) {
1171
+ *call->receiving_buffer_ = grpc_raw_compressed_byte_buffer_create(
1172
+ nullptr, 0, call->incoming_compression_algorithm_);
1331
1173
  } else {
1332
- *call->receiving_buffer = grpc_raw_byte_buffer_create(nullptr, 0);
1174
+ *call->receiving_buffer_ = grpc_raw_byte_buffer_create(nullptr, 0);
1333
1175
  }
1334
- GRPC_CLOSURE_INIT(&call->receiving_slice_ready, receiving_slice_ready, bctl,
1335
- grpc_schedule_on_exec_ctx);
1336
- continue_receiving_slices(bctl);
1337
- }
1338
- }
1339
-
1340
- static void receiving_stream_ready(void* bctlp, grpc_error_handle error) {
1341
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1342
- grpc_call* call = bctl->call;
1343
- if (error != GRPC_ERROR_NONE) {
1344
- call->receiving_stream.reset();
1345
- if (bctl->batch_error.ok()) {
1346
- bctl->batch_error.set(error);
1176
+ grpc_slice_buffer_move_into(
1177
+ call->receiving_slice_buffer_->c_slice_buffer(),
1178
+ &(*call->receiving_buffer_)->data.raw.slice_buffer);
1179
+ call->receiving_message_ = false;
1180
+ call->receiving_slice_buffer_.reset();
1181
+ FinishStep();
1182
+ }
1183
+ }
1184
+
1185
+ void FilterStackCall::BatchControl::ReceivingStreamReady(
1186
+ grpc_error_handle error) {
1187
+ FilterStackCall* call = call_;
1188
+ if (!error.ok()) {
1189
+ call->receiving_slice_buffer_.reset();
1190
+ if (batch_error_.ok()) {
1191
+ batch_error_.set(error);
1347
1192
  }
1348
- cancel_with_error(call, GRPC_ERROR_REF(error));
1193
+ call->CancelWithError(error);
1349
1194
  }
1350
- /* If recv_state is RECV_NONE, we will save the batch_control
1195
+ /* If recv_state is kRecvNone, we will save the batch_control
1351
1196
  * object with rel_cas, and will not use it after the cas. Its corresponding
1352
1197
  * acq_load is in receiving_initial_metadata_ready() */
1353
- if (error != GRPC_ERROR_NONE || call->receiving_stream == nullptr ||
1354
- !gpr_atm_rel_cas(&call->recv_state, RECV_NONE,
1355
- reinterpret_cast<gpr_atm>(bctlp))) {
1356
- process_data_after_md(bctl);
1357
- }
1358
- }
1359
-
1360
- // The recv_message_ready callback used when sending a batch containing
1361
- // a recv_message op down the filter stack. Yields the call combiner
1362
- // before processing the received message.
1363
- static void receiving_stream_ready_in_call_combiner(void* bctlp,
1364
- grpc_error_handle error) {
1365
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1366
- grpc_call* call = bctl->call;
1367
- GRPC_CALL_COMBINER_STOP(&call->call_combiner, "recv_message_ready");
1368
- receiving_stream_ready(bctlp, error);
1369
- }
1370
-
1371
- static void GPR_ATTRIBUTE_NOINLINE
1372
- handle_both_stream_and_msg_compression_set(grpc_call* call) {
1373
- std::string error_msg = absl::StrFormat(
1374
- "Incoming stream has both stream compression (%d) and message "
1375
- "compression (%d).",
1376
- call->incoming_stream_compression_algorithm,
1377
- call->incoming_message_compression_algorithm);
1378
- gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1379
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1380
- }
1381
-
1382
- static void GPR_ATTRIBUTE_NOINLINE
1383
- handle_error_parsing_compression_algorithm(grpc_call* call) {
1384
- std::string error_msg = absl::StrFormat(
1385
- "Error in incoming message compression (%d) or stream "
1386
- "compression (%d).",
1387
- call->incoming_stream_compression_algorithm,
1388
- call->incoming_message_compression_algorithm);
1389
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1390
- }
1391
-
1392
- static void GPR_ATTRIBUTE_NOINLINE handle_invalid_compression(
1393
- grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1394
- std::string error_msg = absl::StrFormat(
1395
- "Invalid compression algorithm value '%d'.", compression_algorithm);
1396
- gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1397
- cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1198
+ if (!error.ok() || !call->receiving_slice_buffer_.has_value() ||
1199
+ !gpr_atm_rel_cas(&call->recv_state_, kRecvNone,
1200
+ reinterpret_cast<gpr_atm>(this))) {
1201
+ ProcessDataAfterMetadata();
1202
+ }
1398
1203
  }
1399
1204
 
1400
- static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_disabled(
1401
- grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1205
+ void FilterStackCall::HandleCompressionAlgorithmDisabled(
1206
+ grpc_compression_algorithm compression_algorithm) {
1402
1207
  const char* algo_name = nullptr;
1403
1208
  grpc_compression_algorithm_name(compression_algorithm, &algo_name);
1404
1209
  std::string error_msg =
1405
1210
  absl::StrFormat("Compression algorithm '%s' is disabled.", algo_name);
1406
1211
  gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1407
- cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1212
+ CancelWithStatus(GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1408
1213
  }
1409
1214
 
1410
- static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_not_accepted(
1411
- grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1215
+ void FilterStackCall::HandleCompressionAlgorithmNotAccepted(
1216
+ grpc_compression_algorithm compression_algorithm) {
1412
1217
  const char* algo_name = nullptr;
1413
1218
  grpc_compression_algorithm_name(compression_algorithm, &algo_name);
1414
1219
  gpr_log(GPR_ERROR,
1415
- "Compression algorithm ('%s') not present in the bitset of "
1416
- "accepted encodings ('0x%x')",
1417
- algo_name, call->encodings_accepted_by_peer);
1418
- }
1419
-
1420
- static void validate_filtered_metadata(batch_control* bctl) {
1421
- grpc_compression_algorithm compression_algorithm;
1422
- grpc_call* call = bctl->call;
1423
- if (GPR_UNLIKELY(call->incoming_stream_compression_algorithm !=
1424
- GRPC_STREAM_COMPRESS_NONE &&
1425
- call->incoming_message_compression_algorithm !=
1426
- GRPC_MESSAGE_COMPRESS_NONE)) {
1427
- handle_both_stream_and_msg_compression_set(call);
1428
- } else if (
1429
- GPR_UNLIKELY(
1430
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
1431
- &compression_algorithm,
1432
- call->incoming_message_compression_algorithm,
1433
- call->incoming_stream_compression_algorithm) == 0)) {
1434
- handle_error_parsing_compression_algorithm(call);
1435
- } else {
1436
- const grpc_compression_options compression_options =
1437
- grpc_channel_compression_options(call->channel);
1438
- if (GPR_UNLIKELY(compression_algorithm >= GRPC_COMPRESS_ALGORITHMS_COUNT)) {
1439
- handle_invalid_compression(call, compression_algorithm);
1440
- } else if (GPR_UNLIKELY(
1441
- grpc_compression_options_is_algorithm_enabled_internal(
1442
- &compression_options, compression_algorithm) == 0)) {
1443
- /* check if algorithm is supported by current channel config */
1444
- handle_compression_algorithm_disabled(call, compression_algorithm);
1445
- }
1446
- /* GRPC_COMPRESS_NONE is always set. */
1447
- GPR_DEBUG_ASSERT(call->encodings_accepted_by_peer != 0);
1448
- if (GPR_UNLIKELY(!grpc_core::GetBit(call->encodings_accepted_by_peer,
1449
- compression_algorithm))) {
1450
- if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
1451
- handle_compression_algorithm_not_accepted(call, compression_algorithm);
1452
- }
1220
+ "Compression algorithm ('%s') not present in the "
1221
+ "accepted encodings (%s)",
1222
+ algo_name,
1223
+ std::string(encodings_accepted_by_peer_.ToString()).c_str());
1224
+ }
1225
+
1226
+ void FilterStackCall::BatchControl::ValidateFilteredMetadata() {
1227
+ FilterStackCall* call = call_;
1228
+
1229
+ const grpc_compression_options compression_options =
1230
+ call->channel()->compression_options();
1231
+ const grpc_compression_algorithm compression_algorithm =
1232
+ call->incoming_compression_algorithm_;
1233
+ if (GPR_UNLIKELY(!CompressionAlgorithmSet::FromUint32(
1234
+ compression_options.enabled_algorithms_bitset)
1235
+ .IsSet(compression_algorithm))) {
1236
+ /* check if algorithm is supported by current channel config */
1237
+ call->HandleCompressionAlgorithmDisabled(compression_algorithm);
1238
+ }
1239
+ /* GRPC_COMPRESS_NONE is always set. */
1240
+ GPR_DEBUG_ASSERT(call->encodings_accepted_by_peer_.IsSet(GRPC_COMPRESS_NONE));
1241
+ if (GPR_UNLIKELY(
1242
+ !call->encodings_accepted_by_peer_.IsSet(compression_algorithm))) {
1243
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
1244
+ call->HandleCompressionAlgorithmNotAccepted(compression_algorithm);
1453
1245
  }
1454
1246
  }
1455
1247
  }
1456
1248
 
1457
- static void receiving_initial_metadata_ready(void* bctlp,
1458
- grpc_error_handle error) {
1459
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1460
- grpc_call* call = bctl->call;
1249
+ void FilterStackCall::BatchControl::ReceivingInitialMetadataReady(
1250
+ grpc_error_handle error) {
1251
+ FilterStackCall* call = call_;
1461
1252
 
1462
- GRPC_CALL_COMBINER_STOP(&call->call_combiner, "recv_initial_metadata_ready");
1253
+ GRPC_CALL_COMBINER_STOP(call->call_combiner(), "recv_initial_metadata_ready");
1463
1254
 
1464
- if (error == GRPC_ERROR_NONE) {
1465
- grpc_metadata_batch* md = &call->recv_initial_metadata;
1466
- recv_initial_filter(call, md);
1255
+ if (error.ok()) {
1256
+ grpc_metadata_batch* md = &call->recv_initial_metadata_;
1257
+ call->RecvInitialFilter(md);
1467
1258
 
1468
1259
  /* TODO(ctiller): this could be moved into recv_initial_filter now */
1469
- GPR_TIMER_SCOPE("validate_filtered_metadata", 0);
1470
- validate_filtered_metadata(bctl);
1260
+ ValidateFilteredMetadata();
1471
1261
 
1472
- absl::optional<grpc_millis> deadline =
1473
- md->get(grpc_core::GrpcTimeoutMetadata());
1474
- if (deadline.has_value() && !call->is_client) {
1475
- call->send_deadline = *deadline;
1262
+ absl::optional<Timestamp> deadline = md->get(GrpcTimeoutMetadata());
1263
+ if (deadline.has_value() && !call->is_client()) {
1264
+ call_->set_send_deadline(*deadline);
1476
1265
  }
1477
1266
  } else {
1478
- if (bctl->batch_error.ok()) {
1479
- bctl->batch_error.set(error);
1267
+ if (batch_error_.ok()) {
1268
+ batch_error_.set(error);
1480
1269
  }
1481
- cancel_with_error(call, GRPC_ERROR_REF(error));
1270
+ call->CancelWithError(error);
1482
1271
  }
1483
1272
 
1484
1273
  grpc_closure* saved_rsr_closure = nullptr;
1485
1274
  while (true) {
1486
- gpr_atm rsr_bctlp = gpr_atm_acq_load(&call->recv_state);
1275
+ gpr_atm rsr_bctlp = gpr_atm_acq_load(&call->recv_state_);
1487
1276
  /* Should only receive initial metadata once */
1488
1277
  GPR_ASSERT(rsr_bctlp != 1);
1489
1278
  if (rsr_bctlp == 0) {
@@ -1492,96 +1281,105 @@ static void receiving_initial_metadata_ready(void* bctlp,
1492
1281
  * no_barrier_cas is used, as this function won't access the batch_control
1493
1282
  * object saved by receiving_stream_ready() if the initial metadata is
1494
1283
  * received first. */
1495
- if (gpr_atm_no_barrier_cas(&call->recv_state, RECV_NONE,
1496
- RECV_INITIAL_METADATA_FIRST)) {
1284
+ if (gpr_atm_no_barrier_cas(&call->recv_state_, kRecvNone,
1285
+ kRecvInitialMetadataFirst)) {
1497
1286
  break;
1498
1287
  }
1499
1288
  } else {
1500
1289
  /* Already received messages */
1501
- saved_rsr_closure =
1502
- GRPC_CLOSURE_CREATE(receiving_stream_ready, (batch_control*)rsr_bctlp,
1503
- grpc_schedule_on_exec_ctx);
1290
+ saved_rsr_closure = GRPC_CLOSURE_CREATE(
1291
+ [](void* bctl, grpc_error_handle error) {
1292
+ static_cast<BatchControl*>(bctl)->ReceivingStreamReady(error);
1293
+ },
1294
+ reinterpret_cast<BatchControl*>(rsr_bctlp),
1295
+ grpc_schedule_on_exec_ctx);
1504
1296
  /* No need to modify recv_state */
1505
1297
  break;
1506
1298
  }
1507
1299
  }
1508
1300
  if (saved_rsr_closure != nullptr) {
1509
- grpc_core::Closure::Run(DEBUG_LOCATION, saved_rsr_closure,
1510
- GRPC_ERROR_REF(error));
1301
+ Closure::Run(DEBUG_LOCATION, saved_rsr_closure, error);
1511
1302
  }
1512
1303
 
1513
- finish_batch_step(bctl);
1304
+ FinishStep();
1514
1305
  }
1515
1306
 
1516
- static void receiving_trailing_metadata_ready(void* bctlp,
1517
- grpc_error_handle error) {
1518
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1519
- grpc_call* call = bctl->call;
1520
- GRPC_CALL_COMBINER_STOP(&call->call_combiner, "recv_trailing_metadata_ready");
1521
- grpc_metadata_batch* md = &call->recv_trailing_metadata;
1522
- recv_trailing_filter(call, md, GRPC_ERROR_REF(error));
1523
- finish_batch_step(bctl);
1307
+ void FilterStackCall::BatchControl::ReceivingTrailingMetadataReady(
1308
+ grpc_error_handle error) {
1309
+ GRPC_CALL_COMBINER_STOP(call_->call_combiner(),
1310
+ "recv_trailing_metadata_ready");
1311
+ grpc_metadata_batch* md = &call_->recv_trailing_metadata_;
1312
+ call_->RecvTrailingFilter(md, error);
1313
+ FinishStep();
1524
1314
  }
1525
1315
 
1526
- static void finish_batch(void* bctlp, grpc_error_handle error) {
1527
- batch_control* bctl = static_cast<batch_control*>(bctlp);
1528
- grpc_call* call = bctl->call;
1529
- GRPC_CALL_COMBINER_STOP(&call->call_combiner, "on_complete");
1530
- if (bctl->batch_error.ok()) {
1531
- bctl->batch_error.set(error);
1316
+ void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) {
1317
+ GRPC_CALL_COMBINER_STOP(call_->call_combiner(), "on_complete");
1318
+ if (batch_error_.ok()) {
1319
+ batch_error_.set(error);
1532
1320
  }
1533
- if (error != GRPC_ERROR_NONE) {
1534
- cancel_with_error(call, GRPC_ERROR_REF(error));
1321
+ if (!error.ok()) {
1322
+ call_->CancelWithError(error);
1535
1323
  }
1536
- finish_batch_step(bctl);
1324
+ FinishStep();
1537
1325
  }
1538
1326
 
1539
- static void free_no_op_completion(void* /*p*/, grpc_cq_completion* completion) {
1540
- gpr_free(completion);
1327
+ namespace {
1328
+ void EndOpImmediately(grpc_completion_queue* cq, void* notify_tag,
1329
+ bool is_notify_tag_closure) {
1330
+ if (!is_notify_tag_closure) {
1331
+ GPR_ASSERT(grpc_cq_begin_op(cq, notify_tag));
1332
+ grpc_cq_end_op(
1333
+ cq, notify_tag, absl::OkStatus(),
1334
+ [](void*, grpc_cq_completion* completion) { gpr_free(completion); },
1335
+ nullptr,
1336
+ static_cast<grpc_cq_completion*>(
1337
+ gpr_malloc(sizeof(grpc_cq_completion))));
1338
+ } else {
1339
+ Closure::Run(DEBUG_LOCATION, static_cast<grpc_closure*>(notify_tag),
1340
+ absl::OkStatus());
1341
+ }
1541
1342
  }
1343
+ } // namespace
1542
1344
 
1543
- static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1544
- size_t nops, void* notify_tag,
1545
- int is_notify_tag_closure) {
1546
- GPR_TIMER_SCOPE("call_start_batch", 0);
1547
-
1345
+ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1346
+ void* notify_tag,
1347
+ bool is_notify_tag_closure) {
1548
1348
  size_t i;
1549
1349
  const grpc_op* op;
1550
- batch_control* bctl;
1350
+ BatchControl* bctl;
1551
1351
  bool has_send_ops = false;
1552
1352
  int num_recv_ops = 0;
1553
1353
  grpc_call_error error = GRPC_CALL_OK;
1554
1354
  grpc_transport_stream_op_batch* stream_op;
1555
1355
  grpc_transport_stream_op_batch_payload* stream_op_payload;
1356
+ uint32_t seen_ops = 0;
1357
+
1358
+ for (i = 0; i < nops; i++) {
1359
+ if (seen_ops & (1u << ops[i].op)) {
1360
+ return GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1361
+ }
1362
+ seen_ops |= (1u << ops[i].op);
1363
+ }
1556
1364
 
1557
1365
  GRPC_CALL_LOG_BATCH(GPR_INFO, ops, nops);
1558
1366
 
1559
1367
  if (nops == 0) {
1560
- if (!is_notify_tag_closure) {
1561
- GPR_ASSERT(grpc_cq_begin_op(call->cq, notify_tag));
1562
- grpc_cq_end_op(call->cq, notify_tag, GRPC_ERROR_NONE,
1563
- free_no_op_completion, nullptr,
1564
- static_cast<grpc_cq_completion*>(
1565
- gpr_malloc(sizeof(grpc_cq_completion))));
1566
- } else {
1567
- grpc_core::Closure::Run(DEBUG_LOCATION,
1568
- static_cast<grpc_closure*>(notify_tag),
1569
- GRPC_ERROR_NONE);
1570
- }
1368
+ EndOpImmediately(cq_, notify_tag, is_notify_tag_closure);
1571
1369
  error = GRPC_CALL_OK;
1572
1370
  goto done;
1573
1371
  }
1574
1372
 
1575
- bctl = reuse_or_allocate_batch_control(call, ops);
1373
+ bctl = ReuseOrAllocateBatchControl(ops);
1576
1374
  if (bctl == nullptr) {
1577
1375
  return GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1578
1376
  }
1579
- bctl->completion_data.notify_tag.tag = notify_tag;
1580
- bctl->completion_data.notify_tag.is_closure =
1377
+ bctl->completion_data_.notify_tag.tag = notify_tag;
1378
+ bctl->completion_data_.notify_tag.is_closure =
1581
1379
  static_cast<uint8_t>(is_notify_tag_closure != 0);
1582
1380
 
1583
- stream_op = &bctl->op;
1584
- stream_op_payload = &call->stream_op_payload;
1381
+ stream_op = &bctl->op_;
1382
+ stream_op_payload = &stream_op_payload_;
1585
1383
 
1586
1384
  /* rewrite batch ops into a transport op */
1587
1385
  for (i = 0; i < nops; i++) {
@@ -1593,11 +1391,11 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1593
1391
  switch (op->op) {
1594
1392
  case GRPC_OP_SEND_INITIAL_METADATA: {
1595
1393
  /* Flag validation: currently allow no flags */
1596
- if (!are_initial_metadata_flags_valid(op->flags, call->is_client)) {
1394
+ if (!AreInitialMetadataFlagsValid(op->flags)) {
1597
1395
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1598
1396
  goto done_with_error;
1599
1397
  }
1600
- if (call->sent_initial_metadata) {
1398
+ if (sent_initial_metadata_) {
1601
1399
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1602
1400
  goto done_with_error;
1603
1401
  }
@@ -1606,10 +1404,6 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1606
1404
  // GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY, we shouldn't override that
1607
1405
  // with the compression algorithm mapped from compression level.
1608
1406
  /* process compression level */
1609
- grpc_metadata& compression_md = call->compression_md;
1610
- compression_md.key = grpc_empty_slice();
1611
- compression_md.value = grpc_empty_slice();
1612
- size_t additional_metadata_count = 0;
1613
1407
  grpc_compression_level effective_compression_level =
1614
1408
  GRPC_COMPRESS_LEVEL_NONE;
1615
1409
  bool level_set = false;
@@ -1619,56 +1413,59 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1619
1413
  level_set = true;
1620
1414
  } else {
1621
1415
  const grpc_compression_options copts =
1622
- grpc_channel_compression_options(call->channel);
1416
+ channel()->compression_options();
1623
1417
  if (copts.default_level.is_set) {
1624
1418
  level_set = true;
1625
1419
  effective_compression_level = copts.default_level.level;
1626
1420
  }
1627
1421
  }
1628
1422
  // Currently, only server side supports compression level setting.
1629
- if (level_set && !call->is_client) {
1423
+ if (level_set && !is_client()) {
1630
1424
  const grpc_compression_algorithm calgo =
1631
- compression_algorithm_for_level_locked(
1632
- call, effective_compression_level);
1425
+ encodings_accepted_by_peer_.CompressionAlgorithmForLevel(
1426
+ effective_compression_level);
1633
1427
  // The following metadata will be checked and removed by the message
1634
1428
  // compression filter. It will be used as the call's compression
1635
1429
  // algorithm.
1636
- compression_md.key = GRPC_MDSTR_GRPC_INTERNAL_ENCODING_REQUEST;
1637
- compression_md.value = grpc_compression_algorithm_slice(calgo);
1638
- additional_metadata_count++;
1430
+ send_initial_metadata_.Set(GrpcInternalEncodingRequest(), calgo);
1639
1431
  }
1640
- if (op->data.send_initial_metadata.count + additional_metadata_count >
1641
- INT_MAX) {
1432
+ if (op->data.send_initial_metadata.count > INT_MAX) {
1642
1433
  error = GRPC_CALL_ERROR_INVALID_METADATA;
1643
1434
  goto done_with_error;
1644
1435
  }
1645
1436
  stream_op->send_initial_metadata = true;
1646
- call->sent_initial_metadata = true;
1647
- if (!prepare_application_metadata(
1648
- call, static_cast<int>(op->data.send_initial_metadata.count),
1649
- op->data.send_initial_metadata.metadata, 0, call->is_client,
1650
- &compression_md, static_cast<int>(additional_metadata_count))) {
1437
+ sent_initial_metadata_ = true;
1438
+ if (!PrepareApplicationMetadata(op->data.send_initial_metadata.count,
1439
+ op->data.send_initial_metadata.metadata,
1440
+ false)) {
1651
1441
  error = GRPC_CALL_ERROR_INVALID_METADATA;
1652
1442
  goto done_with_error;
1653
1443
  }
1444
+ // Ignore any te metadata key value pairs specified.
1445
+ send_initial_metadata_.Remove(TeMetadata());
1654
1446
  /* TODO(ctiller): just make these the same variable? */
1655
- if (call->is_client && call->send_deadline != GRPC_MILLIS_INF_FUTURE) {
1656
- call->send_initial_metadata.Set(grpc_core::GrpcTimeoutMetadata(),
1657
- call->send_deadline);
1447
+ if (is_client() && send_deadline() != Timestamp::InfFuture()) {
1448
+ send_initial_metadata_.Set(GrpcTimeoutMetadata(), send_deadline());
1449
+ }
1450
+ if (is_client()) {
1451
+ send_initial_metadata_.Set(
1452
+ WaitForReady(),
1453
+ WaitForReady::ValueType{
1454
+ (op->flags & GRPC_INITIAL_METADATA_WAIT_FOR_READY) != 0,
1455
+ (op->flags &
1456
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET) != 0});
1658
1457
  }
1659
1458
  stream_op_payload->send_initial_metadata.send_initial_metadata =
1660
- &call->send_initial_metadata;
1661
- stream_op_payload->send_initial_metadata.send_initial_metadata_flags =
1662
- op->flags;
1663
- if (call->is_client) {
1459
+ &send_initial_metadata_;
1460
+ if (is_client()) {
1664
1461
  stream_op_payload->send_initial_metadata.peer_string =
1665
- &call->peer_string;
1462
+ peer_string_atm_ptr();
1666
1463
  }
1667
1464
  has_send_ops = true;
1668
1465
  break;
1669
1466
  }
1670
1467
  case GRPC_OP_SEND_MESSAGE: {
1671
- if (!are_write_flags_valid(op->flags)) {
1468
+ if (!AreWriteFlagsValid(op->flags)) {
1672
1469
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1673
1470
  goto done_with_error;
1674
1471
  }
@@ -1676,7 +1473,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1676
1473
  error = GRPC_CALL_ERROR_INVALID_MESSAGE;
1677
1474
  goto done_with_error;
1678
1475
  }
1679
- if (call->sending_message) {
1476
+ if (sending_message_) {
1680
1477
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1681
1478
  goto done_with_error;
1682
1479
  }
@@ -1689,11 +1486,13 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1689
1486
  flags |= GRPC_WRITE_INTERNAL_COMPRESS;
1690
1487
  }
1691
1488
  stream_op->send_message = true;
1692
- call->sending_message = true;
1693
- call->sending_stream.Init(
1694
- &op->data.send_message.send_message->data.raw.slice_buffer, flags);
1695
- stream_op_payload->send_message.send_message.reset(
1696
- call->sending_stream.get());
1489
+ sending_message_ = true;
1490
+ send_slice_buffer_.Clear();
1491
+ grpc_slice_buffer_move_into(
1492
+ &op->data.send_message.send_message->data.raw.slice_buffer,
1493
+ send_slice_buffer_.c_slice_buffer());
1494
+ stream_op_payload->send_message.flags = flags;
1495
+ stream_op_payload->send_message.send_message = &send_slice_buffer_;
1697
1496
  has_send_ops = true;
1698
1497
  break;
1699
1498
  }
@@ -1703,18 +1502,18 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1703
1502
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1704
1503
  goto done_with_error;
1705
1504
  }
1706
- if (!call->is_client) {
1505
+ if (!is_client()) {
1707
1506
  error = GRPC_CALL_ERROR_NOT_ON_SERVER;
1708
1507
  goto done_with_error;
1709
1508
  }
1710
- if (call->sent_final_op) {
1509
+ if (sent_final_op_) {
1711
1510
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1712
1511
  goto done_with_error;
1713
1512
  }
1714
1513
  stream_op->send_trailing_metadata = true;
1715
- call->sent_final_op = true;
1514
+ sent_final_op_ = true;
1716
1515
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1717
- &call->send_trailing_metadata;
1516
+ &send_trailing_metadata_;
1718
1517
  has_send_ops = true;
1719
1518
  break;
1720
1519
  }
@@ -1724,11 +1523,11 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1724
1523
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1725
1524
  goto done_with_error;
1726
1525
  }
1727
- if (call->is_client) {
1526
+ if (is_client()) {
1728
1527
  error = GRPC_CALL_ERROR_NOT_ON_CLIENT;
1729
1528
  goto done_with_error;
1730
1529
  }
1731
- if (call->sent_final_op) {
1530
+ if (sent_final_op_) {
1732
1531
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1733
1532
  goto done_with_error;
1734
1533
  }
@@ -1738,55 +1537,47 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1738
1537
  goto done_with_error;
1739
1538
  }
1740
1539
  stream_op->send_trailing_metadata = true;
1741
- call->sent_final_op = true;
1742
- GPR_ASSERT(call->send_extra_metadata_count == 0);
1743
- call->send_extra_metadata_count = 1;
1744
- call->send_extra_metadata[0].md = grpc_get_reffed_status_elem(
1745
- op->data.send_status_from_server.status);
1540
+ sent_final_op_ = true;
1541
+
1542
+ if (!PrepareApplicationMetadata(
1543
+ op->data.send_status_from_server.trailing_metadata_count,
1544
+ op->data.send_status_from_server.trailing_metadata, true)) {
1545
+ error = GRPC_CALL_ERROR_INVALID_METADATA;
1546
+ goto done_with_error;
1547
+ }
1548
+
1746
1549
  grpc_error_handle status_error =
1747
1550
  op->data.send_status_from_server.status == GRPC_STATUS_OK
1748
- ? GRPC_ERROR_NONE
1551
+ ? absl::OkStatus()
1749
1552
  : grpc_error_set_int(
1750
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1751
- "Server returned error"),
1752
- GRPC_ERROR_INT_GRPC_STATUS,
1553
+ GRPC_ERROR_CREATE("Server returned error"),
1554
+ StatusIntProperty::kRpcStatus,
1753
1555
  static_cast<intptr_t>(
1754
1556
  op->data.send_status_from_server.status));
1755
1557
  if (op->data.send_status_from_server.status_details != nullptr) {
1756
- call->send_extra_metadata[1].md = grpc_mdelem_from_slices(
1757
- GRPC_MDSTR_GRPC_MESSAGE,
1758
- grpc_slice_copy(
1759
- *op->data.send_status_from_server.status_details));
1760
- call->send_extra_metadata_count++;
1761
- if (status_error != GRPC_ERROR_NONE) {
1762
- char* msg = grpc_slice_to_c_string(
1763
- GRPC_MDVALUE(call->send_extra_metadata[1].md));
1764
- status_error = grpc_error_set_str(status_error,
1765
- GRPC_ERROR_STR_GRPC_MESSAGE, msg);
1766
- gpr_free(msg);
1558
+ send_trailing_metadata_.Set(
1559
+ GrpcMessageMetadata(),
1560
+ Slice(grpc_slice_copy(
1561
+ *op->data.send_status_from_server.status_details)));
1562
+ if (!status_error.ok()) {
1563
+ status_error = grpc_error_set_str(
1564
+ status_error, StatusStrProperty::kGrpcMessage,
1565
+ StringViewFromSlice(
1566
+ *op->data.send_status_from_server.status_details));
1767
1567
  }
1768
1568
  }
1769
1569
 
1770
- call->status_error.set(status_error);
1771
- GRPC_ERROR_UNREF(status_error);
1772
-
1773
- if (!prepare_application_metadata(
1774
- call,
1775
- static_cast<int>(
1776
- op->data.send_status_from_server.trailing_metadata_count),
1777
- op->data.send_status_from_server.trailing_metadata, 1, 1,
1778
- nullptr, 0)) {
1779
- for (int n = 0; n < call->send_extra_metadata_count; n++) {
1780
- GRPC_MDELEM_UNREF(call->send_extra_metadata[n].md);
1781
- }
1782
- call->send_extra_metadata_count = 0;
1783
- error = GRPC_CALL_ERROR_INVALID_METADATA;
1784
- goto done_with_error;
1785
- }
1570
+ status_error_.set(status_error);
1571
+
1572
+ send_trailing_metadata_.Set(GrpcStatusMetadata(),
1573
+ op->data.send_status_from_server.status);
1574
+
1575
+ // Ignore any te metadata key value pairs specified.
1576
+ send_trailing_metadata_.Remove(TeMetadata());
1786
1577
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1787
- &call->send_trailing_metadata;
1578
+ &send_trailing_metadata_;
1788
1579
  stream_op_payload->send_trailing_metadata.sent =
1789
- &call->sent_server_trailing_metadata;
1580
+ &sent_server_trailing_metadata_;
1790
1581
  has_send_ops = true;
1791
1582
  break;
1792
1583
  }
@@ -1796,27 +1587,31 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1796
1587
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1797
1588
  goto done_with_error;
1798
1589
  }
1799
- if (call->received_initial_metadata) {
1590
+ if (received_initial_metadata_) {
1800
1591
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1801
1592
  goto done_with_error;
1802
1593
  }
1803
- call->received_initial_metadata = true;
1804
- call->buffered_metadata[0] =
1594
+ received_initial_metadata_ = true;
1595
+ buffered_metadata_[0] =
1805
1596
  op->data.recv_initial_metadata.recv_initial_metadata;
1806
- GRPC_CLOSURE_INIT(&call->receiving_initial_metadata_ready,
1807
- receiving_initial_metadata_ready, bctl,
1808
- grpc_schedule_on_exec_ctx);
1597
+ GRPC_CLOSURE_INIT(
1598
+ &receiving_initial_metadata_ready_,
1599
+ [](void* bctl, grpc_error_handle error) {
1600
+ static_cast<BatchControl*>(bctl)->ReceivingInitialMetadataReady(
1601
+ error);
1602
+ },
1603
+ bctl, grpc_schedule_on_exec_ctx);
1809
1604
  stream_op->recv_initial_metadata = true;
1810
1605
  stream_op_payload->recv_initial_metadata.recv_initial_metadata =
1811
- &call->recv_initial_metadata;
1606
+ &recv_initial_metadata_;
1812
1607
  stream_op_payload->recv_initial_metadata.recv_initial_metadata_ready =
1813
- &call->receiving_initial_metadata_ready;
1814
- if (call->is_client) {
1608
+ &receiving_initial_metadata_ready_;
1609
+ if (is_client()) {
1815
1610
  stream_op_payload->recv_initial_metadata.trailing_metadata_available =
1816
- &call->is_trailers_only;
1611
+ &is_trailers_only_;
1817
1612
  } else {
1818
1613
  stream_op_payload->recv_initial_metadata.peer_string =
1819
- &call->peer_string;
1614
+ peer_string_atm_ptr();
1820
1615
  }
1821
1616
  ++num_recv_ops;
1822
1617
  break;
@@ -1827,21 +1622,33 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1827
1622
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1828
1623
  goto done_with_error;
1829
1624
  }
1830
- if (call->receiving_message) {
1625
+ if (receiving_message_) {
1831
1626
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1832
1627
  goto done_with_error;
1833
1628
  }
1834
- call->receiving_message = true;
1629
+ receiving_message_ = true;
1835
1630
  stream_op->recv_message = true;
1836
- call->receiving_buffer = op->data.recv_message.recv_message;
1837
- stream_op_payload->recv_message.recv_message = &call->receiving_stream;
1631
+ receiving_slice_buffer_.reset();
1632
+ receiving_buffer_ = op->data.recv_message.recv_message;
1633
+ stream_op_payload->recv_message.recv_message = &receiving_slice_buffer_;
1634
+ receiving_stream_flags_ = 0;
1635
+ stream_op_payload->recv_message.flags = &receiving_stream_flags_;
1838
1636
  stream_op_payload->recv_message.call_failed_before_recv_message =
1839
- &call->call_failed_before_recv_message;
1840
- GRPC_CLOSURE_INIT(&call->receiving_stream_ready,
1841
- receiving_stream_ready_in_call_combiner, bctl,
1842
- grpc_schedule_on_exec_ctx);
1637
+ &call_failed_before_recv_message_;
1638
+ GRPC_CLOSURE_INIT(
1639
+ &receiving_stream_ready_,
1640
+ [](void* bctlp, grpc_error_handle error) {
1641
+ auto* bctl = static_cast<BatchControl*>(bctlp);
1642
+ auto* call = bctl->call_;
1643
+ // Yields the call combiner before processing the received
1644
+ // message.
1645
+ GRPC_CALL_COMBINER_STOP(call->call_combiner(),
1646
+ "recv_message_ready");
1647
+ bctl->ReceivingStreamReady(error);
1648
+ },
1649
+ bctl, grpc_schedule_on_exec_ctx);
1843
1650
  stream_op_payload->recv_message.recv_message_ready =
1844
- &call->receiving_stream_ready;
1651
+ &receiving_stream_ready_;
1845
1652
  ++num_recv_ops;
1846
1653
  break;
1847
1654
  }
@@ -1851,32 +1658,36 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1851
1658
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1852
1659
  goto done_with_error;
1853
1660
  }
1854
- if (!call->is_client) {
1661
+ if (!is_client()) {
1855
1662
  error = GRPC_CALL_ERROR_NOT_ON_SERVER;
1856
1663
  goto done_with_error;
1857
1664
  }
1858
- if (call->requested_final_op) {
1665
+ if (requested_final_op_) {
1859
1666
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1860
1667
  goto done_with_error;
1861
1668
  }
1862
- call->requested_final_op = true;
1863
- call->buffered_metadata[1] =
1669
+ requested_final_op_ = true;
1670
+ buffered_metadata_[1] =
1864
1671
  op->data.recv_status_on_client.trailing_metadata;
1865
- call->final_op.client.status = op->data.recv_status_on_client.status;
1866
- call->final_op.client.status_details =
1672
+ final_op_.client.status = op->data.recv_status_on_client.status;
1673
+ final_op_.client.status_details =
1867
1674
  op->data.recv_status_on_client.status_details;
1868
- call->final_op.client.error_string =
1675
+ final_op_.client.error_string =
1869
1676
  op->data.recv_status_on_client.error_string;
1870
1677
  stream_op->recv_trailing_metadata = true;
1871
1678
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata =
1872
- &call->recv_trailing_metadata;
1679
+ &recv_trailing_metadata_;
1873
1680
  stream_op_payload->recv_trailing_metadata.collect_stats =
1874
- &call->final_info.stats.transport_stream_stats;
1875
- GRPC_CLOSURE_INIT(&call->receiving_trailing_metadata_ready,
1876
- receiving_trailing_metadata_ready, bctl,
1877
- grpc_schedule_on_exec_ctx);
1681
+ &final_info_.stats.transport_stream_stats;
1682
+ GRPC_CLOSURE_INIT(
1683
+ &receiving_trailing_metadata_ready_,
1684
+ [](void* bctl, grpc_error_handle error) {
1685
+ static_cast<BatchControl*>(bctl)->ReceivingTrailingMetadataReady(
1686
+ error);
1687
+ },
1688
+ bctl, grpc_schedule_on_exec_ctx);
1878
1689
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1879
- &call->receiving_trailing_metadata_ready;
1690
+ &receiving_trailing_metadata_ready_;
1880
1691
  ++num_recv_ops;
1881
1692
  break;
1882
1693
  }
@@ -1886,47 +1697,53 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1886
1697
  error = GRPC_CALL_ERROR_INVALID_FLAGS;
1887
1698
  goto done_with_error;
1888
1699
  }
1889
- if (call->is_client) {
1700
+ if (is_client()) {
1890
1701
  error = GRPC_CALL_ERROR_NOT_ON_CLIENT;
1891
1702
  goto done_with_error;
1892
1703
  }
1893
- if (call->requested_final_op) {
1704
+ if (requested_final_op_) {
1894
1705
  error = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
1895
1706
  goto done_with_error;
1896
1707
  }
1897
- call->requested_final_op = true;
1898
- call->final_op.server.cancelled =
1899
- op->data.recv_close_on_server.cancelled;
1708
+ requested_final_op_ = true;
1709
+ final_op_.server.cancelled = op->data.recv_close_on_server.cancelled;
1900
1710
  stream_op->recv_trailing_metadata = true;
1901
1711
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata =
1902
- &call->recv_trailing_metadata;
1712
+ &recv_trailing_metadata_;
1903
1713
  stream_op_payload->recv_trailing_metadata.collect_stats =
1904
- &call->final_info.stats.transport_stream_stats;
1905
- GRPC_CLOSURE_INIT(&call->receiving_trailing_metadata_ready,
1906
- receiving_trailing_metadata_ready, bctl,
1907
- grpc_schedule_on_exec_ctx);
1714
+ &final_info_.stats.transport_stream_stats;
1715
+ GRPC_CLOSURE_INIT(
1716
+ &receiving_trailing_metadata_ready_,
1717
+ [](void* bctl, grpc_error_handle error) {
1718
+ static_cast<BatchControl*>(bctl)->ReceivingTrailingMetadataReady(
1719
+ error);
1720
+ },
1721
+ bctl, grpc_schedule_on_exec_ctx);
1908
1722
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1909
- &call->receiving_trailing_metadata_ready;
1723
+ &receiving_trailing_metadata_ready_;
1910
1724
  ++num_recv_ops;
1911
1725
  break;
1912
1726
  }
1913
1727
  }
1914
1728
  }
1915
1729
 
1916
- GRPC_CALL_INTERNAL_REF(call, "completion");
1730
+ InternalRef("completion");
1917
1731
  if (!is_notify_tag_closure) {
1918
- GPR_ASSERT(grpc_cq_begin_op(call->cq, notify_tag));
1732
+ GPR_ASSERT(grpc_cq_begin_op(cq_, notify_tag));
1919
1733
  }
1920
1734
  bctl->set_num_steps_to_complete((has_send_ops ? 1 : 0) + num_recv_ops);
1921
1735
 
1922
1736
  if (has_send_ops) {
1923
- GRPC_CLOSURE_INIT(&bctl->finish_batch, finish_batch, bctl,
1924
- grpc_schedule_on_exec_ctx);
1925
- stream_op->on_complete = &bctl->finish_batch;
1737
+ GRPC_CLOSURE_INIT(
1738
+ &bctl->finish_batch_,
1739
+ [](void* bctl, grpc_error_handle error) {
1740
+ static_cast<BatchControl*>(bctl)->FinishBatch(error);
1741
+ },
1742
+ bctl, grpc_schedule_on_exec_ctx);
1743
+ stream_op->on_complete = &bctl->finish_batch_;
1926
1744
  }
1927
1745
 
1928
- gpr_atm_rel_store(&call->any_ops_sent_atm, 1);
1929
- execute_batch(call, stream_op, &bctl->start_batch);
1746
+ ExecuteBatch(stream_op, &bctl->start_batch_);
1930
1747
 
1931
1748
  done:
1932
1749
  return error;
@@ -1934,87 +1751,1257 @@ done:
1934
1751
  done_with_error:
1935
1752
  /* reverse any mutations that occurred */
1936
1753
  if (stream_op->send_initial_metadata) {
1937
- call->sent_initial_metadata = false;
1938
- call->send_initial_metadata.Clear();
1754
+ sent_initial_metadata_ = false;
1755
+ send_initial_metadata_.Clear();
1939
1756
  }
1940
1757
  if (stream_op->send_message) {
1941
- call->sending_message = false;
1942
- call->sending_stream->Orphan();
1943
- stream_op_payload->send_message.send_message.reset();
1758
+ sending_message_ = false;
1944
1759
  }
1945
1760
  if (stream_op->send_trailing_metadata) {
1946
- call->sent_final_op = false;
1947
- call->send_trailing_metadata.Clear();
1761
+ sent_final_op_ = false;
1762
+ send_trailing_metadata_.Clear();
1948
1763
  }
1949
1764
  if (stream_op->recv_initial_metadata) {
1950
- call->received_initial_metadata = false;
1765
+ received_initial_metadata_ = false;
1951
1766
  }
1952
1767
  if (stream_op->recv_message) {
1953
- call->receiving_message = false;
1768
+ receiving_message_ = false;
1954
1769
  }
1955
1770
  if (stream_op->recv_trailing_metadata) {
1956
- call->requested_final_op = false;
1771
+ requested_final_op_ = false;
1957
1772
  }
1958
1773
  goto done;
1959
1774
  }
1960
1775
 
1776
+ void FilterStackCall::ContextSet(grpc_context_index elem, void* value,
1777
+ void (*destroy)(void*)) {
1778
+ if (context_[elem].destroy) {
1779
+ context_[elem].destroy(context_[elem].value);
1780
+ }
1781
+ context_[elem].value = value;
1782
+ context_[elem].destroy = destroy;
1783
+ }
1784
+
1785
+ ///////////////////////////////////////////////////////////////////////////////
1786
+ // Metadata validation helpers
1787
+
1788
+ namespace {
1789
+ bool ValidateMetadata(size_t count, grpc_metadata* metadata) {
1790
+ for (size_t i = 0; i < count; i++) {
1791
+ grpc_metadata* md = &metadata[i];
1792
+ if (!GRPC_LOG_IF_ERROR("validate_metadata",
1793
+ grpc_validate_header_key_is_legal(md->key))) {
1794
+ return false;
1795
+ } else if (!grpc_is_binary_header_internal(md->key) &&
1796
+ !GRPC_LOG_IF_ERROR(
1797
+ "validate_metadata",
1798
+ grpc_validate_header_nonbin_value_is_legal(md->value))) {
1799
+ return false;
1800
+ } else if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
1801
+ // HTTP2 hpack encoding has a maximum limit.
1802
+ return false;
1803
+ }
1804
+ }
1805
+ return true;
1806
+ }
1807
+ } // namespace
1808
+
1809
+ ///////////////////////////////////////////////////////////////////////////////
1810
+ // PromiseBasedCall
1811
+ // Will be folded into Call once the promise conversion is done
1812
+
1813
+ class PromiseBasedCall : public Call, public Activity, public Wakeable {
1814
+ public:
1815
+ PromiseBasedCall(Arena* arena, const grpc_call_create_args& args);
1816
+
1817
+ void ContextSet(grpc_context_index elem, void* value,
1818
+ void (*destroy)(void* value)) override;
1819
+ void* ContextGet(grpc_context_index elem) const override;
1820
+ void SetCompletionQueue(grpc_completion_queue* cq) override;
1821
+
1822
+ // Implementation of call refcounting: move this to DualRefCounted once we
1823
+ // don't need to maintain FilterStackCall compatibility
1824
+ void ExternalRef() final {
1825
+ refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed);
1826
+ }
1827
+ void ExternalUnref() final {
1828
+ const uint64_t prev_ref_pair =
1829
+ refs_.fetch_add(MakeRefPair(-1, 1), std::memory_order_acq_rel);
1830
+ const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
1831
+ if (GPR_UNLIKELY(strong_refs == 1)) {
1832
+ Orphan();
1833
+ }
1834
+ // Now drop the weak ref.
1835
+ InternalUnref("external_ref");
1836
+ }
1837
+ void InternalRef(const char*) final {
1838
+ refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_relaxed);
1839
+ }
1840
+ void InternalUnref(const char*) final {
1841
+ const uint64_t prev_ref_pair =
1842
+ refs_.fetch_sub(MakeRefPair(0, 1), std::memory_order_acq_rel);
1843
+ if (GPR_UNLIKELY(prev_ref_pair == MakeRefPair(0, 1))) {
1844
+ DeleteThis();
1845
+ }
1846
+ }
1847
+
1848
+ // Activity methods
1849
+ void ForceImmediateRepoll() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) override;
1850
+ Waker MakeOwningWaker() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) override {
1851
+ InternalRef("wakeup");
1852
+ // If ASAN is defined, we leverage it to detect dropped Waker objects.
1853
+ // Usually Waker must be destroyed or woken up, but (especially with arenas)
1854
+ // it's not uncommon to create a Waker and then do neither. In that case it's
1855
+ // incredibly fraught to diagnose where the dropped reference to this object was
1856
+ // created. Instead, leverage ASAN and create a new object per expected wakeup.
1857
+ // Now when we drop such an object ASAN will fail and we'll get a callstack to
1858
+ // the creation of the waker in question.
1859
+ #if defined(__has_feature)
1860
+ #if __has_feature(address_sanitizer)
1861
+ #define GRPC_CALL_USES_ASAN_WAKER
1862
+ class AsanWaker final : public Wakeable {
1863
+ public:
1864
+ explicit AsanWaker(PromiseBasedCall* call) : call_(call) {}
1865
+
1866
+ void Wakeup() override {
1867
+ call_->Wakeup();
1868
+ delete this;
1869
+ }
1870
+
1871
+ void Drop() override {
1872
+ call_->Drop();
1873
+ delete this;
1874
+ }
1875
+
1876
+ std::string ActivityDebugTag() const override {
1877
+ return call_->DebugTag();
1878
+ }
1879
+
1880
+ private:
1881
+ PromiseBasedCall* call_;
1882
+ };
1883
+ return Waker(new AsanWaker(this));
1884
+ #endif
1885
+ #endif
1886
+ #ifndef GRPC_CALL_USES_ASAN_WAKER
1887
+ return Waker(this);
1888
+ #endif
1889
+ }
1890
+ Waker MakeNonOwningWaker() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) override;
1891
+
1892
+ // Wakeable methods
1893
+ void Wakeup() override {
1894
+ channel()->event_engine()->Run([this] {
1895
+ ApplicationCallbackExecCtx app_exec_ctx;
1896
+ ExecCtx exec_ctx;
1897
+ {
1898
+ ScopedContext activity_context(this);
1899
+ MutexLock lock(&mu_);
1900
+ Update();
1901
+ }
1902
+ InternalUnref("wakeup");
1903
+ });
1904
+ }
1905
+ void Drop() override { InternalUnref("wakeup"); }
1906
+
1907
+ void RunInContext(absl::AnyInvocable<void()> fn) {
1908
+ if (Activity::current() == this) {
1909
+ fn();
1910
+ } else {
1911
+ InternalRef("in_context");
1912
+ channel()->event_engine()->Run([this, fn = std::move(fn)]() mutable {
1913
+ ApplicationCallbackExecCtx app_exec_ctx;
1914
+ ExecCtx exec_ctx;
1915
+ {
1916
+ ScopedContext activity_context(this);
1917
+ MutexLock lock(&mu_);
1918
+ fn();
1919
+ Update();
1920
+ }
1921
+ InternalUnref("in_context");
1922
+ });
1923
+ }
1924
+ }
1925
+
1926
+ grpc_compression_algorithm test_only_compression_algorithm() override {
1927
+ abort();
1928
+ }
1929
+ uint32_t test_only_message_flags() override { abort(); }
1930
+ uint32_t test_only_encodings_accepted_by_peer() override { abort(); }
1931
+ grpc_compression_algorithm compression_for_level(
1932
+ grpc_compression_level) override {
1933
+ abort();
1934
+ }
1935
+
1936
+ // This should return nullptr for the promise stack (and alternative means
1937
+ // for that functionality be invented)
1938
+ grpc_call_stack* call_stack() override { return nullptr; }
1939
+
1940
+ protected:
1941
+ class ScopedContext
1942
+ : public ScopedActivity,
1943
+ public promise_detail::Context<Arena>,
1944
+ public promise_detail::Context<grpc_call_context_element>,
1945
+ public promise_detail::Context<CallContext>,
1946
+ public promise_detail::Context<CallFinalization> {
1947
+ public:
1948
+ explicit ScopedContext(PromiseBasedCall* call)
1949
+ : ScopedActivity(call),
1950
+ promise_detail::Context<Arena>(call->arena()),
1951
+ promise_detail::Context<grpc_call_context_element>(call->context_),
1952
+ promise_detail::Context<CallContext>(&call->call_context_),
1953
+ promise_detail::Context<CallFinalization>(&call->finalization_) {}
1954
+ };
1955
+
1956
+ class Completion {
1957
+ public:
1958
+ Completion() : index_(kNullIndex) {}
1959
+ ~Completion() { GPR_ASSERT(index_ == kNullIndex); }
1960
+ explicit Completion(uint8_t index) : index_(index) {}
1961
+ Completion(const Completion& other) = delete;
1962
+ Completion& operator=(const Completion& other) = delete;
1963
+ Completion(Completion&& other) noexcept : index_(other.index_) {
1964
+ other.index_ = kNullIndex;
1965
+ }
1966
+ Completion& operator=(Completion&& other) noexcept {
1967
+ GPR_ASSERT(index_ == kNullIndex);
1968
+ index_ = other.index_;
1969
+ other.index_ = kNullIndex;
1970
+ return *this;
1971
+ }
1972
+
1973
+ uint8_t index() const { return index_; }
1974
+ uint8_t TakeIndex() { return std::exchange(index_, kNullIndex); }
1975
+ bool has_value() const { return index_ != kNullIndex; }
1976
+
1977
+ std::string ToString() const {
1978
+ return index_ == kNullIndex ? "null"
1979
+ : std::to_string(static_cast<int>(index_));
1980
+ }
1981
+
1982
+ private:
1983
+ enum : uint8_t { kNullIndex = 0xff };
1984
+ uint8_t index_;
1985
+ };
1986
+
1987
+ ~PromiseBasedCall() override {
1988
+ if (non_owning_wakeable_) non_owning_wakeable_->DropActivity();
1989
+ if (cq_) GRPC_CQ_INTERNAL_UNREF(cq_, "bind");
1990
+ }
1991
+
1992
+ // Enumerates why a Completion is still pending
1993
+ enum class PendingOp {
1994
+ // We're in the midst of starting a batch of operations
1995
+ kStartingBatch = 0,
1996
+ // The following correspond with the batch operations from above
1997
+ kReceiveInitialMetadata,
1998
+ kReceiveStatusOnClient,
1999
+ kSendMessage,
2000
+ kReceiveMessage,
2001
+ };
2002
+
2003
+ static constexpr const char* PendingOpString(PendingOp reason) {
2004
+ switch (reason) {
2005
+ case PendingOp::kStartingBatch:
2006
+ return "StartingBatch";
2007
+ case PendingOp::kReceiveInitialMetadata:
2008
+ return "ReceiveInitialMetadata";
2009
+ case PendingOp::kReceiveStatusOnClient:
2010
+ return "ReceiveStatusOnClient";
2011
+ case PendingOp::kSendMessage:
2012
+ return "SendMessage";
2013
+ case PendingOp::kReceiveMessage:
2014
+ return "ReceiveMessage";
2015
+ }
2016
+ return "Unknown";
2017
+ }
2018
+
2019
+ static constexpr uint8_t PendingOpBit(PendingOp reason) {
2020
+ return 1 << static_cast<int>(reason);
2021
+ }
2022
+
2023
+ Mutex* mu() const ABSL_LOCK_RETURNED(mu_) { return &mu_; }
2024
+
2025
+ // Begin work on a completion, recording the tag/closure to notify.
2026
+ // Use the op selected in \a ops to determine the index to allocate into.
2027
+ // Starts the "StartingBatch" PendingOp immediately.
2028
+ // Assumes at least one operation in \a ops.
2029
+ Completion StartCompletion(void* tag, bool is_closure, const grpc_op* ops)
2030
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2031
+ // Add one pending op to the completion, and return it.
2032
+ Completion AddOpToCompletion(const Completion& completion, PendingOp reason)
2033
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2034
+ // Finish one op on the completion. Must have been previously been added.
2035
+ // The completion as a whole finishes when all pending ops finish.
2036
+ void FinishOpOnCompletion(Completion* completion, PendingOp reason)
2037
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2038
+ // Mark the completion as failed. Does not finish it.
2039
+ void FailCompletion(const Completion& completion);
2040
+ // Run the promise polling loop until it stalls.
2041
+ void Update() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2042
+ // Update the promise state once.
2043
+ virtual void UpdateOnce() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) = 0;
2044
+ // Accept the stats from the context (call once we have proof the transport is
2045
+ // done with them).
2046
+ // Right now this means that promise based calls do not record correct stats
2047
+ // with census if they are cancelled.
2048
+ // TODO(ctiller): this should be remedied before promise based calls are
2049
+ // dexperimentalized.
2050
+ void AcceptTransportStatsFromContext() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
2051
+ final_stats_ = *call_context_.call_stats();
2052
+ }
2053
+
2054
+ grpc_completion_queue* cq() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { return cq_; }
2055
+
2056
+ void CToMetadata(grpc_metadata* metadata, size_t count,
2057
+ grpc_metadata_batch* batch);
2058
+
2059
+ std::string ActivityDebugTag() const override { return DebugTag(); }
2060
+
2061
+ // At the end of the call run any finalization actions.
2062
+ void RunFinalization(grpc_status_code status, const char* status_details) {
2063
+ grpc_call_final_info final_info;
2064
+ final_info.stats = final_stats_;
2065
+ final_info.final_status = status;
2066
+ final_info.error_string = status_details;
2067
+ finalization_.Run(&final_info);
2068
+ }
2069
+
2070
+ private:
2071
+ union CompletionInfo {
2072
+ struct Pending {
2073
+ // Bitmask of PendingOps
2074
+ uint8_t pending_op_bits;
2075
+ bool is_closure;
2076
+ bool success;
2077
+ void* tag;
2078
+ } pending;
2079
+ grpc_cq_completion completion;
2080
+ };
2081
+
2082
+ class NonOwningWakable final : public Wakeable {
2083
+ public:
2084
+ explicit NonOwningWakable(PromiseBasedCall* call) : call_(call) {}
2085
+
2086
+ // Ref the Handle (not the activity).
2087
+ void Ref() { refs_.fetch_add(1, std::memory_order_relaxed); }
2088
+
2089
+ // Activity is going away... drop its reference and sever the connection
2090
+ // back.
2091
+ void DropActivity() ABSL_LOCKS_EXCLUDED(mu_) {
2092
+ auto unref = absl::MakeCleanup([this]() { Unref(); });
2093
+ MutexLock lock(&mu_);
2094
+ GPR_ASSERT(call_ != nullptr);
2095
+ call_ = nullptr;
2096
+ }
2097
+
2098
+ // Activity needs to wake up (if it still exists!) - wake it up, and drop
2099
+ // the ref that was kept for this handle.
2100
+ void Wakeup() override ABSL_LOCKS_EXCLUDED(mu_) {
2101
+ // Drop the ref to the handle at end of scope (we have one ref = one
2102
+ // wakeup semantics).
2103
+ auto unref = absl::MakeCleanup([this]() { Unref(); });
2104
+ ReleasableMutexLock lock(&mu_);
2105
+ // Note that activity refcount can drop to zero, but we could win the lock
2106
+ // against DropActivity, so we need to only increase activities refcount
2107
+ // if it is non-zero.
2108
+ if (call_ != nullptr && call_->RefIfNonZero()) {
2109
+ PromiseBasedCall* call = call_;
2110
+ lock.Release();
2111
+ // Activity still exists and we have a reference: wake it up, which will
2112
+ // drop the ref.
2113
+ call->Wakeup();
2114
+ }
2115
+ }
2116
+
2117
+ std::string ActivityDebugTag() const override {
2118
+ MutexLock lock(&mu_);
2119
+ return call_ == nullptr ? "<unknown>" : call_->DebugTag();
2120
+ }
2121
+
2122
+ void Drop() override { Unref(); }
2123
+
2124
+ private:
2125
+ // Unref the Handle (not the activity).
2126
+ void Unref() {
2127
+ if (1 == refs_.fetch_sub(1, std::memory_order_acq_rel)) {
2128
+ delete this;
2129
+ }
2130
+ }
2131
+
2132
+ mutable Mutex mu_;
2133
+ // We have two initial refs: one for the wakeup that this is created for,
2134
+ // and will be dropped by Wakeup, and the other for the activity which is
2135
+ // dropped by DropActivity.
2136
+ std::atomic<size_t> refs_{2};
2137
+ PromiseBasedCall* call_ ABSL_GUARDED_BY(mu_);
2138
+ };
2139
+
2140
+ static void OnDestroy(void* arg, grpc_error_handle) {
2141
+ auto* call = static_cast<PromiseBasedCall*>(arg);
2142
+ ScopedContext context(call);
2143
+ call->DeleteThis();
2144
+ }
2145
+
2146
+ // First 32 bits are strong refs, next 32 bits are weak refs.
2147
+ static uint64_t MakeRefPair(uint32_t strong, uint32_t weak) {
2148
+ return (static_cast<uint64_t>(strong) << 32) + static_cast<int64_t>(weak);
2149
+ }
2150
+ static uint32_t GetStrongRefs(uint64_t ref_pair) {
2151
+ return static_cast<uint32_t>(ref_pair >> 32);
2152
+ }
2153
+ static uint32_t GetWeakRefs(uint64_t ref_pair) {
2154
+ return static_cast<uint32_t>(ref_pair & 0xffffffffu);
2155
+ }
2156
+
2157
+ bool RefIfNonZero() {
2158
+ uint64_t prev_ref_pair = refs_.load(std::memory_order_acquire);
2159
+ do {
2160
+ const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
2161
+ if (strong_refs == 0) return false;
2162
+ } while (!refs_.compare_exchange_weak(
2163
+ prev_ref_pair, prev_ref_pair + MakeRefPair(1, 0),
2164
+ std::memory_order_acq_rel, std::memory_order_acquire));
2165
+ return true;
2166
+ }
2167
+
2168
+ mutable Mutex mu_;
2169
+ std::atomic<uint64_t> refs_{MakeRefPair(1, 0)};
2170
+ CallContext call_context_{this};
2171
+ bool keep_polling_ ABSL_GUARDED_BY(mu()) = false;
2172
+
2173
+ /* Contexts for various subsystems (security, tracing, ...). */
2174
+ grpc_call_context_element context_[GRPC_CONTEXT_COUNT] = {};
2175
+ grpc_completion_queue* cq_ ABSL_GUARDED_BY(mu_);
2176
+ NonOwningWakable* non_owning_wakeable_ ABSL_GUARDED_BY(mu_) = nullptr;
2177
+ CompletionInfo completion_info_[6];
2178
+ grpc_call_stats final_stats_{};
2179
+ CallFinalization finalization_;
2180
+ };
2181
+
2182
+ template <typename T>
2183
+ grpc_error_handle MakePromiseBasedCall(grpc_call_create_args* args,
2184
+ grpc_call** out_call) {
2185
+ Channel* channel = args->channel.get();
2186
+
2187
+ auto alloc = Arena::CreateWithAlloc(channel->CallSizeEstimate(), sizeof(T),
2188
+ channel->allocator());
2189
+ PromiseBasedCall* call = new (alloc.second) T(alloc.first, args);
2190
+ *out_call = call->c_ptr();
2191
+ GPR_DEBUG_ASSERT(Call::FromC(*out_call) == call);
2192
+ return absl::OkStatus();
2193
+ }
2194
+
2195
+ PromiseBasedCall::PromiseBasedCall(Arena* arena,
2196
+ const grpc_call_create_args& args)
2197
+ : Call(arena, args.server_transport_data == nullptr, args.send_deadline,
2198
+ args.channel->Ref()),
2199
+ cq_(args.cq) {
2200
+ if (args.cq != nullptr) {
2201
+ GPR_ASSERT(args.pollset_set_alternative == nullptr &&
2202
+ "Only one of 'cq' and 'pollset_set_alternative' should be "
2203
+ "non-nullptr.");
2204
+ GRPC_CQ_INTERNAL_REF(args.cq, "bind");
2205
+ call_context_.pollent_ =
2206
+ grpc_polling_entity_create_from_pollset(grpc_cq_pollset(args.cq));
2207
+ }
2208
+ if (args.pollset_set_alternative != nullptr) {
2209
+ call_context_.pollent_ = grpc_polling_entity_create_from_pollset_set(
2210
+ args.pollset_set_alternative);
2211
+ }
2212
+ }
2213
+
2214
+ Waker PromiseBasedCall::MakeNonOwningWaker() {
2215
+ if (non_owning_wakeable_ == nullptr) {
2216
+ non_owning_wakeable_ = new NonOwningWakable(this);
2217
+ } else {
2218
+ non_owning_wakeable_->Ref();
2219
+ }
2220
+ return Waker(non_owning_wakeable_);
2221
+ }
2222
+
2223
+ void PromiseBasedCall::CToMetadata(grpc_metadata* metadata, size_t count,
2224
+ grpc_metadata_batch* b) {
2225
+ for (size_t i = 0; i < count; i++) {
2226
+ grpc_metadata* md = &metadata[i];
2227
+ auto key = StringViewFromSlice(md->key);
2228
+ // Filter "content-length metadata"
2229
+ if (key == "content-length") continue;
2230
+ b->Append(key, Slice(CSliceRef(md->value)),
2231
+ [md](absl::string_view error, const Slice& value) {
2232
+ gpr_log(GPR_DEBUG, "Append error: %s",
2233
+ absl::StrCat("key=", StringViewFromSlice(md->key),
2234
+ " error=", error,
2235
+ " value=", value.as_string_view())
2236
+ .c_str());
2237
+ });
2238
+ }
2239
+ }
2240
+
2241
+ void PromiseBasedCall::ContextSet(grpc_context_index elem, void* value,
2242
+ void (*destroy)(void*)) {
2243
+ if (context_[elem].destroy != nullptr) {
2244
+ context_[elem].destroy(context_[elem].value);
2245
+ }
2246
+ context_[elem].value = value;
2247
+ context_[elem].destroy = destroy;
2248
+ }
2249
+
2250
+ void* PromiseBasedCall::ContextGet(grpc_context_index elem) const {
2251
+ return context_[elem].value;
2252
+ }
2253
+
2254
+ PromiseBasedCall::Completion PromiseBasedCall::StartCompletion(
2255
+ void* tag, bool is_closure, const grpc_op* ops) {
2256
+ Completion c(BatchSlotForOp(ops[0].op));
2257
+ if (grpc_call_trace.enabled()) {
2258
+ gpr_log(GPR_INFO, "%sStartCompletion %s tag=%p", DebugTag().c_str(),
2259
+ c.ToString().c_str(), tag);
2260
+ }
2261
+ if (!is_closure) {
2262
+ grpc_cq_begin_op(cq(), tag);
2263
+ }
2264
+ completion_info_[c.index()].pending = {
2265
+ PendingOpBit(PendingOp::kStartingBatch), is_closure, true, tag};
2266
+ return c;
2267
+ }
2268
+
2269
+ PromiseBasedCall::Completion PromiseBasedCall::AddOpToCompletion(
2270
+ const Completion& completion, PendingOp reason) {
2271
+ if (grpc_call_trace.enabled()) {
2272
+ gpr_log(GPR_INFO, "%sAddOpToCompletion %s %s", DebugTag().c_str(),
2273
+ completion.ToString().c_str(), PendingOpString(reason));
2274
+ }
2275
+ auto& pending_op_bits =
2276
+ completion_info_[completion.index()].pending.pending_op_bits;
2277
+ GPR_ASSERT((pending_op_bits & PendingOpBit(reason)) == 0);
2278
+ pending_op_bits |= PendingOpBit(reason);
2279
+ return Completion(completion.index());
2280
+ }
2281
+
2282
+ void PromiseBasedCall::FailCompletion(const Completion& completion) {
2283
+ if (grpc_call_trace.enabled()) {
2284
+ gpr_log(GPR_INFO, "%sFailCompletion %s", DebugTag().c_str(),
2285
+ completion.ToString().c_str());
2286
+ }
2287
+ completion_info_[completion.index()].pending.success = false;
2288
+ }
2289
+
2290
+ void PromiseBasedCall::FinishOpOnCompletion(Completion* completion,
2291
+ PendingOp reason) {
2292
+ if (grpc_call_trace.enabled()) {
2293
+ auto pending_op_bits =
2294
+ completion_info_[completion->index()].pending.pending_op_bits;
2295
+ bool success = completion_info_[completion->index()].pending.success;
2296
+ std::vector<const char*> pending;
2297
+ for (size_t i = 0; i < 8 * sizeof(pending_op_bits); i++) {
2298
+ if (static_cast<PendingOp>(i) == reason) continue;
2299
+ if (pending_op_bits & (1 << i)) {
2300
+ pending.push_back(PendingOpString(static_cast<PendingOp>(i)));
2301
+ }
2302
+ }
2303
+ gpr_log(
2304
+ GPR_INFO, "%sFinishOpOnCompletion %s %s %s", DebugTag().c_str(),
2305
+ completion->ToString().c_str(), PendingOpString(reason),
2306
+ (pending.empty()
2307
+ ? (success ? std::string("done") : std::string("failed"))
2308
+ : absl::StrFormat("pending_ops={%s}", absl::StrJoin(pending, ",")))
2309
+ .c_str());
2310
+ }
2311
+ const uint8_t i = completion->TakeIndex();
2312
+ GPR_ASSERT(i < GPR_ARRAY_SIZE(completion_info_));
2313
+ CompletionInfo::Pending& pending = completion_info_[i].pending;
2314
+ GPR_ASSERT(pending.pending_op_bits & PendingOpBit(reason));
2315
+ pending.pending_op_bits &= ~PendingOpBit(reason);
2316
+ auto error = pending.success ? absl::OkStatus() : absl::CancelledError();
2317
+ if (pending.pending_op_bits == 0) {
2318
+ if (pending.is_closure) {
2319
+ ExecCtx::Run(DEBUG_LOCATION, static_cast<grpc_closure*>(pending.tag),
2320
+ error);
2321
+ } else {
2322
+ grpc_cq_end_op(
2323
+ cq(), pending.tag, error, [](void*, grpc_cq_completion*) {}, nullptr,
2324
+ &completion_info_[i].completion);
2325
+ }
2326
+ }
2327
+ }
2328
+
2329
+ void PromiseBasedCall::Update() {
2330
+ keep_polling_ = false;
2331
+ do {
2332
+ UpdateOnce();
2333
+ } while (std::exchange(keep_polling_, false));
2334
+ }
2335
+
2336
+ void PromiseBasedCall::ForceImmediateRepoll() { keep_polling_ = true; }
2337
+
2338
+ void PromiseBasedCall::SetCompletionQueue(grpc_completion_queue* cq) {
2339
+ MutexLock lock(&mu_);
2340
+ cq_ = cq;
2341
+ GRPC_CQ_INTERNAL_REF(cq, "bind");
2342
+ call_context_.pollent_ =
2343
+ grpc_polling_entity_create_from_pollset(grpc_cq_pollset(cq));
2344
+ }
2345
+
2346
+ ///////////////////////////////////////////////////////////////////////////////
2347
+ // CallContext
2348
+
2349
+ void CallContext::RunInContext(absl::AnyInvocable<void()> fn) {
2350
+ call_->RunInContext(std::move(fn));
2351
+ }
2352
+
2353
+ void CallContext::IncrementRefCount(const char* reason) {
2354
+ call_->InternalRef(reason);
2355
+ }
2356
+
2357
+ void CallContext::Unref(const char* reason) { call_->InternalUnref(reason); }
2358
+
2359
+ ///////////////////////////////////////////////////////////////////////////////
2360
+ // ClientPromiseBasedCall
2361
+
2362
+ class ClientPromiseBasedCall final : public PromiseBasedCall {
2363
+ public:
2364
+ ClientPromiseBasedCall(Arena* arena, grpc_call_create_args* args)
2365
+ : PromiseBasedCall(arena, *args) {
2366
+ global_stats().IncrementClientCallsCreated();
2367
+ ScopedContext context(this);
2368
+ send_initial_metadata_ =
2369
+ GetContext<Arena>()->MakePooled<ClientMetadata>(GetContext<Arena>());
2370
+ send_initial_metadata_->Set(HttpPathMetadata(), std::move(*args->path));
2371
+ if (args->authority.has_value()) {
2372
+ send_initial_metadata_->Set(HttpAuthorityMetadata(),
2373
+ std::move(*args->authority));
2374
+ }
2375
+ if (auto* channelz_channel = channel()->channelz_node()) {
2376
+ channelz_channel->RecordCallStarted();
2377
+ }
2378
+ }
2379
+
2380
+ ~ClientPromiseBasedCall() override {
2381
+ ScopedContext context(this);
2382
+ send_initial_metadata_.reset();
2383
+ recv_status_on_client_ = absl::monostate();
2384
+ promise_ = ArenaPromise<ServerMetadataHandle>();
2385
+ // Need to destroy the pipes under the ScopedContext above, so we move them
2386
+ // out here and then allow the destructors to run at end of scope, but
2387
+ // before context.
2388
+ auto c2s = std::move(client_to_server_messages_);
2389
+ auto s2c = std::move(server_to_client_messages_);
2390
+ }
2391
+
2392
+ absl::string_view GetServerAuthority() const override { abort(); }
2393
+ void CancelWithError(grpc_error_handle error) override;
2394
+ bool Completed() override;
2395
+ void Orphan() override {
2396
+ MutexLock lock(mu());
2397
+ ScopedContext ctx(this);
2398
+ if (!completed_) Finish(ServerMetadataFromStatus(absl::CancelledError()));
2399
+ }
2400
+ bool is_trailers_only() const override {
2401
+ MutexLock lock(mu());
2402
+ return is_trailers_only_;
2403
+ }
2404
+ bool failed_before_recv_message() const override { abort(); }
2405
+
2406
+ grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag,
2407
+ bool is_notify_tag_closure) override;
2408
+
2409
+ std::string DebugTag() const override {
2410
+ return absl::StrFormat("CLIENT_CALL[%p]: ", this);
2411
+ }
2412
+
2413
+ private:
2414
+ // Poll the underlying promise (and sundry objects) once.
2415
+ void UpdateOnce() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) override;
2416
+ // Finish the call with the given status/trailing metadata.
2417
+ void Finish(ServerMetadataHandle trailing_metadata)
2418
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2419
+ // Validate that a set of ops is valid for a client call.
2420
+ grpc_call_error ValidateBatch(const grpc_op* ops, size_t nops) const
2421
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2422
+ // Commit a valid batch of operations to be executed.
2423
+ void CommitBatch(const grpc_op* ops, size_t nops,
2424
+ const Completion& completion)
2425
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2426
+ // Start the underlying promise.
2427
+ void StartPromise(ClientMetadataHandle client_initial_metadata)
2428
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2429
+ // Publish some metadata out to the application.
2430
+ static void PublishMetadataArray(grpc_metadata_array* array,
2431
+ ServerMetadata* md);
2432
+ // Publish status out to the application.
2433
+ void PublishStatus(
2434
+ grpc_op::grpc_op_data::grpc_op_recv_status_on_client op_args,
2435
+ ServerMetadataHandle trailing_metadata)
2436
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2437
+ // Publish server initial metadata out to the application.
2438
+ void PublishInitialMetadata(ServerMetadata* metadata)
2439
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2440
+
2441
+ ArenaPromise<ServerMetadataHandle> promise_ ABSL_GUARDED_BY(mu());
2442
+ Latch<ServerMetadata*> server_initial_metadata_ ABSL_GUARDED_BY(mu());
2443
+ Pipe<MessageHandle> client_to_server_messages_ ABSL_GUARDED_BY(mu()){arena()};
2444
+ Pipe<MessageHandle> server_to_client_messages_ ABSL_GUARDED_BY(mu()){arena()};
2445
+
2446
+ ClientMetadataHandle send_initial_metadata_;
2447
+ grpc_metadata_array* recv_initial_metadata_ ABSL_GUARDED_BY(mu()) = nullptr;
2448
+ grpc_byte_buffer** recv_message_ ABSL_GUARDED_BY(mu()) = nullptr;
2449
+ absl::variant<absl::monostate,
2450
+ grpc_op::grpc_op_data::grpc_op_recv_status_on_client,
2451
+ ServerMetadataHandle>
2452
+ recv_status_on_client_ ABSL_GUARDED_BY(mu());
2453
+ absl::optional<PipeSender<MessageHandle>::PushType> outstanding_send_
2454
+ ABSL_GUARDED_BY(mu());
2455
+ absl::optional<PipeReceiver<MessageHandle>::NextType> outstanding_recv_
2456
+ ABSL_GUARDED_BY(mu());
2457
+ absl::optional<Latch<ServerMetadata*>::WaitPromise>
2458
+ server_initial_metadata_ready_;
2459
+ absl::optional<grpc_compression_algorithm> incoming_compression_algorithm_;
2460
+ Completion recv_initial_metadata_completion_ ABSL_GUARDED_BY(mu());
2461
+ Completion recv_status_on_client_completion_ ABSL_GUARDED_BY(mu());
2462
+ Completion send_message_completion_ ABSL_GUARDED_BY(mu());
2463
+ Completion recv_message_completion_ ABSL_GUARDED_BY(mu());
2464
+ bool completed_ ABSL_GUARDED_BY(mu()) = false;
2465
+ bool is_trailers_only_ ABSL_GUARDED_BY(mu());
2466
+ };
2467
+
2468
+ void ClientPromiseBasedCall::StartPromise(
2469
+ ClientMetadataHandle client_initial_metadata) {
2470
+ GPR_ASSERT(!promise_.has_value());
2471
+ promise_ = channel()->channel_stack()->MakeClientCallPromise(CallArgs{
2472
+ std::move(client_initial_metadata),
2473
+ &server_initial_metadata_,
2474
+ &client_to_server_messages_.receiver,
2475
+ &server_to_client_messages_.sender,
2476
+ });
2477
+ }
2478
+
2479
+ void ClientPromiseBasedCall::CancelWithError(grpc_error_handle error) {
2480
+ MutexLock lock(mu());
2481
+ ScopedContext context(this);
2482
+ Finish(ServerMetadataFromStatus(grpc_error_to_absl_status(error)));
2483
+ }
2484
+
2485
+ grpc_call_error ClientPromiseBasedCall::ValidateBatch(const grpc_op* ops,
2486
+ size_t nops) const {
2487
+ BitSet<8> got_ops;
2488
+ for (size_t op_idx = 0; op_idx < nops; op_idx++) {
2489
+ const grpc_op& op = ops[op_idx];
2490
+ switch (op.op) {
2491
+ case GRPC_OP_SEND_INITIAL_METADATA:
2492
+ if (!AreInitialMetadataFlagsValid(op.flags)) {
2493
+ return GRPC_CALL_ERROR_INVALID_FLAGS;
2494
+ }
2495
+ if (!ValidateMetadata(op.data.send_initial_metadata.count,
2496
+ op.data.send_initial_metadata.metadata)) {
2497
+ return GRPC_CALL_ERROR_INVALID_METADATA;
2498
+ }
2499
+ break;
2500
+ case GRPC_OP_SEND_MESSAGE:
2501
+ if (!AreWriteFlagsValid(op.flags)) {
2502
+ return GRPC_CALL_ERROR_INVALID_FLAGS;
2503
+ }
2504
+ break;
2505
+ case GRPC_OP_RECV_INITIAL_METADATA:
2506
+ case GRPC_OP_RECV_MESSAGE:
2507
+ case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
2508
+ case GRPC_OP_RECV_STATUS_ON_CLIENT:
2509
+ if (op.flags != 0) return GRPC_CALL_ERROR_INVALID_FLAGS;
2510
+ break;
2511
+ case GRPC_OP_RECV_CLOSE_ON_SERVER:
2512
+ case GRPC_OP_SEND_STATUS_FROM_SERVER:
2513
+ return GRPC_CALL_ERROR_NOT_ON_CLIENT;
2514
+ }
2515
+ if (got_ops.is_set(op.op)) return GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
2516
+ got_ops.set(op.op);
2517
+ }
2518
+ return GRPC_CALL_OK;
2519
+ }
2520
+
2521
+ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
2522
+ const Completion& completion) {
2523
+ for (size_t op_idx = 0; op_idx < nops; op_idx++) {
2524
+ const grpc_op& op = ops[op_idx];
2525
+ switch (op.op) {
2526
+ case GRPC_OP_SEND_INITIAL_METADATA: {
2527
+ // compression not implemented
2528
+ GPR_ASSERT(
2529
+ !op.data.send_initial_metadata.maybe_compression_level.is_set);
2530
+ if (!completed_) {
2531
+ CToMetadata(op.data.send_initial_metadata.metadata,
2532
+ op.data.send_initial_metadata.count,
2533
+ send_initial_metadata_.get());
2534
+ StartPromise(std::move(send_initial_metadata_));
2535
+ }
2536
+ } break;
2537
+ case GRPC_OP_RECV_INITIAL_METADATA: {
2538
+ recv_initial_metadata_ =
2539
+ op.data.recv_initial_metadata.recv_initial_metadata;
2540
+ server_initial_metadata_ready_ = server_initial_metadata_.Wait();
2541
+ recv_initial_metadata_completion_ =
2542
+ AddOpToCompletion(completion, PendingOp::kReceiveInitialMetadata);
2543
+ } break;
2544
+ case GRPC_OP_RECV_STATUS_ON_CLIENT: {
2545
+ recv_status_on_client_completion_ =
2546
+ AddOpToCompletion(completion, PendingOp::kReceiveStatusOnClient);
2547
+ if (auto* finished_metadata =
2548
+ absl::get_if<ServerMetadataHandle>(&recv_status_on_client_)) {
2549
+ PublishStatus(op.data.recv_status_on_client,
2550
+ std::move(*finished_metadata));
2551
+ } else {
2552
+ recv_status_on_client_ = op.data.recv_status_on_client;
2553
+ }
2554
+ } break;
2555
+ case GRPC_OP_SEND_MESSAGE: {
2556
+ GPR_ASSERT(!outstanding_send_.has_value());
2557
+ if (!completed_) {
2558
+ send_message_completion_ =
2559
+ AddOpToCompletion(completion, PendingOp::kSendMessage);
2560
+ SliceBuffer send;
2561
+ grpc_slice_buffer_swap(
2562
+ &op.data.send_message.send_message->data.raw.slice_buffer,
2563
+ send.c_slice_buffer());
2564
+ outstanding_send_.emplace(client_to_server_messages_.sender.Push(
2565
+ GetContext<Arena>()->MakePooled<Message>(std::move(send),
2566
+ op.flags)));
2567
+ } else {
2568
+ FailCompletion(completion);
2569
+ }
2570
+ } break;
2571
+ case GRPC_OP_RECV_MESSAGE: {
2572
+ GPR_ASSERT(!outstanding_recv_.has_value());
2573
+ recv_message_ = op.data.recv_message.recv_message;
2574
+ recv_message_completion_ =
2575
+ AddOpToCompletion(completion, PendingOp::kReceiveMessage);
2576
+ outstanding_recv_.emplace(server_to_client_messages_.receiver.Next());
2577
+ } break;
2578
+ case GRPC_OP_SEND_CLOSE_FROM_CLIENT: {
2579
+ client_to_server_messages_.sender.Close();
2580
+ } break;
2581
+ case GRPC_OP_SEND_STATUS_FROM_SERVER:
2582
+ case GRPC_OP_RECV_CLOSE_ON_SERVER:
2583
+ abort(); // unreachable
2584
+ }
2585
+ }
2586
+ }
2587
+
2588
+ grpc_call_error ClientPromiseBasedCall::StartBatch(const grpc_op* ops,
2589
+ size_t nops,
2590
+ void* notify_tag,
2591
+ bool is_notify_tag_closure) {
2592
+ MutexLock lock(mu());
2593
+ ScopedContext activity_context(this);
2594
+ if (nops == 0) {
2595
+ EndOpImmediately(cq(), notify_tag, is_notify_tag_closure);
2596
+ return GRPC_CALL_OK;
2597
+ }
2598
+ const grpc_call_error validation_result = ValidateBatch(ops, nops);
2599
+ if (validation_result != GRPC_CALL_OK) {
2600
+ return validation_result;
2601
+ }
2602
+ Completion completion =
2603
+ StartCompletion(notify_tag, is_notify_tag_closure, ops);
2604
+ CommitBatch(ops, nops, completion);
2605
+ Update();
2606
+ FinishOpOnCompletion(&completion, PendingOp::kStartingBatch);
2607
+ return GRPC_CALL_OK;
2608
+ }
2609
+
2610
+ void ClientPromiseBasedCall::PublishInitialMetadata(ServerMetadata* metadata) {
2611
+ incoming_compression_algorithm_ =
2612
+ metadata->Take(GrpcEncodingMetadata()).value_or(GRPC_COMPRESS_NONE);
2613
+ server_initial_metadata_ready_.reset();
2614
+ GPR_ASSERT(recv_initial_metadata_ != nullptr);
2615
+ PublishMetadataArray(std::exchange(recv_initial_metadata_, nullptr),
2616
+ metadata);
2617
+ FinishOpOnCompletion(&recv_initial_metadata_completion_,
2618
+ PendingOp::kReceiveInitialMetadata);
2619
+ }
2620
+
2621
+ void ClientPromiseBasedCall::UpdateOnce() {
2622
+ if (grpc_call_trace.enabled()) {
2623
+ auto present_and_completion_text =
2624
+ [](const char* caption, bool has,
2625
+ const Completion& completion) -> std::string {
2626
+ if (has) {
2627
+ if (completion.has_value()) {
2628
+ return absl::StrCat(caption, ":",
2629
+ static_cast<int>(completion.index()), " ");
2630
+ } else {
2631
+ return absl::StrCat(caption,
2632
+ ":!!BUG:operation is present, no completion!! ");
2633
+ }
2634
+ } else {
2635
+ if (!completion.has_value()) {
2636
+ return "";
2637
+ } else {
2638
+ return absl::StrCat(
2639
+ caption, ":no-op:", static_cast<int>(completion.index()), " ");
2640
+ }
2641
+ }
2642
+ };
2643
+ gpr_log(
2644
+ GPR_INFO, "%sUpdateOnce: %s%s%shas_promise=%s", DebugTag().c_str(),
2645
+ present_and_completion_text("server_initial_metadata_ready",
2646
+ server_initial_metadata_ready_.has_value(),
2647
+ recv_initial_metadata_completion_)
2648
+ .c_str(),
2649
+ present_and_completion_text("outstanding_send",
2650
+ outstanding_send_.has_value(),
2651
+ send_message_completion_)
2652
+ .c_str(),
2653
+ present_and_completion_text("outstanding_recv",
2654
+ outstanding_recv_.has_value(),
2655
+ recv_message_completion_)
2656
+ .c_str(),
2657
+ promise_.has_value() ? "true" : "false");
2658
+ }
2659
+ if (send_message_completion_.has_value()) {
2660
+ FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
2661
+ }
2662
+ if (server_initial_metadata_ready_.has_value()) {
2663
+ Poll<ServerMetadata**> r = (*server_initial_metadata_ready_)();
2664
+ if (ServerMetadata*** server_initial_metadata =
2665
+ absl::get_if<ServerMetadata**>(&r)) {
2666
+ PublishInitialMetadata(**server_initial_metadata);
2667
+ } else if (completed_) {
2668
+ ServerMetadata no_metadata{GetContext<Arena>()};
2669
+ PublishInitialMetadata(&no_metadata);
2670
+ }
2671
+ }
2672
+ if (outstanding_send_.has_value()) {
2673
+ Poll<bool> r = (*outstanding_send_)();
2674
+ if (const bool* result = absl::get_if<bool>(&r)) {
2675
+ outstanding_send_.reset();
2676
+ if (!*result) {
2677
+ FailCompletion(send_message_completion_);
2678
+ Finish(ServerMetadataFromStatus(absl::Status(
2679
+ absl::StatusCode::kInternal, "Failed to send message to server")));
2680
+ }
2681
+ }
2682
+ }
2683
+ if (promise_.has_value()) {
2684
+ Poll<ServerMetadataHandle> r = promise_();
2685
+ if (grpc_call_trace.enabled()) {
2686
+ gpr_log(GPR_INFO, "%sUpdateOnce: promise returns %s", DebugTag().c_str(),
2687
+ PollToString(r, [](const ServerMetadataHandle& h) {
2688
+ return h->DebugString();
2689
+ }).c_str());
2690
+ }
2691
+ if (auto* result = absl::get_if<ServerMetadataHandle>(&r)) {
2692
+ AcceptTransportStatsFromContext();
2693
+ Finish(std::move(*result));
2694
+ }
2695
+ }
2696
+ if (incoming_compression_algorithm_.has_value() &&
2697
+ outstanding_recv_.has_value()) {
2698
+ Poll<NextResult<MessageHandle>> r = (*outstanding_recv_)();
2699
+ if (auto* result = absl::get_if<NextResult<MessageHandle>>(&r)) {
2700
+ outstanding_recv_.reset();
2701
+ if (result->has_value()) {
2702
+ MessageHandle& message = **result;
2703
+ if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
2704
+ (incoming_compression_algorithm_ != GRPC_COMPRESS_NONE)) {
2705
+ *recv_message_ = grpc_raw_compressed_byte_buffer_create(
2706
+ nullptr, 0, *incoming_compression_algorithm_);
2707
+ } else {
2708
+ *recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0);
2709
+ }
2710
+ grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(),
2711
+ &(*recv_message_)->data.raw.slice_buffer);
2712
+ if (grpc_call_trace.enabled()) {
2713
+ gpr_log(GPR_INFO,
2714
+ "%sUpdateOnce: outstanding_recv finishes: received %" PRIdPTR
2715
+ " byte message",
2716
+ DebugTag().c_str(),
2717
+ (*recv_message_)->data.raw.slice_buffer.length);
2718
+ }
2719
+ } else {
2720
+ if (grpc_call_trace.enabled()) {
2721
+ gpr_log(
2722
+ GPR_INFO,
2723
+ "%sUpdateOnce: outstanding_recv finishes: received end-of-stream",
2724
+ DebugTag().c_str());
2725
+ }
2726
+ *recv_message_ = nullptr;
2727
+ }
2728
+ FinishOpOnCompletion(&recv_message_completion_,
2729
+ PendingOp::kReceiveMessage);
2730
+ } else if (completed_) {
2731
+ if (grpc_call_trace.enabled()) {
2732
+ gpr_log(GPR_INFO,
2733
+ "%sUpdateOnce: outstanding_recv finishes: promise has "
2734
+ "completed without queuing a message, forcing end-of-stream",
2735
+ DebugTag().c_str());
2736
+ }
2737
+ outstanding_recv_.reset();
2738
+ *recv_message_ = nullptr;
2739
+ FinishOpOnCompletion(&recv_message_completion_,
2740
+ PendingOp::kReceiveMessage);
2741
+ }
2742
+ }
2743
+ }
2744
+
2745
+ void ClientPromiseBasedCall::Finish(ServerMetadataHandle trailing_metadata) {
2746
+ if (grpc_call_trace.enabled()) {
2747
+ gpr_log(GPR_INFO, "%sFinish: %s", DebugTag().c_str(),
2748
+ trailing_metadata->DebugString().c_str());
2749
+ }
2750
+ promise_ = ArenaPromise<ServerMetadataHandle>();
2751
+ completed_ = true;
2752
+ if (recv_initial_metadata_ != nullptr) {
2753
+ ForceImmediateRepoll();
2754
+ }
2755
+ const bool pending_initial_metadata =
2756
+ server_initial_metadata_ready_.has_value();
2757
+ server_initial_metadata_ready_.reset();
2758
+ Poll<ServerMetadata**> r = server_initial_metadata_.Wait()();
2759
+ if (auto* result = absl::get_if<ServerMetadata**>(&r)) {
2760
+ if (pending_initial_metadata) PublishInitialMetadata(**result);
2761
+ is_trailers_only_ = false;
2762
+ } else {
2763
+ if (pending_initial_metadata) {
2764
+ ServerMetadata no_metadata{GetContext<Arena>()};
2765
+ PublishInitialMetadata(&no_metadata);
2766
+ }
2767
+ is_trailers_only_ = true;
2768
+ }
2769
+ if (auto* channelz_channel = channel()->channelz_node()) {
2770
+ if (trailing_metadata->get(GrpcStatusMetadata())
2771
+ .value_or(GRPC_STATUS_UNKNOWN) == GRPC_STATUS_OK) {
2772
+ channelz_channel->RecordCallSucceeded();
2773
+ } else {
2774
+ channelz_channel->RecordCallFailed();
2775
+ }
2776
+ }
2777
+ if (auto* status_request =
2778
+ absl::get_if<grpc_op::grpc_op_data::grpc_op_recv_status_on_client>(
2779
+ &recv_status_on_client_)) {
2780
+ PublishStatus(*status_request, std::move(trailing_metadata));
2781
+ } else {
2782
+ recv_status_on_client_ = std::move(trailing_metadata);
2783
+ }
2784
+ }
2785
+
2786
+ namespace {
2787
+ std::string MakeErrorString(const ServerMetadata* trailing_metadata) {
2788
+ std::string out = absl::StrCat(
2789
+ trailing_metadata->get(GrpcStatusFromWire()).value_or(false)
2790
+ ? "Error received from peer"
2791
+ : "Error generated by client",
2792
+ "grpc_status: ",
2793
+ grpc_status_code_to_string(trailing_metadata->get(GrpcStatusMetadata())
2794
+ .value_or(GRPC_STATUS_UNKNOWN)));
2795
+ if (const Slice* message =
2796
+ trailing_metadata->get_pointer(GrpcMessageMetadata())) {
2797
+ absl::StrAppend(&out, "\ngrpc_message: ", message->as_string_view());
2798
+ }
2799
+ if (auto annotations = trailing_metadata->get_pointer(GrpcStatusContext())) {
2800
+ absl::StrAppend(&out, "\nStatus Context:");
2801
+ for (const std::string& annotation : *annotations) {
2802
+ absl::StrAppend(&out, "\n ", annotation);
2803
+ }
2804
+ }
2805
+ return out;
2806
+ }
2807
+ } // namespace
2808
+
2809
+ void ClientPromiseBasedCall::PublishStatus(
2810
+ grpc_op::grpc_op_data::grpc_op_recv_status_on_client op_args,
2811
+ ServerMetadataHandle trailing_metadata) {
2812
+ const grpc_status_code status = trailing_metadata->get(GrpcStatusMetadata())
2813
+ .value_or(GRPC_STATUS_UNKNOWN);
2814
+ *op_args.status = status;
2815
+ absl::string_view message_string;
2816
+ if (Slice* message = trailing_metadata->get_pointer(GrpcMessageMetadata())) {
2817
+ message_string = message->as_string_view();
2818
+ *op_args.status_details = message->Ref().TakeCSlice();
2819
+ } else {
2820
+ *op_args.status_details = grpc_empty_slice();
2821
+ }
2822
+ if (message_string.empty()) {
2823
+ RunFinalization(status, nullptr);
2824
+ } else {
2825
+ std::string error_string(message_string);
2826
+ RunFinalization(status, error_string.c_str());
2827
+ }
2828
+ if (op_args.error_string != nullptr && status != GRPC_STATUS_OK) {
2829
+ *op_args.error_string =
2830
+ gpr_strdup(MakeErrorString(trailing_metadata.get()).c_str());
2831
+ }
2832
+ PublishMetadataArray(op_args.trailing_metadata, trailing_metadata.get());
2833
+ FinishOpOnCompletion(&recv_status_on_client_completion_,
2834
+ PendingOp::kReceiveStatusOnClient);
2835
+ }
2836
+
2837
+ void ClientPromiseBasedCall::PublishMetadataArray(grpc_metadata_array* array,
2838
+ ServerMetadata* md) {
2839
+ const auto md_count = md->count();
2840
+ if (md_count > array->capacity) {
2841
+ array->capacity =
2842
+ std::max(array->capacity + md->count(), array->capacity * 3 / 2);
2843
+ array->metadata = static_cast<grpc_metadata*>(
2844
+ gpr_realloc(array->metadata, sizeof(grpc_metadata) * array->capacity));
2845
+ }
2846
+ PublishToAppEncoder encoder(array);
2847
+ md->Encode(&encoder);
2848
+ }
2849
+
2850
+ bool ClientPromiseBasedCall::Completed() {
2851
+ MutexLock lock(mu());
2852
+ return completed_;
2853
+ }
2854
+
2855
+ gpr_atm* CallContext::peer_string_atm_ptr() {
2856
+ return call_->peer_string_atm_ptr();
2857
+ }
2858
+
2859
+ } // namespace grpc_core
2860
+
2861
+ ///////////////////////////////////////////////////////////////////////////////
2862
+ // C-based API
2863
+
2864
+ void* grpc_call_arena_alloc(grpc_call* call, size_t size) {
2865
+ grpc_core::ExecCtx exec_ctx;
2866
+ return grpc_core::Call::FromC(call)->arena()->Alloc(size);
2867
+ }
2868
+
2869
+ size_t grpc_call_get_initial_size_estimate() {
2870
+ return grpc_core::FilterStackCall::InitialSizeEstimate();
2871
+ }
2872
+
2873
+ grpc_error_handle grpc_call_create(grpc_call_create_args* args,
2874
+ grpc_call** out_call) {
2875
+ if (grpc_core::IsPromiseBasedClientCallEnabled() &&
2876
+ args->channel->is_promising()) {
2877
+ if (args->server_transport_data == nullptr) {
2878
+ return grpc_core::MakePromiseBasedCall<grpc_core::ClientPromiseBasedCall>(
2879
+ args, out_call);
2880
+ }
2881
+ }
2882
+ return grpc_core::FilterStackCall::Create(args, out_call);
2883
+ }
2884
+
2885
+ void grpc_call_set_completion_queue(grpc_call* call,
2886
+ grpc_completion_queue* cq) {
2887
+ grpc_core::Call::FromC(call)->SetCompletionQueue(cq);
2888
+ }
2889
+
2890
+ void grpc_call_ref(grpc_call* c) { grpc_core::Call::FromC(c)->ExternalRef(); }
2891
+
2892
+ void grpc_call_unref(grpc_call* c) {
2893
+ grpc_core::ExecCtx exec_ctx;
2894
+ grpc_core::Call::FromC(c)->ExternalUnref();
2895
+ }
2896
+
2897
+ char* grpc_call_get_peer(grpc_call* call) {
2898
+ return grpc_core::Call::FromC(call)->GetPeer();
2899
+ }
2900
+
2901
+ grpc_call* grpc_call_from_top_element(grpc_call_element* surface_element) {
2902
+ return grpc_core::FilterStackCall::FromTopElem(surface_element)->c_ptr();
2903
+ }
2904
+
2905
+ grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved) {
2906
+ GRPC_API_TRACE("grpc_call_cancel(call=%p, reserved=%p)", 2, (call, reserved));
2907
+ GPR_ASSERT(reserved == nullptr);
2908
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2909
+ grpc_core::ExecCtx exec_ctx;
2910
+ grpc_core::Call::FromC(call)->CancelWithError(absl::CancelledError());
2911
+ return GRPC_CALL_OK;
2912
+ }
2913
+
2914
+ grpc_call_error grpc_call_cancel_with_status(grpc_call* c,
2915
+ grpc_status_code status,
2916
+ const char* description,
2917
+ void* reserved) {
2918
+ GRPC_API_TRACE(
2919
+ "grpc_call_cancel_with_status("
2920
+ "c=%p, status=%d, description=%s, reserved=%p)",
2921
+ 4, (c, (int)status, description, reserved));
2922
+ GPR_ASSERT(reserved == nullptr);
2923
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2924
+ grpc_core::ExecCtx exec_ctx;
2925
+ grpc_core::Call::FromC(c)->CancelWithStatus(status, description);
2926
+ return GRPC_CALL_OK;
2927
+ }
2928
+
2929
+ void grpc_call_cancel_internal(grpc_call* call) {
2930
+ grpc_core::Call::FromC(call)->CancelWithError(absl::CancelledError());
2931
+ }
2932
+
2933
+ grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm(
2934
+ grpc_call* call) {
2935
+ return grpc_core::Call::FromC(call)->test_only_compression_algorithm();
2936
+ }
2937
+
2938
+ uint32_t grpc_call_test_only_get_message_flags(grpc_call* call) {
2939
+ return grpc_core::Call::FromC(call)->test_only_message_flags();
2940
+ }
2941
+
2942
+ uint32_t grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call* call) {
2943
+ return grpc_core::Call::FromC(call)->test_only_encodings_accepted_by_peer();
2944
+ }
2945
+
2946
+ grpc_core::Arena* grpc_call_get_arena(grpc_call* call) {
2947
+ return grpc_core::Call::FromC(call)->arena();
2948
+ }
2949
+
2950
+ grpc_call_stack* grpc_call_get_call_stack(grpc_call* call) {
2951
+ return grpc_core::Call::FromC(call)->call_stack();
2952
+ }
2953
+
1961
2954
  grpc_call_error grpc_call_start_batch(grpc_call* call, const grpc_op* ops,
1962
2955
  size_t nops, void* tag, void* reserved) {
1963
- grpc_call_error err;
1964
-
1965
2956
  GRPC_API_TRACE(
1966
2957
  "grpc_call_start_batch(call=%p, ops=%p, nops=%lu, tag=%p, "
1967
2958
  "reserved=%p)",
1968
2959
  5, (call, ops, (unsigned long)nops, tag, reserved));
1969
2960
 
1970
2961
  if (reserved != nullptr) {
1971
- err = GRPC_CALL_ERROR;
2962
+ return GRPC_CALL_ERROR;
1972
2963
  } else {
1973
2964
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1974
2965
  grpc_core::ExecCtx exec_ctx;
1975
- err = call_start_batch(call, ops, nops, tag, 0);
2966
+ return grpc_core::Call::FromC(call)->StartBatch(ops, nops, tag, false);
1976
2967
  }
1977
-
1978
- return err;
1979
2968
  }
1980
2969
 
1981
2970
  grpc_call_error grpc_call_start_batch_and_execute(grpc_call* call,
1982
2971
  const grpc_op* ops,
1983
2972
  size_t nops,
1984
2973
  grpc_closure* closure) {
1985
- return call_start_batch(call, ops, nops, closure, 1);
2974
+ return grpc_core::Call::FromC(call)->StartBatch(ops, nops, closure, true);
1986
2975
  }
1987
2976
 
1988
2977
  void grpc_call_context_set(grpc_call* call, grpc_context_index elem,
1989
2978
  void* value, void (*destroy)(void* value)) {
1990
- if (call->context[elem].destroy) {
1991
- call->context[elem].destroy(call->context[elem].value);
1992
- }
1993
- call->context[elem].value = value;
1994
- call->context[elem].destroy = destroy;
2979
+ return grpc_core::Call::FromC(call)->ContextSet(elem, value, destroy);
1995
2980
  }
1996
2981
 
1997
2982
  void* grpc_call_context_get(grpc_call* call, grpc_context_index elem) {
1998
- return call->context[elem].value;
2983
+ return grpc_core::Call::FromC(call)->ContextGet(elem);
1999
2984
  }
2000
2985
 
2001
- uint8_t grpc_call_is_client(grpc_call* call) { return call->is_client; }
2986
+ uint8_t grpc_call_is_client(grpc_call* call) {
2987
+ return grpc_core::Call::FromC(call)->is_client();
2988
+ }
2002
2989
 
2003
2990
  grpc_compression_algorithm grpc_call_compression_for_level(
2004
2991
  grpc_call* call, grpc_compression_level level) {
2005
- grpc_compression_algorithm algo =
2006
- compression_algorithm_for_level_locked(call, level);
2007
- return algo;
2992
+ return grpc_core::Call::FromC(call)->compression_for_level(level);
2008
2993
  }
2009
2994
 
2010
2995
  bool grpc_call_is_trailers_only(const grpc_call* call) {
2011
- bool result = call->is_trailers_only;
2012
- GPR_DEBUG_ASSERT(!result || call->recv_initial_metadata.empty());
2013
- return result;
2996
+ return grpc_core::Call::FromC(call)->is_trailers_only();
2014
2997
  }
2015
2998
 
2016
2999
  int grpc_call_failed_before_recv_message(const grpc_call* c) {
2017
- return c->call_failed_before_recv_message;
3000
+ return grpc_core::Call::FromC(c)->failed_before_recv_message();
3001
+ }
3002
+
3003
+ absl::string_view grpc_call_server_authority(const grpc_call* call) {
3004
+ return grpc_core::Call::FromC(call)->GetServerAuthority();
2018
3005
  }
2019
3006
 
2020
3007
  const char* grpc_call_error_to_string(grpc_call_error error) {