grpc 1.42.0 → 1.52.0

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

Potentially problematic release.


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

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