grpc 1.46.3 → 1.47.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 (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -21,9 +21,18 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include "absl/utility/utility.h"
24
+ #include <stdint.h>
25
+ #include <stdlib.h>
25
26
 
26
- #include <grpc/status.h>
27
+ #include <atomic>
28
+ #include <new>
29
+ #include <type_traits>
30
+ #include <utility>
31
+
32
+ #include "absl/container/inlined_vector.h"
33
+ #include "absl/meta/type_traits.h"
34
+
35
+ #include <grpc/impl/codegen/grpc_types.h>
27
36
  #include <grpc/support/log.h>
28
37
 
29
38
  #include "src/core/lib/channel/call_finalization.h"
@@ -31,11 +40,21 @@
31
40
  #include "src/core/lib/channel/channel_stack.h"
32
41
  #include "src/core/lib/channel/context.h"
33
42
  #include "src/core/lib/gprpp/debug_location.h"
43
+ #include "src/core/lib/gprpp/time.h"
44
+ #include "src/core/lib/iomgr/call_combiner.h"
45
+ #include "src/core/lib/iomgr/closure.h"
34
46
  #include "src/core/lib/iomgr/error.h"
47
+ #include "src/core/lib/iomgr/exec_ctx.h"
48
+ #include "src/core/lib/iomgr/polling_entity.h"
49
+ #include "src/core/lib/promise/activity.h"
35
50
  #include "src/core/lib/promise/arena_promise.h"
36
51
  #include "src/core/lib/promise/context.h"
37
- #include "src/core/lib/promise/promise.h"
52
+ #include "src/core/lib/promise/latch.h"
53
+ #include "src/core/lib/promise/poll.h"
54
+ #include "src/core/lib/resource_quota/arena.h"
38
55
  #include "src/core/lib/transport/error_utils.h"
56
+ #include "src/core/lib/transport/metadata_batch.h"
57
+ #include "src/core/lib/transport/transport.h"
39
58
 
40
59
  namespace grpc_core {
41
60
 
@@ -59,6 +78,9 @@ class ChannelFilter {
59
78
  grpc_channel_element* channel_element_;
60
79
  };
61
80
 
81
+ // Perform post-initialization step (if any).
82
+ virtual void PostInit() {}
83
+
62
84
  // Construct a promise for one call.
63
85
  virtual ArenaPromise<ServerMetadataHandle> MakeCallPromise(
64
86
  CallArgs call_args, NextPromiseFactory next_promise_factory) = 0;
@@ -70,12 +92,18 @@ class ChannelFilter {
70
92
  // structures going forward.
71
93
  virtual bool StartTransportOp(grpc_transport_op*) { return false; }
72
94
 
95
+ // Perform a legacy get info call
96
+ // Return true if the op was handled, false if it should be passed to the
97
+ // next filter.
98
+ // TODO(ctiller): design a new API for this
99
+ virtual bool GetChannelInfo(const grpc_channel_info*) { return false; }
100
+
73
101
  virtual ~ChannelFilter() = default;
74
102
  };
75
103
 
76
104
  // Designator for whether a filter is client side or server side.
77
- // Please don't use this outside calls to MakePromiseBasedFilter - it's intended
78
- // to be deleted once the promise conversion is complete.
105
+ // Please don't use this outside calls to MakePromiseBasedFilter - it's
106
+ // intended to be deleted once the promise conversion is complete.
79
107
  enum class FilterEndpoint {
80
108
  kClient,
81
109
  kServer,
@@ -83,9 +111,20 @@ enum class FilterEndpoint {
83
111
 
84
112
  // Flags for MakePromiseBasedFilter.
85
113
  static constexpr uint8_t kFilterExaminesServerInitialMetadata = 1;
114
+ static constexpr uint8_t kFilterIsLast = 2;
86
115
 
87
116
  namespace promise_filter_detail {
88
117
 
118
+ // Proxy channel filter for initialization failure, since we must leave a
119
+ // valid filter in place.
120
+ class InvalidChannelFilter : public ChannelFilter {
121
+ public:
122
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
123
+ CallArgs, NextPromiseFactory) override {
124
+ abort();
125
+ }
126
+ };
127
+
89
128
  // Call data shared between all implementations of promise-based filters.
90
129
  class BaseCallData : public Activity, private Wakeable {
91
130
  public:
@@ -124,6 +163,69 @@ class BaseCallData : public Activity, private Wakeable {
124
163
  }
125
164
  };
126
165
 
166
+ class Flusher {
167
+ public:
168
+ explicit Flusher(BaseCallData* call);
169
+ // Calls closures, schedules batches, relinquishes call combiner.
170
+ ~Flusher();
171
+
172
+ void Resume(grpc_transport_stream_op_batch* batch) {
173
+ release_.push_back(batch);
174
+ }
175
+
176
+ void Cancel(grpc_transport_stream_op_batch* batch,
177
+ grpc_error_handle error) {
178
+ grpc_transport_stream_op_batch_queue_finish_with_failure(batch, error,
179
+ &call_closures_);
180
+ }
181
+
182
+ void Complete(grpc_transport_stream_op_batch* batch) {
183
+ call_closures_.Add(batch->on_complete, GRPC_ERROR_NONE,
184
+ "Flusher::Complete");
185
+ }
186
+
187
+ void AddClosure(grpc_closure* closure, grpc_error_handle error,
188
+ const char* reason) {
189
+ call_closures_.Add(closure, error, reason);
190
+ }
191
+
192
+ private:
193
+ absl::InlinedVector<grpc_transport_stream_op_batch*, 1> release_;
194
+ CallCombinerClosureList call_closures_;
195
+ BaseCallData* const call_;
196
+ };
197
+
198
+ // Smart pointer like wrapper around a batch.
199
+ // Creation makes a ref count of one capture.
200
+ // Copying increments.
201
+ // Must be moved from or resumed or cancelled before destruction.
202
+ class CapturedBatch final {
203
+ public:
204
+ CapturedBatch();
205
+ explicit CapturedBatch(grpc_transport_stream_op_batch* batch);
206
+ ~CapturedBatch();
207
+ CapturedBatch(const CapturedBatch&);
208
+ CapturedBatch& operator=(const CapturedBatch&);
209
+ CapturedBatch(CapturedBatch&&) noexcept;
210
+ CapturedBatch& operator=(CapturedBatch&&) noexcept;
211
+
212
+ grpc_transport_stream_op_batch* operator->() { return batch_; }
213
+ bool is_captured() const { return batch_ != nullptr; }
214
+
215
+ // Resume processing this batch (releases one ref, passes it down the
216
+ // stack)
217
+ void ResumeWith(Flusher* releaser);
218
+ // Cancel this batch immediately (releases all refs)
219
+ void CancelWith(grpc_error_handle error, Flusher* releaser);
220
+ // Complete this batch (pass it up) assuming refs drop to zero
221
+ void CompleteWith(Flusher* releaser);
222
+
223
+ void Swap(CapturedBatch* other) { std::swap(batch_, other->batch_); }
224
+
225
+ private:
226
+ grpc_transport_stream_op_batch* batch_;
227
+ };
228
+
127
229
  static MetadataHandle<grpc_metadata_batch> WrapMetadata(
128
230
  grpc_metadata_batch* p) {
129
231
  return MetadataHandle<grpc_metadata_batch>(p);
@@ -143,6 +245,11 @@ class BaseCallData : public Activity, private Wakeable {
143
245
  return server_initial_metadata_latch_;
144
246
  }
145
247
 
248
+ bool is_last() const {
249
+ return grpc_call_stack_element(call_stack_, call_stack_->count - 1) ==
250
+ elem_;
251
+ }
252
+
146
253
  private:
147
254
  // Wakeable implementation.
148
255
  void Wakeup() final;
@@ -190,7 +297,8 @@ class ClientCallData : public BaseCallData {
190
297
  // Start state: no op seen
191
298
  kInitial,
192
299
  // We saw the op, and since it was bundled with send initial metadata, we
193
- // queued it until the send initial metadata can be sent to the next filter.
300
+ // queued it until the send initial metadata can be sent to the next
301
+ // filter.
194
302
  kQueued,
195
303
  // We've forwarded the op to the next filter.
196
304
  kForwarded,
@@ -212,11 +320,11 @@ class ClientCallData : public BaseCallData {
212
320
  void Cancel(grpc_error_handle error);
213
321
  // Begin running the promise - which will ultimately take some initial
214
322
  // metadata and return some trailing metadata.
215
- void StartPromise();
216
- // Interject our callback into the op batch for recv trailing metadata ready.
217
- // Stash a pointer to the trailing metadata that will be filled in, so we can
218
- // manipulate it later.
219
- void HookRecvTrailingMetadata(grpc_transport_stream_op_batch* batch);
323
+ void StartPromise(Flusher* flusher);
324
+ // Interject our callback into the op batch for recv trailing metadata
325
+ // ready. Stash a pointer to the trailing metadata that will be filled in,
326
+ // so we can manipulate it later.
327
+ void HookRecvTrailingMetadata(CapturedBatch batch);
220
328
  // Construct a promise that will "call" the next filter.
221
329
  // Effectively:
222
330
  // - put the modified initial metadata into the batch to be sent down.
@@ -235,13 +343,13 @@ class ClientCallData : public BaseCallData {
235
343
  void SetStatusFromError(grpc_metadata_batch* metadata,
236
344
  grpc_error_handle error);
237
345
  // Wakeup and poll the promise if appropriate.
238
- void WakeInsideCombiner();
346
+ void WakeInsideCombiner(Flusher* flusher);
239
347
  void OnWakeup() override;
240
348
 
241
349
  // Contained promise
242
350
  ArenaPromise<ServerMetadataHandle> promise_;
243
351
  // Queued batch containing at least a send_initial_metadata op.
244
- grpc_transport_stream_op_batch* send_initial_metadata_batch_ = nullptr;
352
+ CapturedBatch send_initial_metadata_batch_;
245
353
  // Pointer to where trailing metadata will be stored.
246
354
  grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
247
355
  // State tracking recv initial metadata for filters that care about it.
@@ -298,8 +406,11 @@ class ServerCallData : public BaseCallData {
298
406
  kCancelled
299
407
  };
300
408
 
409
+ class PollContext;
410
+ struct SendInitialMetadata;
411
+
301
412
  // Handle cancellation.
302
- void Cancel(grpc_error_handle error);
413
+ void Cancel(grpc_error_handle error, Flusher* flusher);
303
414
  // Construct a promise that will "call" the next filter.
304
415
  // Effectively:
305
416
  // - put the modified initial metadata into the batch being sent up.
@@ -313,13 +424,15 @@ class ServerCallData : public BaseCallData {
313
424
  grpc_error_handle error);
314
425
  void RecvInitialMetadataReady(grpc_error_handle error);
315
426
  // Wakeup and poll the promise if appropriate.
316
- void WakeInsideCombiner(absl::FunctionRef<void(grpc_error_handle)> cancel);
427
+ void WakeInsideCombiner(Flusher* flusher);
317
428
  void OnWakeup() override;
318
429
 
319
430
  // Contained promise
320
431
  ArenaPromise<ServerMetadataHandle> promise_;
321
432
  // Pointer to where initial metadata will be stored.
322
433
  grpc_metadata_batch* recv_initial_metadata_ = nullptr;
434
+ // State for sending initial metadata.
435
+ SendInitialMetadata* send_initial_metadata_ = nullptr;
323
436
  // Closure to call when we're done with the trailing metadata.
324
437
  grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
325
438
  // Our closure pointing to RecvInitialMetadataReadyCallback.
@@ -327,13 +440,13 @@ class ServerCallData : public BaseCallData {
327
440
  // Error received during cancellation.
328
441
  grpc_error_handle cancelled_error_ = GRPC_ERROR_NONE;
329
442
  // Trailing metadata batch
330
- grpc_transport_stream_op_batch* send_trailing_metadata_batch_ = nullptr;
443
+ CapturedBatch send_trailing_metadata_batch_;
331
444
  // State of the send_initial_metadata op.
332
445
  RecvInitialState recv_initial_state_ = RecvInitialState::kInitial;
333
446
  // State of the recv_trailing_metadata op.
334
447
  SendTrailingState send_trailing_state_ = SendTrailingState::kInitial;
335
- // Whether we're currently polling the promise.
336
- bool is_polling_ = false;
448
+ // Current poll context (or nullptr if not polling).
449
+ PollContext* poll_ctx_ = nullptr;
337
450
  // Whether to forward the recv_initial_metadata op at the end of promise
338
451
  // wakeup.
339
452
  bool forward_recv_initial_metadata_callback_ = false;
@@ -367,8 +480,6 @@ class CallData<ChannelFilter, FilterEndpoint::kServer> : public ServerCallData {
367
480
  // static absl::StatusOr<SomeChannelFilter> Create(
368
481
  // ChannelArgs channel_args, ChannelFilter::Args filter_args);
369
482
  // };
370
- // TODO(ctiller): allow implementing get_channel_info, start_transport_op in
371
- // some way on ChannelFilter.
372
483
  template <typename F, FilterEndpoint kEndpoint, uint8_t kFlags = 0>
373
484
  absl::enable_if_t<std::is_base_of<ChannelFilter, F>::value, grpc_channel_filter>
374
485
  MakePromiseBasedFilter(const char* name) {
@@ -382,13 +493,14 @@ MakePromiseBasedFilter(const char* name) {
382
493
  // make_call_promise
383
494
  [](grpc_channel_element* elem, CallArgs call_args,
384
495
  NextPromiseFactory next_promise_factory) {
385
- return static_cast<F*>(elem->channel_data)
496
+ return static_cast<ChannelFilter*>(elem->channel_data)
386
497
  ->MakeCallPromise(std::move(call_args),
387
498
  std::move(next_promise_factory));
388
499
  },
389
500
  // start_transport_op
390
501
  [](grpc_channel_element* elem, grpc_transport_op* op) {
391
- if (!static_cast<F*>(elem->channel_data)->StartTransportOp(op)) {
502
+ if (!static_cast<ChannelFilter*>(elem->channel_data)
503
+ ->StartTransportOp(op)) {
392
504
  grpc_channel_next_op(elem, op);
393
505
  }
394
506
  },
@@ -405,28 +517,49 @@ MakePromiseBasedFilter(const char* name) {
405
517
  },
406
518
  // destroy_call_elem
407
519
  [](grpc_call_element* elem, const grpc_call_final_info* final_info,
408
- grpc_closure*) {
520
+ grpc_closure* then_schedule_closure) {
409
521
  auto* cd = static_cast<CallData*>(elem->call_data);
410
522
  cd->Finalize(final_info);
411
523
  cd->~CallData();
524
+ if ((kFlags & kFilterIsLast) != 0) {
525
+ ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, GRPC_ERROR_NONE);
526
+ } else {
527
+ GPR_ASSERT(then_schedule_closure == nullptr);
528
+ }
412
529
  },
413
530
  // sizeof_channel_data
414
531
  sizeof(F),
415
532
  // init_channel_elem
416
533
  [](grpc_channel_element* elem, grpc_channel_element_args* args) {
417
- GPR_ASSERT(!args->is_last);
534
+ GPR_ASSERT(args->is_last == ((kFlags & kFilterIsLast) != 0));
418
535
  auto status = F::Create(ChannelArgs::FromC(args->channel_args),
419
536
  ChannelFilter::Args(args->channel_stack, elem));
420
- if (!status.ok()) return absl_status_to_grpc_error(status.status());
537
+ if (!status.ok()) {
538
+ static_assert(
539
+ sizeof(promise_filter_detail::InvalidChannelFilter) <= sizeof(F),
540
+ "InvalidChannelFilter must fit in F");
541
+ new (elem->channel_data)
542
+ promise_filter_detail::InvalidChannelFilter();
543
+ return absl_status_to_grpc_error(status.status());
544
+ }
421
545
  new (elem->channel_data) F(std::move(*status));
422
546
  return GRPC_ERROR_NONE;
423
547
  },
548
+ // post_init_channel_elem
549
+ [](grpc_channel_stack*, grpc_channel_element* elem) {
550
+ static_cast<ChannelFilter*>(elem->channel_data)->PostInit();
551
+ },
424
552
  // destroy_channel_elem
425
553
  [](grpc_channel_element* elem) {
426
- static_cast<F*>(elem->channel_data)->~F();
554
+ static_cast<ChannelFilter*>(elem->channel_data)->~ChannelFilter();
427
555
  },
428
556
  // get_channel_info
429
- grpc_channel_next_get_info,
557
+ [](grpc_channel_element* elem, const grpc_channel_info* info) {
558
+ if (!static_cast<ChannelFilter*>(elem->channel_data)
559
+ ->GetChannelInfo(info)) {
560
+ grpc_channel_next_get_info(elem, info);
561
+ }
562
+ },
430
563
  // name
431
564
  name,
432
565
  };
@@ -20,6 +20,8 @@
20
20
 
21
21
  #include "src/core/lib/channel/status_util.h"
22
22
 
23
+ #include <string.h>
24
+
23
25
  #include "src/core/lib/gpr/useful.h"
24
26
 
25
27
  struct status_string_entry {
@@ -21,9 +21,6 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <stdbool.h>
25
- #include <string.h>
26
-
27
24
  #include <grpc/status.h>
28
25
 
29
26
  /// If \a status_str is a valid status string, sets \a status to the
@@ -52,6 +52,48 @@ const char* CompressionAlgorithmAsString(grpc_compression_algorithm algorithm) {
52
52
  }
53
53
  }
54
54
 
55
+ namespace {
56
+ class CommaSeparatedLists {
57
+ public:
58
+ CommaSeparatedLists() : lists_{}, text_buffer_{} {
59
+ char* text_buffer = text_buffer_;
60
+ auto add_char = [&text_buffer, this](char c) {
61
+ if (text_buffer - text_buffer_ == kTextBufferSize) abort();
62
+ *text_buffer++ = c;
63
+ };
64
+ for (size_t list = 0; list < kNumLists; ++list) {
65
+ char* start = text_buffer;
66
+ for (size_t algorithm = 0; algorithm < GRPC_COMPRESS_ALGORITHMS_COUNT;
67
+ ++algorithm) {
68
+ if ((list & (1 << algorithm)) == 0) continue;
69
+ if (start != text_buffer) {
70
+ add_char(',');
71
+ add_char(' ');
72
+ }
73
+ const char* name = CompressionAlgorithmAsString(
74
+ static_cast<grpc_compression_algorithm>(algorithm));
75
+ for (const char* p = name; *p != '\0'; ++p) {
76
+ add_char(*p);
77
+ }
78
+ }
79
+ lists_[list] = absl::string_view(start, text_buffer - start);
80
+ }
81
+ if (text_buffer - text_buffer_ != kTextBufferSize) abort();
82
+ }
83
+
84
+ absl::string_view operator[](size_t list) const { return lists_[list]; }
85
+
86
+ private:
87
+ static constexpr size_t kNumLists = 1 << GRPC_COMPRESS_ALGORITHMS_COUNT;
88
+ // Experimentally determined (tweak things until it runs).
89
+ static constexpr size_t kTextBufferSize = 86;
90
+ absl::string_view lists_[kNumLists];
91
+ char text_buffer_[kTextBufferSize];
92
+ };
93
+
94
+ const CommaSeparatedLists kCommaSeparatedLists;
95
+ } // namespace
96
+
55
97
  absl::optional<grpc_compression_algorithm> ParseCompressionAlgorithm(
56
98
  absl::string_view algorithm) {
57
99
  if (algorithm == "identity") {
@@ -165,19 +207,12 @@ void CompressionAlgorithmSet::Set(grpc_compression_algorithm algorithm) {
165
207
  }
166
208
  }
167
209
 
168
- std::string CompressionAlgorithmSet::ToString() const {
169
- absl::InlinedVector<const char*, GRPC_COMPRESS_ALGORITHMS_COUNT> segments;
170
- for (size_t i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
171
- if (set_.is_set(i)) {
172
- segments.push_back(CompressionAlgorithmAsString(
173
- static_cast<grpc_compression_algorithm>(i)));
174
- }
175
- }
176
- return absl::StrJoin(segments, ", ");
210
+ absl::string_view CompressionAlgorithmSet::ToString() const {
211
+ return kCommaSeparatedLists[ToLegacyBitmask()];
177
212
  }
178
213
 
179
214
  Slice CompressionAlgorithmSet::ToSlice() const {
180
- return Slice::FromCopiedString(ToString());
215
+ return Slice::FromStaticString(ToString());
181
216
  }
182
217
 
183
218
  CompressionAlgorithmSet CompressionAlgorithmSet::FromString(
@@ -73,7 +73,7 @@ class CompressionAlgorithmSet {
73
73
  void Set(grpc_compression_algorithm algorithm);
74
74
 
75
75
  // Return a comma separated string of the algorithms in this set.
76
- std::string ToString() const;
76
+ absl::string_view ToString() const;
77
77
  Slice ToSlice() const;
78
78
 
79
79
  // Return a bitmask of the algorithms in this set.
@@ -16,7 +16,10 @@
16
16
 
17
17
  #include "src/core/lib/config/core_configuration.h"
18
18
 
19
+ #include <algorithm>
19
20
  #include <atomic>
21
+ #include <utility>
22
+ #include <vector>
20
23
 
21
24
  #include <grpc/support/log.h>
22
25
 
@@ -18,13 +18,14 @@
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include <atomic>
21
+ #include <functional>
21
22
 
22
23
  #include "src/core/lib/channel/channel_args_preconditioning.h"
23
- #include "src/core/lib/channel/handshaker_registry.h"
24
24
  #include "src/core/lib/resolver/resolver_registry.h"
25
25
  #include "src/core/lib/security/credentials/channel_creds_registry.h"
26
26
  #include "src/core/lib/service_config/service_config_parser.h"
27
27
  #include "src/core/lib/surface/channel_init.h"
28
+ #include "src/core/lib/transport/handshaker_registry.h"
28
29
 
29
30
  namespace grpc_core {
30
31
 
@@ -15,12 +15,14 @@
15
15
 
16
16
  #include "src/core/lib/event_engine/channel_args_endpoint_config.h"
17
17
 
18
+ #include <string>
19
+
20
+ #include "absl/types/variant.h"
21
+
18
22
  #include <grpc/event_engine/endpoint_config.h>
19
23
  #include <grpc/impl/codegen/grpc_types.h>
20
- #include <grpc/impl/codegen/log.h>
21
24
 
22
25
  #include "src/core/lib/channel/channel_args.h"
23
- #include "src/core/lib/gpr/useful.h"
24
26
 
25
27
  namespace grpc_event_engine {
26
28
  namespace experimental {
@@ -16,9 +16,10 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
- #include <grpc/event_engine/endpoint_config.h>
19
+ #include "absl/strings/string_view.h"
20
20
 
21
- #include "src/core/lib/channel/channel_args.h"
21
+ #include <grpc/event_engine/endpoint_config.h>
22
+ #include <grpc/impl/codegen/grpc_types.h>
22
23
 
23
24
  namespace grpc_event_engine {
24
25
  namespace experimental {
@@ -13,14 +13,20 @@
13
13
  // limitations under the License.
14
14
  #include <grpc/support/port_platform.h>
15
15
 
16
+ #include <memory>
17
+
18
+ #include "absl/memory/memory.h"
19
+
20
+ #include <grpc/event_engine/event_engine.h>
21
+
16
22
  #include "src/core/lib/event_engine/event_engine_factory.h"
23
+ #include "src/core/lib/event_engine/iomgr_engine.h"
17
24
 
18
25
  namespace grpc_event_engine {
19
26
  namespace experimental {
20
27
 
21
28
  std::unique_ptr<EventEngine> DefaultEventEngineFactory() {
22
- // TODO(hork): call LibuvEventEngineFactory
23
- return nullptr;
29
+ return absl::make_unique<IomgrEventEngine>();
24
30
  }
25
31
 
26
32
  } // namespace experimental
@@ -13,11 +13,14 @@
13
13
  // limitations under the License.
14
14
  #include <grpc/support/port_platform.h>
15
15
 
16
+ #include <functional>
17
+ #include <memory>
18
+
16
19
  #include <grpc/event_engine/event_engine.h>
17
- #include <grpc/event_engine/port.h>
18
- #include <grpc/support/log.h>
19
20
 
21
+ #include "src/core/lib/debug/trace.h"
20
22
  #include "src/core/lib/event_engine/event_engine_factory.h"
23
+ #include "src/core/lib/event_engine/trace.h"
21
24
  #include "src/core/lib/gprpp/sync.h"
22
25
 
23
26
  namespace grpc_event_engine {
@@ -48,5 +51,12 @@ EventEngine* GetDefaultEventEngine() {
48
51
  return default_event_engine;
49
52
  }
50
53
 
54
+ void InitializeEventEngine() {
55
+ GetDefaultEventEngine()->Run([]() {
56
+ GRPC_EVENT_ENGINE_TRACE("EventEngine:%p initialized",
57
+ GetDefaultEventEngine());
58
+ });
59
+ }
60
+
51
61
  } // namespace experimental
52
62
  } // namespace grpc_event_engine
@@ -16,6 +16,8 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <memory>
20
+
19
21
  #include <grpc/event_engine/event_engine.h>
20
22
 
21
23
  namespace grpc_event_engine {
@@ -30,6 +32,9 @@ EventEngine* GetDefaultEventEngine();
30
32
  /// Create an EventEngine using the default factory provided at link time.
31
33
  std::unique_ptr<EventEngine> DefaultEventEngineFactory();
32
34
 
35
+ // TODO(hork): remove this when any other EE usage is landed
36
+ void InitializeEventEngine();
37
+
33
38
  } // namespace experimental
34
39
  } // namespace grpc_event_engine
35
40
 
@@ -0,0 +1,67 @@
1
+ // Copyright 2022 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_HANDLE_CONTAINERS_H
15
+ #define GRPC_CORE_LIB_EVENT_ENGINE_HANDLE_CONTAINERS_H
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <stddef.h>
20
+
21
+ #include <cstdint>
22
+ #include <utility>
23
+
24
+ #include "absl/container/flat_hash_set.h"
25
+ #include "absl/hash/hash.h"
26
+
27
+ #include <grpc/event_engine/event_engine.h>
28
+
29
+ namespace grpc_event_engine {
30
+ namespace experimental {
31
+
32
+ // Used for heterogeneous lookup of TaskHandles in abseil containers.
33
+ template <typename TaskHandle>
34
+ struct TaskHandleComparator {
35
+ struct Hash {
36
+ using HashType = std::pair<const intptr_t, const intptr_t>;
37
+ using is_transparent = void;
38
+ size_t operator()(const TaskHandle& handle) const {
39
+ return absl::Hash<HashType>()({handle.keys[0], handle.keys[1]});
40
+ }
41
+ };
42
+ struct Eq {
43
+ using is_transparent = void;
44
+ bool operator()(const TaskHandle& lhs, const TaskHandle& rhs) const {
45
+ return lhs.keys[0] == rhs.keys[0] && lhs.keys[1] == rhs.keys[1];
46
+ }
47
+ };
48
+ };
49
+
50
+ using TaskHandleSet = absl::flat_hash_set<
51
+ grpc_event_engine::experimental::EventEngine::TaskHandle,
52
+ TaskHandleComparator<
53
+ grpc_event_engine::experimental::EventEngine::TaskHandle>::Hash,
54
+ TaskHandleComparator<
55
+ grpc_event_engine::experimental::EventEngine::TaskHandle>::Eq>;
56
+
57
+ using LookupTaskHandleSet = absl::flat_hash_set<
58
+ grpc_event_engine::experimental::EventEngine::DNSResolver::LookupTaskHandle,
59
+ TaskHandleComparator<grpc_event_engine::experimental::EventEngine::
60
+ DNSResolver::LookupTaskHandle>::Hash,
61
+ TaskHandleComparator<grpc_event_engine::experimental::EventEngine::
62
+ DNSResolver::LookupTaskHandle>::Eq>;
63
+
64
+ } // namespace experimental
65
+ } // namespace grpc_event_engine
66
+
67
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_HANDLE_CONTAINERS_H