grpc 1.55.0 → 1.56.0.pre3

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 (374) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -68
  3. data/include/grpc/event_engine/event_engine.h +4 -3
  4. data/include/grpc/grpc_audit_logging.h +96 -0
  5. data/include/grpc/module.modulemap +2 -0
  6. data/include/grpc/support/json.h +218 -0
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +86 -104
  11. data/src/core/ext/filters/client_channel/client_channel.h +6 -0
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
  14. data/src/core/ext/filters/client_channel/config_selector.h +9 -24
  15. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
  41. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
  45. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
  46. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
  47. data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
  48. data/src/core/ext/filters/client_channel/subchannel.h +3 -43
  49. data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
  50. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
  51. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
  52. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
  53. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
  55. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  56. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  57. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  58. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  59. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  60. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  61. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  62. data/src/core/ext/xds/xds_api.cc +9 -6
  63. data/src/core/ext/xds/xds_api.h +3 -2
  64. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  65. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  66. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  67. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  68. data/src/core/ext/xds/xds_client.cc +5 -4
  69. data/src/core/ext/xds/xds_client_stats.h +1 -1
  70. data/src/core/ext/xds/xds_cluster.cc +20 -19
  71. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  72. data/src/core/ext/xds/xds_common_types.cc +3 -1
  73. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  74. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  75. data/src/core/ext/xds/xds_http_filters.h +4 -2
  76. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  77. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  78. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  79. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  80. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  81. data/src/core/ext/xds/xds_listener.cc +1 -0
  82. data/src/core/ext/xds/xds_route_config.cc +40 -3
  83. data/src/core/ext/xds/xds_routing.cc +2 -2
  84. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  85. data/src/core/lib/avl/avl.h +5 -0
  86. data/src/core/lib/channel/channel_args.cc +80 -22
  87. data/src/core/lib/channel/channel_args.h +34 -1
  88. data/src/core/lib/channel/channel_trace.cc +16 -12
  89. data/src/core/lib/channel/channelz.cc +159 -132
  90. data/src/core/lib/channel/channelz.h +42 -35
  91. data/src/core/lib/channel/channelz_registry.cc +23 -20
  92. data/src/core/lib/channel/connected_channel.cc +17 -6
  93. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  94. data/src/core/lib/channel/promise_based_filter.h +2 -0
  95. data/src/core/lib/compression/compression_internal.cc +2 -5
  96. data/src/core/lib/config/config_vars.cc +20 -18
  97. data/src/core/lib/config/config_vars.h +4 -4
  98. data/src/core/lib/config/load_config.cc +13 -0
  99. data/src/core/lib/config/load_config.h +6 -0
  100. data/src/core/lib/debug/event_log.h +1 -1
  101. data/src/core/lib/debug/stats_data.h +1 -1
  102. data/src/core/lib/debug/trace.cc +24 -55
  103. data/src/core/lib/debug/trace.h +3 -1
  104. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  105. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  106. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  107. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  108. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  109. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  110. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  111. data/src/core/lib/event_engine/poller.h +2 -2
  112. data/src/core/lib/event_engine/posix.h +4 -0
  113. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  114. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  115. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  116. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +33 -19
  117. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -1
  118. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -4
  119. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -8
  120. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  121. data/src/core/lib/event_engine/shim.cc +7 -1
  122. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  123. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  124. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  125. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  126. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  127. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  128. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  129. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  130. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  131. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  132. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  133. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  134. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  135. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  136. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  137. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  139. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  140. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  141. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  142. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  143. data/src/core/lib/experiments/config.cc +38 -7
  144. data/src/core/lib/experiments/config.h +16 -0
  145. data/src/core/lib/experiments/experiments.cc +67 -20
  146. data/src/core/lib/experiments/experiments.h +27 -21
  147. data/src/core/lib/gpr/log_internal.h +55 -0
  148. data/src/core/lib/gprpp/crash.cc +10 -0
  149. data/src/core/lib/gprpp/crash.h +3 -0
  150. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  151. data/src/core/lib/gprpp/per_cpu.h +29 -6
  152. data/src/core/lib/gprpp/time.cc +1 -0
  153. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  154. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  155. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  156. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  157. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  158. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  159. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  160. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  161. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  162. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  163. data/src/core/lib/iomgr/socket_windows.h +9 -2
  164. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  165. data/src/core/lib/iomgr/tcp_server_posix.cc +148 -107
  166. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  167. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  168. data/src/core/lib/json/json.h +2 -166
  169. data/src/core/lib/json/json_object_loader.cc +8 -9
  170. data/src/core/lib/json/json_object_loader.h +25 -18
  171. data/src/core/lib/json/json_reader.cc +13 -6
  172. data/src/core/lib/json/json_util.cc +6 -11
  173. data/src/core/lib/json/json_writer.cc +7 -8
  174. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  175. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  176. data/src/core/lib/matchers/matchers.cc +3 -4
  177. data/src/core/lib/matchers/matchers.h +2 -1
  178. data/src/core/lib/promise/activity.cc +5 -0
  179. data/src/core/lib/promise/activity.h +10 -0
  180. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  181. data/src/core/lib/promise/party.cc +31 -13
  182. data/src/core/lib/promise/party.h +11 -2
  183. data/src/core/lib/promise/pipe.h +9 -2
  184. data/src/core/lib/promise/prioritized_race.h +95 -0
  185. data/src/core/lib/promise/sleep.cc +2 -1
  186. data/src/core/lib/resolver/server_address.cc +0 -8
  187. data/src/core/lib/resolver/server_address.h +0 -6
  188. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  189. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  190. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  191. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  192. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  193. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  194. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  195. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  196. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  197. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  198. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  199. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  200. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  205. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  206. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  207. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  208. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  209. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  210. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  211. data/src/core/lib/security/util/json_util.cc +1 -0
  212. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  213. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  214. data/src/core/lib/surface/call.cc +38 -23
  215. data/src/core/lib/surface/completion_queue.cc +6 -2
  216. data/src/core/lib/surface/version.cc +2 -2
  217. data/src/core/lib/transport/batch_builder.cc +15 -12
  218. data/src/core/lib/transport/batch_builder.h +39 -35
  219. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  220. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  221. data/src/ruby/ext/grpc/extconf.rb +8 -9
  222. data/src/ruby/lib/grpc/version.rb +1 -1
  223. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  224. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  225. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  226. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  227. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  228. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  229. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  230. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  231. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  232. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  233. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  234. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  235. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  236. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  237. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  238. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  239. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  240. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  241. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  242. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  243. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  244. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  245. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  246. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  251. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  252. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  253. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  254. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  271. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  278. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  279. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  280. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  281. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  282. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  283. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  284. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  288. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  289. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  291. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  292. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  293. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  294. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  295. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  296. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  297. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  298. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  299. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  300. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  301. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  302. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  303. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  304. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  305. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  306. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  307. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  309. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  310. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  311. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  312. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  313. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  314. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  315. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  316. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  317. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  318. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  319. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  320. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  321. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  322. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  323. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  324. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  325. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  326. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  327. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  328. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  329. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  332. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  333. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  334. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  335. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  336. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  337. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  338. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  339. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  340. data/third_party/cares/cares/include/ares.h +23 -1
  341. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  342. data/third_party/cares/cares/include/ares_rules.h +2 -2
  343. data/third_party/cares/cares/include/ares_version.h +3 -3
  344. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  345. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  346. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  347. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  348. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  349. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  350. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  351. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  352. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  353. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  354. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  355. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  356. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  357. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  358. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  359. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  360. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  361. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  362. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  363. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  364. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  365. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  366. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  367. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  368. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  369. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  370. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  371. metadata +50 -14
  372. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  373. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  374. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -0,0 +1,489 @@
