grpc 1.50.0 → 1.51.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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -15,24 +15,377 @@
15
15
 
16
16
  #include "src/core/lib/event_engine/posix_engine/posix_engine.h"
17
17
 
18
+ #include <algorithm>
19
+ #include <atomic>
20
+ #include <chrono>
21
+ #include <cstring>
22
+ #include <memory>
18
23
  #include <string>
19
24
  #include <utility>
20
25
 
21
- #include "absl/container/flat_hash_set.h"
26
+ #include "absl/cleanup/cleanup.h"
22
27
  #include "absl/functional/any_invocable.h"
28
+ #include "absl/meta/type_traits.h"
29
+ #include "absl/status/status.h"
30
+ #include "absl/strings/str_cat.h"
23
31
 
24
32
  #include <grpc/event_engine/event_engine.h>
33
+ #include <grpc/event_engine/memory_allocator.h>
34
+ #include <grpc/support/cpu.h>
25
35
  #include <grpc/support/log.h>
26
36
 
27
37
  #include "src/core/lib/debug/trace.h"
28
- #include "src/core/lib/event_engine/executor/threaded_executor.h"
38
+ #include "src/core/lib/event_engine/poller.h"
29
39
  #include "src/core/lib/event_engine/posix_engine/timer.h"
30
40
  #include "src/core/lib/event_engine/trace.h"
31
41
  #include "src/core/lib/event_engine/utils.h"
42
+ #include "src/core/lib/experiments/experiments.h"
43
+ #include "src/core/lib/gprpp/sync.h"
44
+
45
+ #ifdef GRPC_POSIX_SOCKET_TCP
46
+ #include <errno.h> // IWYU pragma: keep
47
+ #include <stdint.h> // IWYU pragma: keep
48
+ #include <sys/socket.h> // IWYU pragma: keep
49
+
50
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
51
+ #include "src/core/lib/event_engine/posix_engine/event_poller_posix_default.h"
52
+ #include "src/core/lib/event_engine/posix_engine/posix_endpoint.h"
53
+ #endif // GRPC_POSIX_SOCKET_TCP
54
+
55
+ // IWYU pragma: no_include <ratio>
56
+
57
+ using namespace std::chrono_literals;
32
58
 
