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
@@ -20,11 +20,9 @@
20
20
 
21
21
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
22
22
 
23
- #include <algorithm>
24
23
  #include <memory>
25
24
  #include <utility>
26
25
 
27
- #include "absl/memory/memory.h"
28
26
  #include "absl/time/time.h"
29
27
  #include "absl/types/optional.h"
30
28
 
@@ -33,79 +31,19 @@
33
31
  #include <grpc/support/time.h>
34
32
 
35
33
  #include "src/core/lib/debug/trace.h"
36
- #include "src/core/lib/gpr/tls.h"
37
34
  #include "src/core/lib/gprpp/thd.h"
38
35
 
39
- static GPR_THREAD_LOCAL(bool) g_timer_thread;
36
+ static thread_local bool g_timer_thread;
40
37
 
41
38
  namespace grpc_event_engine {
42
39
  namespace posix_engine {
43
40
 
44
41
  grpc_core::DebugOnlyTraceFlag grpc_event_engine_timer_trace(false, "timer");
45
42
 
46
- namespace {
47
- class ThreadCollector {
48
- public:
49
- ThreadCollector() = default;
50
- ~ThreadCollector();
51
-
52
- void Collect(std::vector<grpc_core::Thread> threads) {
53
- GPR_ASSERT(threads_.empty());
54
- threads_ = std::move(threads);
55
- }
56
-
57
- private:
58
- std::vector<grpc_core::Thread> threads_;
59
- };
60
-
61
- ThreadCollector::~ThreadCollector() {
62
- for (auto& t : threads_) t.Join();
63
- }
64
- } // namespace
65
-
66
- void TimerManager::StartThread() {
67
- ++waiter_count_;
68
- ++thread_count_;
69
- auto* thread = new RunThreadArgs();
70
- thread->self = this;
71
- thread->thread = grpc_core::Thread(
72
- "timer_manager", &TimerManager::RunThread, thread, nullptr,
73
- grpc_core::Thread::Options().set_tracked(false));
74
- thread->thread.Start();
75
- }
76
-
77
43
  void TimerManager::RunSomeTimers(
78
44
  std::vector<experimental::EventEngine::Closure*> timers) {
79
- // if there's something to execute...
80
- ThreadCollector collector;
81
- {
82
- grpc_core::MutexLock lock(&mu_);
83
- if (shutdown_ || forking_) return;
84
- // remove a waiter from the pool, and start another thread if necessary
85
- --waiter_count_;
86
- if (waiter_count_ == 0) {
87
- // The number of timer threads is always increasing until all the threads
88
- // are stopped, with the exception that all threads are shut down on fork
89
- // events. In rare cases, if a large number of timers fire simultaneously,
90
- // we may end up using a large number of threads.
91
- // TODO(ctiller): We could avoid this by exiting threads in WaitUntil().
92
- StartThread();
93
- } else {
94
- // if there's no thread waiting with a timeout, kick an existing untimed
95
- // waiter so that the next deadline is not missed
96
- if (!has_timed_waiter_) {
97
- cv_wait_.Signal();
98
- }
99
- }
100
- }
101
45
  for (auto* timer : timers) {
102
- timer->Run();
103
- }
104
- {
105
- grpc_core::MutexLock lock(&mu_);
106
- collector.Collect(std::move(completed_threads_));
107
- // get ready to wait again
108
- ++waiter_count_;
46
+ thread_pool_->Run(timer);
109
47
  }
110
48
  }
111
49
 
@@ -114,64 +52,18 @@ void TimerManager::RunSomeTimers(
114
52
  // shutdown)
115
53
  bool TimerManager::WaitUntil(grpc_core::Timestamp next) {
116
54
  grpc_core::MutexLock lock(&mu_);
117
-
118
55
  if (shutdown_) return false;
119
- if (forking_) return false;
120
-
121
- // TODO(ctiller): if there are too many waiting threads, this would be a good
122
- // place to exit the current thread.
123
-
124
56
  // If kicked_ is true at this point, it means there was a kick from the timer
125
57
  // system that the timer-manager threads here missed. We cannot trust 'next'
126
58
  // here any longer (since there might be an earlier deadline). So if kicked_
127
59
  // is true at this point, we should quickly exit this and get the next
128
60
  // deadline from the timer system
129
-
130
61
  if (!kicked_) {
131
- // if there's no timed waiter, we should become one: that waiter waits
132
- // only until the next timer should expire. All other timers wait forever
133
- //
134
- // 'timed_waiter_generation_' is a global generation counter. The idea here
135
- // is that the thread becoming a timed-waiter increments and stores this
136
- // global counter locally in 'my_timed_waiter_generation' before going to
137
- // sleep. After waking up, if my_timed_waiter_generation ==
138
- // timed_waiter_generation_, it can be sure that it was the timed_waiter
139
- // thread (and that no other thread took over while this was asleep)
140
- //
141
- // Initialize my_timed_waiter_generation to some value that is NOT equal to
142
- // timed_waiter_generation_
143
- uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1;
144
-
145
- /* If there's no timed waiter, we should become one: that waiter waits only
146
- until the next timer should expire. All other timer threads wait forever
147
- unless their 'next' is earlier than the current timed-waiter's deadline
148
- (in which case the thread with earlier 'next' takes over as the new timed
149
- waiter) */
150
- if (next != grpc_core::Timestamp::InfFuture()) {
151
- if (!has_timed_waiter_ || (next < timed_waiter_deadline_)) {
152
- my_timed_waiter_generation = ++timed_waiter_generation_;
153
- has_timed_waiter_ = true;
154
- timed_waiter_deadline_ = next;
155
- } else { // timed_waiter_ == true && next >= timed_waiter_deadline_
156
- next = grpc_core::Timestamp::InfFuture();
157
- }
158
- }
159
-
160
62
  cv_wait_.WaitWithTimeout(&mu_,
161
63
  absl::Milliseconds((next - host_.Now()).millis()));
162
-
163
- // if this was the timed waiter, then we need to check timers, and flag
164
- // that there's now no timed waiter... we'll look for a replacement if
165
- // there's work to do after checking timers (code above)
166
- if (my_timed_waiter_generation == timed_waiter_generation_) {
167
- ++wakeups_;
168
- has_timed_waiter_ = false;
169
- timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
170
- }
64
+ ++wakeups_;
171
65
  }
172
-
173
66
  kicked_ = false;
174
-
175
67
  return true;
176
68
  }
177
69
 
@@ -180,55 +72,37 @@ void TimerManager::MainLoop() {
180
72
  grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
181
73
  absl::optional<std::vector<experimental::EventEngine::Closure*>>
182
74
  check_result = timer_list_->TimerCheck(&next);
183
- if (check_result.has_value()) {
184
- if (!check_result->empty()) {
185
- RunSomeTimers(std::move(*check_result));
186
- continue;
187
- }
188
- } else {
189
- /* This case only happens under contention, meaning more than one timer
190
- manager thread checked timers concurrently.
191
-
192
- If that happens, we're guaranteed that some other thread has just
193
- checked timers, and this will avalanche into some other thread seeing
194
- empty timers and doing a timed sleep.
195
-
196
- Consequently, we can just sleep forever here and be happy at some
197
- saved wakeup cycles. */
198
- next = grpc_core::Timestamp::InfFuture();
75
+ GPR_ASSERT(check_result.has_value() &&
76
+ "ERROR: More than one MainLoop is running.");
77
+ if (!check_result->empty()) {
78
+ RunSomeTimers(std::move(*check_result));
79
+ continue;
199
80
  }
200
- if (!WaitUntil(next)) return;
81
+ if (!WaitUntil(next)) break;
201
82
  }
83
+ main_loop_exit_signal_->Notify();
202
84
  }
203
85
 
204
- void TimerManager::RunThread(void* arg) {
205
- g_timer_thread = true;
206
- std::unique_ptr<RunThreadArgs> thread(static_cast<RunThreadArgs*>(arg));
207
- if (grpc_event_engine_timer_trace.enabled()) {
208
- gpr_log(GPR_DEBUG, "TimerManager::%p starting thread::%p", thread->self,
209
- &thread->thread);
210
- }
211
- thread->self->Run(std::move(thread->thread));
212
- if (grpc_event_engine_timer_trace.enabled()) {
213
- gpr_log(GPR_DEBUG, "TimerManager::%p thread::%p finished", thread->self,
214
- &thread->thread);
215
- }
216
- }
86
+ bool TimerManager::IsTimerManagerThread() { return g_timer_thread; }
217
87
 
218
- void TimerManager::Run(grpc_core::Thread thread) {
219
- MainLoop();
220
- grpc_core::MutexLock lock(&mu_);
221
- completed_threads_.push_back(std::move(thread));
222
- thread_count_--;
223
- if (thread_count_ == 0) cv_threadcount_.Signal();
88
+ void TimerManager::StartMainLoopThread() {
89
+ main_thread_ = grpc_core::Thread(
90
+ "timer_manager",
91
+ [](void* arg) {
92
+ auto self = static_cast<TimerManager*>(arg);
93
+ self->MainLoop();
94
+ },
95
+ this, nullptr,
96
+ grpc_core::Thread::Options().set_tracked(false).set_joinable(false));
97
+ main_thread_.Start();
224
98
  }
225
99
 
226
- bool TimerManager::IsTimerManagerThread() { return g_timer_thread; }
227
-
228
- TimerManager::TimerManager() : host_(this) {
229
- timer_list_ = absl::make_unique<TimerList>(&host_);
230
- grpc_core::MutexLock lock(&mu_);
231
- StartThread();
100
+ TimerManager::TimerManager(
101
+ std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool)
102
+ : host_(this), thread_pool_(std::move(thread_pool)) {
103
+ timer_list_ = std::make_unique<TimerList>(&host_);
104
+ main_loop_exit_signal_.emplace();
105
+ StartMainLoopThread();
232
106
  }
233
107
 
234
108
  grpc_core::Timestamp TimerManager::Host::Now() {
@@ -238,6 +112,15 @@ grpc_core::Timestamp TimerManager::Host::Now() {
238
112
 
239
113
  void TimerManager::TimerInit(Timer* timer, grpc_core::Timestamp deadline,
240
114
  experimental::EventEngine::Closure* closure) {
115
+ if (grpc_event_engine_timer_trace.enabled()) {
116
+ grpc_core::MutexLock lock(&mu_);
117
+ if (shutdown_) {
118
+ gpr_log(GPR_ERROR,
119
+ "WARNING: TimerManager::%p: scheduling Closure::%p after "
120
+ "TimerManager has been shut down.",
121
+ this, closure);
122
+ }
123
+ }
241
124
  timer_list_->TimerInit(timer, deadline, closure);
242
125
  }
243
126
 
@@ -245,67 +128,47 @@ bool TimerManager::TimerCancel(Timer* timer) {
245
128
  return timer_list_->TimerCancel(timer);
246
129
  }
247
130
 
248
- TimerManager::~TimerManager() {
249
- if (grpc_event_engine_timer_trace.enabled()) {
250
- gpr_log(GPR_DEBUG, "TimerManager::%p shutting down", this);
251
- }
252
- ThreadCollector collector;
253
- grpc_core::MutexLock lock(&mu_);
254
- shutdown_ = true;
255
- cv_wait_.SignalAll();
256
- while (thread_count_ > 0) {
257
- cv_threadcount_.Wait(&mu_);
131
+ void TimerManager::Shutdown() {
132
+ {
133
+ grpc_core::MutexLock lock(&mu_);
134
+ if (shutdown_) return;
258
135
  if (grpc_event_engine_timer_trace.enabled()) {
259
- gpr_log(GPR_DEBUG, "TimerManager::%p waiting for %zu threads to finish",
260
- this, thread_count_);
136
+ gpr_log(GPR_DEBUG, "TimerManager::%p shutting down", this);
261
137
  }
138
+ shutdown_ = true;
139
+ // Wait on the main loop to exit.
140
+ cv_wait_.Signal();
262
141
  }
263
- collector.Collect(std::move(completed_threads_));
142
+ main_loop_exit_signal_->WaitForNotification();
264
143
  if (grpc_event_engine_timer_trace.enabled()) {
265
144
  gpr_log(GPR_DEBUG, "TimerManager::%p shutdown complete", this);
266
145
  }
267
146
  }
268
147
 
148
+ TimerManager::~TimerManager() { Shutdown(); }
149
+
269
150
  void TimerManager::Host::Kick() { timer_manager_->Kick(); }
270
151
 
271
152
  void TimerManager::Kick() {
272
153
  grpc_core::MutexLock lock(&mu_);
273
- has_timed_waiter_ = false;
274
- timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
275
- ++timed_waiter_generation_;
276
154
  kicked_ = true;
277
155
  cv_wait_.Signal();
278
156
  }
279
157
 
280
- void TimerManager::PrepareFork() {
281
- ThreadCollector collector;
282
- grpc_core::MutexLock lock(&mu_);
283
- forking_ = true;
284
- prefork_thread_count_ = thread_count_;
285
- cv_wait_.SignalAll();
286
- while (thread_count_ > 0) {
287
- cv_threadcount_.Wait(&mu_);
288
- }
289
- collector.Collect(std::move(completed_threads_));
290
- }
291
-
292
- void TimerManager::PostforkParent() {
158
+ void TimerManager::RestartPostFork() {
293
159
  grpc_core::MutexLock lock(&mu_);
294
- for (int i = 0; i < prefork_thread_count_; i++) {
295
- StartThread();
160
+ GPR_ASSERT(GPR_LIKELY(shutdown_));
161
+ if (grpc_event_engine_timer_trace.enabled()) {
162
+ gpr_log(GPR_DEBUG, "TimerManager::%p restarting after shutdown", this);
296
163
  }
297
- prefork_thread_count_ = 0;
298
- forking_ = false;
164
+ shutdown_ = false;
165
+ main_loop_exit_signal_.emplace();
166
+ StartMainLoopThread();
299
167
  }
300
168
 
301
- void TimerManager::PostforkChild() {
302
- grpc_core::MutexLock lock(&mu_);
303
- for (int i = 0; i < prefork_thread_count_; i++) {
304
- StartThread();
305
- }
306
- prefork_thread_count_ = 0;
307
- forking_ = false;
308
- }
169
+ void TimerManager::PrepareFork() { Shutdown(); }
170
+ void TimerManager::PostforkParent() { RestartPostFork(); }
171
+ void TimerManager::PostforkChild() { RestartPostFork(); }
309
172
 
310
173
  } // namespace posix_engine
311
174
  } // namespace grpc_event_engine
@@ -21,18 +21,20 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <stddef.h>
25
24
  #include <stdint.h>
26
25
 
27
26
  #include <memory>
28
27
  #include <vector>
29
28
 
30
29
  #include "absl/base/thread_annotations.h"
30
+ #include "absl/types/optional.h"
31
31
 
32
32
  #include <grpc/event_engine/event_engine.h>
33
33
 
34
34
  #include "src/core/lib/event_engine/forkable.h"
35
35
  #include "src/core/lib/event_engine/posix_engine/timer.h"
36
+ #include "src/core/lib/event_engine/thread_pool.h"
37
+ #include "src/core/lib/gprpp/notification.h"
36
38
  #include "src/core/lib/gprpp/sync.h"
37
39
  #include "src/core/lib/gprpp/thd.h"
38
40
  #include "src/core/lib/gprpp/time.h"
@@ -46,7 +48,8 @@ namespace posix_engine {
46
48
  // thread_pool.{h,cc}.
47
49
  class TimerManager final : public grpc_event_engine::experimental::Forkable {
48
50
  public:
49
- TimerManager();
51
+ explicit TimerManager(
52
+ std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool);
50
53
  ~TimerManager() override;
51
54
 
52
55
  grpc_core::Timestamp Now() { return host_.Now(); }
@@ -55,19 +58,16 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
55
58
  experimental::EventEngine::Closure* closure);
56
59
  bool TimerCancel(Timer* timer);
57
60
 
58
- // Forkable
61
+ static bool IsTimerManagerThread();
62
+
63
+ // Called on destruction, prefork, and manually when needed.
64
+ void Shutdown();
65
+
59
66
  void PrepareFork() override;
60
67
  void PostforkParent() override;
61
68
  void PostforkChild() override;
62
69
 
63
- static bool IsTimerManagerThread();
64
-
65
70
  private:
66
- struct RunThreadArgs {
67
- TimerManager* self;
68
- grpc_core::Thread thread;
69
- };
70
-
71
71
  class Host final : public TimerListHost {
72
72
  public:
73
73
  explicit Host(TimerManager* timer_manager)
@@ -80,60 +80,32 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
80
80
  TimerManager* const timer_manager_;
81
81
  };
82
82
 
83
- void StartThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
84
- static void RunThread(void* arg);
85
- void Run(grpc_core::Thread thread);
83
+ void StartMainLoopThread();
84
+ void RestartPostFork();
86
85
  void MainLoop();
87
86
  void RunSomeTimers(std::vector<experimental::EventEngine::Closure*> timers);
88
87
  bool WaitUntil(grpc_core::Timestamp next);
89
88
  void Kick();
90
89
 
91
90
  grpc_core::Mutex mu_;
92
- // Condvar associated with decrementing the thread count.
93
- // Threads will signal this when thread count reaches zero, and the forking
94
- // code *or* the destructor will wait upon it.
95
- grpc_core::CondVar cv_threadcount_;
96
- // Condvar associated with threads waiting to wakeup and work.
97
- // Threads wait on this until either a timeout is reached or another thread is
98
- // needed to wait for a timeout.
99
- // On shutdown we SignalAll against this to wake up all threads and have them
100
- // finish.
101
- // On kick we Signal against this to wake up at least one thread (but not
102
- // all)! Similarly when we note that no thread is watching timers.
103
- //
104
- // This is a different condvar than cv_threadcount_!
105
- // If this were the same:
106
- // - thread exits would require a SignalAll to ensure that the specific thread
107
- // we want to wake is woken up.
108
- // - kicks would need to signal all threads to avoid having the kick absorbed
109
- // by a shutdown thread and cause a deadlock, leading to thundering herd
110
- // problems in the common case.
91
+ // Condvar associated with the main thread waiting to wakeup and work.
92
+ // Threads wait on this until either a timeout is reached or the timer manager
93
+ // is kicked. On shutdown we Signal against this to wake up all threads and
94
+ // have them finish. On kick we Signal against this to wake up the main
95
+ // thread.
111
96
  grpc_core::CondVar cv_wait_;
112
97
  Host host_;
113
- // number of threads in the system
114
- size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0;
115
- // number of threads sitting around waiting
116
- size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0;
117
- // Threads waiting to be joined
118
- std::vector<grpc_core::Thread> completed_threads_ ABSL_GUARDED_BY(mu_);
119
- // is there a thread waiting until the next timer should fire?
120
- bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false;
121
98
  // are we shutting down?
122
99
  bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
123
- // are we forking?
124
- bool forking_ ABSL_GUARDED_BY(mu_) = false;
125
100
  // are we shutting down?
126
101
  bool kicked_ ABSL_GUARDED_BY(mu_) = false;
127
- // the deadline of the current timed waiter thread (only relevant if
128
- // has_timed_waiter_ is true)
129
- grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_);
130
- // generation counter to track which thread is waiting for the next timer
131
- uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0;
132
102
  // number of timer wakeups
133
- uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = 0;
103
+ uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = false;
134
104
  // actual timer implementation
135
105
  std::unique_ptr<TimerList> timer_list_;
136
- int prefork_thread_count_ = 0;
106
+ grpc_core::Thread main_thread_;
107
+ std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool_;
108
+ absl::optional<grpc_core::Notification> main_loop_exit_signal_;
137
109
  };
138
110
 
139
111
  } // namespace posix_engine