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
@@ -0,0 +1,618 @@
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
+ #include <grpc/support/port_platform.h>
15
+
16
+ #include "src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h"
17
+
18
+ #include <stdint.h>
19
+
20
+ #include <atomic>
21
+ #include <memory>
22
+
23
+ #include "absl/status/status.h"
24
+ #include "absl/status/statusor.h"
25
+
26
+ #include <grpc/event_engine/event_engine.h>
27
+ #include <grpc/support/log.h>
28
+ #include <grpc/support/sync.h>
29
+
30
+ #include "src/core/lib/event_engine/poller.h"
31
+ #include "src/core/lib/event_engine/time_util.h"
32
+ #include "src/core/lib/iomgr/port.h"
33
+
34
+ // This polling engine is only relevant on linux kernels supporting epoll
35
+ // epoll_create() or epoll_create1()
36
+ #ifdef GRPC_LINUX_EPOLL
37
+ #include <errno.h>
38
+ #include <limits.h>
39
+ #include <sys/epoll.h>
40
+ #include <sys/socket.h>
41
+ #include <unistd.h>
42
+
43
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
44
+ #include "src/core/lib/event_engine/posix_engine/lockfree_event.h"
45
+ #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
46
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
47
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h"
48
+ #include "src/core/lib/gprpp/fork.h"
49
+ #include "src/core/lib/gprpp/strerror.h"
50
+ #include "src/core/lib/gprpp/sync.h"
51
+
52
+ using ::grpc_event_engine::posix_engine::LockfreeEvent;
53
+ using ::grpc_event_engine::posix_engine::WakeupFd;
54
+
55
+ #define MAX_EPOLL_EVENTS_HANDLED_PER_ITERATION 1
56
+
57
+ namespace grpc_event_engine {
58
+ namespace posix_engine {
59
+
60
+ using ::grpc_event_engine::experimental::EventEngine;
61
+ using ::grpc_event_engine::experimental::Poller;
62
+ using ::grpc_event_engine::posix_engine::LockfreeEvent;
63
+ using ::grpc_event_engine::posix_engine::WakeupFd;
64
+
65
+ class Epoll1EventHandle : public EventHandle {
66
+ public:
67
+ Epoll1EventHandle(int fd, Epoll1Poller* poller)
68
+ : fd_(fd),
69
+ list_(this),
70
+ poller_(poller),
71
+ read_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
72
+ write_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
73
+ error_closure_(
74
+ std::make_unique<LockfreeEvent>(poller->GetScheduler())) {
75
+ read_closure_->InitEvent();
76
+ write_closure_->InitEvent();
77
+ error_closure_->InitEvent();
78
+ pending_read_.store(false, std::memory_order_relaxed);
79
+ pending_write_.store(false, std::memory_order_relaxed);
80
+ pending_error_.store(false, std::memory_order_relaxed);
81
+ }
82
+ void ReInit(int fd) {
83
+ fd_ = fd;
84
+ read_closure_->InitEvent();
85
+ write_closure_->InitEvent();
86
+ error_closure_->InitEvent();
87
+ pending_read_.store(false, std::memory_order_relaxed);
88
+ pending_write_.store(false, std::memory_order_relaxed);
89
+ pending_error_.store(false, std::memory_order_relaxed);
90
+ }
91
+ Epoll1Poller* Poller() override { return poller_; }
92
+ bool SetPendingActions(bool pending_read, bool pending_write,
93
+ bool pending_error) {
94
+ // Another thread may be executing ExecutePendingActions() at this point
95
+ // This is possible for instance, if one instantiation of Work(..) sets
96
+ // an fd to be readable while the next instantiation of Work(...) may
97
+ // set the fd to be writable. While the second instantiation is running,
98
+ // ExecutePendingActions() of the first instantiation may execute in
99
+ // parallel and read the pending_<***>_ variables. So we need to use
100
+ // atomics to manipulate pending_<***>_ variables.
101
+
102
+ if (pending_read) {
103
+ pending_read_.store(true, std::memory_order_release);
104
+ }
105
+
106
+ if (pending_write) {
107
+ pending_write_.store(true, std::memory_order_release);
108
+ }
109
+
110
+ if (pending_error) {
111
+ pending_error_.store(true, std::memory_order_release);
112
+ }
113
+
114
+ return pending_read || pending_write || pending_error;
115
+ }
116
+ int WrappedFd() override { return fd_; }
117
+ void OrphanHandle(PosixEngineClosure* on_done, int* release_fd,
118
+ absl::string_view reason) override;
119
+ void ShutdownHandle(absl::Status why) override;
120
+ void NotifyOnRead(PosixEngineClosure* on_read) override;
121
+ void NotifyOnWrite(PosixEngineClosure* on_write) override;
122
+ void NotifyOnError(PosixEngineClosure* on_error) override;
123
+ void SetReadable() override;
124
+ void SetWritable() override;
125
+ void SetHasError() override;
126
+ bool IsHandleShutdown() override;
127
+ inline void ExecutePendingActions() {
128
+ // These may execute in Parallel with ShutdownHandle. Thats not an issue
129
+ // because the lockfree event implementation should be able to handle it.
130
+ if (pending_read_.exchange(false, std::memory_order_acq_rel)) {
131
+ read_closure_->SetReady();
132
+ }
133
+ if (pending_write_.exchange(false, std::memory_order_acq_rel)) {
134
+ write_closure_->SetReady();
135
+ }
136
+ if (pending_error_.exchange(false, std::memory_order_acq_rel)) {
137
+ error_closure_->SetReady();
138
+ }
139
+ }
140
+ grpc_core::Mutex* mu() { return &mu_; }
141
+ LockfreeEvent* ReadClosure() { return read_closure_.get(); }
142
+ LockfreeEvent* WriteClosure() { return write_closure_.get(); }
143
+ LockfreeEvent* ErrorClosure() { return error_closure_.get(); }
144
+ Epoll1Poller::HandlesList& ForkFdListPos() { return list_; }
145
+ ~Epoll1EventHandle() override = default;
146
+
147
+ private:
148
+ void HandleShutdownInternal(absl::Status why, bool releasing_fd);
149
+ // See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
150
+ // required.
151
+ grpc_core::Mutex mu_;
152
+ int fd_;
153
+ // See Epoll1Poller::SetPendingActions for explanation on why pending_<***>_
154
+ // need to be atomic.
155
+ std::atomic<bool> pending_read_{false};
156
+ std::atomic<bool> pending_write_{false};
157
+ std::atomic<bool> pending_error_{false};
158
+ Epoll1Poller::HandlesList list_;
159
+ Epoll1Poller* poller_;
160
+ std::unique_ptr<LockfreeEvent> read_closure_;
161
+ std::unique_ptr<LockfreeEvent> write_closure_;
162
+ std::unique_ptr<LockfreeEvent> error_closure_;
163
+ };
164
+
165
+ namespace {
166
+
167
+ int EpollCreateAndCloexec() {
168
+ #ifdef GRPC_LINUX_EPOLL_CREATE1
169
+ int fd = epoll_create1(EPOLL_CLOEXEC);
170
+ if (fd < 0) {
171
+ gpr_log(GPR_ERROR, "epoll_create1 unavailable");
172
+ }
173
+ #else
174
+ int fd = epoll_create(MAX_EPOLL_EVENTS);
175
+ if (fd < 0) {
176
+ gpr_log(GPR_ERROR, "epoll_create unavailable");
177
+ } else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
178
+ gpr_log(GPR_ERROR, "fcntl following epoll_create failed");
179
+ return -1;
180
+ }
181
+ #endif
182
+ return fd;
183
+ }
184
+
185
+ // Only used when GRPC_ENABLE_FORK_SUPPORT=1
186
+ std::list<Epoll1Poller*> fork_poller_list;
187
+
188
+ // Only used when GRPC_ENABLE_FORK_SUPPORT=1
189
+ Epoll1EventHandle* fork_fd_list_head = nullptr;
190
+ gpr_mu fork_fd_list_mu;
191
+
192
+ void ForkFdListAddHandle(Epoll1EventHandle* handle) {
193
+ if (grpc_core::Fork::Enabled()) {
194
+ gpr_mu_lock(&fork_fd_list_mu);
195
+ handle->ForkFdListPos().next = fork_fd_list_head;
196
+ handle->ForkFdListPos().prev = nullptr;
197
+ if (fork_fd_list_head != nullptr) {
198
+ fork_fd_list_head->ForkFdListPos().prev = handle;
199
+ }
200
+ fork_fd_list_head = handle;
201
+ gpr_mu_unlock(&fork_fd_list_mu);
202
+ }
203
+ }
204
+
205
+ void ForkFdListRemoveHandle(Epoll1EventHandle* handle) {
206
+ if (grpc_core::Fork::Enabled()) {
207
+ gpr_mu_lock(&fork_fd_list_mu);
208
+ if (fork_fd_list_head == handle) {
209
+ fork_fd_list_head = handle->ForkFdListPos().next;
210
+ }
211
+ if (handle->ForkFdListPos().prev != nullptr) {
212
+ handle->ForkFdListPos().prev->ForkFdListPos().next =
213
+ handle->ForkFdListPos().next;
214
+ }
215
+ if (handle->ForkFdListPos().next != nullptr) {
216
+ handle->ForkFdListPos().next->ForkFdListPos().prev =
217
+ handle->ForkFdListPos().prev;
218
+ }
219
+ gpr_mu_unlock(&fork_fd_list_mu);
220
+ }
221
+ }
222
+
223
+ void ForkPollerListAddPoller(Epoll1Poller* poller) {
224
+ if (grpc_core::Fork::Enabled()) {
225
+ gpr_mu_lock(&fork_fd_list_mu);
226
+ fork_poller_list.push_back(poller);
227
+ gpr_mu_unlock(&fork_fd_list_mu);
228
+ }
229
+ }
230
+
231
+ void ForkPollerListRemovePoller(Epoll1Poller* poller) {
232
+ if (grpc_core::Fork::Enabled()) {
233
+ gpr_mu_lock(&fork_fd_list_mu);
234
+ fork_poller_list.remove(poller);
235
+ gpr_mu_unlock(&fork_fd_list_mu);
236
+ }
237
+ }
238
+
239
+ bool InitEpoll1PollerLinux();
240
+
241
+ // Called by the child process's post-fork handler to close open fds,
242
+ // including the global epoll fd of each poller. This allows gRPC to shutdown in
243
+ // the child process without interfering with connections or RPCs ongoing in the
244
+ // parent.
245
+ void ResetEventManagerOnFork() {
246
+ // Delete all pending Epoll1EventHandles.
247
+ gpr_mu_lock(&fork_fd_list_mu);
248
+ while (fork_fd_list_head != nullptr) {
249
+ close(fork_fd_list_head->WrappedFd());
250
+ Epoll1EventHandle* next = fork_fd_list_head->ForkFdListPos().next;
251
+ delete fork_fd_list_head;
252
+ fork_fd_list_head = next;
253
+ }
254
+ // Delete all registered pollers. This also closes all open epoll_sets
255
+ while (!fork_poller_list.empty()) {
256
+ Epoll1Poller* poller = fork_poller_list.front();
257
+ fork_poller_list.pop_front();
258
+ delete poller;
259
+ }
260
+ gpr_mu_unlock(&fork_fd_list_mu);
261
+ if (grpc_core::Fork::Enabled()) {
262
+ gpr_mu_destroy(&fork_fd_list_mu);
263
+ grpc_core::Fork::SetResetChildPollingEngineFunc(nullptr);
264
+ }
265
+ InitEpoll1PollerLinux();
266
+ }
267
+
268
+ // It is possible that GLIBC has epoll but the underlying kernel doesn't.
269
+ // Create epoll_fd to make sure epoll support is available
270
+ bool InitEpoll1PollerLinux() {
271
+ if (!grpc_event_engine::posix_engine::SupportsWakeupFd()) {
272
+ return false;
273
+ }
274
+ int fd = EpollCreateAndCloexec();
275
+ if (fd <= 0) {
276
+ return false;
277
+ }
278
+ if (grpc_core::Fork::Enabled()) {
279
+ gpr_mu_init(&fork_fd_list_mu);
280
+ grpc_core::Fork::SetResetChildPollingEngineFunc(ResetEventManagerOnFork);
281
+ }
282
+ close(fd);
283
+ return true;
284
+ }
285
+
286
+ } // namespace
287
+
288
+ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
289
+ int* release_fd,
290
+ absl::string_view reason) {
291
+ bool is_release_fd = (release_fd != nullptr);
292
+ if (!read_closure_->IsShutdown()) {
293
+ HandleShutdownInternal(absl::Status(absl::StatusCode::kUnknown, reason),
294
+ is_release_fd);
295
+ }
296
+
297
+ // If release_fd is not NULL, we should be relinquishing control of the file
298
+ // descriptor fd->fd (but we still own the grpc_fd structure).
299
+ if (is_release_fd) {
300
+ *release_fd = fd_;
301
+ } else {
302
+ close(fd_);
303
+ }
304
+
305
+ ForkFdListRemoveHandle(this);
306
+ {
307
+ // See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
308
+ // required here.
309
+ grpc_core::MutexLock lock(&mu_);
310
+ read_closure_->DestroyEvent();
311
+ write_closure_->DestroyEvent();
312
+ error_closure_->DestroyEvent();
313
+ }
314
+ pending_read_.store(false, std::memory_order_release);
315
+ pending_write_.store(false, std::memory_order_release);
316
+ pending_error_.store(false, std::memory_order_release);
317
+ {
318
+ grpc_core::MutexLock lock(&poller_->mu_);
319
+ poller_->free_epoll1_handles_list_.push_back(this);
320
+ }
321
+ if (on_done != nullptr) {
322
+ on_done->SetStatus(absl::OkStatus());
323
+ poller_->GetScheduler()->Run(on_done);
324
+ }
325
+ }
326
+
327
+ // if 'releasing_fd' is true, it means that we are going to detach the internal
328
+ // fd from grpc_fd structure (i.e which means we should not be calling
329
+ // shutdown() syscall on that fd)
330
+ void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
331
+ bool releasing_fd) {
332
+ if (read_closure_->SetShutdown(why)) {
333
+ if (!releasing_fd) {
334
+ shutdown(fd_, SHUT_RDWR);
335
+ } else {
336
+ epoll_event phony_event;
337
+ if (epoll_ctl(poller_->g_epoll_set_.epfd, EPOLL_CTL_DEL, fd_,
338
+ &phony_event) != 0) {
339
+ gpr_log(GPR_ERROR, "epoll_ctl failed: %s",
340
+ grpc_core::StrError(errno).c_str());
341
+ }
342
+ }
343
+ write_closure_->SetShutdown(why);
344
+ write_closure_->SetShutdown(why);
345
+ }
346
+ }
347
+
348
+ Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
349
+ : scheduler_(scheduler), was_kicked_(false) {
350
+ g_epoll_set_.epfd = EpollCreateAndCloexec();
351
+ wakeup_fd_ = *CreateWakeupFd();
352
+ GPR_ASSERT(wakeup_fd_ != nullptr);
353
+ GPR_ASSERT(g_epoll_set_.epfd >= 0);
354
+ gpr_log(GPR_INFO, "grpc epoll fd: %d", g_epoll_set_.epfd);
355
+ struct epoll_event ev;
356
+ ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLET);
357
+ ev.data.ptr = wakeup_fd_.get();
358
+ GPR_ASSERT(epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, wakeup_fd_->ReadFd(),
359
+ &ev) == 0);
360
+ g_epoll_set_.num_events = 0;
361
+ g_epoll_set_.cursor = 0;
362
+ ForkPollerListAddPoller(this);
363
+ }
364
+
365
+ void Epoll1Poller::Shutdown() {
366
+ ForkPollerListRemovePoller(this);
367
+ delete this;
368
+ }
369
+
370
+ Epoll1Poller::~Epoll1Poller() {
371
+ if (g_epoll_set_.epfd >= 0) {
372
+ close(g_epoll_set_.epfd);
373
+ g_epoll_set_.epfd = -1;
374
+ }
375
+ {
376
+ grpc_core::MutexLock lock(&mu_);
377
+ while (!free_epoll1_handles_list_.empty()) {
378
+ Epoll1EventHandle* handle = reinterpret_cast<Epoll1EventHandle*>(
379
+ free_epoll1_handles_list_.front());
380
+ free_epoll1_handles_list_.pop_front();
381
+ delete handle;
382
+ }
383
+ }
384
+ }
385
+
386
+ EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view /*name*/,
387
+ bool track_err) {
388
+ Epoll1EventHandle* new_handle = nullptr;
389
+ {
390
+ grpc_core::MutexLock lock(&mu_);
391
+ if (free_epoll1_handles_list_.empty()) {
392
+ new_handle = new Epoll1EventHandle(fd, this);
393
+ } else {
394
+ new_handle = reinterpret_cast<Epoll1EventHandle*>(
395
+ free_epoll1_handles_list_.front());
396
+ free_epoll1_handles_list_.pop_front();
397
+ new_handle->ReInit(fd);
398
+ }
399
+ }
400
+ ForkFdListAddHandle(new_handle);
401
+ struct epoll_event ev;
402
+ ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLOUT | EPOLLET);
403
+ // Use the least significant bit of ev.data.ptr to store track_err. We expect
404
+ // the addresses to be word aligned. We need to store track_err to avoid
405
+ // synchronization issues when accessing it after receiving an event.
406
+ // Accessing fd would be a data race there because the fd might have been
407
+ // returned to the free list at that point.
408
+ ev.data.ptr = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(new_handle) |
409
+ (track_err ? 1 : 0));
410
+ if (epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, fd, &ev) != 0) {
411
+ gpr_log(GPR_ERROR, "epoll_ctl failed: %s",
412
+ grpc_core::StrError(errno).c_str());
413
+ }
414
+
415
+ return new_handle;
416
+ }
417
+
418
+ // Process the epoll events found by DoEpollWait() function.
419
+ // - g_epoll_set.cursor points to the index of the first event to be processed
420
+ // - This function then processes up-to max_epoll_events_to_handle and
421
+ // updates the g_epoll_set.cursor.
422
+ // It returns true, it there was a Kick that forced invocation of this
423
+ // function. It also returns the list of closures to run to take action
424
+ // on file descriptors that became readable/writable.
425
+ bool Epoll1Poller::ProcessEpollEvents(int max_epoll_events_to_handle,
426
+ Events& pending_events) {
427
+ int64_t num_events = g_epoll_set_.num_events;
428
+ int64_t cursor = g_epoll_set_.cursor;
429
+ bool was_kicked = false;
430
+ for (int idx = 0; (idx < max_epoll_events_to_handle) && cursor != num_events;
431
+ idx++) {
432
+ int64_t c = cursor++;
433
+ struct epoll_event* ev = &g_epoll_set_.events[c];
434
+ void* data_ptr = ev->data.ptr;
435
+ if (data_ptr == wakeup_fd_.get()) {
436
+ GPR_ASSERT(wakeup_fd_->ConsumeWakeup().ok());
437
+ was_kicked = true;
438
+ } else {
439
+ Epoll1EventHandle* handle = reinterpret_cast<Epoll1EventHandle*>(
440
+ reinterpret_cast<intptr_t>(data_ptr) & ~static_cast<intptr_t>(1));
441
+ bool track_err =
442
+ reinterpret_cast<intptr_t>(data_ptr) & static_cast<intptr_t>(1);
443
+ bool cancel = (ev->events & EPOLLHUP) != 0;
444
+ bool error = (ev->events & EPOLLERR) != 0;
445
+ bool read_ev = (ev->events & (EPOLLIN | EPOLLPRI)) != 0;
446
+ bool write_ev = (ev->events & EPOLLOUT) != 0;
447
+ bool err_fallback = error && !track_err;
448
+ if (handle->SetPendingActions(read_ev || cancel || err_fallback,
449
+ write_ev || cancel || err_fallback,
450
+ error && !err_fallback)) {
451
+ pending_events.push_back(handle);
452
+ }
453
+ }
454
+ }
455
+ g_epoll_set_.cursor = cursor;
456
+ return was_kicked;
457
+ }
458
+
459
+ // Do epoll_wait and store the events in g_epoll_set.events field. This does
460
+ // not "process" any of the events yet; that is done in ProcessEpollEvents().
461
+ // See ProcessEpollEvents() function for more details. It returns the number
462
+ // of events generated by epoll_wait.
463
+ int Epoll1Poller::DoEpollWait(EventEngine::Duration timeout) {
464
+ int r;
465
+ do {
466
+ r = epoll_wait(g_epoll_set_.epfd, g_epoll_set_.events, MAX_EPOLL_EVENTS,
467
+ static_cast<int>(
468
+ grpc_event_engine::experimental::Milliseconds(timeout)));
469
+ } while (r < 0 && errno == EINTR);
470
+ if (r < 0) {
471
+ gpr_log(GPR_ERROR,
472
+ "(event_engine) Epoll1Poller:%p encountered epoll_wait error: %s",
473
+ this, grpc_core::StrError(errno).c_str());
474
+ GPR_ASSERT(false);
475
+ }
476
+ g_epoll_set_.num_events = r;
477
+ g_epoll_set_.cursor = 0;
478
+ return r;
479
+ }
480
+
481
+ // Might be called multiple times
482
+ void Epoll1EventHandle::ShutdownHandle(absl::Status why) {
483
+ // A mutex is required here because, the SetShutdown method of the
484
+ // lockfree event may schedule a closure if it is already ready and that
485
+ // closure may call OrphanHandle. Execution of ShutdownHandle and OrphanHandle
486
+ // in parallel is not safe because some of the lockfree event types e.g, read,
487
+ // write, error may-not have called SetShutdown when DestroyEvent gets
488
+ // called in the OrphanHandle method.
489
+ grpc_core::MutexLock lock(&mu_);
490
+ HandleShutdownInternal(why, false);
491
+ }
492
+
493
+ bool Epoll1EventHandle::IsHandleShutdown() {
494
+ return read_closure_->IsShutdown();
495
+ }
496
+
497
+ void Epoll1EventHandle::NotifyOnRead(PosixEngineClosure* on_read) {
498
+ read_closure_->NotifyOn(on_read);
499
+ }
500
+
501
+ void Epoll1EventHandle::NotifyOnWrite(PosixEngineClosure* on_write) {
502
+ write_closure_->NotifyOn(on_write);
503
+ }
504
+
505
+ void Epoll1EventHandle::NotifyOnError(PosixEngineClosure* on_error) {
506
+ error_closure_->NotifyOn(on_error);
507
+ }
508
+
509
+ void Epoll1EventHandle::SetReadable() { read_closure_->SetReady(); }
510
+
511
+ void Epoll1EventHandle::SetWritable() { write_closure_->SetReady(); }
512
+
513
+ void Epoll1EventHandle::SetHasError() { error_closure_->SetReady(); }
514
+
515
+ // Polls the registered Fds for events until timeout is reached or there is a
516
+ // Kick(). If there is a Kick(), it collects and processes any previously
517
+ // un-processed events. If there are no un-processed events, it returns
518
+ // Poller::WorkResult::Kicked{}
519
+ Poller::WorkResult Epoll1Poller::Work(
520
+ EventEngine::Duration timeout,
521
+ absl::FunctionRef<void()> schedule_poll_again) {
522
+ Events pending_events;
523
+ bool was_kicked_ext = false;
524
+ if (g_epoll_set_.cursor == g_epoll_set_.num_events) {
525
+ if (DoEpollWait(timeout) == 0) {
526
+ return Poller::WorkResult::kDeadlineExceeded;
527
+ }
528
+ }
529
+ {
530
+ grpc_core::MutexLock lock(&mu_);
531
+ // If was_kicked_ is true, collect all pending events in this iteration.
532
+ if (ProcessEpollEvents(
533
+ was_kicked_ ? INT_MAX : MAX_EPOLL_EVENTS_HANDLED_PER_ITERATION,
534
+ pending_events)) {
535
+ was_kicked_ = false;
536
+ was_kicked_ext = true;
537
+ }
538
+ if (pending_events.empty()) {
539
+ return Poller::WorkResult::kKicked;
540
+ }
541
+ }
542
+ // Run the provided callback.
543
+ schedule_poll_again();
544
+ // Process all pending events inline.
545
+ for (auto& it : pending_events) {
546
+ it->ExecutePendingActions();
547
+ }
548
+ return was_kicked_ext ? Poller::WorkResult::kKicked : Poller::WorkResult::kOk;
549
+ }
550
+
551
+ void Epoll1Poller::Kick() {
552
+ grpc_core::MutexLock lock(&mu_);
553
+ if (was_kicked_) {
554
+ return;
555
+ }
556
+ was_kicked_ = true;
557
+ GPR_ASSERT(wakeup_fd_->Wakeup().ok());
558
+ }
559
+
560
+ Epoll1Poller* MakeEpoll1Poller(Scheduler* scheduler) {
561
+ static bool kEpoll1PollerSupported = InitEpoll1PollerLinux();
562
+ if (kEpoll1PollerSupported) {
563
+ return new Epoll1Poller(scheduler);
564
+ }
565
+ return nullptr;
566
+ }
567
+
568
+ } // namespace posix_engine
569
+ } // namespace grpc_event_engine
570
+
571
+ #else /* defined(GRPC_LINUX_EPOLL) */
572
+ #if defined(GRPC_POSIX_SOCKET_EV_EPOLL1)
573
+
574
+ namespace grpc_event_engine {
575
+ namespace posix_engine {
576
+
577
+ using ::grpc_event_engine::experimental::EventEngine;
578
+ using ::grpc_event_engine::experimental::Poller;
579
+
580
+ Epoll1Poller::Epoll1Poller(Scheduler* /* engine */) {
581
+ GPR_ASSERT(false && "unimplemented");
582
+ }
583
+
584
+ void Epoll1Poller::Shutdown() { GPR_ASSERT(false && "unimplemented"); }
585
+
586
+ Epoll1Poller::~Epoll1Poller() { GPR_ASSERT(false && "unimplemented"); }
587
+
588
+ EventHandle* Epoll1Poller::CreateHandle(int /*fd*/, absl::string_view /*name*/,
589
+ bool /*track_err*/) {
590
+ GPR_ASSERT(false && "unimplemented");
591
+ }
592
+
593
+ bool Epoll1Poller::ProcessEpollEvents(int /*max_epoll_events_to_handle*/,
594
+ Events& /*pending_events*/) {
595
+ GPR_ASSERT(false && "unimplemented");
596
+ }
597
+
598
+ int Epoll1Poller::DoEpollWait(EventEngine::Duration /*timeout*/) {
599
+ GPR_ASSERT(false && "unimplemented");
600
+ }
601
+
602
+ Poller::WorkResult Epoll1Poller::Work(
603
+ EventEngine::Duration /*timeout*/,
604
+ absl::FunctionRef<void()> /*schedule_poll_again*/) {
605
+ GPR_ASSERT(false && "unimplemented");
606
+ }
607
+
608
+ void Epoll1Poller::Kick() { GPR_ASSERT(false && "unimplemented"); }
609
+
610
+ // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
611
+ // nullptr.
612
+ Epoll1Poller* MakeEpoll1Poller(Scheduler* /*scheduler*/) { return nullptr; }
613
+
614
+ } // namespace posix_engine
615
+ } // namespace grpc_event_engine
616
+
617
+ #endif /* defined(GRPC_POSIX_SOCKET_EV_EPOLL1) */
618
+ #endif /* !defined(GRPC_LINUX_EPOLL) */