33
59
  namespace grpc_event_engine {
34
60
  namespace experimental {
35
61
 
62
+ #ifdef GRPC_POSIX_SOCKET_TCP
63
+ using ::grpc_event_engine::posix_engine::EventHandle;
64
+ using ::grpc_event_engine::posix_engine::PosixEngineClosure;
65
+ using ::grpc_event_engine::posix_engine::PosixEventPoller;
66
+ using ::grpc_event_engine::posix_engine::PosixSocketWrapper;
67
+ using ::grpc_event_engine::posix_engine::PosixTcpOptions;
68
+ using ::grpc_event_engine::posix_engine::SockaddrToString;
69
+ using ::grpc_event_engine::posix_engine::TcpOptionsFromEndpointConfig;
70
+
71
+ void AsyncConnect::Start(EventEngine::Duration timeout) {
72
+ on_writable_ = PosixEngineClosure::ToPermanentClosure(
73
+ [this](absl::Status status) { OnWritable(std::move(status)); });
74
+ alarm_handle_ = engine_->RunAfter(timeout, [this]() {
75
+ OnTimeoutExpired(absl::DeadlineExceededError("connect() timed out"));
76
+ });
77
+ fd_->NotifyOnWrite(on_writable_);
78
+ }
79
+
80
+ AsyncConnect ::~AsyncConnect() { delete on_writable_; }
81
+
82
+ void AsyncConnect::OnTimeoutExpired(absl::Status status) {
83
+ bool done = false;
84
+ {
85
+ grpc_core::MutexLock lock(&mu_);
86
+ if (fd_ != nullptr) {
87
+ fd_->ShutdownHandle(std::move(status));
88
+ }
89
+ done = (--refs_ == 0);
90
+ }
91
+ if (done) {
92
+ delete this;
93
+ }
94
+ }
95
+
96
+ void AsyncConnect::OnWritable(absl::Status status)
97
+ ABSL_NO_THREAD_SAFETY_ANALYSIS {
98
+ int so_error = 0;
99
+ socklen_t so_error_size;
100
+ int err;
101
+ int done;
102
+ int consumed_refs = 1;
103
+ EventHandle* fd;
104
+ absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>> ep;
105
+
106
+ mu_.Lock();
107
+ GPR_ASSERT(fd_ != nullptr);
108
+ fd = std::exchange(fd_, nullptr);
109
+ bool connect_cancelled = connect_cancelled_;
110
+ if (fd->IsHandleShutdown() && status.ok()) {
111
+ if (!connect_cancelled) {
112
+ // status is OK and handle has been shutdown but the connect was not
113
+ // cancelled. This can happen if the timeout expired and the while the
114
+ // OnWritable just started executing.
115
+ status = absl::DeadlineExceededError("connect() timed out");
116
+ } else {
117
+ // This can happen if the connection was cancelled while the OnWritable
118
+ // just started executing.
119
+ status = absl::FailedPreconditionError("Connection cancelled");
120
+ }
121
+ }
122
+ mu_.Unlock();
123
+
124
+ if (engine_->Cancel(alarm_handle_)) {
125
+ ++consumed_refs;
126
+ }
127
+
128
+ auto on_writable_finish = absl::MakeCleanup([&]() -> void {
129
+ mu_.AssertHeld();
130
+ if (!connect_cancelled) {
131
+ reinterpret_cast<PosixEventEngine*>(engine_.get())
132
+ ->OnConnectFinishInternal(connection_handle_);
133
+ }
134
+ if (fd != nullptr) {
135
+ fd->OrphanHandle(nullptr, nullptr, "tcp_client_orphan");
136
+ fd = nullptr;
137
+ }
138
+ if (!status.ok()) {
139
+ ep = absl::CancelledError(
140
+ absl::StrCat("Failed to connect to remote host: ", resolved_addr_str_,
141
+ " with error: ", status.ToString()));
142
+ }
143
+ // Run the OnConnect callback asynchronously.
144
+ if (!connect_cancelled) {
145
+ executor_->Run(
146
+ [ep = std::move(ep), on_connect = std::move(on_connect_)]() mutable {
147
+ if (on_connect) {
148
+ on_connect(std::move(ep));
149
+ }
150
+ });
151
+ }
152
+ done = ((refs_ -= consumed_refs) == 0);
153
+ mu_.Unlock();
154
+ if (done) {
155
+ delete this;
156
+ }
157
+ });
158
+
159
+ mu_.Lock();
160
+ if (!status.ok() || connect_cancelled) {
161
+ return;
162
+ }
163
+
164
+ do {
165
+ so_error_size = sizeof(so_error);
166
+ err = getsockopt(fd->WrappedFd(), SOL_SOCKET, SO_ERROR, &so_error,
167
+ &so_error_size);
168
+ } while (err < 0 && errno == EINTR);
169
+ if (err < 0) {
170
+ status = absl::FailedPreconditionError(
171
+ absl::StrCat("getsockopt: ", std::strerror(errno)));
172
+ return;
173
+ }
174
+
175
+ switch (so_error) {
176
+ case 0:
177
+ ep = CreatePosixEndpoint(fd, nullptr, engine_, std::move(allocator_),
178
+ options_);
179
+ fd = nullptr;
180
+ break;
181
+ case ENOBUFS:
182
+ // We will get one of these errors if we have run out of
183
+ // memory in the kernel for the data structures allocated
184
+ // when you connect a socket. If this happens it is very
185
+ // likely that if we wait a little bit then try again the
186
+ // connection will work (since other programs or this
187
+ // program will close their network connections and free up
188
+ // memory). This does _not_ indicate that there is anything
189
+ // wrong with the server we are connecting to, this is a
190
+ // local problem.
191
+
192
+ // If you are looking at this code, then chances are that
193
+ // your program or another program on the same computer
194
+ // opened too many network connections. The "easy" fix:
195
+ // don't do that!
196
+ gpr_log(GPR_ERROR, "kernel out of buffers");
197
+ mu_.Unlock();
198
+ fd->NotifyOnWrite(on_writable_);
199
+ // Don't run the cleanup function for this case.
200
+ std::move(on_writable_finish).Cancel();
201
+ return;
202
+ case ECONNREFUSED:
203
+ // This error shouldn't happen for anything other than connect().
204
+ status = absl::FailedPreconditionError(
205
+ absl::StrCat("connect: ", std::strerror(so_error)));
206
+ break;
207
+ default:
208
+ // We don't really know which syscall triggered the problem here, so
209
+ // punt by reporting getsockopt().
210
+ status = absl::FailedPreconditionError(
211
+ absl::StrCat("getsockopt(SO_ERROR): ", std::strerror(so_error)));
212
+ break;
213
+ }
214
+ }
215
+
216
+ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
217
+ PosixSocketWrapper sock, OnConnectCallback on_connect, ResolvedAddress addr,
218
+ MemoryAllocator&& allocator, const PosixTcpOptions& options,
219
+ Duration timeout) {
220
+ int err;
221
+ int saved_errno;
222
+ do {
223
+ err = connect(sock.Fd(), addr.address(), addr.size());
224
+ } while (err < 0 && errno == EINTR);
225
+ saved_errno = errno;
226
+
227
+ auto addr_uri = SockaddrToString(&addr, true);
228
+ if (!addr_uri.ok()) {
229
+ Run([on_connect = std::move(on_connect),
230
+ ep = absl::FailedPreconditionError(absl::StrCat(
231
+ "connect failed: ", "invalid addr: ",
232
+ addr_uri.value()))]() mutable { on_connect(std::move(ep)); });
233
+ return {0, 0};
234
+ }
235
+
236
+ std::string name = absl::StrCat("tcp-client:", addr_uri.value());
237
+ PosixEventPoller* poller = poller_manager_->Poller();
238
+ EventHandle* handle =
239
+ poller->CreateHandle(sock.Fd(), name, poller->CanTrackErrors());
240
+ int64_t connection_id = 0;
241
+ if (saved_errno == EWOULDBLOCK || saved_errno == EINPROGRESS) {
242
+ // Connection is still in progress.
243
+ connection_id = last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
244
+ }
245
+
246
+ if (err >= 0) {
247
+ // Connection already succeded. Return 0 to discourage any cancellation
248
+ // attempts.
249
+ Run([on_connect = std::move(on_connect),
250
+ ep = CreatePosixEndpoint(handle, nullptr, shared_from_this(),
251
+ std::move(allocator), options)]() mutable {
252
+ on_connect(std::move(ep));
253
+ });
254
+ return {0, 0};
255
+ }
256
+ if (saved_errno != EWOULDBLOCK && saved_errno != EINPROGRESS) {
257
+ // Connection already failed. Return 0 to discourage any cancellation
258
+ // attempts.
259
+ handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
260
+ Run([on_connect = std::move(on_connect),
261
+ ep = absl::FailedPreconditionError(
262
+ absl::StrCat("connect failed: ", "addr: ", addr_uri.value(),
263
+ " error: ", std::strerror(saved_errno)))]() mutable {
264
+ on_connect(std::move(ep));
265
+ });
266
+ return {0, 0};
267
+ }
268
+ AsyncConnect* ac = new AsyncConnect(
269
+ std::move(on_connect), shared_from_this(), executor_.get(), handle,
270
+ std::move(allocator), options, addr_uri.value(), connection_id);
271
+ int shard_number = connection_id % connection_shards_.size();
272
+ struct ConnectionShard* shard = &connection_shards_[shard_number];
273
+ {
274
+ grpc_core::MutexLock lock(&shard->mu);
275
+ shard->pending_connections.insert_or_assign(connection_id, ac);
276
+ }
277
+ // Start asynchronous connect and return the connection id.
278
+ ac->Start(timeout);
279
+ return {static_cast<intptr_t>(connection_id), 0};
280
+ }
281
+
282
+ void PosixEventEngine::OnConnectFinishInternal(int connection_handle) {
283
+ int shard_number = connection_handle % connection_shards_.size();
284
+ struct ConnectionShard* shard = &connection_shards_[shard_number];
285
+ {
286
+ grpc_core::MutexLock lock(&shard->mu);
287
+ shard->pending_connections.erase(connection_handle);
288
+ }
289
+ }
290
+
291
+ PosixEnginePollerManager::PosixEnginePollerManager(
292
+ std::shared_ptr<ThreadPool> executor)
293
+ : poller_(grpc_event_engine::posix_engine::MakeDefaultPoller(this)),
294
+ executor_(std::move(executor)) {}
295
+
296
+ PosixEnginePollerManager::PosixEnginePollerManager(PosixEventPoller* poller)
297
+ : poller_(poller),
298
+ poller_state_(PollerState::kExternal),
299
+ executor_(nullptr) {
300
+ GPR_DEBUG_ASSERT(poller_ != nullptr);
301
+ }
302
+
303
+ void PosixEnginePollerManager::Run(
304
+ experimental::EventEngine::Closure* closure) {
305
+ if (executor_ != nullptr) {
306
+ executor_->Run(closure);
307
+ }
308
+ }
309
+
310
+ void PosixEnginePollerManager::Run(absl::AnyInvocable<void()> cb) {
311
+ if (executor_ != nullptr) {
312
+ executor_->Run(std::move(cb));
313
+ }
314
+ }
315
+
316
+ void PosixEnginePollerManager::TriggerShutdown() {
317
+ // If the poller is external, dont try to shut it down. Otherwise
318
+ // set poller state to PollerState::kShuttingDown.
319
+ if (poller_state_.exchange(PollerState::kShuttingDown) ==
320
+ PollerState::kExternal) {
321
+ poller_ = nullptr;
322
+ return;
323
+ }
324
+ poller_->Kick();
325
+ }
326
+
327
+ PosixEnginePollerManager::~PosixEnginePollerManager() {
328
+ if (poller_ != nullptr) {
329
+ poller_->Shutdown();
330
+ }
331
+ }
332
+
333
+ PosixEventEngine::PosixEventEngine(PosixEventPoller* poller)
334
+ : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
335
+ executor_(std::make_shared<ThreadPool>()),
336
+ timer_manager_(executor_) {
337
+ poller_manager_ = std::make_shared<PosixEnginePollerManager>(poller);
338
+ }
339
+
340
+ PosixEventEngine::PosixEventEngine()
341
+ : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
342
+ executor_(std::make_shared<ThreadPool>()),
343
+ timer_manager_(executor_) {
344
+ if (grpc_core::IsPosixEventEngineEnablePollingEnabled()) {
345
+ poller_manager_ = std::make_shared<PosixEnginePollerManager>(executor_);
346
+ if (poller_manager_->Poller() != nullptr) {
347
+ executor_->Run([poller_manager = poller_manager_]() {
348
+ PollerWorkInternal(poller_manager);
349
+ });
350
+ }
351
+ }
352
+ }
353
+
354
+ void PosixEventEngine::PollerWorkInternal(
355
+ std::shared_ptr<PosixEnginePollerManager> poller_manager) {
356
+ // TODO(vigneshbabu): The timeout specified here is arbitrary. For instance,
357
+ // this can be improved by setting the timeout to the next expiring timer.
358
+ PosixEventPoller* poller = poller_manager->Poller();
359
+ ThreadPool* executor = poller_manager->Executor();
360
+ auto result = poller->Work(24h, [executor, &poller_manager]() {
361
+ executor->Run([poller_manager]() mutable {
362
+ PollerWorkInternal(std::move(poller_manager));
363
+ });
364
+ });
365
+ if (result == Poller::WorkResult::kDeadlineExceeded) {
366
+ // The event engine is not shutting down but the next asynchronous
367
+ // PollerWorkInternal did not get scheduled. Schedule it now.
368
+ executor->Run([poller_manager = std::move(poller_manager)]() {
369
+ PollerWorkInternal(poller_manager);
370
+ });
371
+ } else if (result == Poller::WorkResult::kKicked &&
372
+ poller_manager->IsShuttingDown()) {
373
+ // The Poller Got Kicked and poller_state_ is set to
374
+ // PollerState::kShuttingDown. This can currently happen only from the
375
+ // EventEngine destructor. Sample the use_count of poller_manager. If the
376
+ // sampled use_count is > 1, there is one more instance of Work(...)
377
+ // which hasn't returned yet. Send another Kick to be safe to ensure the
378
+ // pending instance of Work(..) also breaks out. Its possible that the other
379
+ // instance of Work(..) had already broken out before this Kick is sent. In
380
+ // that case, the Kick is spurious but it shouldn't cause any side effects.
381
+ if (poller_manager.use_count() > 1) {
382
+ poller->Kick();
383
+ }
384
+ }
385
+ }
386
+
387
+ #endif // GRPC_POSIX_SOCKET_TCP
388
+
36
389
  struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
37
390
  absl::AnyInvocable<void()> cb;
38
391
  posix_engine::Timer timer;
@@ -52,16 +405,26 @@ struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
52
405
  };
