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
@@ -24,6 +24,7 @@
24
24
  #include <grpc/support/log_windows.h>
25
25
 
26
26
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
27
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
27
28
  #include "src/core/lib/event_engine/trace.h"
28
29
  #include "src/core/lib/event_engine/windows/windows_endpoint.h"
29
30
  #include "src/core/lib/gprpp/debug_location.h"
@@ -50,11 +51,11 @@ void DumpSliceBuffer(SliceBuffer* buffer, absl::string_view context_string) {
50
51
  WindowsEndpoint::WindowsEndpoint(
51
52
  const EventEngine::ResolvedAddress& peer_address,
52
53
  std::unique_ptr<WinSocket> socket, MemoryAllocator&& allocator,
53
- const EndpointConfig& /* config */, Executor* executor,
54
+ const EndpointConfig& /* config */, ThreadPool* thread_pool,
54
55
  std::shared_ptr<EventEngine> engine)
55
56
  : peer_address_(peer_address),
56
57
  allocator_(std::move(allocator)),
57
- executor_(executor),
58
+ thread_pool_(thread_pool),
58
59
  io_state_(std::make_shared<AsyncIOState>(this, std::move(socket),
59
60
  std::move(engine))) {
60
61
  char addr[EventEngine::ResolvedAddress::MAX_SIZE_BYTES];
@@ -100,7 +101,7 @@ absl::Status WindowsEndpoint::DoTcpRead(SliceBuffer* buffer) {
100
101
  // Data or some error was returned immediately.
101
102
  io_state_->socket->read_info()->SetResult(
102
103
  {/*wsa_error=*/wsa_error, /*bytes_read=*/bytes_read});
103
- executor_->Run(&io_state_->handle_read_event);
104
+ thread_pool_->Run(&io_state_->handle_read_event);
104
105
  return absl::OkStatus();
105
106
  }
106
107
  // If the endpoint has already received some data, and the next call would
@@ -126,7 +127,7 @@ absl::Status WindowsEndpoint::DoTcpRead(SliceBuffer* buffer) {
126
127
  bool WindowsEndpoint::Read(absl::AnyInvocable<void(absl::Status)> on_read,
127
128
  SliceBuffer* buffer, const ReadArgs* /* args */) {
128
129
  if (io_state_->socket->IsShutdown()) {
129
- executor_->Run([on_read = std::move(on_read)]() mutable {
130
+ thread_pool_->Run([on_read = std::move(on_read)]() mutable {
130
131
  on_read(absl::UnavailableError("Socket is shutting down."));
131
132
  });
132
133
  return false;
@@ -143,7 +144,7 @@ bool WindowsEndpoint::Read(absl::AnyInvocable<void(absl::Status)> on_read,
143
144
  auto status = DoTcpRead(buffer);
144
145
  if (!status.ok()) {
145
146
  // The read could not be completed.
146
- io_state_->endpoint->executor_->Run([this, status]() {
147
+ io_state_->endpoint->thread_pool_->Run([this, status]() {
147
148
  io_state_->handle_read_event.ExecuteCallbackAndReset(status);
148
149
  });
149
150
  }
@@ -154,7 +155,7 @@ bool WindowsEndpoint::Write(absl::AnyInvocable<void(absl::Status)> on_writable,
154
155
  SliceBuffer* data, const WriteArgs* /* args */) {
155
156
  GRPC_EVENT_ENGINE_ENDPOINT_TRACE("WindowsEndpoint::%p writing", this);
156
157
  if (io_state_->socket->IsShutdown()) {
157
- executor_->Run([on_writable = std::move(on_writable)]() mutable {
158
+ thread_pool_->Run([on_writable = std::move(on_writable)]() mutable {
158
159
  on_writable(absl::UnavailableError("Socket is shutting down."));
159
160
  });
160
161
  return false;
@@ -182,7 +183,7 @@ bool WindowsEndpoint::Write(absl::AnyInvocable<void(absl::Status)> on_writable,
182
183
  if (status == 0) {
183
184
  if (bytes_sent == data->Length()) {
184
185
  // Write completed, exiting early
185
- executor_->Run(
186
+ thread_pool_->Run(
186
187
  [cb = std::move(on_writable)]() mutable { cb(absl::OkStatus()); });
187
188
  return false;
188
189
  }
@@ -203,7 +204,7 @@ bool WindowsEndpoint::Write(absl::AnyInvocable<void(absl::Status)> on_writable,
203
204
  // then we can avoid doing an async write operation at all.
204
205
  int wsa_error = WSAGetLastError();
205
206
  if (wsa_error != WSAEWOULDBLOCK) {
206
- executor_->Run([cb = std::move(on_writable), wsa_error]() mutable {
207
+ thread_pool_->Run([cb = std::move(on_writable), wsa_error]() mutable {
207
208
  cb(GRPC_WSA_ERROR(wsa_error, "WSASend"));
208
209
  });
209
210
  return false;
@@ -217,7 +218,7 @@ bool WindowsEndpoint::Write(absl::AnyInvocable<void(absl::Status)> on_writable,
217
218
  if (status != 0) {
218
219
  int wsa_error = WSAGetLastError();
219
220
  if (wsa_error != WSA_IO_PENDING) {
220
- executor_->Run([cb = std::move(on_writable), wsa_error]() mutable {
221
+ thread_pool_->Run([cb = std::move(on_writable), wsa_error]() mutable {
221
222
  cb(GRPC_WSA_ERROR(wsa_error, "WSASend"));
222
223
  });
223
224
  return false;
@@ -319,7 +320,7 @@ void WindowsEndpoint::HandleReadClosure::Run() {
319
320
  bool WindowsEndpoint::HandleReadClosure::MaybeFinishIfDataHasAlreadyBeenRead() {
320
321
  if (last_read_buffer_.Length() > 0) {
321
322
  buffer_->Swap(last_read_buffer_);
322
- io_state_->endpoint->executor_->Run(
323
+ io_state_->endpoint->thread_pool_->Run(
323
324
  [this]() { ExecuteCallbackAndReset(absl::OkStatus()); });
324
325
  return true;
325
326
  }
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <grpc/event_engine/event_engine.h>
21
21
 
22
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
22
23
  #include "src/core/lib/event_engine/windows/win_socket.h"
23
24
 
24
25
  namespace grpc_event_engine {
@@ -29,7 +30,7 @@ class WindowsEndpoint : public EventEngine::Endpoint {
29
30
  WindowsEndpoint(const EventEngine::ResolvedAddress& peer_address,
30
31
  std::unique_ptr<WinSocket> socket,
31
32
  MemoryAllocator&& allocator, const EndpointConfig& config,
32
- Executor* Executor, std::shared_ptr<EventEngine> engine);
33
+ ThreadPool* thread_pool, std::shared_ptr<EventEngine> engine);
33
34
  ~WindowsEndpoint() override;
34
35
  bool Read(absl::AnyInvocable<void(absl::Status)> on_read, SliceBuffer* buffer,
35
36
  const ReadArgs* args) override;
@@ -107,7 +108,7 @@ class WindowsEndpoint : public EventEngine::Endpoint {
107
108
  EventEngine::ResolvedAddress local_address_;
108
109
  std::string local_address_string_;
109
110
  MemoryAllocator allocator_;
110
- Executor* executor_;
111
+ ThreadPool* thread_pool_;
111
112
  std::shared_ptr<AsyncIOState> io_state_;
112
113
  };
113
114
 
@@ -25,13 +25,14 @@
25
25
  #include <grpc/event_engine/event_engine.h>
26
26
  #include <grpc/event_engine/memory_allocator.h>
27
27
  #include <grpc/event_engine/slice_buffer.h>
28
+ #include <grpc/support/cpu.h>
28
29
 
29
30
  #include "src/core/lib/event_engine/channel_args_endpoint_config.h"
30
31
  #include "src/core/lib/event_engine/common_closures.h"
31
- #include "src/core/lib/event_engine/executor/executor.h"
32
32
  #include "src/core/lib/event_engine/handle_containers.h"
33
33
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
34
34
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
35
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
35
36
  #include "src/core/lib/event_engine/trace.h"
36
37
  #include "src/core/lib/event_engine/utils.h"
37
38
  #include "src/core/lib/event_engine/windows/iocp.h"
@@ -48,21 +49,21 @@ namespace experimental {
48
49
 
49
50
  // ---- IOCPWorkClosure ----
50
51
 
51
- WindowsEventEngine::IOCPWorkClosure::IOCPWorkClosure(Executor* executor,
52
+ WindowsEventEngine::IOCPWorkClosure::IOCPWorkClosure(ThreadPool* thread_pool,
52
53
  IOCP* iocp)
53
- : executor_(executor), iocp_(iocp) {
54
- executor_->Run(this);
54
+ : thread_pool_(thread_pool), iocp_(iocp) {
55
+ thread_pool_->Run(this);
55
56
  }
56
57
 
57
58
  void WindowsEventEngine::IOCPWorkClosure::Run() {
58
59
  auto result = iocp_->Work(std::chrono::seconds(60), [this] {
59
60
  workers_.fetch_add(1);
60
- executor_->Run(this);
61
+ thread_pool_->Run(this);
61
62
  });
62
63
  if (result == Poller::WorkResult::kDeadlineExceeded) {
63
64
  // iocp received no messages. restart the worker
64
65
  workers_.fetch_add(1);
65
- executor_->Run(this);
66
+ thread_pool_->Run(this);
66
67
  }
67
68
  if (workers_.fetch_sub(1) == 1) done_signal_.Notify();
68
69
  }
@@ -97,10 +98,11 @@ struct WindowsEventEngine::TimerClosure final : public EventEngine::Closure {
97
98
  };
98
99
 
99
100
  WindowsEventEngine::WindowsEventEngine()
100
- : executor_(std::make_shared<ThreadPool>()),
101
- iocp_(executor_.get()),
102
- timer_manager_(executor_),
103
- iocp_worker_(executor_.get(), &iocp_) {
101
+ : thread_pool_(
102
+ MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 2u, 16u))),
103
+ iocp_(thread_pool_.get()),
104
+ timer_manager_(thread_pool_),
105
+ iocp_worker_(thread_pool_.get(), &iocp_) {
104
106
  WSADATA wsaData;
105
107
  int status = WSAStartup(MAKEWORD(2, 0), &wsaData);
106
108
  GPR_ASSERT(status == 0);
@@ -140,7 +142,7 @@ WindowsEventEngine::~WindowsEventEngine() {
140
142
  iocp_.Shutdown();
141
143
  GPR_ASSERT(WSACleanup() == 0);
142
144
  timer_manager_.Shutdown();
143
- executor_->Quiesce();
145
+ thread_pool_->Quiesce();
144
146
  }
145
147
 
146
148
  bool WindowsEventEngine::Cancel(EventEngine::TaskHandle handle) {
@@ -167,11 +169,11 @@ EventEngine::TaskHandle WindowsEventEngine::RunAfter(
167
169
  }
168
170
 
169
171
  void WindowsEventEngine::Run(absl::AnyInvocable<void()> closure) {
170
- executor_->Run(std::move(closure));
172
+ thread_pool_->Run(std::move(closure));
171
173
  }
172
174
 
173
175
  void WindowsEventEngine::Run(EventEngine::Closure* closure) {
174
- executor_->Run(closure);
176
+ thread_pool_->Run(closure);
175
177
  }
176
178
 
177
179
  EventEngine::TaskHandle WindowsEventEngine::RunAfterInternal(
@@ -219,12 +221,12 @@ void WindowsEventEngine::OnConnectCompleted(
219
221
  state->socket->Shutdown(DEBUG_LOCATION, "ConnectEx failure");
220
222
  endpoint = GRPC_WSA_ERROR(overlapped_result.wsa_error, "ConnectEx");
221
223
  } else {
222
- // This code should be running in an executor thread already, so the
224
+ // This code should be running in a thread pool thread already, so the
223
225
  // callback can be run directly.
224
226
  ChannelArgsEndpointConfig cfg;
225
227
  endpoint = std::make_unique<WindowsEndpoint>(
226
228
  state->address, std::move(state->socket), std::move(state->allocator),
227
- cfg, executor_.get(), shared_from_this());
229
+ cfg, thread_pool_.get(), shared_from_this());
228
230
  }
229
231
  }
230
232
  cb(std::move(endpoint));
@@ -400,8 +402,8 @@ WindowsEventEngine::CreateListener(
400
402
  std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory) {
401
403
  return std::make_unique<WindowsEventEngineListener>(
402
404
  &iocp_, std::move(on_accept), std::move(on_shutdown),
403
- std::move(memory_allocator_factory), shared_from_this(), executor_.get(),
404
- config);
405
+ std::move(memory_allocator_factory), shared_from_this(),
406
+ thread_pool_.get(), config);
405
407
  }
406
408
  } // namespace experimental
407
409
  } // namespace grpc_event_engine
@@ -30,7 +30,7 @@
30
30
 
31
31
  #include "src/core/lib/event_engine/handle_containers.h"
32
32
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
33
- #include "src/core/lib/event_engine/thread_pool.h"
33
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
34
34
  #include "src/core/lib/event_engine/windows/iocp.h"
35
35
  #include "src/core/lib/event_engine/windows/windows_endpoint.h"
36
36
  #include "src/core/lib/gprpp/sync.h"
@@ -88,11 +88,11 @@ class WindowsEventEngine : public EventEngine,
88
88
  absl::AnyInvocable<void()> closure) override;
89
89
  bool Cancel(TaskHandle handle) override;
90
90
 
91
- // Retrieve the base executor.
91
+ // Retrieve the base ThreadPool.
92
92
  // This is public because most classes that know the concrete
93
93
  // WindowsEventEngine type are effectively friends.
94
94
  // Not intended for external use.
95
- Executor* executor() { return executor_.get(); }
95
+ ThreadPool* thread_pool() { return thread_pool_.get(); }
96
96
  IOCP* poller() { return &iocp_; }
97
97
 
98
98
  private:
@@ -116,14 +116,14 @@ class WindowsEventEngine : public EventEngine,
116
116
  // A poll worker which schedules itself unless kicked
117
117
  class IOCPWorkClosure : public EventEngine::Closure {
118
118
  public:
119
- explicit IOCPWorkClosure(Executor* executor, IOCP* iocp);
119
+ explicit IOCPWorkClosure(ThreadPool* thread_pool, IOCP* iocp);
120
120
  void Run() override;
121
121
  void WaitForShutdown();
122
122
 
123
123
  private:
124
124
  std::atomic<int> workers_{1};
125
125
  grpc_core::Notification done_signal_;
126
- Executor* executor_;
126
+ ThreadPool* thread_pool_;
127
127
  IOCP* iocp_;
128
128
  };
129
129
 
@@ -150,7 +150,7 @@ class WindowsEventEngine : public EventEngine,
150
150
  ConnectionHandleSet known_connection_handles_ ABSL_GUARDED_BY(connection_mu_);
151
151
  std::atomic<intptr_t> aba_token_{0};
152
152
 
153
- std::shared_ptr<ThreadPool> executor_;
153
+ std::shared_ptr<ThreadPool> thread_pool_;
154
154
  IOCP iocp_;
155
155
  TimerManager timer_manager_;
156
156
  IOCPWorkClosure iocp_worker_;
@@ -201,7 +201,7 @@ void WindowsEventEngineListener::SinglePortSocketListener::
201
201
  peer_address, listener_->iocp_->Watch(io_state_->accept_socket),
202
202
  listener_->memory_allocator_factory_->CreateMemoryAllocator(
203
203
  absl::StrFormat("listener endpoint %s", peer_name)),
204
- listener_->config_, listener_->executor_, listener_->engine_);
204
+ listener_->config_, listener_->thread_pool_, listener_->engine_);
205
205
  listener_->accept_cb_(
206
206
  std::move(endpoint),
207
207
  listener_->memory_allocator_factory_->CreateMemoryAllocator(
@@ -265,12 +265,12 @@ WindowsEventEngineListener::WindowsEventEngineListener(
265
265
  IOCP* iocp, AcceptCallback accept_cb,
266
266
  absl::AnyInvocable<void(absl::Status)> on_shutdown,
267
267
  std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory,
268
- std::shared_ptr<EventEngine> engine, Executor* executor,
268
+ std::shared_ptr<EventEngine> engine, ThreadPool* thread_pool,
269
269
  const EndpointConfig& config)
270
270
  : iocp_(iocp),
271
271
  config_(config),
272
272
  engine_(std::move(engine)),
273
- executor_(executor),
273
+ thread_pool_(thread_pool),
274
274
  memory_allocator_factory_(std::move(memory_allocator_factory)),
275
275
  accept_cb_(std::move(accept_cb)),
276
276
  on_shutdown_(std::move(on_shutdown)) {}
@@ -27,6 +27,7 @@
27
27
  #include <grpc/event_engine/memory_allocator.h>
28
28
 
29
29
  #include "src/core/lib/event_engine/common_closures.h"
30
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
30
31
  #include "src/core/lib/event_engine/windows/iocp.h"
31
32
  #include "src/core/lib/gprpp/sync.h"
32
33
 
@@ -39,7 +40,7 @@ class WindowsEventEngineListener : public EventEngine::Listener {
39
40
  IOCP* iocp, AcceptCallback accept_cb,
40
41
  absl::AnyInvocable<void(absl::Status)> on_shutdown,
41
42
  std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory,
42
- std::shared_ptr<EventEngine> engine, Executor* executor_,
43
+ std::shared_ptr<EventEngine> engine, ThreadPool* thread_pool_,
43
44
  const EndpointConfig& config);
44
45
  ~WindowsEventEngineListener() override;
45
46
  absl::StatusOr<int> Bind(const EventEngine::ResolvedAddress& addr) override;
@@ -136,7 +137,7 @@ class WindowsEventEngineListener : public EventEngine::Listener {
136
137
  IOCP* const iocp_;
137
138
  const EndpointConfig& config_;
138
139
  std::shared_ptr<EventEngine> engine_;
139
- Executor* executor_;
140
+ ThreadPool* thread_pool_;
140
141
  const std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory_;
141
142
  AcceptCallback accept_cb_;
142
143
  absl::AnyInvocable<void(absl::Status)> on_shutdown_;
@@ -0,0 +1,63 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #include <grpc/support/port_platform.h>
15
+
16
+ #include "src/core/lib/event_engine/work_queue/basic_work_queue.h"
17
+
18
+ #include <utility>
19
+
20
+ #include "src/core/lib/event_engine/common_closures.h"
21
+ #include "src/core/lib/gprpp/sync.h"
22
+
23
+ namespace grpc_event_engine {
24
+ namespace experimental {
25
+
26
+ bool BasicWorkQueue::Empty() const {
27
+ grpc_core::MutexLock lock(&mu_);
28
+ return q_.empty();
29
+ }
30
+
31
+ size_t BasicWorkQueue::Size() const {
32
+ grpc_core::MutexLock lock(&mu_);
33
+ return q_.size();
34
+ }
35
+
36
+ EventEngine::Closure* BasicWorkQueue::PopMostRecent() {
37
+ grpc_core::MutexLock lock(&mu_);
38
+ if (q_.empty()) return nullptr;
39
+ auto tmp = q_.back();
40
+ q_.pop_back();
41
+ return tmp;
42
+ }
43
+
44
+ EventEngine::Closure* BasicWorkQueue::PopOldest() {
45
+ grpc_core::MutexLock lock(&mu_);
46
+ if (q_.empty()) return nullptr;
47
+ auto tmp = q_.front();
48
+ q_.pop_front();
49
+ return tmp;
50
+ }
51
+
52
+ void BasicWorkQueue::Add(EventEngine::Closure* closure) {
53
+ grpc_core::MutexLock lock(&mu_);
54
+ q_.push_back(closure);
55
+ }
56
+
57
+ void BasicWorkQueue::Add(absl::AnyInvocable<void()> invocable) {
58
+ grpc_core::MutexLock lock(&mu_);
59
+ q_.push_back(SelfDeletingClosure::Create(std::move(invocable)));
60
+ }
61
+
62
+ } // namespace experimental
63
+ } // namespace grpc_event_engine
@@ -0,0 +1,71 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_BASIC_WORK_QUEUE_H
15
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_BASIC_WORK_QUEUE_H
16
+ #include <grpc/support/port_platform.h>
17
+
18
+ #include <stddef.h>
19
+
20
+ #include <deque>
21
+
22
+ #include "absl/base/thread_annotations.h"
23
+ #include "absl/functional/any_invocable.h"
24
+
25
+ #include <grpc/event_engine/event_engine.h>
26
+
27
+ #include "src/core/lib/event_engine/work_queue/work_queue.h"
28
+ #include "src/core/lib/gprpp/sync.h"
29
+
30
+ namespace grpc_event_engine {
31
+ namespace experimental {
32
+
33
+ // A basic WorkQueue implementation that guards an std::deque with a Mutex
34
+ //
35
+ // Implementation note: q_.back is the most recent. q_.front is the oldest. New
36
+ // closures are added to the back.
37
+ class BasicWorkQueue : public WorkQueue {
38
+ public:
39
+ BasicWorkQueue() = default;
40
+ // Returns whether the queue is empty
41
+ bool Empty() const override ABSL_LOCKS_EXCLUDED(mu_);
42
+ // Returns the size of the queue.
43
+ size_t Size() const override ABSL_LOCKS_EXCLUDED(mu_);
44
+ // Returns the most recent element from the queue, or nullptr if either empty
45
+ // or the queue is under contention. This is the fastest way to retrieve
46
+ // elements from the queue.
47
+ //
48
+ // This method may return nullptr even if the queue is not empty.
49
+ EventEngine::Closure* PopMostRecent() override ABSL_LOCKS_EXCLUDED(mu_);
50
+ // Returns the most recent element from the queue, or nullptr if either empty
51
+ // or the queue is under contention.
52
+ // This is expected to be the slower of the two ways to retrieve closures from
53
+ // the queue.
54
+ //
55
+ // This method may return nullptr even if the queue is not empty.
56
+ EventEngine::Closure* PopOldest() override ABSL_LOCKS_EXCLUDED(mu_);
57
+ // Adds a closure to the queue.
58
+ void Add(EventEngine::Closure* closure) override ABSL_LOCKS_EXCLUDED(mu_);
59
+ // Wraps an AnyInvocable and adds it to the the queue.
60
+ void Add(absl::AnyInvocable<void()> invocable) override
61
+ ABSL_LOCKS_EXCLUDED(mu_);
62
+
63
+ private:
64
+ mutable grpc_core::Mutex mu_;
65
+ std::deque<EventEngine::Closure*> q_ ABSL_GUARDED_BY(mu_);
66
+ };
67
+
68
+ } // namespace experimental
69
+ } // namespace grpc_event_engine
70
+
71
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_BASIC_WORK_QUEUE_H
@@ -0,0 +1,62 @@
1
+ // Copyright 2022 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_WORK_QUEUE_H
15
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_WORK_QUEUE_H
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <stddef.h>
20
+
21
+ #include "absl/functional/any_invocable.h"
22
+
23
+ #include <grpc/event_engine/event_engine.h>
24
+
25
+ namespace grpc_event_engine {
26
+ namespace experimental {
27
+
28
+ // An interface for thread-safe EventEngine callback work queues.
29
+ //
30
+ // Implementations should be optimized for LIFO operations using PopMostRecent.
31
+ // All methods must be guaranteed thread-safe.
32
+ class WorkQueue {
33
+ public:
34
+ virtual ~WorkQueue() = default;
35
+ // Returns whether the queue is empty.
36
+ virtual bool Empty() const = 0;
37
+ // Returns the size of the queue.
38
+ virtual size_t Size() const = 0;
39
+ // Returns the most recent element from the queue. This is the fastest way to
40
+ // retrieve elements from the queue.
41
+ //
42
+ // Implementations are permitted to return nullptr even if the queue is not
43
+ // empty. This is to support potential optimizations.
44
+ virtual EventEngine::Closure* PopMostRecent() = 0;
45
+ // Returns the most recent element from the queue, or nullptr if either empty
46
+ // or the queue is under contention.
47
+ // This is expected to be the slower of the two ways to retrieve closures from
48
+ // the queue.
49
+ //
50
+ // Implementations are permitted to return nullptr even if the queue is not
51
+ // empty. This is to support potential optimizations.
52
+ virtual EventEngine::Closure* PopOldest() = 0;
53
+ // Adds a closure to the queue.
54
+ virtual void Add(EventEngine::Closure* closure) = 0;
55
+ // Wraps an AnyInvocable and adds it to the the queue.
56
+ virtual void Add(absl::AnyInvocable<void()> invocable) = 0;
57
+ };
58
+
59
+ } // namespace experimental
60
+ } // namespace grpc_event_engine
61
+
62
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_WORK_QUEUE_WORK_QUEUE_H
@@ -21,7 +21,9 @@
21
21
  #include <algorithm>
22
22
  #include <atomic>
23
23
  #include <string>
24
+ #include <utility>
24
25
 
26
+ #include "absl/functional/any_invocable.h"
25
27
  #include "absl/strings/ascii.h"
26
28
  #include "absl/strings/str_cat.h"
27
29
  #include "absl/strings/str_split.h"
@@ -48,15 +50,23 @@ struct ForcedExperiment {
48
50
  };
49
51
  ForcedExperiment g_forced_experiments[kNumExperiments];
50
52
 
51
- std::atomic<bool> g_loaded;
53
+ std::atomic<bool> g_loaded(false);
54
+
55
+ absl::AnyInvocable<bool(struct ExperimentMetadata)>* g_check_constraints_cb =
56
+ nullptr;
52
57
 
53
58
  GPR_ATTRIBUTE_NOINLINE Experiments LoadExperimentsFromConfigVariable() {
54
- GPR_ASSERT(g_loaded.exchange(true, std::memory_order_relaxed) == false);
59
+ g_loaded.store(true, std::memory_order_relaxed);
55
60
  // Set defaults from metadata.
56
61
  Experiments experiments;
57
62
  for (size_t i = 0; i < kNumExperiments; i++) {
58
63
  if (!g_forced_experiments[i].forced) {
59
- experiments.enabled[i] = g_experiment_metadata[i].default_value;
64
+ if (g_check_constraints_cb != nullptr) {
65
+ experiments.enabled[i] =
66
+ (*g_check_constraints_cb)(g_experiment_metadata[i]);
67
+ } else {
68
+ experiments.enabled[i] = g_experiment_metadata[i].default_value;
69
+ }
60
70
  } else {
61
71
  experiments.enabled[i] = g_forced_experiments[i].value;
62
72
  }
@@ -92,14 +102,23 @@ GPR_ATTRIBUTE_NOINLINE Experiments LoadExperimentsFromConfigVariable() {
92
102
  }
93
103
  return experiments;
94
104
  }
95
- } // namespace
96
105
 
97
- bool IsExperimentEnabled(size_t experiment_id) {
106
+ Experiments& ExperimentsSingleton() {
98
107
  // One time initialization:
99
- static const NoDestruct<Experiments> experiments{
108
+ static NoDestruct<Experiments> experiments{
100
109
  LoadExperimentsFromConfigVariable()};
110
+ return *experiments;
111
+ }
112
+ } // namespace
113
+
114
+ void TestOnlyReloadExperimentsFromConfigVariables() {
115
+ ExperimentsSingleton() = LoadExperimentsFromConfigVariable();
116
+ PrintExperimentsList();
117
+ }
118
+
119
+ bool IsExperimentEnabled(size_t experiment_id) {
101
120
  // Normal path: just return the value;
102
- return experiments->enabled[experiment_id];
121
+ return ExperimentsSingleton().enabled[experiment_id];
103
122
  }
104
123
 
105
124
  void PrintExperimentsList() {
@@ -142,6 +161,13 @@ void ForceEnableExperiment(absl::string_view experiment, bool enable) {
142
161
  std::string(experiment).c_str(), enable ? "enable" : "disable");
143
162
  }
144
163
 
164
+ void RegisterExperimentConstraintsValidator(
165
+ absl::AnyInvocable<bool(struct ExperimentMetadata)> check_constraints_cb) {
166
+ g_check_constraints_cb =
167
+ new absl::AnyInvocable<bool(struct ExperimentMetadata)>(
168
+ std::move(check_constraints_cb));
169
+ }
170
+
145
171
  } // namespace grpc_core
146
172
  #else
147
173
  namespace grpc_core {
@@ -150,5 +176,10 @@ void ForceEnableExperiment(absl::string_view experiment_name, bool) {
150
176
  Crash(absl::StrCat("ForceEnableExperiment(\"", experiment_name,
151
177
  "\") called in final build"));
152
178
  }
179
+
180
+ void RegisterExperimentConstraintsValidator(
181
+ absl::AnyInvocable<
182
+ bool(struct ExperimentMetadata)> /*check_constraints_cb*/) {}
183
+
153
184
  } // namespace grpc_core
154
185
  #endif
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <stddef.h>
21
21
 
22
+ #include "absl/functional/any_invocable.h"
22
23
  #include "absl/strings/string_view.h"
23
24
 
24
25
  // #define GRPC_EXPERIMENTS_ARE_FINAL
@@ -30,6 +31,12 @@ namespace grpc_core {
30
31
  // Experiments are numbered by their order in the g_experiment_metadata array
31
32
  // declared in experiments.h.
32
33
  bool IsExperimentEnabled(size_t experiment_id);
34
+
35
+ // Reload experiment state from config variables.
36
+ // Does not change ForceEnableExperiment state.
37
+ // Expects the caller to handle global thread safety - so really only
38
+ // appropriate for carefully written tests.
39
+ void TestOnlyReloadExperimentsFromConfigVariables();
33
40
  #endif
34
41
 
35
42
  // Print out a list of all experiments that are built into this binary.
@@ -45,9 +52,18 @@ void ForceEnableExperiment(absl::string_view experiment_name, bool enable);
45
52
  struct ExperimentMetadata {
46
53
  const char* name;
47
54
  const char* description;
55
+ const char* additional_constaints;
48
56
  bool default_value;
57
+ bool allow_in_fuzzing_config;
49
58
  };
50
59
 
60
+ // Register a function to be called to validate the value an experiment can
61
+ // take subject to additional constraints.
62
+ // The function will take the ExperimentMetadata as its argument. It will return
63
+ // a bool value indicating the actual value the experiment should take.
64
+ void RegisterExperimentConstraintsValidator(
65
+ absl::AnyInvocable<bool(struct ExperimentMetadata)> check_constraints_cb);
66
+
51
67
  } // namespace grpc_core
52
68
 
53
69
  #endif // GRPC_SRC_CORE_LIB_EXPERIMENTS_CONFIG_H