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.
- checksums.yaml +4 -4
- data/Makefile +100 -68
- data/include/grpc/event_engine/event_engine.h +4 -3
- data/include/grpc/grpc_audit_logging.h +96 -0
- data/include/grpc/module.modulemap +2 -0
- data/include/grpc/support/json.h +218 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
- data/src/core/ext/filters/client_channel/client_channel.cc +86 -104
- data/src/core/ext/filters/client_channel/client_channel.h +6 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
- data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
- data/src/core/ext/filters/client_channel/config_selector.h +9 -24
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
- data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
- data/src/core/ext/filters/client_channel/subchannel.h +3 -43
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
- data/src/core/ext/xds/certificate_provider_store.cc +4 -9
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
- data/src/core/ext/xds/xds_api.cc +9 -6
- data/src/core/ext/xds/xds_api.h +3 -2
- data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
- data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
- data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
- data/src/core/ext/xds/xds_client.cc +5 -4
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_cluster.cc +20 -19
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
- data/src/core/ext/xds/xds_common_types.cc +3 -1
- data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
- data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
- data/src/core/ext/xds/xds_http_filters.h +4 -2
- data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
- data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
- data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
- data/src/core/ext/xds/xds_listener.cc +1 -0
- data/src/core/ext/xds/xds_route_config.cc +40 -3
- data/src/core/ext/xds/xds_routing.cc +2 -2
- data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
- data/src/core/lib/avl/avl.h +5 -0
- data/src/core/lib/channel/channel_args.cc +80 -22
- data/src/core/lib/channel/channel_args.h +34 -1
- data/src/core/lib/channel/channel_trace.cc +16 -12
- data/src/core/lib/channel/channelz.cc +159 -132
- data/src/core/lib/channel/channelz.h +42 -35
- data/src/core/lib/channel/channelz_registry.cc +23 -20
- data/src/core/lib/channel/connected_channel.cc +17 -6
- data/src/core/lib/channel/promise_based_filter.cc +0 -4
- data/src/core/lib/channel/promise_based_filter.h +2 -0
- data/src/core/lib/compression/compression_internal.cc +2 -5
- data/src/core/lib/config/config_vars.cc +20 -18
- data/src/core/lib/config/config_vars.h +4 -4
- data/src/core/lib/config/load_config.cc +13 -0
- data/src/core/lib/config/load_config.h +6 -0
- data/src/core/lib/debug/event_log.h +1 -1
- data/src/core/lib/debug/stats_data.h +1 -1
- data/src/core/lib/debug/trace.cc +24 -55
- data/src/core/lib/debug/trace.h +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
- data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
- data/src/core/lib/event_engine/default_event_engine.cc +13 -1
- data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
- data/src/core/lib/event_engine/poller.h +2 -2
- data/src/core/lib/event_engine/posix.h +4 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +33 -19
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
- data/src/core/lib/event_engine/shim.cc +7 -1
- data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
- data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
- data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
- data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
- data/src/core/lib/event_engine/windows/iocp.cc +4 -3
- data/src/core/lib/event_engine/windows/iocp.h +3 -3
- data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
- data/src/core/lib/event_engine/windows/win_socket.h +4 -4
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
- data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
- data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
- data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
- data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
- data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
- data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
- data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
- data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
- data/src/core/lib/experiments/config.cc +38 -7
- data/src/core/lib/experiments/config.h +16 -0
- data/src/core/lib/experiments/experiments.cc +67 -20
- data/src/core/lib/experiments/experiments.h +27 -21
- data/src/core/lib/gpr/log_internal.h +55 -0
- data/src/core/lib/gprpp/crash.cc +10 -0
- data/src/core/lib/gprpp/crash.h +3 -0
- data/src/core/lib/gprpp/per_cpu.cc +33 -0
- data/src/core/lib/gprpp/per_cpu.h +29 -6
- data/src/core/lib/gprpp/time.cc +1 -0
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
- data/src/core/lib/iomgr/ev_apple.cc +12 -12
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
- data/src/core/lib/iomgr/iocp_windows.cc +24 -3
- data/src/core/lib/iomgr/iocp_windows.h +11 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
- data/src/core/lib/iomgr/socket_windows.cc +61 -7
- data/src/core/lib/iomgr/socket_windows.h +9 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
- data/src/core/lib/iomgr/tcp_server_posix.cc +148 -107
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
- data/src/core/lib/json/json.h +2 -166
- data/src/core/lib/json/json_object_loader.cc +8 -9
- data/src/core/lib/json/json_object_loader.h +25 -18
- data/src/core/lib/json/json_reader.cc +13 -6
- data/src/core/lib/json/json_util.cc +6 -11
- data/src/core/lib/json/json_writer.cc +7 -8
- data/src/core/lib/load_balancing/lb_policy.h +13 -0
- data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/matchers/matchers.h +2 -1
- data/src/core/lib/promise/activity.cc +5 -0
- data/src/core/lib/promise/activity.h +10 -0
- data/src/core/lib/promise/detail/promise_factory.h +1 -1
- data/src/core/lib/promise/party.cc +31 -13
- data/src/core/lib/promise/party.h +11 -2
- data/src/core/lib/promise/pipe.h +9 -2
- data/src/core/lib/promise/prioritized_race.h +95 -0
- data/src/core/lib/promise/sleep.cc +2 -1
- data/src/core/lib/resolver/server_address.cc +0 -8
- data/src/core/lib/resolver/server_address.h +0 -6
- data/src/core/lib/resource_quota/memory_quota.cc +7 -7
- data/src/core/lib/resource_quota/memory_quota.h +1 -2
- data/src/core/lib/security/authorization/audit_logging.cc +98 -0
- data/src/core/lib/security/authorization/audit_logging.h +73 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
- data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
- data/src/core/lib/security/authorization/rbac_policy.h +19 -2
- data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
- data/src/core/lib/security/authorization/stdout_logger.h +61 -0
- data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
- data/src/core/lib/security/util/json_util.cc +1 -0
- data/src/core/lib/service_config/service_config_call_data.h +49 -20
- data/src/core/lib/service_config/service_config_impl.cc +2 -1
- data/src/core/lib/surface/call.cc +38 -23
- data/src/core/lib/surface/completion_queue.cc +6 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/batch_builder.cc +15 -12
- data/src/core/lib/transport/batch_builder.h +39 -35
- data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
- data/src/ruby/ext/grpc/extconf.rb +8 -9
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
- data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
- data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
- data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
- data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
- data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
- data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
- data/third_party/cares/cares/include/ares.h +23 -1
- data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
- data/third_party/cares/cares/include/ares_rules.h +2 -2
- data/third_party/cares/cares/include/ares_version.h +3 -3
- data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
- data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
- data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
- data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
- data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
- data/third_party/cares/cares/src/lib/ares_data.c +16 -0
- data/third_party/cares/cares/src/lib/ares_data.h +7 -0
- data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
- data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
- data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
- data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
- data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
- data/third_party/cares/cares/src/lib/ares_init.c +97 -485
- data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
- data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
- data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
- data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
- data/third_party/cares/cares/src/lib/ares_private.h +30 -16
- data/third_party/cares/cares/src/lib/ares_process.c +55 -16
- data/third_party/cares/cares/src/lib/ares_query.c +1 -35
- data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
- data/third_party/cares/cares/src/lib/ares_send.c +5 -7
- data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
- data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
- data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
- data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
- data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
- metadata +48 -12
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
- data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
- 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(
|
36
|
-
:
|
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,
|
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(
|
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
|
-
|
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,
|
41
|
+
WinSocket::WinSocket(SOCKET socket, ThreadPool* thread_pool) noexcept
|
42
42
|
: socket_(socket),
|
43
|
-
|
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
|
-
|
93
|
+
thread_pool_->Run(closure);
|
94
94
|
return;
|
95
95
|
};
|
96
96
|
if (std::exchange(info.has_pending_iocp_, false)) {
|
97
|
-
|
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_->
|
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/
|
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
|
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,
|
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
|
-
|
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
|