53
406
 
54
407
  PosixEventEngine::~PosixEventEngine() {
55
- grpc_core::MutexLock lock(&mu_);
56
- if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) {
57
- for (auto handle : known_handles_) {
58
- gpr_log(GPR_ERROR,
59
- "(event_engine) PosixEventEngine:%p uncleared TaskHandle at "
60
- "shutdown:%s",
61
- this, HandleToString(handle).c_str());
408
+ {
409
+ grpc_core::MutexLock lock(&mu_);
410
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) {
411
+ for (auto handle : known_handles_) {
412
+ gpr_log(GPR_ERROR,
413
+ "(event_engine) PosixEventEngine:%p uncleared "
414
+ "TaskHandle at "
415
+ "shutdown:%s",
416
+ this, HandleToString(handle).c_str());
417
+ }
62
418
  }
419
+ GPR_ASSERT(GPR_LIKELY(known_handles_.empty()));
420
+ }
421
+ timer_manager_.Shutdown();
422
+ #ifdef GRPC_POSIX_SOCKET_TCP
423
+ if (poller_manager_ != nullptr) {
424
+ poller_manager_->TriggerShutdown();
63
425
  }
64
- GPR_ASSERT(GPR_LIKELY(known_handles_.empty()));
426
+ #endif // GRPC_POSIX_SOCKET_TCP
427
+ executor_->Quiesce();
65
428
  }
