grpc 1.55.3 → 1.56.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +100 -70
- 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 +82 -98
- data/src/core/ext/filters/client_channel/client_channel.h +4 -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/hpack_parser.cc +543 -567
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +9 -150
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +32 -46
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +5 -18
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
- data/src/core/ext/transport/chttp2/transport/parsing.cc +12 -12
- 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/backoff/random_early_detection.h +0 -5
- 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 +3 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -33
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -11
- 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 +156 -140
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +0 -21
- 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/validate_metadata.cc +22 -37
- data/src/core/lib/surface/validate_metadata.h +3 -13
- 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 +50 -16
- 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/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +0 -176
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +0 -325
- data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -0,0 +1,489 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2015 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h"
|
22
|
+
|
23
|
+
#include <atomic>
|
24
|
+
#include <memory>
|
25
|
+
#include <utility>
|
26
|
+
|
27
|
+
#include "absl/time/clock.h"
|
28
|
+
#include "absl/time/time.h"
|
29
|
+
|
30
|
+
#include <grpc/support/log.h>
|
31
|
+
|
32
|
+
#include "src/core/lib/backoff/backoff.h"
|
33
|
+
#include "src/core/lib/debug/trace.h"
|
34
|
+
#include "src/core/lib/event_engine/common_closures.h"
|
35
|
+
#include "src/core/lib/event_engine/thread_local.h"
|
36
|
+
#include "src/core/lib/event_engine/trace.h"
|
37
|
+
#include "src/core/lib/event_engine/work_queue/basic_work_queue.h"
|
38
|
+
#include "src/core/lib/event_engine/work_queue/work_queue.h"
|
39
|
+
#include "src/core/lib/gprpp/thd.h"
|
40
|
+
#include "src/core/lib/gprpp/time.h"
|
41
|
+
|
42
|
+
namespace grpc_event_engine {
|
43
|
+
namespace experimental {
|
44
|
+
|
45
|
+
namespace {
|
46
|
+
constexpr grpc_core::Duration kIdleThreadLimit =
|
47
|
+
grpc_core::Duration::Seconds(20);
|
48
|
+
constexpr grpc_core::Duration kTimeBetweenThrottledThreadStarts =
|
49
|
+
grpc_core::Duration::Seconds(1);
|
50
|
+
constexpr grpc_core::Duration kWorkerThreadMinSleepBetweenChecks{
|
51
|
+
grpc_core::Duration::Milliseconds(15)};
|
52
|
+
constexpr grpc_core::Duration kWorkerThreadMaxSleepBetweenChecks{
|
53
|
+
grpc_core::Duration::Seconds(3)};
|
54
|
+
constexpr grpc_core::Duration kLifeguardMinSleepBetweenChecks{
|
55
|
+
grpc_core::Duration::Milliseconds(15)};
|
56
|
+
constexpr grpc_core::Duration kLifeguardMaxSleepBetweenChecks{
|
57
|
+
grpc_core::Duration::Seconds(1)};
|
58
|
+
constexpr absl::Duration kSleepBetweenQuiesceCheck{absl::Milliseconds(10)};
|
59
|
+
} // namespace
|
60
|
+
|
61
|
+
thread_local WorkQueue* g_local_queue = nullptr;
|
62
|
+
|
63
|
+
// -------- WorkStealingThreadPool --------
|
64
|
+
|
65
|
+
WorkStealingThreadPool::WorkStealingThreadPool(size_t reserve_threads)
|
66
|
+
: pool_{std::make_shared<WorkStealingThreadPoolImpl>(reserve_threads)} {
|
67
|
+
pool_->Start();
|
68
|
+
}
|
69
|
+
|
70
|
+
void WorkStealingThreadPool::Quiesce() { pool_->Quiesce(); }
|
71
|
+
|
72
|
+
WorkStealingThreadPool::~WorkStealingThreadPool() {
|
73
|
+
GPR_ASSERT(pool_->IsQuiesced());
|
74
|
+
}
|
75
|
+
|
76
|
+
void WorkStealingThreadPool::Run(absl::AnyInvocable<void()> callback) {
|
77
|
+
Run(SelfDeletingClosure::Create(std::move(callback)));
|
78
|
+
}
|
79
|
+
|
80
|
+
void WorkStealingThreadPool::Run(EventEngine::Closure* closure) {
|
81
|
+
pool_->Run(closure);
|
82
|
+
}
|
83
|
+
|
84
|
+
// -------- WorkStealingThreadPool::TheftRegistry --------
|
85
|
+
|
86
|
+
void WorkStealingThreadPool::TheftRegistry::Enroll(WorkQueue* queue) {
|
87
|
+
grpc_core::MutexLock lock(&mu_);
|
88
|
+
queues_.emplace(queue);
|
89
|
+
}
|
90
|
+
|
91
|
+
void WorkStealingThreadPool::TheftRegistry::Unenroll(WorkQueue* queue) {
|
92
|
+
grpc_core::MutexLock lock(&mu_);
|
93
|
+
queues_.erase(queue);
|
94
|
+
}
|
95
|
+
|
96
|
+
EventEngine::Closure* WorkStealingThreadPool::TheftRegistry::StealOne() {
|
97
|
+
grpc_core::MutexLock lock(&mu_);
|
98
|
+
EventEngine::Closure* closure;
|
99
|
+
for (auto* queue : queues_) {
|
100
|
+
closure = queue->PopMostRecent();
|
101
|
+
if (closure != nullptr) return closure;
|
102
|
+
}
|
103
|
+
return nullptr;
|
104
|
+
}
|
105
|
+
|
106
|
+
void WorkStealingThreadPool::PrepareFork() { pool_->PrepareFork(); }
|
107
|
+
|
108
|
+
void WorkStealingThreadPool::PostforkParent() { pool_->Postfork(); }
|
109
|
+
|
110
|
+
void WorkStealingThreadPool::PostforkChild() { pool_->Postfork(); }
|
111
|
+
|
112
|
+
// -------- WorkStealingThreadPool::WorkStealingThreadPoolImpl --------
|
113
|
+
|
114
|
+
WorkStealingThreadPool::WorkStealingThreadPoolImpl::WorkStealingThreadPoolImpl(
|
115
|
+
size_t reserve_threads)
|
116
|
+
: reserve_threads_(reserve_threads), lifeguard_() {}
|
117
|
+
|
118
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Start() {
|
119
|
+
lifeguard_.Start(shared_from_this());
|
120
|
+
for (size_t i = 0; i < reserve_threads_; i++) {
|
121
|
+
StartThread();
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Run(
|
126
|
+
EventEngine::Closure* closure) {
|
127
|
+
GPR_DEBUG_ASSERT(quiesced_.load(std::memory_order_relaxed) == false);
|
128
|
+
if (g_local_queue != nullptr) {
|
129
|
+
g_local_queue->Add(closure);
|
130
|
+
return;
|
131
|
+
}
|
132
|
+
queue_.Add(closure);
|
133
|
+
work_signal_.Signal();
|
134
|
+
}
|
135
|
+
|
136
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::StartThread() {
|
137
|
+
last_started_thread_.store(
|
138
|
+
grpc_core::Timestamp::Now().milliseconds_after_process_epoch(),
|
139
|
+
std::memory_order_relaxed);
|
140
|
+
grpc_core::Thread(
|
141
|
+
"event_engine",
|
142
|
+
[](void* arg) {
|
143
|
+
ThreadState* worker = static_cast<ThreadState*>(arg);
|
144
|
+
worker->ThreadBody();
|
145
|
+
delete worker;
|
146
|
+
},
|
147
|
+
new ThreadState(shared_from_this()), nullptr,
|
148
|
+
grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
|
149
|
+
.Start();
|
150
|
+
}
|
151
|
+
|
152
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Quiesce() {
|
153
|
+
SetShutdown(true);
|
154
|
+
// Wait until all threads have exited.
|
155
|
+
// Note that if this is a threadpool thread then we won't exit this thread
|
156
|
+
// until all other threads have exited, so we need to wait for just one thread
|
157
|
+
// running instead of zero.
|
158
|
+
bool is_threadpool_thread = g_local_queue != nullptr;
|
159
|
+
thread_count()->BlockUntilThreadCount(CounterType::kLivingThreadCount,
|
160
|
+
is_threadpool_thread ? 1 : 0,
|
161
|
+
"shutting down", work_signal());
|
162
|
+
GPR_ASSERT(queue_.Empty());
|
163
|
+
quiesced_.store(true, std::memory_order_relaxed);
|
164
|
+
lifeguard_.BlockUntilShutdown();
|
165
|
+
}
|
166
|
+
|
167
|
+
bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetThrottled(
|
168
|
+
bool throttled) {
|
169
|
+
return throttled_.exchange(throttled, std::memory_order_relaxed);
|
170
|
+
}
|
171
|
+
|
172
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetShutdown(
|
173
|
+
bool is_shutdown) {
|
174
|
+
auto was_shutdown = shutdown_.exchange(is_shutdown);
|
175
|
+
GPR_ASSERT(is_shutdown != was_shutdown);
|
176
|
+
work_signal_.SignalAll();
|
177
|
+
}
|
178
|
+
|
179
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::SetForking(
|
180
|
+
bool is_forking) {
|
181
|
+
auto was_forking = forking_.exchange(is_forking);
|
182
|
+
GPR_ASSERT(is_forking != was_forking);
|
183
|
+
}
|
184
|
+
|
185
|
+
bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsForking() {
|
186
|
+
return forking_.load(std::memory_order_relaxed);
|
187
|
+
}
|
188
|
+
|
189
|
+
bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsShutdown() {
|
190
|
+
return shutdown_.load(std::memory_order_relaxed);
|
191
|
+
}
|
192
|
+
|
193
|
+
bool WorkStealingThreadPool::WorkStealingThreadPoolImpl::IsQuiesced() {
|
194
|
+
return quiesced_.load(std::memory_order_relaxed);
|
195
|
+
}
|
196
|
+
|
197
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::PrepareFork() {
|
198
|
+
SetForking(true);
|
199
|
+
thread_count()->BlockUntilThreadCount(CounterType::kLivingThreadCount, 0,
|
200
|
+
"forking", &work_signal_);
|
201
|
+
lifeguard_.BlockUntilShutdown();
|
202
|
+
}
|
203
|
+
|
204
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Postfork() {
|
205
|
+
SetForking(false);
|
206
|
+
Start();
|
207
|
+
}
|
208
|
+
|
209
|
+
// -------- WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard
|
210
|
+
// --------
|
211
|
+
|
212
|
+
WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::Lifeguard()
|
213
|
+
: backoff_(grpc_core::BackOff::Options()
|
214
|
+
.set_initial_backoff(kLifeguardMinSleepBetweenChecks)
|
215
|
+
.set_max_backoff(kLifeguardMaxSleepBetweenChecks)
|
216
|
+
.set_multiplier(1.3)) {}
|
217
|
+
|
218
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::Start(
|
219
|
+
std::shared_ptr<WorkStealingThreadPoolImpl> pool) {
|
220
|
+
// thread_running_ is set early to avoid a quiesce race while the lifeguard is
|
221
|
+
// still starting up.
|
222
|
+
thread_running_.store(true);
|
223
|
+
pool_ = std::move(pool);
|
224
|
+
grpc_core::Thread(
|
225
|
+
"lifeguard",
|
226
|
+
[](void* arg) {
|
227
|
+
auto* lifeguard = static_cast<Lifeguard*>(arg);
|
228
|
+
lifeguard->LifeguardMain();
|
229
|
+
},
|
230
|
+
this, nullptr,
|
231
|
+
grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
|
232
|
+
.Start();
|
233
|
+
}
|
234
|
+
|
235
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
|
236
|
+
LifeguardMain() {
|
237
|
+
while (true) {
|
238
|
+
absl::SleepFor(absl::Milliseconds(
|
239
|
+
(backoff_.NextAttemptTime() - grpc_core::Timestamp::Now()).millis()));
|
240
|
+
if (pool_->IsForking()) break;
|
241
|
+
if (pool_->IsShutdown() && pool_->IsQuiesced()) break;
|
242
|
+
MaybeStartNewThread();
|
243
|
+
}
|
244
|
+
pool_.reset();
|
245
|
+
thread_running_.store(false);
|
246
|
+
}
|
247
|
+
|
248
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
|
249
|
+
BlockUntilShutdown() {
|
250
|
+
while (thread_running_.load()) {
|
251
|
+
absl::SleepFor(kSleepBetweenQuiesceCheck);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
void WorkStealingThreadPool::WorkStealingThreadPoolImpl::Lifeguard::
|
256
|
+
MaybeStartNewThread() {
|
257
|
+
// No new threads are started when forking.
|
258
|
+
// No new work is done when forking needs to begin.
|
259
|
+
if (pool_->forking_.load()) return;
|
260
|
+
int busy_thread_count =
|
261
|
+
pool_->thread_count_.GetCount(CounterType::kBusyCount);
|
262
|
+
int living_thread_count =
|
263
|
+
pool_->thread_count_.GetCount(CounterType::kLivingThreadCount);
|
264
|
+
// Wake an idle worker thread if there's global work to be had.
|
265
|
+
if (busy_thread_count < living_thread_count) {
|
266
|
+
if (!pool_->queue_.Empty()) {
|
267
|
+
pool_->work_signal()->Signal();
|
268
|
+
backoff_.Reset();
|
269
|
+
}
|
270
|
+
// Idle threads will eventually wake up for an attempt at work stealing.
|
271
|
+
return;
|
272
|
+
}
|
273
|
+
// No new threads if in the throttled state.
|
274
|
+
// However, all workers are busy, so the Lifeguard should be more
|
275
|
+
// vigilant about checking whether a new thread must be started.
|
276
|
+
if (grpc_core::Timestamp::Now() -
|
277
|
+
grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
|
278
|
+
pool_->last_started_thread_) <
|
279
|
+
kTimeBetweenThrottledThreadStarts) {
|
280
|
+
backoff_.Reset();
|
281
|
+
return;
|
282
|
+
}
|
283
|
+
// All workers are busy and the pool is not throttled. Start a new thread.
|
284
|
+
// TODO(hork): new threads may spawn when there is no work in the global
|
285
|
+
// queue, nor any work to steal. Add more sophisticated logic about when to
|
286
|
+
// start a thread.
|
287
|
+
GRPC_EVENT_ENGINE_TRACE(
|
288
|
+
"Starting new ThreadPool thread due to backlog (total threads: %d)",
|
289
|
+
living_thread_count + 1);
|
290
|
+
pool_->StartThread();
|
291
|
+
// Tell the lifeguard to monitor the pool more closely.
|
292
|
+
backoff_.Reset();
|
293
|
+
}
|
294
|
+
|
295
|
+
// -------- WorkStealingThreadPool::ThreadState --------
|
296
|
+
|
297
|
+
WorkStealingThreadPool::ThreadState::ThreadState(
|
298
|
+
std::shared_ptr<WorkStealingThreadPoolImpl> pool)
|
299
|
+
: pool_(std::move(pool)),
|
300
|
+
auto_thread_count_(pool_->thread_count(),
|
301
|
+
CounterType::kLivingThreadCount),
|
302
|
+
backoff_(grpc_core::BackOff::Options()
|
303
|
+
.set_initial_backoff(kWorkerThreadMinSleepBetweenChecks)
|
304
|
+
.set_max_backoff(kWorkerThreadMaxSleepBetweenChecks)
|
305
|
+
.set_multiplier(1.3)) {}
|
306
|
+
|
307
|
+
void WorkStealingThreadPool::ThreadState::ThreadBody() {
|
308
|
+
g_local_queue = new BasicWorkQueue();
|
309
|
+
pool_->theft_registry()->Enroll(g_local_queue);
|
310
|
+
ThreadLocal::SetIsEventEngineThread(true);
|
311
|
+
while (Step()) {
|
312
|
+
// loop until the thread should no longer run
|
313
|
+
}
|
314
|
+
// cleanup
|
315
|
+
if (pool_->IsForking()) {
|
316
|
+
// TODO(hork): consider WorkQueue::AddAll(WorkQueue*)
|
317
|
+
EventEngine::Closure* closure;
|
318
|
+
while (!g_local_queue->Empty()) {
|
319
|
+
closure = g_local_queue->PopMostRecent();
|
320
|
+
if (closure != nullptr) {
|
321
|
+
pool_->queue()->Add(closure);
|
322
|
+
}
|
323
|
+
}
|
324
|
+
} else if (pool_->IsShutdown()) {
|
325
|
+
FinishDraining();
|
326
|
+
}
|
327
|
+
GPR_ASSERT(g_local_queue->Empty());
|
328
|
+
pool_->theft_registry()->Unenroll(g_local_queue);
|
329
|
+
delete g_local_queue;
|
330
|
+
}
|
331
|
+
|
332
|
+
void WorkStealingThreadPool::ThreadState::SleepIfRunning() {
|
333
|
+
if (pool_->IsForking()) return;
|
334
|
+
absl::SleepFor(
|
335
|
+
absl::Milliseconds(kTimeBetweenThrottledThreadStarts.millis()));
|
336
|
+
}
|
337
|
+
|
338
|
+
bool WorkStealingThreadPool::ThreadState::Step() {
|
339
|
+
if (pool_->IsForking()) return false;
|
340
|
+
auto* closure = g_local_queue->PopMostRecent();
|
341
|
+
// If local work is available, run it.
|
342
|
+
if (closure != nullptr) {
|
343
|
+
ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
|
344
|
+
CounterType::kBusyCount};
|
345
|
+
closure->Run();
|
346
|
+
return true;
|
347
|
+
}
|
348
|
+
// Thread shutdown exit condition (ignoring fork). All must be true:
|
349
|
+
// * shutdown was called
|
350
|
+
// * the local queue is empty
|
351
|
+
// * the global queue is empty
|
352
|
+
// * the steal pool returns nullptr
|
353
|
+
bool should_run_again = false;
|
354
|
+
grpc_core::Timestamp start_time{grpc_core::Timestamp::Now()};
|
355
|
+
// Wait until work is available or until shut down.
|
356
|
+
while (!pool_->IsForking()) {
|
357
|
+
// Pull from the global queue next
|
358
|
+
// TODO(hork): consider an empty check for performance wins. Depends on the
|
359
|
+
// queue implementation, the BasicWorkQueue takes two locks when you do an
|
360
|
+
// empty check then pop.
|
361
|
+
closure = pool_->queue()->PopMostRecent();
|
362
|
+
if (closure != nullptr) {
|
363
|
+
should_run_again = true;
|
364
|
+
break;
|
365
|
+
};
|
366
|
+
// Try stealing if the queue is empty
|
367
|
+
closure = pool_->theft_registry()->StealOne();
|
368
|
+
if (closure != nullptr) {
|
369
|
+
should_run_again = true;
|
370
|
+
break;
|
371
|
+
}
|
372
|
+
// No closures were retrieved from anywhere.
|
373
|
+
// Quit the thread if the pool has been shut down.
|
374
|
+
if (pool_->IsShutdown()) break;
|
375
|
+
bool timed_out = pool_->work_signal()->WaitWithTimeout(
|
376
|
+
backoff_.NextAttemptTime() - grpc_core::Timestamp::Now());
|
377
|
+
// Quit a thread if the pool has more than it requires, and this thread
|
378
|
+
// has been idle long enough.
|
379
|
+
if (timed_out &&
|
380
|
+
pool_->thread_count()->GetCount(CounterType::kLivingThreadCount) >
|
381
|
+
pool_->reserve_threads() &&
|
382
|
+
grpc_core::Timestamp::Now() - start_time > kIdleThreadLimit) {
|
383
|
+
return false;
|
384
|
+
}
|
385
|
+
}
|
386
|
+
if (pool_->IsForking()) {
|
387
|
+
// save the closure since we aren't going to execute it.
|
388
|
+
if (closure != nullptr) g_local_queue->Add(closure);
|
389
|
+
return false;
|
390
|
+
}
|
391
|
+
if (closure != nullptr) {
|
392
|
+
ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
|
393
|
+
CounterType::kBusyCount};
|
394
|
+
closure->Run();
|
395
|
+
}
|
396
|
+
backoff_.Reset();
|
397
|
+
return should_run_again;
|
398
|
+
}
|
399
|
+
|
400
|
+
void WorkStealingThreadPool::ThreadState::FinishDraining() {
|
401
|
+
// The thread is definitionally busy while draining
|
402
|
+
ThreadCount::AutoThreadCount auto_busy{pool_->thread_count(),
|
403
|
+
CounterType::kBusyCount};
|
404
|
+
// If a fork occurs at any point during shutdown, quit draining. The post-fork
|
405
|
+
// threads will finish draining the global queue.
|
406
|
+
while (!pool_->IsForking()) {
|
407
|
+
if (!g_local_queue->Empty()) {
|
408
|
+
auto* closure = g_local_queue->PopMostRecent();
|
409
|
+
if (closure != nullptr) {
|
410
|
+
closure->Run();
|
411
|
+
}
|
412
|
+
continue;
|
413
|
+
}
|
414
|
+
if (!pool_->queue()->Empty()) {
|
415
|
+
auto* closure = pool_->queue()->PopMostRecent();
|
416
|
+
if (closure != nullptr) {
|
417
|
+
closure->Run();
|
418
|
+
}
|
419
|
+
continue;
|
420
|
+
}
|
421
|
+
break;
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
425
|
+
// -------- WorkStealingThreadPool::ThreadCount --------
|
426
|
+
|
427
|
+
void WorkStealingThreadPool::ThreadCount::Add(CounterType counter_type) {
|
428
|
+
thread_counts_[counter_type].fetch_add(1, std::memory_order_relaxed);
|
429
|
+
}
|
430
|
+
|
431
|
+
void WorkStealingThreadPool::ThreadCount::Remove(CounterType counter_type) {
|
432
|
+
thread_counts_[counter_type].fetch_sub(1, std::memory_order_relaxed);
|
433
|
+
}
|
434
|
+
|
435
|
+
void WorkStealingThreadPool::ThreadCount::BlockUntilThreadCount(
|
436
|
+
CounterType counter_type, int desired_threads, const char* why,
|
437
|
+
WorkSignal* work_signal) {
|
438
|
+
auto& counter = thread_counts_[counter_type];
|
439
|
+
int curr_threads = counter.load(std::memory_order_relaxed);
|
440
|
+
// Wait for all threads to exit.
|
441
|
+
auto last_log_time = grpc_core::Timestamp::Now();
|
442
|
+
while (curr_threads > desired_threads) {
|
443
|
+
absl::SleepFor(kSleepBetweenQuiesceCheck);
|
444
|
+
work_signal->SignalAll();
|
445
|
+
if (grpc_core::Timestamp::Now() - last_log_time >
|
446
|
+
grpc_core::Duration::Seconds(3)) {
|
447
|
+
gpr_log(GPR_DEBUG,
|
448
|
+
"Waiting for thread pool to idle before %s. (%d to %d)", why,
|
449
|
+
curr_threads, desired_threads);
|
450
|
+
last_log_time = grpc_core::Timestamp::Now();
|
451
|
+
}
|
452
|
+
curr_threads = counter.load(std::memory_order_relaxed);
|
453
|
+
}
|
454
|
+
}
|
455
|
+
|
456
|
+
size_t WorkStealingThreadPool::ThreadCount::GetCount(CounterType counter_type) {
|
457
|
+
return thread_counts_[counter_type].load(std::memory_order_relaxed);
|
458
|
+
}
|
459
|
+
|
460
|
+
WorkStealingThreadPool::ThreadCount::AutoThreadCount::AutoThreadCount(
|
461
|
+
ThreadCount* counter, CounterType counter_type)
|
462
|
+
: counter_(counter), counter_type_(counter_type) {
|
463
|
+
counter_->Add(counter_type_);
|
464
|
+
}
|
465
|
+
|
466
|
+
WorkStealingThreadPool::ThreadCount::AutoThreadCount::~AutoThreadCount() {
|
467
|
+
counter_->Remove(counter_type_);
|
468
|
+
}
|
469
|
+
|
470
|
+
// -------- WorkStealingThreadPool::WorkSignal --------
|
471
|
+
|
472
|
+
void WorkStealingThreadPool::WorkSignal::Signal() {
|
473
|
+
grpc_core::MutexLock lock(&mu_);
|
474
|
+
cv_.Signal();
|
475
|
+
}
|
476
|
+
|
477
|
+
void WorkStealingThreadPool::WorkSignal::SignalAll() {
|
478
|
+
grpc_core::MutexLock lock(&mu_);
|
479
|
+
cv_.SignalAll();
|
480
|
+
}
|
481
|
+
|
482
|
+
bool WorkStealingThreadPool::WorkSignal::WaitWithTimeout(
|
483
|
+
grpc_core::Duration time) {
|
484
|
+
grpc_core::MutexLock lock(&mu_);
|
485
|
+
return cv_.WaitWithTimeout(&mu_, absl::Milliseconds(time.millis()));
|
486
|
+
}
|
487
|
+
|
488
|
+
} // namespace experimental
|
489
|
+
} // namespace grpc_event_engine
|