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,455 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2022 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
#include <stdint.h>
|
20
|
+
#include <string.h>
|
21
|
+
|
22
|
+
#include <map>
|
23
|
+
#include <memory>
|
24
|
+
#include <set>
|
25
|
+
#include <string>
|
26
|
+
#include <type_traits>
|
27
|
+
#include <utility>
|
28
|
+
|
29
|
+
#include "absl/status/status.h"
|
30
|
+
#include "absl/status/statusor.h"
|
31
|
+
#include "absl/strings/string_view.h"
|
32
|
+
#include "upb/base/string_view.h"
|
33
|
+
#include "upb/upb.hpp"
|
34
|
+
|
35
|
+
#include <grpc/impl/connectivity_state.h>
|
36
|
+
#include <grpc/slice.h>
|
37
|
+
#include <grpc/status.h>
|
38
|
+
#include <grpc/support/log.h>
|
39
|
+
|
40
|
+
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
41
|
+
#include "src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h"
|
42
|
+
#include "src/core/ext/filters/client_channel/subchannel.h"
|
43
|
+
#include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
|
44
|
+
#include "src/core/lib/channel/channel_trace.h"
|
45
|
+
#include "src/core/lib/debug/trace.h"
|
46
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
47
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
48
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
49
|
+
#include "src/core/lib/gprpp/sync.h"
|
50
|
+
#include "src/core/lib/gprpp/work_serializer.h"
|
51
|
+
#include "src/core/lib/iomgr/closure.h"
|
52
|
+
#include "src/core/lib/iomgr/error.h"
|
53
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
54
|
+
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
55
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
56
|
+
#include "src/core/lib/load_balancing/subchannel_interface.h"
|
57
|
+
#include "src/core/lib/slice/slice.h"
|
58
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
59
|
+
#include "src/proto/grpc/health/v1/health.upb.h"
|
60
|
+
|
61
|
+
namespace grpc_core {
|
62
|
+
|
63
|
+
TraceFlag grpc_health_check_client_trace(false, "health_check_client");
|
64
|
+
|
65
|
+
namespace {
|
66
|
+
|
67
|
+
// A fire-and-forget class to asynchronously drain a WorkSerializer queue.
|
68
|
+
class AsyncWorkSerializerDrainer {
|
69
|
+
public:
|
70
|
+
explicit AsyncWorkSerializerDrainer(
|
71
|
+
std::shared_ptr<WorkSerializer> work_serializer)
|
72
|
+
: work_serializer_(std::move(work_serializer)) {
|
73
|
+
GRPC_CLOSURE_INIT(&closure_, RunInExecCtx, this, nullptr);
|
74
|
+
ExecCtx::Run(DEBUG_LOCATION, &closure_, absl::OkStatus());
|
75
|
+
}
|
76
|
+
|
77
|
+
private:
|
78
|
+
static void RunInExecCtx(void* arg, grpc_error_handle) {
|
79
|
+
auto* self = static_cast<AsyncWorkSerializerDrainer*>(arg);
|
80
|
+
self->work_serializer_->DrainQueue();
|
81
|
+
delete self;
|
82
|
+
}
|
83
|
+
|
84
|
+
std::shared_ptr<WorkSerializer> work_serializer_;
|
85
|
+
grpc_closure closure_;
|
86
|
+
};
|
87
|
+
|
88
|
+
} // namespace
|
89
|
+
|
90
|
+
//
|
91
|
+
// HealthProducer::HealthChecker
|
92
|
+
//
|
93
|
+
|
94
|
+
HealthProducer::HealthChecker::HealthChecker(
|
95
|
+
WeakRefCountedPtr<HealthProducer> producer,
|
96
|
+
absl::string_view health_check_service_name)
|
97
|
+
: producer_(std::move(producer)),
|
98
|
+
health_check_service_name_(health_check_service_name),
|
99
|
+
state_(producer_->state_ == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING
|
100
|
+
: producer_->state_),
|
101
|
+
status_(producer_->status_) {
|
102
|
+
// If the subchannel is already connected, start health checking.
|
103
|
+
if (producer_->state_ == GRPC_CHANNEL_READY) StartHealthStreamLocked();
|
104
|
+
}
|
105
|
+
|
106
|
+
void HealthProducer::HealthChecker::Orphan() {
|
107
|
+
stream_client_.reset();
|
108
|
+
Unref();
|
109
|
+
}
|
110
|
+
|
111
|
+
void HealthProducer::HealthChecker::AddWatcherLocked(HealthWatcher* watcher) {
|
112
|
+
watchers_.insert(watcher);
|
113
|
+
watcher->Notify(state_, status_);
|
114
|
+
}
|
115
|
+
|
116
|
+
bool HealthProducer::HealthChecker::RemoveWatcherLocked(
|
117
|
+
HealthWatcher* watcher) {
|
118
|
+
watchers_.erase(watcher);
|
119
|
+
return watchers_.empty();
|
120
|
+
}
|
121
|
+
|
122
|
+
void HealthProducer::HealthChecker::OnConnectivityStateChangeLocked(
|
123
|
+
grpc_connectivity_state state, const absl::Status& status) {
|
124
|
+
if (state == GRPC_CHANNEL_READY) {
|
125
|
+
// We should already be in CONNECTING, and we don't want to change
|
126
|
+
// that until we see the initial response on the stream.
|
127
|
+
GPR_ASSERT(state_ == GRPC_CHANNEL_CONNECTING);
|
128
|
+
// Start the health watch stream.
|
129
|
+
StartHealthStreamLocked();
|
130
|
+
} else {
|
131
|
+
state_ = state;
|
132
|
+
status_ = status;
|
133
|
+
NotifyWatchersLocked(state_, status_);
|
134
|
+
// We're not connected, so stop health checking.
|
135
|
+
stream_client_.reset();
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
void HealthProducer::HealthChecker::StartHealthStreamLocked() {
|
140
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
141
|
+
gpr_log(GPR_INFO,
|
142
|
+
"HealthProducer %p HealthChecker %p: "
|
143
|
+
"creating HealthClient for \"%s\"",
|
144
|
+
producer_.get(), this,
|
145
|
+
std::string(health_check_service_name_).c_str());
|
146
|
+
}
|
147
|
+
stream_client_ = MakeOrphanable<SubchannelStreamClient>(
|
148
|
+
producer_->connected_subchannel_, producer_->subchannel_->pollset_set(),
|
149
|
+
std::make_unique<HealthStreamEventHandler>(Ref()),
|
150
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace) ? "HealthClient"
|
151
|
+
: nullptr);
|
152
|
+
}
|
153
|
+
|
154
|
+
void HealthProducer::HealthChecker::NotifyWatchersLocked(
|
155
|
+
grpc_connectivity_state state, absl::Status status) {
|
156
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
157
|
+
gpr_log(
|
158
|
+
GPR_INFO,
|
159
|
+
"HealthProducer %p HealthChecker %p: reporting state %s to watchers",
|
160
|
+
producer_.get(), this, ConnectivityStateName(state));
|
161
|
+
}
|
162
|
+
work_serializer_->Schedule(
|
163
|
+
[self = Ref(), state, status = std::move(status)]() {
|
164
|
+
MutexLock lock(&self->producer_->mu_);
|
165
|
+
for (HealthWatcher* watcher : self->watchers_) {
|
166
|
+
watcher->Notify(state, status);
|
167
|
+
}
|
168
|
+
},
|
169
|
+
DEBUG_LOCATION);
|
170
|
+
new AsyncWorkSerializerDrainer(work_serializer_);
|
171
|
+
}
|
172
|
+
|
173
|
+
void HealthProducer::HealthChecker::OnHealthWatchStatusChange(
|
174
|
+
grpc_connectivity_state state, const absl::Status& status) {
|
175
|
+
if (state == GRPC_CHANNEL_SHUTDOWN) return;
|
176
|
+
work_serializer_->Schedule(
|
177
|
+
[self = Ref(), state, status]() {
|
178
|
+
MutexLock lock(&self->producer_->mu_);
|
179
|
+
if (self->stream_client_ != nullptr) {
|
180
|
+
self->state_ = state;
|
181
|
+
self->status_ = status;
|
182
|
+
for (HealthWatcher* watcher : self->watchers_) {
|
183
|
+
watcher->Notify(state, self->status_);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
},
|
187
|
+
DEBUG_LOCATION);
|
188
|
+
new AsyncWorkSerializerDrainer(work_serializer_);
|
189
|
+
}
|
190
|
+
|
191
|
+
//
|
192
|
+
// HealthProducer::HealthChecker::HealthStreamEventHandler
|
193
|
+
//
|
194
|
+
|
195
|
+
class HealthProducer::HealthChecker::HealthStreamEventHandler
|
196
|
+
: public SubchannelStreamClient::CallEventHandler {
|
197
|
+
public:
|
198
|
+
explicit HealthStreamEventHandler(RefCountedPtr<HealthChecker> health_checker)
|
199
|
+
: health_checker_(std::move(health_checker)) {}
|
200
|
+
|
201
|
+
Slice GetPathLocked() override {
|
202
|
+
return Slice::FromStaticString("/grpc.health.v1.Health/Watch");
|
203
|
+
}
|
204
|
+
|
205
|
+
void OnCallStartLocked(SubchannelStreamClient* client) override {
|
206
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_CONNECTING,
|
207
|
+
"starting health watch");
|
208
|
+
}
|
209
|
+
|
210
|
+
void OnRetryTimerStartLocked(SubchannelStreamClient* client) override {
|
211
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
|
212
|
+
"health check call failed; will retry after backoff");
|
213
|
+
}
|
214
|
+
|
215
|
+
grpc_slice EncodeSendMessageLocked() override {
|
216
|
+
upb::Arena arena;
|
217
|
+
grpc_health_v1_HealthCheckRequest* request_struct =
|
218
|
+
grpc_health_v1_HealthCheckRequest_new(arena.ptr());
|
219
|
+
grpc_health_v1_HealthCheckRequest_set_service(
|
220
|
+
request_struct,
|
221
|
+
upb_StringView_FromDataAndSize(
|
222
|
+
health_checker_->health_check_service_name_.data(),
|
223
|
+
health_checker_->health_check_service_name_.size()));
|
224
|
+
size_t buf_length;
|
225
|
+
char* buf = grpc_health_v1_HealthCheckRequest_serialize(
|
226
|
+
request_struct, arena.ptr(), &buf_length);
|
227
|
+
grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
|
228
|
+
memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
|
229
|
+
return request_slice;
|
230
|
+
}
|
231
|
+
|
232
|
+
absl::Status RecvMessageReadyLocked(
|
233
|
+
SubchannelStreamClient* client,
|
234
|
+
absl::string_view serialized_message) override {
|
235
|
+
auto healthy = DecodeResponse(serialized_message);
|
236
|
+
if (!healthy.ok()) {
|
237
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
|
238
|
+
healthy.status().ToString().c_str());
|
239
|
+
return healthy.status();
|
240
|
+
}
|
241
|
+
if (!*healthy) {
|
242
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
|
243
|
+
"backend unhealthy");
|
244
|
+
} else {
|
245
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_READY, "OK");
|
246
|
+
}
|
247
|
+
return absl::OkStatus();
|
248
|
+
}
|
249
|
+
|
250
|
+
void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* client,
|
251
|
+
grpc_status_code status) override {
|
252
|
+
if (status == GRPC_STATUS_UNIMPLEMENTED) {
|
253
|
+
static const char kErrorMessage[] =
|
254
|
+
"health checking Watch method returned UNIMPLEMENTED; "
|
255
|
+
"disabling health checks but assuming server is healthy";
|
256
|
+
gpr_log(GPR_ERROR, kErrorMessage);
|
257
|
+
auto* channelz_node =
|
258
|
+
health_checker_->producer_->subchannel_->channelz_node();
|
259
|
+
if (channelz_node != nullptr) {
|
260
|
+
channelz_node->AddTraceEvent(
|
261
|
+
channelz::ChannelTrace::Error,
|
262
|
+
grpc_slice_from_static_string(kErrorMessage));
|
263
|
+
}
|
264
|
+
SetHealthStatusLocked(client, GRPC_CHANNEL_READY, kErrorMessage);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
private:
|
269
|
+
// Returns true if healthy.
|
270
|
+
static absl::StatusOr<bool> DecodeResponse(
|
271
|
+
absl::string_view serialized_message) {
|
272
|
+
// Deserialize message.
|
273
|
+
upb::Arena arena;
|
274
|
+
auto* response = grpc_health_v1_HealthCheckResponse_parse(
|
275
|
+
serialized_message.data(), serialized_message.size(), arena.ptr());
|
276
|
+
if (response == nullptr) {
|
277
|
+
// Can't parse message; assume unhealthy.
|
278
|
+
return absl::InvalidArgumentError("cannot parse health check response");
|
279
|
+
}
|
280
|
+
int32_t status = grpc_health_v1_HealthCheckResponse_status(response);
|
281
|
+
return status == grpc_health_v1_HealthCheckResponse_SERVING;
|
282
|
+
}
|
283
|
+
|
284
|
+
void SetHealthStatusLocked(SubchannelStreamClient* client,
|
285
|
+
grpc_connectivity_state state,
|
286
|
+
const char* reason) {
|
287
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
288
|
+
gpr_log(GPR_INFO, "HealthCheckClient %p: setting state=%s reason=%s",
|
289
|
+
client, ConnectivityStateName(state), reason);
|
290
|
+
}
|
291
|
+
health_checker_->OnHealthWatchStatusChange(
|
292
|
+
state, state == GRPC_CHANNEL_TRANSIENT_FAILURE
|
293
|
+
? absl::UnavailableError(reason)
|
294
|
+
: absl::OkStatus());
|
295
|
+
}
|
296
|
+
|
297
|
+
RefCountedPtr<HealthChecker> health_checker_;
|
298
|
+
};
|
299
|
+
|
300
|
+
//
|
301
|
+
// HealthProducer::ConnectivityWatcher
|
302
|
+
//
|
303
|
+
|
304
|
+
class HealthProducer::ConnectivityWatcher
|
305
|
+
: public Subchannel::ConnectivityStateWatcherInterface {
|
306
|
+
public:
|
307
|
+
explicit ConnectivityWatcher(WeakRefCountedPtr<HealthProducer> producer)
|
308
|
+
: producer_(std::move(producer)) {}
|
309
|
+
|
310
|
+
void OnConnectivityStateChange(grpc_connectivity_state state,
|
311
|
+
const absl::Status& status) override {
|
312
|
+
producer_->OnConnectivityStateChange(state, status);
|
313
|
+
}
|
314
|
+
|
315
|
+
grpc_pollset_set* interested_parties() override {
|
316
|
+
return producer_->interested_parties_;
|
317
|
+
}
|
318
|
+
|
319
|
+
private:
|
320
|
+
WeakRefCountedPtr<HealthProducer> producer_;
|
321
|
+
};
|
322
|
+
|
323
|
+
//
|
324
|
+
// HealthProducer
|
325
|
+
//
|
326
|
+
|
327
|
+
void HealthProducer::Start(RefCountedPtr<Subchannel> subchannel) {
|
328
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
329
|
+
gpr_log(GPR_INFO, "HealthProducer %p: starting with subchannel %p", this,
|
330
|
+
subchannel.get());
|
331
|
+
}
|
332
|
+
subchannel_ = std::move(subchannel);
|
333
|
+
{
|
334
|
+
MutexLock lock(&mu_);
|
335
|
+
connected_subchannel_ = subchannel_->connected_subchannel();
|
336
|
+
}
|
337
|
+
auto connectivity_watcher = MakeRefCounted<ConnectivityWatcher>(WeakRef());
|
338
|
+
connectivity_watcher_ = connectivity_watcher.get();
|
339
|
+
subchannel_->WatchConnectivityState(std::move(connectivity_watcher));
|
340
|
+
}
|
341
|
+
|
342
|
+
void HealthProducer::Orphan() {
|
343
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
344
|
+
gpr_log(GPR_INFO, "HealthProducer %p: shutting down", this);
|
345
|
+
}
|
346
|
+
{
|
347
|
+
MutexLock lock(&mu_);
|
348
|
+
health_checkers_.clear();
|
349
|
+
}
|
350
|
+
subchannel_->CancelConnectivityStateWatch(connectivity_watcher_);
|
351
|
+
subchannel_->RemoveDataProducer(this);
|
352
|
+
}
|
353
|
+
|
354
|
+
void HealthProducer::AddWatcher(HealthWatcher* watcher,
|
355
|
+
const std::string& health_check_service_name) {
|
356
|
+
MutexLock lock(&mu_);
|
357
|
+
grpc_pollset_set_add_pollset_set(interested_parties_,
|
358
|
+
watcher->interested_parties());
|
359
|
+
auto it = health_checkers_.emplace(health_check_service_name, nullptr).first;
|
360
|
+
auto& health_checker = it->second;
|
361
|
+
if (health_checker == nullptr) {
|
362
|
+
health_checker = MakeOrphanable<HealthChecker>(WeakRef(), it->first);
|
363
|
+
}
|
364
|
+
health_checker->AddWatcherLocked(watcher);
|
365
|
+
}
|
366
|
+
|
367
|
+
void HealthProducer::RemoveWatcher(
|
368
|
+
HealthWatcher* watcher, const std::string& health_check_service_name) {
|
369
|
+
MutexLock lock(&mu_);
|
370
|
+
grpc_pollset_set_del_pollset_set(interested_parties_,
|
371
|
+
watcher->interested_parties());
|
372
|
+
auto it = health_checkers_.find(health_check_service_name);
|
373
|
+
if (it == health_checkers_.end()) return;
|
374
|
+
const bool empty = it->second->RemoveWatcherLocked(watcher);
|
375
|
+
if (empty) health_checkers_.erase(it);
|
376
|
+
}
|
377
|
+
|
378
|
+
void HealthProducer::OnConnectivityStateChange(grpc_connectivity_state state,
|
379
|
+
const absl::Status& status) {
|
380
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
381
|
+
gpr_log(GPR_INFO,
|
382
|
+
"HealthProducer %p: subchannel state update: state=%s status=%s",
|
383
|
+
this, ConnectivityStateName(state), status.ToString().c_str());
|
384
|
+
}
|
385
|
+
MutexLock lock(&mu_);
|
386
|
+
state_ = state;
|
387
|
+
status_ = status;
|
388
|
+
if (state == GRPC_CHANNEL_READY) {
|
389
|
+
connected_subchannel_ = subchannel_->connected_subchannel();
|
390
|
+
} else {
|
391
|
+
connected_subchannel_.reset();
|
392
|
+
}
|
393
|
+
for (const auto& p : health_checkers_) {
|
394
|
+
p.second->OnConnectivityStateChangeLocked(state, status);
|
395
|
+
}
|
396
|
+
}
|
397
|
+
|
398
|
+
//
|
399
|
+
// HealthWatcher
|
400
|
+
//
|
401
|
+
|
402
|
+
HealthWatcher::~HealthWatcher() {
|
403
|
+
if (producer_ != nullptr) {
|
404
|
+
producer_->RemoveWatcher(this, health_check_service_name_);
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
void HealthWatcher::SetSubchannel(Subchannel* subchannel) {
|
409
|
+
bool created = false;
|
410
|
+
// Check if our producer is already registered with the subchannel.
|
411
|
+
// If not, create a new one.
|
412
|
+
subchannel->GetOrAddDataProducer(
|
413
|
+
HealthProducer::Type(),
|
414
|
+
[&](Subchannel::DataProducerInterface** producer) {
|
415
|
+
if (*producer != nullptr) producer_ = (*producer)->RefIfNonZero();
|
416
|
+
if (producer_ == nullptr) {
|
417
|
+
producer_ = MakeRefCounted<HealthProducer>();
|
418
|
+
*producer = producer_.get();
|
419
|
+
created = true;
|
420
|
+
}
|
421
|
+
});
|
422
|
+
// If we just created the producer, start it.
|
423
|
+
// This needs to be done outside of the lambda passed to
|
424
|
+
// GetOrAddDataProducer() to avoid deadlocking by re-acquiring the
|
425
|
+
// subchannel lock while already holding it.
|
426
|
+
if (created) producer_->Start(subchannel->Ref());
|
427
|
+
// Register ourself with the producer.
|
428
|
+
producer_->AddWatcher(this, health_check_service_name_);
|
429
|
+
}
|
430
|
+
|
431
|
+
void HealthWatcher::Notify(grpc_connectivity_state state, absl::Status status) {
|
432
|
+
work_serializer_->Schedule(
|
433
|
+
[watcher = watcher_, state, status = std::move(status)]() mutable {
|
434
|
+
watcher->OnConnectivityStateChange(state, std::move(status));
|
435
|
+
},
|
436
|
+
DEBUG_LOCATION);
|
437
|
+
new AsyncWorkSerializerDrainer(work_serializer_);
|
438
|
+
}
|
439
|
+
|
440
|
+
//
|
441
|
+
// External API
|
442
|
+
//
|
443
|
+
|
444
|
+
std::unique_ptr<SubchannelInterface::DataWatcherInterface>
|
445
|
+
MakeHealthCheckWatcher(
|
446
|
+
std::shared_ptr<WorkSerializer> work_serializer,
|
447
|
+
absl::string_view health_check_service_name,
|
448
|
+
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
449
|
+
watcher) {
|
450
|
+
return std::make_unique<HealthWatcher>(std::move(work_serializer),
|
451
|
+
health_check_service_name,
|
452
|
+
std::move(watcher));
|
453
|
+
}
|
454
|
+
|
455
|
+
} // namespace grpc_core
|
@@ -0,0 +1,54 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2022 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_H
|
18
|
+
#define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_H
|
19
|
+
|
20
|
+
#include <grpc/support/port_platform.h>
|
21
|
+
|
22
|
+
#include <memory>
|
23
|
+
|
24
|
+
#include "absl/strings/string_view.h"
|
25
|
+
|
26
|
+
#include "src/core/lib/gprpp/work_serializer.h"
|
27
|
+
#include "src/core/lib/load_balancing/subchannel_interface.h"
|
28
|
+
|
29
|
+
namespace grpc_core {
|
30
|
+
|
31
|
+
// Interface for LB policies to access health check data from a subchannel.
|
32
|
+
// The data is reported from via a Health.Watch stream established on the
|
33
|
+
// subchannel whenever an LB policy registers a watcher.
|
34
|
+
//
|
35
|
+
// To use this, an LB policy will implement its own subclass of
|
36
|
+
// SubchannelInterface::ConnectivityStateWatcherInterface, which will
|
37
|
+
// receive connectivity state updates with health check status taken
|
38
|
+
// into account. It will then register that watcher with the subchannel
|
39
|
+
// like this:
|
40
|
+
// subchannel->AddDataWatcher(
|
41
|
+
// MakeHealthCheckWatcher(
|
42
|
+
// work_serializer(), health_check_service_name,
|
43
|
+
// std::make_unique<MyConnectivityStateWatcherSubclass>(...)));
|
44
|
+
|
45
|
+
std::unique_ptr<SubchannelInterface::DataWatcherInterface>
|
46
|
+
MakeHealthCheckWatcher(
|
47
|
+
std::shared_ptr<WorkSerializer> work_serializer,
|
48
|
+
absl::string_view health_check_service_name,
|
49
|
+
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
50
|
+
watcher);
|
51
|
+
|
52
|
+
} // namespace grpc_core
|
53
|
+
|
54
|
+
#endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_H
|
@@ -0,0 +1,186 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2022 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_INTERNAL_H
|
18
|
+
#define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_INTERNAL_H
|
19
|
+
|
20
|
+
#include <grpc/support/port_platform.h>
|
21
|
+
|
22
|
+
#include <map>
|
23
|
+
#include <memory>
|
24
|
+
#include <set>
|
25
|
+
#include <string>
|
26
|
+
#include <utility>
|
27
|
+
|
28
|
+
#include "absl/base/thread_annotations.h"
|
29
|
+
#include "absl/status/status.h"
|
30
|
+
#include "absl/strings/string_view.h"
|
31
|
+
|
32
|
+
#include <grpc/impl/connectivity_state.h>
|
33
|
+
|
34
|
+
#include "src/core/ext/filters/client_channel/subchannel.h"
|
35
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface_internal.h"
|
36
|
+
#include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
|
37
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
38
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
39
|
+
#include "src/core/lib/gprpp/sync.h"
|
40
|
+
#include "src/core/lib/gprpp/unique_type_name.h"
|
41
|
+
#include "src/core/lib/gprpp/work_serializer.h"
|
42
|
+
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
43
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
44
|
+
#include "src/core/lib/load_balancing/subchannel_interface.h"
|
45
|
+
|
46
|
+
namespace grpc_core {
|
47
|
+
|
48
|
+
class HealthWatcher;
|
49
|
+
|
50
|
+
// This producer is registered with a subchannel. It creates a streaming
|
51
|
+
// health watch call for each health check service name that is being
|
52
|
+
// watched and reports the resulting connectivity state to all
|
53
|
+
// registered watchers.
|
54
|
+
class HealthProducer : public Subchannel::DataProducerInterface {
|
55
|
+
public:
|
56
|
+
HealthProducer() : interested_parties_(grpc_pollset_set_create()) {}
|
57
|
+
~HealthProducer() override { grpc_pollset_set_destroy(interested_parties_); }
|
58
|
+
|
59
|
+
void Start(RefCountedPtr<Subchannel> subchannel);
|
60
|
+
|
61
|
+
void Orphan() override;
|
62
|
+
|
63
|
+
static UniqueTypeName Type() {
|
64
|
+
static UniqueTypeName::Factory kFactory("health_check");
|
65
|
+
return kFactory.Create();
|
66
|
+
}
|
67
|
+
|
68
|
+
UniqueTypeName type() const override { return Type(); }
|
69
|
+
|
70
|
+
void AddWatcher(HealthWatcher* watcher,
|
71
|
+
const std::string& health_check_service_name);
|
72
|
+
void RemoveWatcher(HealthWatcher* watcher,
|
73
|
+
const std::string& health_check_service_name);
|
74
|
+
|
75
|
+
private:
|
76
|
+
class ConnectivityWatcher;
|
77
|
+
|
78
|
+
// Health checker for a given health check service name. Contains the
|
79
|
+
// health check client and the list of watchers.
|
80
|
+
class HealthChecker : public InternallyRefCounted<HealthChecker> {
|
81
|
+
public:
|
82
|
+
HealthChecker(WeakRefCountedPtr<HealthProducer> producer,
|
83
|
+
absl::string_view health_check_service_name);
|
84
|
+
|
85
|
+
// Disable thread-safety analysis because this method is called via
|
86
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
87
|
+
// through there.
|
88
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
|
89
|
+
|
90
|
+
void AddWatcherLocked(HealthWatcher* watcher)
|
91
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
|
92
|
+
|
93
|
+
// Returns true if this was the last watcher.
|
94
|
+
bool RemoveWatcherLocked(HealthWatcher* watcher)
|
95
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
|
96
|
+
|
97
|
+
// Called when the subchannel's connectivity state changes.
|
98
|
+
void OnConnectivityStateChangeLocked(grpc_connectivity_state state,
|
99
|
+
const absl::Status& status)
|
100
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
|
101
|
+
|
102
|
+
private:
|
103
|
+
class HealthStreamEventHandler;
|
104
|
+
|
105
|
+
// Starts a new stream if we have a connected subchannel.
|
106
|
+
// Called whenever the subchannel transitions to state READY or when a
|
107
|
+
// watcher is added.
|
108
|
+
void StartHealthStreamLocked()
|
109
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
|
110
|
+
|
111
|
+
// Notifies watchers of a new state.
|
112
|
+
// Called while holding the SubchannelStreamClient lock and possibly
|
113
|
+
// the producer lock, so must notify asynchronously, but in guaranteed
|
114
|
+
// order (hence the use of WorkSerializer).
|
115
|
+
void NotifyWatchersLocked(grpc_connectivity_state state,
|
116
|
+
absl::Status status)
|
117
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
|
118
|
+
|
119
|
+
// Called by the health check client when receiving an update.
|
120
|
+
void OnHealthWatchStatusChange(grpc_connectivity_state state,
|
121
|
+
const absl::Status& status);
|
122
|
+
|
123
|
+
WeakRefCountedPtr<HealthProducer> producer_;
|
124
|
+
absl::string_view health_check_service_name_;
|
125
|
+
std::shared_ptr<WorkSerializer> work_serializer_ =
|
126
|
+
std::make_shared<WorkSerializer>();
|
127
|
+
|
128
|
+
grpc_connectivity_state state_ ABSL_GUARDED_BY(&HealthProducer::mu_);
|
129
|
+
absl::Status status_ ABSL_GUARDED_BY(&HealthProducer::mu_);
|
130
|
+
OrphanablePtr<SubchannelStreamClient> stream_client_
|
131
|
+
ABSL_GUARDED_BY(&HealthProducer::mu_);
|
132
|
+
std::set<HealthWatcher*> watchers_ ABSL_GUARDED_BY(&HealthProducer::mu_);
|
133
|
+
};
|
134
|
+
|
135
|
+
// Handles a connectivity state change on the subchannel.
|
136
|
+
void OnConnectivityStateChange(grpc_connectivity_state state,
|
137
|
+
const absl::Status& status);
|
138
|
+
|
139
|
+
RefCountedPtr<Subchannel> subchannel_;
|
140
|
+
ConnectivityWatcher* connectivity_watcher_;
|
141
|
+
grpc_pollset_set* interested_parties_;
|
142
|
+
|
143
|
+
Mutex mu_;
|
144
|
+
grpc_connectivity_state state_ ABSL_GUARDED_BY(&mu_);
|
145
|
+
absl::Status status_ ABSL_GUARDED_BY(&mu_);
|
146
|
+
RefCountedPtr<ConnectedSubchannel> connected_subchannel_
|
147
|
+
ABSL_GUARDED_BY(&mu_);
|
148
|
+
std::map<std::string /*health_check_service_name*/,
|
149
|
+
OrphanablePtr<HealthChecker>>
|
150
|
+
health_checkers_ ABSL_GUARDED_BY(&mu_);
|
151
|
+
};
|
152
|
+
|
153
|
+
// A data watcher that handles health checking.
|
154
|
+
class HealthWatcher : public InternalSubchannelDataWatcherInterface {
|
155
|
+
public:
|
156
|
+
HealthWatcher(
|
157
|
+
std::shared_ptr<WorkSerializer> work_serializer,
|
158
|
+
absl::string_view health_check_service_name,
|
159
|
+
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
160
|
+
watcher)
|
161
|
+
: work_serializer_(std::move(work_serializer)),
|
162
|
+
health_check_service_name_(health_check_service_name),
|
163
|
+
watcher_(std::move(watcher)) {}
|
164
|
+
~HealthWatcher() override;
|
165
|
+
|
166
|
+
// When the client channel sees this wrapper, it will pass it the real
|
167
|
+
// subchannel to use.
|
168
|
+
void SetSubchannel(Subchannel* subchannel) override;
|
169
|
+
|
170
|
+
void Notify(grpc_connectivity_state state, absl::Status status);
|
171
|
+
|
172
|
+
grpc_pollset_set* interested_parties() const {
|
173
|
+
return watcher_->interested_parties();
|
174
|
+
}
|
175
|
+
|
176
|
+
private:
|
177
|
+
std::shared_ptr<WorkSerializer> work_serializer_;
|
178
|
+
std::string health_check_service_name_;
|
179
|
+
std::shared_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
180
|
+
watcher_;
|
181
|
+
RefCountedPtr<HealthProducer> producer_;
|
182
|
+
};
|
183
|
+
|
184
|
+
} // namespace grpc_core
|
185
|
+
|
186
|
+
#endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_INTERNAL_H
|