66
429
 
67
430
  bool PosixEventEngine::Cancel(EventEngine::TaskHandle handle) {
@@ -85,11 +448,11 @@ EventEngine::TaskHandle PosixEventEngine::RunAfter(
85
448
  }
86
449
 
87
450
  void PosixEventEngine::Run(absl::AnyInvocable<void()> closure) {
88
- executor_.Run(std::move(closure));
451
+ executor_->Run(std::move(closure));
89
452
  }
90
453
 
91
454
  void PosixEventEngine::Run(EventEngine::Closure* closure) {
92
- executor_.Run(closure);
455
+ executor_->Run(closure);
93
456
  }
94
457
 
95
458
  EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
@@ -118,15 +481,87 @@ bool PosixEventEngine::IsWorkerThread() {
118
481
  GPR_ASSERT(false && "unimplemented");
119
482
  }
120
483
 
121
- bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle /*handle*/) {
122
- GPR_ASSERT(false && "unimplemented");
484
+ bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle handle) {
485
+ #ifdef GRPC_POSIX_SOCKET_TCP
486
+ int connection_handle = handle.keys[0];
487
+ if (connection_handle <= 0) {
488
+ return false;
489
+ }
490
+ int shard_number = connection_handle % connection_shards_.size();
491
+ struct ConnectionShard* shard = &connection_shards_[shard_number];
492
+ AsyncConnect* ac = nullptr;
493
+ {
494
+ grpc_core::MutexLock lock(&shard->mu);
495
+ auto it = shard->pending_connections.find(connection_handle);
496
+ if (it != shard->pending_connections.end()) {
497
+ ac = it->second;
498
+ GPR_ASSERT(ac != nullptr);
499
+ // Trying to acquire ac->mu here would could cause a deadlock because
500
+ // the OnWritable method tries to acquire the two mutexes used
501
+ // here in the reverse order. But we dont need to acquire ac->mu before
502
+ // incrementing ac->refs here. This is because the OnWritable
503
+ // method decrements ac->refs only after deleting the connection handle
504
+ // from the corresponding hashmap. If the code enters here, it means
505
+ // that deletion hasn't happened yet. The deletion can only happen after
506
+ // the corresponding g_shard_mu is unlocked.
507
+ ++ac->refs_;
508
+ // Remove connection from list of active connections.
509
+ shard->pending_connections.erase(it);
510
+ }
511
+ }
512
+ if (ac == nullptr) {
513
+ return false;
514
+ }
515
+ ac->mu_.Lock();
516
+ bool connection_cancel_success = (ac->fd_ != nullptr);
517
+ if (connection_cancel_success) {
518
+ // Connection is still pending. The OnWritable callback hasn't executed
519
+ // yet because ac->fd != nullptr.
520
+ ac->connect_cancelled_ = true;
521
+ // Shutdown the fd. This would cause OnWritable to run as soon as
522
+ // possible. We dont need to pass a custom error here because it wont be
523
+ // used since the on_connect_closure is not run if connect cancellation is
524
+ // successfull.
525
+ ac->fd_->ShutdownHandle(
526
+ absl::FailedPreconditionError("Connection cancelled"));
527
+ }
528
+ bool done = (--ac->refs_ == 0);
529
+ ac->mu_.Unlock();
530
+ if (done) {
531
+ delete ac;
532
+ }
533
+ return connection_cancel_success;
534
+ #else // GRPC_POSIX_SOCKET_TCP
535
+ GPR_ASSERT(false &&
536
+ "EventEngine::CancelConnect is not supported on this platform");
537
+ #endif // GRPC_POSIX_SOCKET_TCP
123
538
  }