1
+ //
2
+ //
3
+ // Copyright 2015 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h"
22
+
23
+ #include <atomic>
24
+ #include <memory>
25
+ #include <utility>
26
+
27
+ #include "absl/time/clock.h"
28
+ #include "absl/time/time.h"
29
+
30
+ #include <grpc/support/log.h>
31
+
32
+ #include "src/core/lib/backoff/backoff.h"
33
+ #include "src/core/lib/debug/trace.h"
34
+ #include "src/core/lib/event_engine/common_closures.h"
35
+ #include "src/core/lib/event_engine/thread_local.h"
36
+ #include "src/core/lib/event_engine/trace.h"
37
+ #include "src/core/lib/event_engine/work_queue/basic_work_queue.h"
38
+ #include "src/core/lib/event_engine/work_queue/work_queue.h"
39
+ #include "src/core/lib/gprpp/thd.h"
40
+ #include "src/core/lib/gprpp/time.h"
41
+
42
+ namespace grpc_event_engine {
43
+ namespace experimental {
44
+
45
+ namespace {
46
+ constexpr grpc_core::Duration kIdleThreadLimit =
47
+ grpc_core::Duration::Seconds(20);
48
+ constexpr grpc_core::Duration kTimeBetweenThrottledThreadStarts =
49
+ grpc_core::Duration::Seconds(1);
50
+ constexpr grpc_core::Duration kWorkerThreadMinSleepBetweenChecks{
51
+ grpc_core::Duration::Milliseconds(15)};
52
+ constexpr grpc_core::Duration kWorkerThreadMaxSleepBetweenChecks{
53
+ grpc_core::Duration::Seconds(3)};
54
+ constexpr grpc_core::Duration kLifeguardMinSleepBetweenChecks{
55
+ grpc_core::Duration::Milliseconds(15)};
56
+ constexpr grpc_core::Duration kLifeguardMaxSleepBetweenChecks{
57
+ grpc_core::Duration::Seconds(1)};
58
+ constexpr absl::Duration kSleepBetweenQuiesceCheck{absl::Milliseconds(10)};
59
+ } // namespace
60
+
61
+ thread_local WorkQueue* g_local_queue = nullptr;
62
+
63
+ // -------- WorkStealingThreadPool --------
64
+
65
+ WorkStealingThreadPool::WorkStealingThreadPool(size_t reserve_threads)
66
+ : pool_{std::make_shared<WorkStealingThreadPoolImpl>(reserve_threads)} {
67
+ pool_->Start();
68
+ }
69
+
70
+ void WorkStealingThreadPool::Quiesce() { pool_->Quiesce(); }
71
+
72
+ WorkStealingThreadPool::~WorkStealingThreadPool() {
73
+ GPR_ASSERT(pool_->IsQuiesced());
74
+ }
75
+
76
+ void WorkStealingThreadPool::Run(absl::AnyInvocable<void()> callback) {
77
+ Run(SelfDeletingClosure::Create(std::move(callback)));
78
+ }
79
+
80
+ void WorkStealingThreadPool::Run(EventEngine::Closure* closure) {
81
+ pool_->Run(closure);
82
+ }
83
+
84
+ // -------- WorkStealingThreadPool::TheftRegistry --------
85
+
86
+ void WorkStealingThreadPool::TheftRegistry::Enroll(WorkQueue* queue) {
87
+ grpc_core::MutexLock lock(&mu_);
88
+ queues_.emplace(queue);
89
+ }
90
+
91
+ void WorkStealingThreadPool::TheftRegistry::Unenroll(WorkQueue* queue) {
92
+ grpc_core::MutexLock lock(&mu_);
93
+ queues_.erase(queue);
94
+ }
95
+
96
+ EventEngine::Closure* WorkStealingThreadPool::TheftRegistry::StealOne() {
97
+ grpc_core::MutexLock lock(&mu_);
98
+ EventEngine::Closure* closure;
99
+ for (auto* queue : queues_) {
100
+ closure = queue->PopMostRecent();
101
+ if (closure != nullptr) return closure;
102
+ }
103
+ return nullptr;
104
+ }
105
+
106
+ void WorkStealingThreadPool::PrepareFork() { pool_->PrepareFork(); }
107
+
108
+ void WorkStealingThreadPool::PostforkParent() { pool_->Postfork(); }
109
+
110
+ void WorkStealingThreadPool::PostforkChild() { pool_->Postfork(); }
111
+
112
+ // -------- WorkStealingThreadPool::WorkStealingThreadPoolImpl --------
113
+
114
+ WorkStealingThreadPool::WorkStealingThreadPoolImpl::WorkStealingThreadPoolImpl(
115
+ size_t reserve_threads)
116
+ : reserve_threads_(reserve_threads), lifeguard_() {}
117
+
118
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Start() {
119
+ lifeguard_.Start(shared_from_this());
120
+ for (size_t i = 0; i < reserve_threads_; i++) {
121
+ StartThread();
122
+ }
123
+ }
124
+
125
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Run(
126
+ EventEngine::Closure* closure) {
127
+ GPR_DEBUG_ASSERT(quiesced_.load(std::memory_order_relaxed) == false);
128
+ if (g_local_queue != nullptr) {
129
+ g_local_queue->Add(closure);
130
+ return;
131
+ }
132
+ queue_.Add(closure);
133
+ work_signal_.Signal();
134
+ }
135
+
136
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::StartThread() {
137
+ last_started_thread_.store(
138
+ grpc_core::Timestamp::Now().milliseconds_after_process_epoch(),
139
+ std::memory_order_relaxed);
140
+ grpc_core::Thread(
141
+ "event_engine",
142
+ [](void* arg) {
143
+ ThreadState* worker = static_cast<ThreadState*>(arg);
144
+ worker->ThreadBody();
145
+ delete worker;
146
+ },
147
+ new ThreadState(shared_from_this()), nullptr,
148
+ grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
149
+ .Start();
150
+ }
151
+
152
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Quiesce() {
153
+ SetShutdown(true);
154
+ // Wait until all threads have exited.
155
+ // Note that if this is a threadpool thread then we won't exit this thread
156
+ // until all other threads have exited, so we need to wait for just one thread
157
+ // running instead of zero.
158
+ bool is_threadpool_thread = g_local_queue != nullptr;
159
+ thread_count()->BlockUntilThreadCount(CounterType::kLivingThreadCount,
160
+ is_threadpool_thread ? 1 : 0,
161
+ "shutting down", work_signal());
162
+ GPR_ASSERT(queue_.Empty());
163
+ quiesced_.store(true, std::memory_order_relaxed);
164
+ lifeguard_.BlockUntilShutdown();
165
+ }
166
+
167
+ bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetThrottled(
168
+ bool throttled) {
169
+ return throttled_.exchange(throttled, std::memory_order_relaxed);
170
+ }
171
+
172
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetShutdown(
173
+ bool is_shutdown) {
174
+ auto was_shutdown = shutdown_.exchange(is_shutdown);
175
+ GPR_ASSERT(is_shutdown != was_shutdown);
176
+ work_signal_.SignalAll();
177
+ }
178
+
179
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetForking(
180
+ bool is_forking) {
181
+ auto was_forking = forking_.exchange(is_forking);
182
+ GPR_ASSERT(is_forking != was_forking);
183
+ }
184
+
185
+ bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsForking() {
186
+ return forking_.load(std::memory_order_relaxed);
187
+ }
188
+
189
+ bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsShutdown() {
190
+ return shutdown_.load(std::memory_order_relaxed);
191
+ }
192
+
193
+ bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsQuiesced() {
194
+ return quiesced_.load(std::memory_order_relaxed);
195
+ }
196
+
197
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::PrepareFork() {
198
+ SetForking(true);
199
+ thread_count()->BlockUntilThreadCount(CounterType::kLivingThreadCount, 0,
200
+ "forking", &work_signal_);
201
+ lifeguard_.BlockUntilShutdown();
202
+ }
203
+
204
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Postfork() {
205
+ SetForking(false);
206
+ Start();
207
+ }
208
+
209
+ // -------- WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard
210
+ // --------
211
+
212
+ WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::Lifeguard()
213
+ : backoff_(grpc_core::BackOff::Options()
214
+ .set_initial_backoff(kLifeguardMinSleepBetweenChecks)
215
+ .set_max_backoff(kLifeguardMaxSleepBetweenChecks)
216
+ .set_multiplier(1.3)) {}
217
+
218
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::Start(
219
+ std::shared_ptr<WorkStealingThreadPoolImpl> pool) {
220
+ // thread_running_ is set early to avoid a quiesce race while the lifeguard is
221
+ // still starting up.
222
+ thread_running_.store(true);
223
+ pool_ = std::move(pool);
224
+ grpc_core::Thread(
225
+ "lifeguard",
226
+ [](void* arg) {
227
+ auto* lifeguard = static_cast<Lifeguard*>(arg);
228
+ lifeguard->LifeguardMain();
229
+ },
230
+ this, nullptr,
231
+ grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
232
+ .Start();
233
+ }
234
+
235
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
236
+ LifeguardMain() {
237
+ while (true) {
238
+ absl::SleepFor(absl::Milliseconds(
239
+ (backoff_.NextAttemptTime() - grpc_core::Timestamp::Now()).millis()));
240
+ if (pool_->IsForking()) break;
241
+ if (pool_->IsShutdown() && pool_->IsQuiesced()) break;
242
+ MaybeStartNewThread();
243
+ }
244
+ pool_.reset();
245
+ thread_running_.store(false);
246
+ }
247
+
248
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
249
+ BlockUntilShutdown() {
250
+ while (thread_running_.load()) {
251
+ absl::SleepFor(kSleepBetweenQuiesceCheck);
252
+ }
253
+ }
254
+
255
+ void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
256
+ MaybeStartNewThread() {
257
+ // No new threads are started when forking.
258
+ // No new work is done when forking needs to begin.
259
+ if (pool_->forking_.load()) return;
260
+ int busy_thread_count =
261
+ pool_->thread_count_.GetCount(CounterType::kBusyCount);
262
+ int living_thread_count =
263
+ pool_->thread_count_.GetCount(CounterType::kLivingThreadCount);
264
+ // Wake an idle worker thread if there's global work to be had.
265
+ if (busy_thread_count < living_thread_count) {
266
+ if (!pool_->queue_.Empty()) {
267
+ pool_->work_signal()->Signal();
268
+ backoff_.Reset();
269
+ }
270
+ // Idle threads will eventually wake up for an attempt at work stealing.
271
+ return;
272
+ }
273
+ // No new threads if in the throttled state.
274
+ // However, all workers are busy, so the Lifeguard should be more
275
+ // vigilant about checking whether a new thread must be started.
276
+ if (grpc_core::Timestamp::Now() -
277
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
278
+ pool_->last_started_thread_) <
279
+ kTimeBetweenThrottledThreadStarts) {
280
+ backoff_.Reset();
281
+ return;
282
+ }
283
+ // All workers are busy and the pool is not throttled. Start a new thread.
284
+ // TODO(hork): new threads may spawn when there is no work in the global
285
+ // queue, nor any work to steal. Add more sophisticated logic about when to
286
+ // start a thread.
287
+ GRPC_EVENT_ENGINE_TRACE(
288
+ "Starting new ThreadPool thread due to backlog (total threads: %d)",
289
+ living_thread_count + 1);
290
+ pool_->StartThread();
291
+ // Tell the lifeguard to monitor the pool more closely.
292
+ backoff_.Reset();
293
+ }
294
+
295
+ // -------- WorkStealingThreadPool::ThreadState --------
296
+
297
+ WorkStealingThreadPool::ThreadState::ThreadState(
298
+ std::shared_ptr<WorkStealingThreadPoolImpl> pool)
299
+ : pool_(std::move(pool)),
300
+ auto_thread_count_(pool_->thread_count(),
301
+ CounterType::kLivingThreadCount),
302
+ backoff_(grpc_core::BackOff::Options()
303
+ .set_initial_backoff(kWorkerThreadMinSleepBetweenChecks)
304
+ .set_max_backoff(kWorkerThreadMaxSleepBetweenChecks)
305
+ .set_multiplier(1.3)) {}
306
+
307
+ void WorkStealingThreadPool::ThreadState::ThreadBody() {
308
+ g_local_queue = new BasicWorkQueue();
309
+ pool_->theft_registry()->Enroll(g_local_queue);
310
+ ThreadLocal::SetIsEventEngineThread(true);
311
+ while (Step()) {
312
+ // loop until the thread should no longer run
313
+ }
314
+ // cleanup
315
+ if (pool_->IsForking()) {
316
+ // TODO(hork): consider WorkQueue::AddAll(WorkQueue*)
317
+ EventEngine::Closure* closure;
318
+ while (!g_local_queue->Empty()) {
319
+ closure = g_local_queue->PopMostRecent();
320
+ if (closure != nullptr) {
321
+ pool_->queue()->Add(closure);
322
+ }
323
+ }
324
+ } else if (pool_->IsShutdown()) {
325
+ FinishDraining();
326
+ }
327
+ GPR_ASSERT(g_local_queue->Empty());
328
+ pool_->theft_registry()->Unenroll(g_local_queue);
329
+ delete g_local_queue;
330
+ }
331
+
332
+ void WorkStealingThreadPool::ThreadState::SleepIfRunning() {
333
+ if (pool_->IsForking()) return;
334
+ absl::SleepFor(
335
+ absl::Milliseconds(kTimeBetweenThrottledThreadStarts.millis()));
336
+ }
337
+
338
+ bool WorkStealingThreadPool::ThreadState::Step() {
339
+ if (pool_->IsForking()) return false;
340
+ auto* closure = g_local_queue->PopMostRecent();
341
+ // If local work is available, run it.
342
+ if (closure != nullptr) {
343
+ ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
344
+ CounterType::kBusyCount};
345
+ closure->Run();
346
+ return true;
347
+ }
348
+ // Thread shutdown exit condition (ignoring fork). All must be true:
349
+ // * shutdown was called
350
+ // * the local queue is empty
351
+ // * the global queue is empty
352
+ // * the steal pool returns nullptr
353
+ bool should_run_again = false;
354
+ grpc_core::Timestamp start_time{grpc_core::Timestamp::Now()};
355
+ // Wait until work is available or until shut down.
356
+ while (!pool_->IsForking()) {
357
+ // Pull from the global queue next
358
+ // TODO(hork): consider an empty check for performance wins. Depends on the
359
+ // queue implementation, the BasicWorkQueue takes two locks when you do an
360
+ // empty check then pop.
361
+ closure = pool_->queue()->PopMostRecent();
362
+ if (closure != nullptr) {
363
+ should_run_again = true;
364
+ break;
365
+ };
366
+ // Try stealing if the queue is empty
367
+ closure = pool_->theft_registry()->StealOne();
368
+ if (closure != nullptr) {
369
+ should_run_again = true;
370
+ break;
371
+ }
372
+ // No closures were retrieved from anywhere.
373
+ // Quit the thread if the pool has been shut down.
374
+ if (pool_->IsShutdown()) break;
375
+ bool timed_out = pool_->work_signal()->WaitWithTimeout(
376
+ backoff_.NextAttemptTime() - grpc_core::Timestamp::Now());
377
+ // Quit a thread if the pool has more than it requires, and this thread
378
+ // has been idle long enough.
379
+ if (timed_out &&
380
+ pool_->thread_count()->GetCount(CounterType::kLivingThreadCount) >
381
+ pool_->reserve_threads() &&
382
+ grpc_core::Timestamp::Now() - start_time > kIdleThreadLimit) {
383
+ return false;
384
+ }
385
+ }
386
+ if (pool_->IsForking()) {
387
+ // save the closure since we aren't going to execute it.
388
+ if (closure != nullptr) g_local_queue->Add(closure);
389
+ return false;
390
+ }
391
+ if (closure != nullptr) {
392
+ ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
393
+ CounterType::kBusyCount};
394
+ closure->Run();
395
+ }
396
+ backoff_.Reset();
397
+ return should_run_again;
398
+ }
399
+
400
+ void WorkStealingThreadPool::ThreadState::FinishDraining() {
401
+ // The thread is definitionally busy while draining
402
+ ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
403
+ CounterType::kBusyCount};
404
+ // If a fork occurs at any point during shutdown, quit draining. The post-fork
405
+ // threads will finish draining the global queue.
406
+ while (!pool_->IsForking()) {
407
+ if (!g_local_queue->Empty()) {
408
+ auto* closure = g_local_queue->PopMostRecent();
409
+ if (closure != nullptr) {
410
+ closure->Run();
411
+ }
412
+ continue;
413
+ }
414
+ if (!pool_->queue()->Empty()) {
415
+ auto* closure = pool_->queue()->PopMostRecent();
416
+ if (closure != nullptr) {
417
+ closure->Run();
418
+ }
419
+ continue;
420
+ }
421
+ break;
422
+ }
423
+ }
424
+
425
+ // -------- WorkStealingThreadPool::ThreadCount --------
426
+
427
+ void WorkStealingThreadPool::ThreadCount::Add(CounterType counter_type) {
428
+ thread_counts_[counter_type].fetch_add(1, std::memory_order_relaxed);
429
+ }
430
+
431
+ void WorkStealingThreadPool::ThreadCount::Remove(CounterType counter_type) {
432
+ thread_counts_[counter_type].fetch_sub(1, std::memory_order_relaxed);
433
+ }
434
+
435
+ void WorkStealingThreadPool::ThreadCount::BlockUntilThreadCount(
436
+ CounterType counter_type, int desired_threads, const char* why,
437
+ WorkSignal* work_signal) {
438
+ auto& counter = thread_counts_[counter_type];
439
+ int curr_threads = counter.load(std::memory_order_relaxed);
440
+ // Wait for all threads to exit.
441
+ auto last_log_time = grpc_core::Timestamp::Now();
442
+ while (curr_threads > desired_threads) {
443
+ absl::SleepFor(kSleepBetweenQuiesceCheck);
444
+ work_signal->SignalAll();
445
+ if (grpc_core::Timestamp::Now() - last_log_time >
446
+ grpc_core::Duration::Seconds(3)) {
447
+ gpr_log(GPR_DEBUG,
448
+ "Waiting for thread pool to idle before %s. (%d to %d)", why,
449
+ curr_threads, desired_threads);
450
+ last_log_time = grpc_core::Timestamp::Now();
451
+ }
452
+ curr_threads = counter.load(std::memory_order_relaxed);
453
+ }
454
+ }
455
+
456
+ size_t WorkStealingThreadPool::ThreadCount::GetCount(CounterType counter_type) {
457
+ return thread_counts_[counter_type].load(std::memory_order_relaxed);
458
+ }
459
+
460
+ WorkStealingThreadPool::ThreadCount::AutoThreadCount::AutoThreadCount(
461
+ ThreadCount* counter, CounterType counter_type)
462
+ : counter_(counter), counter_type_(counter_type) {
463
+ counter_->Add(counter_type_);
464
+ }
465
+
466
+ WorkStealingThreadPool::ThreadCount::AutoThreadCount::~AutoThreadCount() {
467
+ counter_->Remove(counter_type_);
468
+ }
469
+
470
+ // -------- WorkStealingThreadPool::WorkSignal --------
471
+
472
+ void WorkStealingThreadPool::WorkSignal::Signal() {
473
+ grpc_core::MutexLock lock(&mu_);
474
+ cv_.Signal();
475
+ }
476
+
477
+ void WorkStealingThreadPool::WorkSignal::SignalAll() {
478
+ grpc_core::MutexLock lock(&mu_);
479
+ cv_.SignalAll();
480
+ }
481
+
482
+ bool WorkStealingThreadPool::WorkSignal::WaitWithTimeout(
483
+ grpc_core::Duration time) {
484
+ grpc_core::MutexLock lock(&mu_);
485
+ return cv_.WaitWithTimeout(&mu_, absl::Milliseconds(time.millis()));
486
+ }
487
+
488
+ } // namespace experimental
489
+ } // namespace grpc_event_engine