grpc 1.55.0 → 1.56.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (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 +48 -12
  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,249 @@
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
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREAD_POOL_WORK_STEALING_THREAD_POOL_H
19
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREAD_POOL_WORK_STEALING_THREAD_POOL_H
20
+
21
+ #include <grpc/support/port_platform.h>
22
+
23
+ #include <stddef.h>
24
+ #include <stdint.h>
25
+
26
+ #include <atomic>
27
+ #include <memory>
28
+
29
+ #include "absl/base/thread_annotations.h"
30
+ #include "absl/container/flat_hash_set.h"
31
+ #include "absl/functional/any_invocable.h"
32
+
33
+ #include <grpc/event_engine/event_engine.h>
34
+
35
+ #include "src/core/lib/backoff/backoff.h"
36
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.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/sync.h"
40
+ #include "src/core/lib/gprpp/time.h"
41
+
42
+ namespace grpc_event_engine {
43
+ namespace experimental {
44
+
45
+ class WorkStealingThreadPool final : public ThreadPool {
46
+ public:
47
+ explicit WorkStealingThreadPool(size_t reserve_threads);
48
+ // Asserts Quiesce was called.
49
+ ~WorkStealingThreadPool() override;
50
+ // Shut down the pool, and wait for all threads to exit.
51
+ // This method is safe to call from within a ThreadPool thread.
52
+ void Quiesce() override;
53
+ // Run must not be called after Quiesce completes
54
+ void Run(absl::AnyInvocable<void()> callback) override;
55
+ void Run(EventEngine::Closure* closure) override;
56
+
57
+ // Forkable
58
+ // These methods are exposed on the public object to allow for testing.
59
+ void PrepareFork() override;
60
+ void PostforkParent() override;
61
+ void PostforkChild() override;
62
+
63
+ private:
64
+ // A basic communication mechanism to signal waiting threads that work is
65
+ // available.
66
+ class WorkSignal {
67
+ public:
68
+ void Signal();
69
+ void SignalAll();
70
+ // Returns whether a timeout occurred.
71
+ bool WaitWithTimeout(grpc_core::Duration time);
72
+
73
+ private:
74
+ grpc_core::Mutex mu_;
75
+ grpc_core::CondVar cv_ ABSL_GUARDED_BY(mu_);
76
+ };
77
+
78
+ // Types of thread counts.
79
+ // Note this is intentionally not an enum class, the keys are used as indexes
80
+ // into the ThreadCount's private array.
81
+ enum CounterType {
82
+ kLivingThreadCount = 0,
83
+ kBusyCount,
84
+ };
85
+
86
+ class ThreadCount {
87
+ public:
88
+ // Adds 1 to the thread count for that counter type.
89
+ void Add(CounterType counter_type);
90
+ // Subtracts 1 from the thread count for that counter type.
91
+ void Remove(CounterType counter_type);
92
+ // Blocks until the thread count for that type reaches `desired_threads`.
93
+ void BlockUntilThreadCount(CounterType counter_type, int desired_threads,
94
+ const char* why, WorkSignal* work_signal);
95
+ // Returns the current thread count for the tracked type.
96
+ size_t GetCount(CounterType counter_type);
97
+
98
+ // Adds and removes thread counts on construction and destruction
99
+ class AutoThreadCount {
100
+ public:
101
+ AutoThreadCount(ThreadCount* counter, CounterType counter_type);
102
+ ~AutoThreadCount();
103
+
104
+ private:
105
+ ThreadCount* counter_;
106
+ CounterType counter_type_;
107
+ };
108
+
109
+ private:
110
+ std::atomic<size_t> thread_counts_[2]{{0}, {0}};
111
+ };
112
+
113
+ // A pool of WorkQueues that participate in work stealing.
114
+ //
115
+ // Every worker thread registers and unregisters its thread-local thread pool
116
+ // here, and steals closures from other threads when work is otherwise
117
+ // unavailable.
118
+ class TheftRegistry {
119
+ public:
120
+ // Allow any member of the registry to steal from the provided queue.
121
+ void Enroll(WorkQueue* queue) ABSL_LOCKS_EXCLUDED(mu_);
122
+ // Disallow work stealing from the provided queue.
123
+ void Unenroll(WorkQueue* queue) ABSL_LOCKS_EXCLUDED(mu_);
124
+ // Returns one closure from another thread, or nullptr if none are
125
+ // available.
126
+ EventEngine::Closure* StealOne() ABSL_LOCKS_EXCLUDED(mu_);
127
+
128
+ private:
129
+ grpc_core::Mutex mu_;
130
+ absl::flat_hash_set<WorkQueue*> queues_ ABSL_GUARDED_BY(mu_);
131
+ };
132
+
133
+ // An implementation of the ThreadPool
134
+ // This object is held as a shared_ptr between the owning ThreadPool and each
135
+ // worker thread. This design allows a ThreadPool worker thread to be the last
136
+ // owner of the ThreadPool itself.
137
+ class WorkStealingThreadPoolImpl
138
+ : public std::enable_shared_from_this<WorkStealingThreadPoolImpl> {
139
+ public:
140
+ explicit WorkStealingThreadPoolImpl(size_t reserve_threads);
141
+ // Start all threads.
142
+ void Start();
143
+ // Add a closure to a work queue, preferably a thread-local queue if
144
+ // available, otherwise the global queue.
145
+ void Run(EventEngine::Closure* closure);
146
+ // Start a new thread.
147
+ // The reason argument determines whether thread creation is rate-limited;
148
+ // threads created to populate the initial pool are not rate-limited, but
149
+ // all others thread creation scenarios are rate-limited.
150
+ void StartThread();
151
+ // Shut down the pool, and wait for all threads to exit.
152
+ // This method is safe to call from within a ThreadPool thread.
153
+ void Quiesce();
154
+ // Sets a throttled state.
155
+ // After the initial pool has been created, if the pool is backlogged when a
156
+ // new thread has started, it is rate limited.
157
+ // Returns the previous throttling state.
158
+ bool SetThrottled(bool throttle);
159
+ // Set the shutdown flag.
160
+ void SetShutdown(bool is_shutdown);
161
+ // Set the forking flag.
162
+ void SetForking(bool is_forking);
163
+ // Forkable
164
+ // Ensures that the thread pool is empty before forking.
165
+ // Postfork parent and child have the same behavior.
166
+ void PrepareFork();
167
+ void Postfork();
168
+ // Accessor methods
169
+ bool IsShutdown();
170
+ bool IsForking();
171
+ bool IsQuiesced();
172
+ size_t reserve_threads() { return reserve_threads_; }
173
+ ThreadCount* thread_count() { return &thread_count_; }
174
+ TheftRegistry* theft_registry() { return &theft_registry_; }
175
+ WorkQueue* queue() { return &queue_; }
176
+ WorkSignal* work_signal() { return &work_signal_; }
177
+
178
+ private:
179
+ // Lifeguard monitors the pool and keeps it healthy.
180
+ // It has two main responsibilities:
181
+ // * scale the pool to match demand.
182
+ // * distribute work to worker threads if the global queue is backing up
183
+ // and there are threads that can accept work.
184
+ class Lifeguard {
185
+ public:
186
+ Lifeguard();
187
+ // Start the lifeguard thread.
188
+ void Start(std::shared_ptr<WorkStealingThreadPoolImpl> pool);
189
+ // Block until the lifeguard thread is shut down.
190
+ void BlockUntilShutdown();
191
+
192
+ private:
193
+ // The main body of the lifeguard thread.
194
+ void LifeguardMain();
195
+ // Starts a new thread if the pool is backlogged
196
+ void MaybeStartNewThread();
197
+ std::shared_ptr<WorkStealingThreadPoolImpl> pool_;
198
+ grpc_core::BackOff backoff_;
199
+ std::atomic<bool> thread_running_{false};
200
+ };
201
+
202
+ const size_t reserve_threads_;
203
+ ThreadCount thread_count_;
204
+ TheftRegistry theft_registry_;
205
+ BasicWorkQueue queue_;
206
+ // Track shutdown and fork bits separately.
207
+ // It's possible for a ThreadPool to initiate shut down while fork handlers
208
+ // are running, and similarly possible for a fork event to occur during
209
+ // shutdown.
210
+ std::atomic<bool> shutdown_{false};
211
+ std::atomic<bool> forking_{false};
212
+ std::atomic<bool> quiesced_{false};
213
+ std::atomic<uint64_t> last_started_thread_{0};
214
+ // After pool creation we use this to rate limit creation of threads to one
215
+ // at a time.
216
+ std::atomic<bool> throttled_{false};
217
+ WorkSignal work_signal_;
218
+ Lifeguard lifeguard_;
219
+ };
220
+
221
+ class ThreadState {
222
+ public:
223
+ explicit ThreadState(std::shared_ptr<WorkStealingThreadPoolImpl> pool);
224
+ void ThreadBody();
225
+ void SleepIfRunning();
226
+ bool Step();
227
+ // After the pool is shut down, ensure all local and global callbacks are
228
+ // executed before quitting the thread.
229
+ void FinishDraining();
230
+
231
+ private:
232
+ // pool_ must be the first member so that it is alive when the thread count
233
+ // is decremented at time of destruction. This is necessary when this thread
234
+ // state holds the last shared_ptr keeping the pool alive.
235
+ std::shared_ptr<WorkStealingThreadPoolImpl> pool_;
236
+ // auto_thread_count_ must be the second member declared, so that the thread
237
+ // count is decremented after all other state is cleaned up (preventing
238
+ // leaks).
239
+ ThreadCount::AutoThreadCount auto_thread_count_;
240
+ grpc_core::BackOff backoff_;
241
+ };
242
+
243
+ const std::shared_ptr<WorkStealingThreadPoolImpl> pool_;
244
+ };
245
+
246
+ } // namespace experimental
247
+ } // namespace grpc_event_engine
248
+
249
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREAD_POOL_WORK_STEALING_THREAD_POOL_H
@@ -0,0 +1,166 @@
1
+ // Copyright 2023 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
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/event_engine/thready_event_engine/thready_event_engine.h"
18
+
19
+ #include <memory>
20
+ #include <string>
21
+ #include <type_traits>
22
+ #include <vector>
23
+
24
+ #include "src/core/lib/gprpp/crash.h"
25
+ #include "src/core/lib/gprpp/thd.h"
26
+
27
+ namespace grpc_event_engine {
28
+ namespace experimental {
29
+
30
+ void ThreadyEventEngine::Asynchronously(absl::AnyInvocable<void()> fn) {
31
+ grpc_core::Thread t("thready_event_engine", std::move(fn), nullptr,
32
+ grpc_core::Thread::Options().set_joinable(false));
33
+ t.Start();
34
+ }
35
+
36
+ absl::StatusOr<std::unique_ptr<EventEngine::Listener>>
37
+ ThreadyEventEngine::CreateListener(
38
+ Listener::AcceptCallback on_accept,
39
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
40
+ const EndpointConfig& config,
41
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory) {
42
+ return impl_->CreateListener(
43
+ [this, on_accept = std::make_shared<Listener::AcceptCallback>(
44
+ std::move(on_accept))](std::unique_ptr<Endpoint> endpoint,
45
+ MemoryAllocator memory_allocator) {
46
+ Asynchronously(
47
+ [on_accept, endpoint = std::move(endpoint),
48
+ memory_allocator = std::move(memory_allocator)]() mutable {
49
+ (*on_accept)(std::move(endpoint), std::move(memory_allocator));
50
+ });
51
+ },
52
+ [this,
53
+ on_shutdown = std::move(on_shutdown)](absl::Status status) mutable {
54
+ Asynchronously([on_shutdown = std::move(on_shutdown),
55
+ status = std::move(status)]() mutable {
56
+ on_shutdown(std::move(status));
57
+ });
58
+ },
59
+ config, std::move(memory_allocator_factory));
60
+ }
61
+
62
+ EventEngine::ConnectionHandle ThreadyEventEngine::Connect(
63
+ OnConnectCallback on_connect, const ResolvedAddress& addr,
64
+ const EndpointConfig& args, MemoryAllocator memory_allocator,
65
+ Duration timeout) {
66
+ return impl_->Connect(
67
+ [this, on_connect = std::move(on_connect)](
68
+ absl::StatusOr<std::unique_ptr<Endpoint>> c) mutable {
69
+ Asynchronously(
70
+ [on_connect = std::move(on_connect), c = std::move(c)]() mutable {
71
+ on_connect(std::move(c));
72
+ });
73
+ },
74
+ addr, args, std::move(memory_allocator), timeout);
75
+ }
76
+
77
+ bool ThreadyEventEngine::CancelConnect(ConnectionHandle handle) {
78
+ return impl_->CancelConnect(handle);
79
+ }
80
+
81
+ bool ThreadyEventEngine::IsWorkerThread() {
82
+ grpc_core::Crash("we should remove this");
83
+ }
84
+
85
+ std::unique_ptr<EventEngine::DNSResolver> ThreadyEventEngine::GetDNSResolver(
86
+ const DNSResolver::ResolverOptions& options) {
87
+ return std::make_unique<ThreadyDNSResolver>(impl_->GetDNSResolver(options));
88
+ }
89
+
90
+ void ThreadyEventEngine::Run(Closure* closure) {
91
+ Run([closure]() { closure->Run(); });
92
+ }
93
+
94
+ void ThreadyEventEngine::Run(absl::AnyInvocable<void()> closure) {
95
+ Asynchronously(std::move(closure));
96
+ }
97
+
98
+ EventEngine::TaskHandle ThreadyEventEngine::RunAfter(Duration when,
99
+ Closure* closure) {
100
+ return RunAfter(when, [closure]() { closure->Run(); });
101
+ }
102
+
103
+ EventEngine::TaskHandle ThreadyEventEngine::RunAfter(
104
+ Duration when, absl::AnyInvocable<void()> closure) {
105
+ return impl_->RunAfter(when, [this, closure = std::move(closure)]() mutable {
106
+ Asynchronously(std::move(closure));
107
+ });
108
+ }
109
+
110
+ bool ThreadyEventEngine::Cancel(TaskHandle handle) {
111
+ return impl_->Cancel(handle);
112
+ }
113
+
114
+ EventEngine::DNSResolver::LookupTaskHandle
115
+ ThreadyEventEngine::ThreadyDNSResolver::LookupHostname(
116
+ LookupHostnameCallback on_resolve, absl::string_view name,
117
+ absl::string_view default_port, Duration timeout) {
118
+ return impl_->LookupHostname(
119
+ [this, on_resolve = std::move(on_resolve)](
120
+ absl::StatusOr<std::vector<ResolvedAddress>> addresses) mutable {
121
+ engine_->Asynchronously([on_resolve = std::move(on_resolve),
122
+ addresses = std::move(addresses)]() mutable {
123
+ on_resolve(std::move(addresses));
124
+ });
125
+ },
126
+ name, default_port, timeout);
127
+ }
128
+
129
+ EventEngine::DNSResolver::LookupTaskHandle
130
+ ThreadyEventEngine::ThreadyDNSResolver::LookupSRV(LookupSRVCallback on_resolve,
131
+ absl::string_view name,
132
+ Duration timeout) {
133
+ return impl_->LookupSRV(
134
+ [this, on_resolve = std::move(on_resolve)](
135
+ absl::StatusOr<std::vector<SRVRecord>> records) mutable {
136
+ return engine_->Asynchronously(
137
+ [on_resolve = std::move(on_resolve),
138
+ records = std::move(records)]() mutable {
139
+ on_resolve(std::move(records));
140
+ });
141
+ },
142
+ name, timeout);
143
+ }
144
+
145
+ EventEngine::DNSResolver::LookupTaskHandle
146
+ ThreadyEventEngine::ThreadyDNSResolver::LookupTXT(LookupTXTCallback on_resolve,
147
+ absl::string_view name,
148
+ Duration timeout) {
149
+ return impl_->LookupTXT(
150
+ [this, on_resolve = std::move(on_resolve)](
151
+ absl::StatusOr<std::vector<std::string>> record) mutable {
152
+ return engine_->Asynchronously([on_resolve = std::move(on_resolve),
153
+ record = std::move(record)]() mutable {
154
+ on_resolve(std::move(record));
155
+ });
156
+ },
157
+ name, timeout);
158
+ }
159
+
160
+ bool ThreadyEventEngine::ThreadyDNSResolver::CancelLookup(
161
+ LookupTaskHandle handle) {
162
+ return impl_->CancelLookup(handle);
163
+ }
164
+
165
+ } // namespace experimental
166
+ } // namespace grpc_event_engine
@@ -0,0 +1,108 @@
1
+ // Copyright 2023 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
+
15
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREADY_EVENT_ENGINE_THREADY_EVENT_ENGINE_H
16
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREADY_EVENT_ENGINE_THREADY_EVENT_ENGINE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <memory>
21
+ #include <utility>
22
+
23
+ #include "absl/functional/any_invocable.h"
24
+ #include "absl/status/status.h"
25
+ #include "absl/status/statusor.h"
26
+ #include "absl/strings/string_view.h"
27
+
28
+ #include <grpc/event_engine/endpoint_config.h>
29
+ #include <grpc/event_engine/event_engine.h>
30
+ #include <grpc/event_engine/memory_allocator.h>
31
+
32
+ namespace grpc_event_engine {
33
+ namespace experimental {
34
+
35
+ // An EventEngine that spawns a thread at every available opportunity:
36
+ // - Run() spawns a thread
37
+ // - RunAfter() schedules a timer that spawns a thread to run the callback
38
+ // - Endpoint operations spawn threads and then call the underlying event engine
39
+ // functions
40
+ // Implemented as a decorator around a complete EventEngine so that it need not
41
+ // deal with OS details.
42
+ // This event engine is intended to be used for testing with TSAN to maximize
43
+ // its visibility into race conditions in the calling code.
44
+ class ThreadyEventEngine final : public EventEngine {
45
+ public:
46
+ explicit ThreadyEventEngine(std::shared_ptr<EventEngine> impl)
47
+ : impl_(std::move(impl)) {}
48
+
49
+ absl::StatusOr<std::unique_ptr<Listener>> CreateListener(
50
+ Listener::AcceptCallback on_accept,
51
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
52
+ const EndpointConfig& config,
53
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory)
54
+ override;
55
+
56
+ ConnectionHandle Connect(OnConnectCallback on_connect,
57
+ const ResolvedAddress& addr,
58
+ const EndpointConfig& args,
59
+ MemoryAllocator memory_allocator,
60
+ Duration timeout) override;
61
+
62
+ bool CancelConnect(ConnectionHandle handle) override;
63
+
64
+ bool IsWorkerThread() override;
65
+
66
+ std::unique_ptr<DNSResolver> GetDNSResolver(
67
+ const DNSResolver::ResolverOptions& options) override;
68
+
69
+ void Run(Closure* closure) override;
70
+ void Run(absl::AnyInvocable<void()> closure) override;
71
+
72
+ TaskHandle RunAfter(Duration when, Closure* closure) override;
73
+ TaskHandle RunAfter(Duration when,
74
+ absl::AnyInvocable<void()> closure) override;
75
+
76
+ bool Cancel(TaskHandle handle) override;
77
+
78
+ private:
79
+ class ThreadyDNSResolver final : public DNSResolver {
80
+ public:
81
+ explicit ThreadyDNSResolver(std::unique_ptr<DNSResolver> impl)
82
+ : impl_(std::move(impl)) {}
83
+ LookupTaskHandle LookupHostname(LookupHostnameCallback on_resolve,
84
+ absl::string_view name,
85
+ absl::string_view default_port,
86
+ Duration timeout) override;
87
+ LookupTaskHandle LookupSRV(LookupSRVCallback on_resolve,
88
+ absl::string_view name,
89
+ Duration timeout) override;
90
+ LookupTaskHandle LookupTXT(LookupTXTCallback on_resolve,
91
+ absl::string_view name,
92
+ Duration timeout) override;
93
+ bool CancelLookup(LookupTaskHandle handle) override;
94
+
95
+ private:
96
+ std::unique_ptr<DNSResolver> impl_;
97
+ ThreadyEventEngine* engine_;
98
+ };
99
+
100
+ void Asynchronously(absl::AnyInvocable<void()> fn);
101
+
102
+ std::shared_ptr<EventEngine> impl_;
103
+ };
104
+
105
+ } // namespace experimental
106
+ } // namespace grpc_event_engine
107
+
108
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_THREADY_EVENT_ENGINE_THREADY_EVENT_ENGINE_H
@@ -22,6 +22,7 @@
22
22
  #include <grpc/support/alloc.h>
23
23
  #include <grpc/support/log_windows.h>
24
24
 
25
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
25
26
  #include "src/core/lib/event_engine/time_util.h"
26
27
  #include "src/core/lib/event_engine/trace.h"
27
28
  #include "src/core/lib/event_engine/windows/iocp.h"
@@ -32,8 +33,8 @@
32
33
  namespace grpc_event_engine {
33
34
  namespace experimental {
34
35
 
35
- IOCP::IOCP(Executor* executor) noexcept
36
- : executor_(executor),
36
+ IOCP::IOCP(ThreadPool* thread_pool) noexcept
37
+ : thread_pool_(thread_pool),
37
38
  iocp_handle_(CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr,
38
39
  (ULONG_PTR) nullptr, 0)) {
39
40
  GPR_ASSERT(iocp_handle_);
@@ -44,7 +45,7 @@ IOCP::IOCP(Executor* executor) noexcept
44
45
  IOCP::~IOCP() {}
45
46
 
46
47
  std::unique_ptr<WinSocket> IOCP::Watch(SOCKET socket) {
47
- auto wrapped_socket = std::make_unique<WinSocket>(socket, executor_);
48
+ auto wrapped_socket = std::make_unique<WinSocket>(socket, thread_pool_);
48
49
  HANDLE ret = CreateIoCompletionPort(
49
50
  reinterpret_cast<HANDLE>(socket), iocp_handle_,
50
51
  reinterpret_cast<uintptr_t>(wrapped_socket.get()), 0);
@@ -22,8 +22,8 @@
22
22
 
23
23
  #include <grpc/event_engine/event_engine.h>
24
24
 
25
- #include "src/core/lib/event_engine/executor/executor.h"
26
25
  #include "src/core/lib/event_engine/poller.h"
26
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
27
27
  #include "src/core/lib/event_engine/windows/win_socket.h"
28
28
 
29
29
  namespace grpc_event_engine {
@@ -31,7 +31,7 @@ namespace experimental {
31
31
 
32
32
  class IOCP final : public Poller {
33
33
  public:
34
- explicit IOCP(Executor* executor) noexcept;
34
+ explicit IOCP(ThreadPool* thread_pool) noexcept;
35
35
  ~IOCP();
36
36
  // Not copyable
37
37
  IOCP(const IOCP&) = delete;
@@ -54,7 +54,7 @@ class IOCP final : public Poller {
54
54
  // Initialize default flags via checking platform support
55
55
  static DWORD WSASocketFlagsInit();
56
56
 
57
- Executor* executor_;
57
+ ThreadPool* thread_pool_;
58
58
  HANDLE iocp_handle_;
59
59
  OVERLAPPED kick_overlap_;
60
60
  ULONG kick_token_;
@@ -17,8 +17,8 @@
17
17
  #include <grpc/support/alloc.h>
18
18
  #include <grpc/support/log_windows.h>
19
19
 
20
- #include "src/core/lib/event_engine/executor/executor.h"
21
20
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
21
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
22
22
  #include "src/core/lib/event_engine/trace.h"
23
23
  #include "src/core/lib/event_engine/windows/win_socket.h"
24
24
  #include "src/core/lib/gprpp/debug_location.h"
@@ -38,9 +38,9 @@ namespace experimental {
38
38
 
39
39
  // ---- WinSocket ----
40
40
 
41
- WinSocket::WinSocket(SOCKET socket, Executor* executor) noexcept
41
+ WinSocket::WinSocket(SOCKET socket, ThreadPool* thread_pool) noexcept
42
42
  : socket_(socket),
43
- executor_(executor),
43
+ thread_pool_(thread_pool),
44
44
  read_info_(this),
45
45
  write_info_(this) {}
46
46
 
@@ -90,11 +90,11 @@ void WinSocket::Shutdown(const grpc_core::DebugLocation& location,
90
90
  void WinSocket::NotifyOnReady(OpState& info, EventEngine::Closure* closure) {
91
91
  if (IsShutdown()) {
92
92
  info.SetError(WSAESHUTDOWN);
93
- executor_->Run(closure);
93
+ thread_pool_->Run(closure);
94
94
  return;
95
95
  };
96
96
  if (std::exchange(info.has_pending_iocp_, false)) {
97
- executor_->Run(closure);
97
+ thread_pool_->Run(closure);
98
98
  } else {
99
99
  EventEngine::Closure* prev = nullptr;
100
100
  GPR_ASSERT(info.closure_.compare_exchange_strong(prev, closure));
@@ -120,7 +120,7 @@ void WinSocket::OpState::SetReady() {
120
120
  GPR_ASSERT(!has_pending_iocp_);
121
121
  auto* closure = closure_.exchange(nullptr);
122
122
  if (closure) {
123
- win_socket_->executor_->Run(closure);
123
+ win_socket_->thread_pool_->Run(closure);
124
124
  } else {
125
125
  has_pending_iocp_ = true;
126
126
  }
@@ -23,7 +23,7 @@
23
23
 
24
24
  #include <grpc/event_engine/event_engine.h>
25
25
 
26
- #include "src/core/lib/event_engine/executor/executor.h"
26
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
27
27
  #include "src/core/lib/gprpp/debug_location.h"
28
28
  #include "src/core/lib/gprpp/sync.h"
29
29
 
@@ -43,7 +43,7 @@ class WinSocket {
43
43
  explicit OpState(WinSocket* win_socket) noexcept;
44
44
  // Signal a result has returned
45
45
  // If a callback is already primed for notification, it will be executed via
46
- // the WinSocket's Executor. Otherwise, a "pending iocp" flag will
46
+ // the WinSocket's ThreadPool. Otherwise, a "pending iocp" flag will
47
47
  // be set.
48
48
  void SetReady();
49
49
  // Set error results for a completed op
@@ -72,7 +72,7 @@ class WinSocket {
72
72
  OverlappedResult result_;
73
73
  };
74
74
 
75
- WinSocket(SOCKET socket, Executor* executor) noexcept;
75
+ WinSocket(SOCKET socket, ThreadPool* thread_pool) noexcept;
76
76
  ~WinSocket();
77
77
  // Calling NotifyOnRead means either of two things:
78
78
  // - The IOCP already completed in the background, and we need to call
@@ -104,7 +104,7 @@ class WinSocket {
104
104
 
105
105
  SOCKET socket_;
106
106
  std::atomic<bool> is_shutdown_{false};
107
- Executor* executor_;
107
+ ThreadPool* thread_pool_;
108
108
  // These OpStates are effectively synchronized using their respective
109
109
  // OVERLAPPED structures and the Overlapped I/O APIs. For example, OpState
110
110
  // users should not attempt to read their bytes_transeferred until