124
539
 
125
540
  EventEngine::ConnectionHandle PosixEventEngine::Connect(
126
- OnConnectCallback /*on_connect*/, const ResolvedAddress& /*addr*/,
127
- const EndpointConfig& /*args*/, MemoryAllocator /*memory_allocator*/,
128
- Duration /*deadline*/) {
129
- GPR_ASSERT(false && "unimplemented");
541
+ OnConnectCallback on_connect, const ResolvedAddress& addr,
542
+ const EndpointConfig& args, MemoryAllocator memory_allocator,
543
+ Duration timeout) {
544
+ #ifdef GRPC_POSIX_SOCKET_TCP
545
+ if (!grpc_core::IsPosixEventEngineEnablePollingEnabled()) {
546
+ GPR_ASSERT(
547
+ false &&
548
+ "EventEngine::Connect is not supported because polling is not enabled");
549
+ }
550
+ GPR_ASSERT(poller_manager_ != nullptr);
551
+ PosixTcpOptions options = TcpOptionsFromEndpointConfig(args);
552
+ absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult> socket =
553
+ PosixSocketWrapper::CreateAndPrepareTcpClientSocket(options, addr);
554
+ if (!socket.ok()) {
555
+ Run([on_connect = std::move(on_connect),
556
+ status = socket.status()]() mutable { on_connect(status); });
557
+ return {0, 0};
558
+ }
559
+ return ConnectInternal((*socket).sock, std::move(on_connect),
560
+ (*socket).mapped_target_addr,
561
+ std::move(memory_allocator), options, timeout);
562
+ #else // GRPC_POSIX_SOCKET_TCP
563
+ GPR_ASSERT(false && "EventEngine::Connect is not supported on this platform");
564
+ #endif // GRPC_POSIX_SOCKET_TCP
130
565
  }
131
566
 
132
567
  absl::StatusOr<std::unique_ptr<EventEngine::Listener>>