grpc 1.35.0.pre1 → 1.37.1
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 +121 -89
- data/include/grpc/grpc.h +15 -1
- data/include/grpc/grpc_security.h +16 -11
- data/include/grpc/impl/codegen/port_platform.h +2 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +359 -331
- data/src/core/ext/filters/client_channel/client_channel.h +0 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
- data/src/core/ext/filters/client_channel/config_selector.h +9 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -25
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +232 -110
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
- data/src/core/ext/filters/client_channel/resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver.h +1 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +34 -50
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +307 -155
- data/src/core/ext/filters/client_channel/server_address.cc +9 -0
- data/src/core/ext/filters/client_channel/server_address.h +31 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
- data/src/core/ext/filters/client_channel/subchannel.h +63 -95
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +500 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
- data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +490 -178
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
- data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
- data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +2149 -666
- data/src/core/ext/xds/xds_api.h +321 -119
- data/src/core/ext/xds/xds_bootstrap.cc +80 -45
- data/src/core/ext/xds/xds_bootstrap.h +17 -5
- data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
- data/src/core/ext/xds/xds_certificate_provider.h +83 -44
- data/src/core/ext/xds/xds_client.cc +181 -34
- data/src/core/ext/xds/xds_client.h +29 -0
- data/src/core/ext/xds/xds_client_stats.cc +2 -1
- data/src/core/ext/xds/xds_client_stats.h +2 -2
- data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
- data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
- data/src/core/ext/xds/xds_http_filters.cc +114 -0
- data/src/core/ext/xds/xds_http_filters.h +130 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +425 -24
- data/src/core/lib/channel/channel_stack.cc +12 -0
- data/src/core/lib/channel/channel_stack.h +7 -0
- data/src/core/lib/channel/channelz.cc +92 -4
- data/src/core/lib/channel/channelz.h +30 -1
- data/src/core/lib/channel/channelz_registry.cc +14 -0
- data/src/core/lib/channel/handshaker.cc +2 -44
- data/src/core/lib/channel/handshaker.h +1 -18
- data/src/core/lib/channel/status_util.cc +12 -2
- data/src/core/lib/channel/status_util.h +5 -0
- data/src/core/lib/gpr/log.cc +6 -1
- data/src/core/lib/gpr/sync_abseil.cc +3 -6
- data/src/core/lib/gpr/sync_windows.cc +2 -2
- data/src/core/lib/gprpp/atomic.h +3 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
- data/src/core/lib/gprpp/mpscq.cc +2 -2
- data/src/core/lib/gprpp/ref_counted.h +1 -1
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
- data/src/core/lib/gprpp/sync.h +129 -40
- data/src/core/lib/gprpp/thd.h +1 -1
- data/src/core/lib/gprpp/time_util.cc +77 -0
- data/src/core/lib/gprpp/time_util.h +42 -0
- data/src/core/lib/http/httpcli_security_connector.cc +2 -2
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
- data/src/core/lib/iomgr/error.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +11 -8
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
- data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/exec_ctx.cc +6 -2
- data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
- data/src/core/lib/iomgr/resource_quota.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_utils.cc +121 -1
- data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +5 -8
- data/src/core/lib/iomgr/tcp_uv.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +2 -2
- data/src/core/lib/iomgr/timer_manager.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
- data/src/core/lib/matchers/matchers.cc +339 -0
- data/src/core/lib/matchers/matchers.h +160 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
- data/src/core/lib/security/credentials/credentials.h +2 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
- data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
- data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
- data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
- data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
- data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
- data/src/core/lib/security/security_connector/ssl_utils.cc +9 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +32 -14
- data/src/core/lib/security/transport/security_handshaker.cc +33 -5
- data/src/core/lib/security/transport/server_auth_filter.cc +7 -0
- data/src/core/lib/slice/slice_intern.cc +5 -6
- data/src/core/lib/surface/channel.h +3 -3
- data/src/core/lib/surface/completion_queue.cc +1 -1
- data/src/core/lib/surface/init.cc +13 -15
- data/src/core/lib/surface/lame_client.cc +38 -19
- data/src/core/lib/surface/lame_client.h +4 -3
- data/src/core/lib/surface/server.cc +43 -36
- data/src/core/lib/surface/server.h +76 -14
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/metadata.cc +6 -2
- data/src/core/lib/transport/metadata_batch.cc +27 -0
- data/src/core/lib/transport/metadata_batch.h +14 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -24
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
- data/src/core/tsi/fake_transport_security.cc +11 -2
- data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
- data/src/core/tsi/ssl_transport_security.cc +0 -3
- data/src/core/tsi/ssl_transport_security.h +0 -3
- data/src/ruby/ext/grpc/extconf.rb +9 -1
- data/src/ruby/ext/grpc/rb_channel.c +10 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/ext/grpc/rb_server.c +13 -1
- data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
- data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +32 -0
- data/src/ruby/spec/channel_spec.rb +17 -6
- data/src/ruby/spec/client_auth_spec.rb +27 -1
- data/src/ruby/spec/errors_spec.rb +1 -1
- data/src/ruby/spec/generic/active_call_spec.rb +2 -2
- data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
- data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +25 -0
- data/src/ruby/spec/server_spec.rb +22 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
- data/third_party/boringssl-with-bazel/err_data.c +715 -713
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
- data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
- data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
- data/third_party/xxhash/xxhash.h +5443 -0
- metadata +140 -84
- data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
- data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
- data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
- data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
- data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
- data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
- data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
- data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
- data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
- data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
- data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
- data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
- data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
- data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
- data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
- data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
- data/src/core/lib/iomgr/iomgr_posix.h +0 -26
- data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
- data/src/core/lib/security/authorization/authorization_engine.h +0 -84
- data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
- data/src/core/lib/security/authorization/evaluate_args.h +0 -59
- data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
- data/third_party/upb/upb/json_decode.c +0 -1443
- data/third_party/upb/upb/json_decode.h +0 -23
- data/third_party/upb/upb/json_encode.c +0 -713
- data/third_party/upb/upb/json_encode.h +0 -36
@@ -30,6 +30,7 @@
|
|
30
30
|
#include "src/core/lib/channel/channel_stack.h"
|
31
31
|
#include "src/core/lib/gpr/time_precise.h"
|
32
32
|
#include "src/core/lib/gprpp/arena.h"
|
33
|
+
#include "src/core/lib/gprpp/dual_ref_counted.h"
|
33
34
|
#include "src/core/lib/gprpp/ref_counted.h"
|
34
35
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
35
36
|
#include "src/core/lib/gprpp/sync.h"
|
@@ -41,31 +42,6 @@
|
|
41
42
|
// Channel arg containing a URI indicating the address to connect to.
|
42
43
|
#define GRPC_ARG_SUBCHANNEL_ADDRESS "grpc.subchannel_address"
|
43
44
|
|
44
|
-
// For debugging refcounting.
|
45
|
-
#ifndef NDEBUG
|
46
|
-
#define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref(__FILE__, __LINE__, (r))
|
47
|
-
#define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
|
48
|
-
#define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref(__FILE__, __LINE__, (r))
|
49
|
-
#define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef(__FILE__, __LINE__, (r))
|
50
|
-
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref(__FILE__, __LINE__, (r))
|
51
|
-
#define GRPC_SUBCHANNEL_REF_EXTRA_ARGS \
|
52
|
-
const char *file, int line, const char *reason
|
53
|
-
#define GRPC_SUBCHANNEL_REF_REASON reason
|
54
|
-
#define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS \
|
55
|
-
, GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char* purpose
|
56
|
-
#define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x) , file, line, reason, x
|
57
|
-
#else
|
58
|
-
#define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref()
|
59
|
-
#define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
|
60
|
-
#define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref()
|
61
|
-
#define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef()
|
62
|
-
#define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref()
|
63
|
-
#define GRPC_SUBCHANNEL_REF_EXTRA_ARGS
|
64
|
-
#define GRPC_SUBCHANNEL_REF_REASON ""
|
65
|
-
#define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS
|
66
|
-
#define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x)
|
67
|
-
#endif
|
68
|
-
|
69
45
|
namespace grpc_core {
|
70
46
|
|
71
47
|
class SubchannelCall;
|
@@ -168,7 +144,7 @@ class SubchannelCall {
|
|
168
144
|
// different from the SubchannelInterface that is exposed to LB policy
|
169
145
|
// implementations. The client channel provides an adaptor class
|
170
146
|
// (SubchannelWrapper) that "converts" between the two.
|
171
|
-
class Subchannel {
|
147
|
+
class Subchannel : public DualRefCounted<Subchannel> {
|
172
148
|
public:
|
173
149
|
class ConnectivityStateWatcherInterface
|
174
150
|
: public RefCounted<ConnectivityStateWatcherInterface> {
|
@@ -204,37 +180,29 @@ class Subchannel {
|
|
204
180
|
ConnectivityStateChange PopConnectivityStateChange();
|
205
181
|
|
206
182
|
private:
|
183
|
+
Mutex mu_; // protects the queue
|
207
184
|
// Keeps track of the updates that the watcher instance must be notified of.
|
208
185
|
// TODO(yashkt): This is currently needed to send the state updates in the
|
209
186
|
// right order when asynchronously notifying. This will no longer be
|
210
187
|
// necessary when we have access to EventManager.
|
211
|
-
std::deque<ConnectivityStateChange> connectivity_state_queue_
|
212
|
-
|
188
|
+
std::deque<ConnectivityStateChange> connectivity_state_queue_
|
189
|
+
ABSL_GUARDED_BY(&mu_);
|
213
190
|
};
|
214
191
|
|
192
|
+
// Creates a subchannel given \a connector and \a args.
|
193
|
+
static RefCountedPtr<Subchannel> Create(
|
194
|
+
OrphanablePtr<SubchannelConnector> connector,
|
195
|
+
const grpc_channel_args* args);
|
196
|
+
|
215
197
|
// The ctor and dtor are not intended to use directly.
|
216
|
-
Subchannel(SubchannelKey
|
198
|
+
Subchannel(SubchannelKey key, OrphanablePtr<SubchannelConnector> connector,
|
217
199
|
const grpc_channel_args* args);
|
218
|
-
~Subchannel();
|
219
|
-
|
220
|
-
// Creates a subchannel given \a connector and \a args.
|
221
|
-
static Subchannel* Create(OrphanablePtr<SubchannelConnector> connector,
|
222
|
-
const grpc_channel_args* args);
|
200
|
+
~Subchannel() override;
|
223
201
|
|
224
202
|
// Throttles keepalive time to \a new_keepalive_time iff \a new_keepalive_time
|
225
203
|
// is larger than the subchannel's current keepalive time. The updated value
|
226
204
|
// will have an affect when the subchannel creates a new ConnectedSubchannel.
|
227
|
-
void ThrottleKeepaliveTime(int new_keepalive_time);
|
228
|
-
|
229
|
-
// Strong and weak refcounting.
|
230
|
-
Subchannel* Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
231
|
-
void Unref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
232
|
-
Subchannel* WeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
233
|
-
void WeakUnref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
|
234
|
-
// Attempts to return a strong ref when only the weak refcount is guaranteed
|
235
|
-
// non-zero. If the strong refcount is zero, does not alter the refcount and
|
236
|
-
// returns null.
|
237
|
-
Subchannel* RefFromWeakRef();
|
205
|
+
void ThrottleKeepaliveTime(int new_keepalive_time) ABSL_LOCKS_EXCLUDED(mu_);
|
238
206
|
|
239
207
|
// Gets the string representing the subchannel address.
|
240
208
|
// Caller doesn't take ownership.
|
@@ -251,7 +219,8 @@ class Subchannel {
|
|
251
219
|
// If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel.
|
252
220
|
grpc_connectivity_state CheckConnectivityState(
|
253
221
|
const absl::optional<std::string>& health_check_service_name,
|
254
|
-
RefCountedPtr<ConnectedSubchannel>* connected_subchannel)
|
222
|
+
RefCountedPtr<ConnectedSubchannel>* connected_subchannel)
|
223
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
255
224
|
|
256
225
|
// Starts watching the subchannel's connectivity state.
|
257
226
|
// The first callback to the watcher will be delivered when the
|
@@ -264,23 +233,27 @@ class Subchannel {
|
|
264
233
|
void WatchConnectivityState(
|
265
234
|
grpc_connectivity_state initial_state,
|
266
235
|
const absl::optional<std::string>& health_check_service_name,
|
267
|
-
RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
|
236
|
+
RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
|
237
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
268
238
|
|
269
239
|
// Cancels a connectivity state watch.
|
270
240
|
// If the watcher has already been destroyed, this is a no-op.
|
271
241
|
void CancelConnectivityStateWatch(
|
272
242
|
const absl::optional<std::string>& health_check_service_name,
|
273
|
-
ConnectivityStateWatcherInterface* watcher);
|
243
|
+
ConnectivityStateWatcherInterface* watcher) ABSL_LOCKS_EXCLUDED(mu_);
|
274
244
|
|
275
245
|
// Attempt to connect to the backend. Has no effect if already connected.
|
276
|
-
void AttemptToConnect();
|
246
|
+
void AttemptToConnect() ABSL_LOCKS_EXCLUDED(mu_);
|
277
247
|
|
278
248
|
// Resets the connection backoff of the subchannel.
|
279
249
|
// TODO(roth): Move connection backoff out of subchannels and up into LB
|
280
250
|
// policy code (probably by adding a SubchannelGroup between
|
281
251
|
// SubchannelList and SubchannelData), at which point this method can
|
282
252
|
// go away.
|
283
|
-
void ResetBackoff();
|
253
|
+
void ResetBackoff() ABSL_LOCKS_EXCLUDED(mu_);
|
254
|
+
|
255
|
+
// Tears down any existing connection, and arranges for destruction
|
256
|
+
void Orphan() override ABSL_LOCKS_EXCLUDED(mu_);
|
284
257
|
|
285
258
|
// Returns a new channel arg encoding the subchannel address as a URI
|
286
259
|
// string. Caller is responsible for freeing the string.
|
@@ -333,18 +306,20 @@ class Subchannel {
|
|
333
306
|
class HealthWatcherMap {
|
334
307
|
public:
|
335
308
|
void AddWatcherLocked(
|
336
|
-
Subchannel
|
309
|
+
WeakRefCountedPtr<Subchannel> subchannel,
|
310
|
+
grpc_connectivity_state initial_state,
|
337
311
|
const std::string& health_check_service_name,
|
338
312
|
RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
|
339
313
|
void RemoveWatcherLocked(const std::string& health_check_service_name,
|
340
314
|
ConnectivityStateWatcherInterface* watcher);
|
341
315
|
|
342
316
|
// Notifies the watcher when the subchannel's state changes.
|
343
|
-
void NotifyLocked(grpc_connectivity_state state,
|
344
|
-
|
317
|
+
void NotifyLocked(grpc_connectivity_state state, const absl::Status& status)
|
318
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&Subchannel::mu_);
|
345
319
|
|
346
320
|
grpc_connectivity_state CheckConnectivityStateLocked(
|
347
|
-
Subchannel* subchannel, const std::string& health_check_service_name)
|
321
|
+
Subchannel* subchannel, const std::string& health_check_service_name)
|
322
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&Subchannel::mu_);
|
348
323
|
|
349
324
|
void ShutdownLocked();
|
350
325
|
|
@@ -360,72 +335,65 @@ class Subchannel {
|
|
360
335
|
|
361
336
|
// Sets the subchannel's connectivity state to \a state.
|
362
337
|
void SetConnectivityStateLocked(grpc_connectivity_state state,
|
363
|
-
const absl::Status& status)
|
338
|
+
const absl::Status& status)
|
339
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
364
340
|
|
365
341
|
// Methods for connection.
|
366
|
-
void MaybeStartConnectingLocked();
|
367
|
-
static void OnRetryAlarm(void* arg, grpc_error* error)
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
gpr_atm RefMutate(gpr_atm delta,
|
374
|
-
int barrier GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS);
|
342
|
+
void MaybeStartConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
343
|
+
static void OnRetryAlarm(void* arg, grpc_error* error)
|
344
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
345
|
+
void ContinueConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
346
|
+
static void OnConnectingFinished(void* arg, grpc_error* error)
|
347
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
348
|
+
bool PublishTransportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
375
349
|
|
376
350
|
// The subchannel pool this subchannel is in.
|
377
351
|
RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
|
378
352
|
// TODO(juanlishen): Consider using args_ as key_ directly.
|
379
353
|
// Subchannel key that identifies this subchannel in the subchannel pool.
|
380
|
-
SubchannelKey
|
354
|
+
const SubchannelKey key_;
|
381
355
|
// Channel args.
|
382
356
|
grpc_channel_args* args_;
|
383
357
|
// pollset_set tracking who's interested in a connection being setup.
|
384
358
|
grpc_pollset_set* pollset_set_;
|
385
|
-
//
|
386
|
-
|
387
|
-
|
388
|
-
//
|
389
|
-
// these do not keep the subchannel open.
|
390
|
-
// - upper remaining bits are for public references: these do
|
391
|
-
// keep the subchannel open
|
392
|
-
gpr_atm ref_pair_;
|
393
|
-
|
394
|
-
// Connection states.
|
359
|
+
// Channelz tracking.
|
360
|
+
RefCountedPtr<channelz::SubchannelNode> channelz_node_;
|
361
|
+
|
362
|
+
// Connection state.
|
395
363
|
OrphanablePtr<SubchannelConnector> connector_;
|
396
|
-
// Set during connection.
|
397
364
|
SubchannelConnector::Result connecting_result_;
|
398
365
|
grpc_closure on_connecting_finished_;
|
366
|
+
|
367
|
+
// Protects the other members.
|
368
|
+
Mutex mu_;
|
369
|
+
|
399
370
|
// Active connection, or null.
|
400
|
-
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
401
|
-
bool connecting_ = false;
|
402
|
-
bool disconnected_ = false;
|
371
|
+
RefCountedPtr<ConnectedSubchannel> connected_subchannel_ ABSL_GUARDED_BY(mu_);
|
372
|
+
bool connecting_ ABSL_GUARDED_BY(mu_) = false;
|
373
|
+
bool disconnected_ ABSL_GUARDED_BY(mu_) = false;
|
403
374
|
|
404
375
|
// Connectivity state tracking.
|
405
|
-
grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
|
406
|
-
absl::Status status_;
|
376
|
+
grpc_connectivity_state state_ ABSL_GUARDED_BY(mu_) = GRPC_CHANNEL_IDLE;
|
377
|
+
absl::Status status_ ABSL_GUARDED_BY(mu_);
|
407
378
|
// The list of watchers without a health check service name.
|
408
|
-
ConnectivityStateWatcherList watcher_list_;
|
379
|
+
ConnectivityStateWatcherList watcher_list_ ABSL_GUARDED_BY(mu_);
|
409
380
|
// The map of watchers with health check service names.
|
410
|
-
HealthWatcherMap health_watcher_map_;
|
381
|
+
HealthWatcherMap health_watcher_map_ ABSL_GUARDED_BY(mu_);
|
411
382
|
|
412
383
|
// Backoff state.
|
413
|
-
BackOff backoff_;
|
414
|
-
grpc_millis next_attempt_deadline_;
|
415
|
-
grpc_millis min_connect_timeout_ms_;
|
416
|
-
bool backoff_begun_ = false;
|
384
|
+
BackOff backoff_ ABSL_GUARDED_BY(mu_);
|
385
|
+
grpc_millis next_attempt_deadline_ ABSL_GUARDED_BY(mu_);
|
386
|
+
grpc_millis min_connect_timeout_ms_ ABSL_GUARDED_BY(mu_);
|
387
|
+
bool backoff_begun_ ABSL_GUARDED_BY(mu_) = false;
|
417
388
|
|
418
389
|
// Retry alarm.
|
419
|
-
grpc_timer retry_alarm_;
|
420
|
-
grpc_closure on_retry_alarm_;
|
421
|
-
bool have_retry_alarm_ = false;
|
390
|
+
grpc_timer retry_alarm_ ABSL_GUARDED_BY(mu_);
|
391
|
+
grpc_closure on_retry_alarm_ ABSL_GUARDED_BY(mu_);
|
392
|
+
bool have_retry_alarm_ ABSL_GUARDED_BY(mu_) = false;
|
422
393
|
// reset_backoff() was called while alarm was pending.
|
423
|
-
bool retry_immediately_ = false;
|
394
|
+
bool retry_immediately_ ABSL_GUARDED_BY(mu_) = false;
|
424
395
|
// Keepalive time period (-1 for unset)
|
425
|
-
int keepalive_time_ = -1;
|
426
|
-
|
427
|
-
// Channelz tracking.
|
428
|
-
RefCountedPtr<channelz::SubchannelNode> channelz_node_;
|
396
|
+
int keepalive_time_ ABSL_GUARDED_BY(mu_) = -1;
|
429
397
|
};
|
430
398
|
|
431
399
|
} // namespace grpc_core
|
@@ -44,13 +44,27 @@ SubchannelKey::SubchannelKey(const SubchannelKey& other) {
|
|
44
44
|
}
|
45
45
|
|
46
46
|
SubchannelKey& SubchannelKey::operator=(const SubchannelKey& other) {
|
47
|
+
if (&other == this) {
|
48
|
+
return *this;
|
49
|
+
}
|
47
50
|
grpc_channel_args_destroy(const_cast<grpc_channel_args*>(args_));
|
48
51
|
Init(other.args_, grpc_channel_args_copy);
|
49
52
|
return *this;
|
50
53
|
}
|
51
54
|
|
52
|
-
|
53
|
-
|
55
|
+
SubchannelKey::SubchannelKey(SubchannelKey&& other) noexcept {
|
56
|
+
args_ = other.args_;
|
57
|
+
other.args_ = nullptr;
|
58
|
+
}
|
59
|
+
|
60
|
+
SubchannelKey& SubchannelKey::operator=(SubchannelKey&& other) noexcept {
|
61
|
+
args_ = other.args_;
|
62
|
+
other.args_ = nullptr;
|
63
|
+
return *this;
|
64
|
+
}
|
65
|
+
|
66
|
+
bool SubchannelKey::operator<(const SubchannelKey& other) const {
|
67
|
+
return grpc_channel_args_compare(args_, other.args_) < 0;
|
54
68
|
}
|
55
69
|
|
56
70
|
void SubchannelKey::Init(
|
@@ -41,11 +41,11 @@ class SubchannelKey {
|
|
41
41
|
// Copyable.
|
42
42
|
SubchannelKey(const SubchannelKey& other);
|
43
43
|
SubchannelKey& operator=(const SubchannelKey& other);
|
44
|
-
//
|
45
|
-
SubchannelKey(SubchannelKey&&)
|
46
|
-
SubchannelKey& operator=(SubchannelKey&&)
|
44
|
+
// Movable
|
45
|
+
SubchannelKey(SubchannelKey&&) noexcept;
|
46
|
+
SubchannelKey& operator=(SubchannelKey&&) noexcept;
|
47
47
|
|
48
|
-
|
48
|
+
bool operator<(const SubchannelKey& other) const;
|
49
49
|
|
50
50
|
private:
|
51
51
|
// Initializes the subchannel key with the given \a args and the function to
|
@@ -72,15 +72,17 @@ class SubchannelPoolInterface : public RefCounted<SubchannelPoolInterface> {
|
|
72
72
|
// Registers a subchannel against a key. Returns the subchannel registered
|
73
73
|
// with \a key, which may be different from \a constructed because we reuse
|
74
74
|
// (instead of update) any existing subchannel already registered with \a key.
|
75
|
-
virtual Subchannel
|
76
|
-
|
75
|
+
virtual RefCountedPtr<Subchannel> RegisterSubchannel(
|
76
|
+
const SubchannelKey& key, RefCountedPtr<Subchannel> constructed) = 0;
|
77
77
|
|
78
78
|
// Removes the registered subchannel found by \a key.
|
79
|
-
virtual void UnregisterSubchannel(SubchannelKey
|
79
|
+
virtual void UnregisterSubchannel(const SubchannelKey& key,
|
80
|
+
Subchannel* subchannel) = 0;
|
80
81
|
|
81
82
|
// Finds the subchannel registered for the given subchannel key. Returns NULL
|
82
83
|
// if no such channel exists. Thread-safe.
|
83
|
-
virtual Subchannel
|
84
|
+
virtual RefCountedPtr<Subchannel> FindSubchannel(
|
85
|
+
const SubchannelKey& key) = 0;
|
84
86
|
|
85
87
|
// Creates a channel arg from \a subchannel pool.
|
86
88
|
static grpc_arg CreateChannelArg(SubchannelPoolInterface* subchannel_pool);
|
@@ -187,7 +187,7 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
|
|
187
187
|
ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
|
188
188
|
// Catch the disconnect_with_error transport op.
|
189
189
|
if (op->disconnect_with_error != nullptr) {
|
190
|
-
// IncreaseCallCount() introduces a
|
190
|
+
// IncreaseCallCount() introduces a phony call and prevent the timer from
|
191
191
|
// being reset by other threads.
|
192
192
|
chand->IncreaseCallCount();
|
193
193
|
// If the timer has been set, cancel the timer.
|
@@ -0,0 +1,500 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2021 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 "src/core/ext/filters/fault_injection/fault_injection_filter.h"
|
20
|
+
|
21
|
+
#include "absl/strings/numbers.h"
|
22
|
+
|
23
|
+
#include <grpc/support/alloc.h>
|
24
|
+
#include <grpc/support/log.h>
|
25
|
+
|
26
|
+
#include "src/core/ext/filters/client_channel/service_config.h"
|
27
|
+
#include "src/core/ext/filters/client_channel/service_config_call_data.h"
|
28
|
+
#include "src/core/ext/filters/fault_injection/service_config_parser.h"
|
29
|
+
#include "src/core/lib/channel/channel_stack.h"
|
30
|
+
#include "src/core/lib/channel/status_util.h"
|
31
|
+
#include "src/core/lib/gprpp/atomic.h"
|
32
|
+
#include "src/core/lib/gprpp/sync.h"
|
33
|
+
#include "src/core/lib/iomgr/closure.h"
|
34
|
+
#include "src/core/lib/iomgr/timer.h"
|
35
|
+
#include "src/core/lib/transport/status_conversion.h"
|
36
|
+
|
37
|
+
namespace grpc_core {
|
38
|
+
|
39
|
+
TraceFlag grpc_fault_injection_filter_trace(false, "fault_injection_filter");
|
40
|
+
|
41
|
+
namespace {
|
42
|
+
|
43
|
+
Atomic<uint32_t> g_active_faults{0};
|
44
|
+
static_assert(
|
45
|
+
std::is_trivially_destructible<Atomic<uint32_t>>::value,
|
46
|
+
"the active fault counter needs to have a trivially destructible type");
|
47
|
+
|
48
|
+
inline int GetLinkedMetadatumValueInt(grpc_linked_mdelem* md) {
|
49
|
+
int res;
|
50
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
|
51
|
+
return res;
|
52
|
+
} else {
|
53
|
+
return -1;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
inline uint32_t GetLinkedMetadatumValueUnsignedInt(grpc_linked_mdelem* md) {
|
58
|
+
uint32_t res;
|
59
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
|
60
|
+
return res;
|
61
|
+
} else {
|
62
|
+
return -1;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
inline int64_t GetLinkedMetadatumValueInt64(grpc_linked_mdelem* md) {
|
67
|
+
int64_t res;
|
68
|
+
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
|
69
|
+
return res;
|
70
|
+
} else {
|
71
|
+
return -1;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
inline bool UnderFraction(const uint32_t numerator,
|
76
|
+
const uint32_t denominator) {
|
77
|
+
if (numerator <= 0) return false;
|
78
|
+
if (numerator >= denominator) return true;
|
79
|
+
// Generate a random number in [0, denominator).
|
80
|
+
const uint32_t random_number = rand() % denominator;
|
81
|
+
return random_number < numerator;
|
82
|
+
}
|
83
|
+
|
84
|
+
class ChannelData {
|
85
|
+
public:
|
86
|
+
static grpc_error* Init(grpc_channel_element* elem,
|
87
|
+
grpc_channel_element_args* args);
|
88
|
+
static void Destroy(grpc_channel_element* elem);
|
89
|
+
|
90
|
+
int index() const { return index_; }
|
91
|
+
|
92
|
+
private:
|
93
|
+
ChannelData(grpc_channel_element* elem, grpc_channel_element_args* args);
|
94
|
+
~ChannelData() = default;
|
95
|
+
|
96
|
+
// The relative index of instances of the same filter.
|
97
|
+
int index_;
|
98
|
+
};
|
99
|
+
|
100
|
+
class CallData {
|
101
|
+
public:
|
102
|
+
static grpc_error* Init(grpc_call_element* elem,
|
103
|
+
const grpc_call_element_args* args);
|
104
|
+
|
105
|
+
static void Destroy(grpc_call_element* elem,
|
106
|
+
const grpc_call_final_info* /*final_info*/,
|
107
|
+
grpc_closure* /*then_schedule_closure*/);
|
108
|
+
|
109
|
+
static void StartTransportStreamOpBatch(
|
110
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
|
111
|
+
|
112
|
+
private:
|
113
|
+
class ResumeBatchCanceller;
|
114
|
+
|
115
|
+
CallData(grpc_call_element* elem, const grpc_call_element_args* args);
|
116
|
+
~CallData();
|
117
|
+
|
118
|
+
void DecideWhetherToInjectFaults(grpc_metadata_batch* initial_metadata);
|
119
|
+
|
120
|
+
// Checks if current active faults exceed the allowed max faults.
|
121
|
+
bool HaveActiveFaultsQuota(bool increment);
|
122
|
+
|
123
|
+
// Returns true if this RPC needs to be delayed. If so, this call will be
|
124
|
+
// counted as an active fault.
|
125
|
+
bool MaybeDelay();
|
126
|
+
|
127
|
+
// Returns the aborted RPC status if this RPC needs to be aborted. If so,
|
128
|
+
// this call will be counted as an active fault. Otherwise, it returns
|
129
|
+
// GRPC_ERROR_NONE.
|
130
|
+
// If this call is already been delay injected, skip the active faults
|
131
|
+
// quota check.
|
132
|
+
grpc_error* MaybeAbort();
|
133
|
+
|
134
|
+
// Delays the stream operations batch.
|
135
|
+
void DelayBatch(grpc_call_element* elem,
|
136
|
+
grpc_transport_stream_op_batch* batch);
|
137
|
+
|
138
|
+
// Cancels the delay timer.
|
139
|
+
void CancelDelayTimer() { grpc_timer_cancel(&delay_timer_); }
|
140
|
+
|
141
|
+
// Finishes the fault injection, should only be called once.
|
142
|
+
void FaultInjectionFinished() {
|
143
|
+
g_active_faults.FetchSub(1, MemoryOrder::RELAXED);
|
144
|
+
}
|
145
|
+
|
146
|
+
// This is a callback that will be invoked after the delay timer is up.
|
147
|
+
static void ResumeBatch(void* arg, grpc_error* error);
|
148
|
+
|
149
|
+
// This is a callback invoked upon completion of recv_trailing_metadata.
|
150
|
+
// Injects the abort_error_ to the recv_trailing_metadata batch if needed.
|
151
|
+
static void HijackedRecvTrailingMetadataReady(void* arg, grpc_error*);
|
152
|
+
|
153
|
+
// Used to track the policy structs that needs to be destroyed in dtor.
|
154
|
+
bool fi_policy_owned_ = false;
|
155
|
+
const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy_;
|
156
|
+
grpc_call_stack* owning_call_;
|
157
|
+
Arena* arena_;
|
158
|
+
CallCombiner* call_combiner_;
|
159
|
+
|
160
|
+
// Indicates whether we are doing a delay and/or an abort for this call.
|
161
|
+
bool delay_request_ = false;
|
162
|
+
bool abort_request_ = false;
|
163
|
+
|
164
|
+
// Delay states
|
165
|
+
grpc_timer delay_timer_ ABSL_GUARDED_BY(delay_mu_);
|
166
|
+
ResumeBatchCanceller* resume_batch_canceller_ ABSL_GUARDED_BY(delay_mu_);
|
167
|
+
grpc_transport_stream_op_batch* delayed_batch_ ABSL_GUARDED_BY(delay_mu_);
|
168
|
+
// Abort states
|
169
|
+
grpc_error* abort_error_ = GRPC_ERROR_NONE;
|
170
|
+
grpc_closure recv_trailing_metadata_ready_;
|
171
|
+
grpc_closure* original_recv_trailing_metadata_ready_;
|
172
|
+
// Protects the asynchronous delay, resume, and cancellation.
|
173
|
+
Mutex delay_mu_;
|
174
|
+
};
|
175
|
+
|
176
|
+
// ChannelData
|
177
|
+
|
178
|
+
grpc_error* ChannelData::Init(grpc_channel_element* elem,
|
179
|
+
grpc_channel_element_args* args) {
|
180
|
+
GPR_ASSERT(elem->filter == &FaultInjectionFilterVtable);
|
181
|
+
new (elem->channel_data) ChannelData(elem, args);
|
182
|
+
return GRPC_ERROR_NONE;
|
183
|
+
}
|
184
|
+
|
185
|
+
void ChannelData::Destroy(grpc_channel_element* elem) {
|
186
|
+
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
187
|
+
chand->~ChannelData();
|
188
|
+
}
|
189
|
+
|
190
|
+
ChannelData::ChannelData(grpc_channel_element* elem,
|
191
|
+
grpc_channel_element_args* args)
|
192
|
+
: index_(grpc_channel_stack_filter_instance_number(args->channel_stack,
|
193
|
+
elem)) {}
|
194
|
+
|
195
|
+
// CallData::ResumeBatchCanceller
|
196
|
+
|
197
|
+
class CallData::ResumeBatchCanceller {
|
198
|
+
public:
|
199
|
+
explicit ResumeBatchCanceller(grpc_call_element* elem) : elem_(elem) {
|
200
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
201
|
+
GRPC_CALL_STACK_REF(calld->owning_call_, "ResumeBatchCanceller");
|
202
|
+
GRPC_CLOSURE_INIT(&closure_, &Cancel, this, grpc_schedule_on_exec_ctx);
|
203
|
+
calld->call_combiner_->SetNotifyOnCancel(&closure_);
|
204
|
+
}
|
205
|
+
|
206
|
+
private:
|
207
|
+
static void Cancel(void* arg, grpc_error* error) {
|
208
|
+
auto* self = static_cast<ResumeBatchCanceller*>(arg);
|
209
|
+
auto* chand = static_cast<ChannelData*>(self->elem_->channel_data);
|
210
|
+
auto* calld = static_cast<CallData*>(self->elem_->call_data);
|
211
|
+
{
|
212
|
+
MutexLock lock(&calld->delay_mu_);
|
213
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
|
214
|
+
gpr_log(GPR_INFO,
|
215
|
+
"chand=%p calld=%p: cancelling schdueled pick: "
|
216
|
+
"error=%s self=%p calld->resume_batch_canceller_=%p",
|
217
|
+
chand, calld, grpc_error_string(error), self,
|
218
|
+
calld->resume_batch_canceller_);
|
219
|
+
}
|
220
|
+
if (error != GRPC_ERROR_NONE && calld->resume_batch_canceller_ == self) {
|
221
|
+
// Cancel the delayed pick.
|
222
|
+
calld->CancelDelayTimer();
|
223
|
+
calld->FaultInjectionFinished();
|
224
|
+
// Fail pending batches on the call.
|
225
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
226
|
+
calld->delayed_batch_, GRPC_ERROR_REF(error),
|
227
|
+
calld->call_combiner_);
|
228
|
+
}
|
229
|
+
}
|
230
|
+
GRPC_CALL_STACK_UNREF(calld->owning_call_, "ResumeBatchCanceller");
|
231
|
+
delete self;
|
232
|
+
}
|
233
|
+
|
234
|
+
grpc_call_element* elem_;
|
235
|
+
grpc_closure closure_;
|
236
|
+
};
|
237
|
+
|
238
|
+
// CallData
|
239
|
+
|
240
|
+
grpc_error* CallData::Init(grpc_call_element* elem,
|
241
|
+
const grpc_call_element_args* args) {
|
242
|
+
auto* calld = new (elem->call_data) CallData(elem, args);
|
243
|
+
if (calld->fi_policy_ == nullptr) {
|
244
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
245
|
+
"failed to find fault injection policy");
|
246
|
+
}
|
247
|
+
return GRPC_ERROR_NONE;
|
248
|
+
}
|
249
|
+
|
250
|
+
void CallData::Destroy(grpc_call_element* elem,
|
251
|
+
const grpc_call_final_info* /*final_info*/,
|
252
|
+
grpc_closure* /*then_schedule_closure*/) {
|
253
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
254
|
+
calld->~CallData();
|
255
|
+
}
|
256
|
+
|
257
|
+
void CallData::StartTransportStreamOpBatch(
|
258
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
259
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
260
|
+
// There should only be one send_initial_metdata op, and fault injection also
|
261
|
+
// only need to be enforced once.
|
262
|
+
if (batch->send_initial_metadata) {
|
263
|
+
calld->DecideWhetherToInjectFaults(
|
264
|
+
batch->payload->send_initial_metadata.send_initial_metadata);
|
265
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
|
266
|
+
gpr_log(GPR_INFO,
|
267
|
+
"chand=%p calld=%p: Fault injection triggered delay=%d abort=%d",
|
268
|
+
elem->channel_data, calld, calld->delay_request_,
|
269
|
+
calld->abort_request_);
|
270
|
+
}
|
271
|
+
if (calld->MaybeDelay()) {
|
272
|
+
// Delay the batch, and pass down the batch in the scheduled closure.
|
273
|
+
calld->DelayBatch(elem, batch);
|
274
|
+
return;
|
275
|
+
}
|
276
|
+
grpc_error* abort_error = calld->MaybeAbort();
|
277
|
+
if (abort_error != GRPC_ERROR_NONE) {
|
278
|
+
calld->abort_error_ = abort_error;
|
279
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
280
|
+
batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
|
281
|
+
return;
|
282
|
+
}
|
283
|
+
} else {
|
284
|
+
if (batch->recv_trailing_metadata) {
|
285
|
+
// Intercept recv_trailing_metadata callback so that we can inject the
|
286
|
+
// failure when aborting streaming calls, because their
|
287
|
+
// recv_trailing_metatdata op may not be on the same batch as the
|
288
|
+
// send_initial_metadata op.
|
289
|
+
calld->original_recv_trailing_metadata_ready_ =
|
290
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
|
291
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
292
|
+
&calld->recv_trailing_metadata_ready_;
|
293
|
+
}
|
294
|
+
if (calld->abort_error_ != GRPC_ERROR_NONE) {
|
295
|
+
// If we already decided to abort, then immediately fail this batch.
|
296
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
297
|
+
batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
|
298
|
+
return;
|
299
|
+
}
|
300
|
+
}
|
301
|
+
// Chain to the next filter.
|
302
|
+
grpc_call_next_op(elem, batch);
|
303
|
+
}
|
304
|
+
|
305
|
+
CallData::CallData(grpc_call_element* elem, const grpc_call_element_args* args)
|
306
|
+
: owning_call_(args->call_stack),
|
307
|
+
arena_(args->arena),
|
308
|
+
call_combiner_(args->call_combiner) {
|
309
|
+
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
310
|
+
// Fetch the fault injection policy from the service config, based on the
|
311
|
+
// relative index for which policy should this CallData use.
|
312
|
+
auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
|
313
|
+
args->context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
|
314
|
+
auto* method_params = static_cast<FaultInjectionMethodParsedConfig*>(
|
315
|
+
service_config_call_data->GetMethodParsedConfig(
|
316
|
+
FaultInjectionServiceConfigParser::ParserIndex()));
|
317
|
+
if (method_params != nullptr) {
|
318
|
+
fi_policy_ = method_params->fault_injection_policy(chand->index());
|
319
|
+
}
|
320
|
+
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
|
321
|
+
HijackedRecvTrailingMetadataReady, elem,
|
322
|
+
grpc_schedule_on_exec_ctx);
|
323
|
+
}
|
324
|
+
|
325
|
+
CallData::~CallData() {
|
326
|
+
if (fi_policy_owned_) {
|
327
|
+
fi_policy_->~FaultInjectionPolicy();
|
328
|
+
}
|
329
|
+
GRPC_ERROR_UNREF(abort_error_);
|
330
|
+
}
|
331
|
+
|
332
|
+
void CallData::DecideWhetherToInjectFaults(
|
333
|
+
grpc_metadata_batch* initial_metadata) {
|
334
|
+
FaultInjectionMethodParsedConfig::FaultInjectionPolicy* copied_policy =
|
335
|
+
nullptr;
|
336
|
+
// Update the policy with values in initial metadata.
|
337
|
+
if (!fi_policy_->abort_code_header.empty() ||
|
338
|
+
!fi_policy_->abort_percentage_header.empty() ||
|
339
|
+
!fi_policy_->delay_header.empty() ||
|
340
|
+
!fi_policy_->delay_percentage_header.empty()) {
|
341
|
+
// Defer the actual copy until the first matched header.
|
342
|
+
auto maybe_copy_policy_func = [this, &copied_policy]() {
|
343
|
+
if (copied_policy == nullptr) {
|
344
|
+
copied_policy =
|
345
|
+
arena_->New<FaultInjectionMethodParsedConfig::FaultInjectionPolicy>(
|
346
|
+
*fi_policy_);
|
347
|
+
}
|
348
|
+
};
|
349
|
+
for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
|
350
|
+
md = md->next) {
|
351
|
+
absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
|
352
|
+
// Only perform string comparison if:
|
353
|
+
// 1. Needs to check this header;
|
354
|
+
// 2. The value is not been filled before.
|
355
|
+
if (!fi_policy_->abort_code_header.empty() &&
|
356
|
+
(copied_policy == nullptr ||
|
357
|
+
copied_policy->abort_code == GRPC_STATUS_OK) &&
|
358
|
+
key == fi_policy_->abort_code_header) {
|
359
|
+
maybe_copy_policy_func();
|
360
|
+
grpc_status_code_from_int(GetLinkedMetadatumValueInt(md),
|
361
|
+
&copied_policy->abort_code);
|
362
|
+
}
|
363
|
+
if (!fi_policy_->abort_percentage_header.empty() &&
|
364
|
+
key == fi_policy_->abort_percentage_header) {
|
365
|
+
maybe_copy_policy_func();
|
366
|
+
copied_policy->abort_percentage_numerator =
|
367
|
+
GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
|
368
|
+
fi_policy_->abort_percentage_numerator);
|
369
|
+
}
|
370
|
+
if (!fi_policy_->delay_header.empty() &&
|
371
|
+
(copied_policy == nullptr || copied_policy->delay == 0) &&
|
372
|
+
key == fi_policy_->delay_header) {
|
373
|
+
maybe_copy_policy_func();
|
374
|
+
copied_policy->delay = static_cast<grpc_millis>(
|
375
|
+
GPR_MAX(GetLinkedMetadatumValueInt64(md), 0));
|
376
|
+
}
|
377
|
+
if (!fi_policy_->delay_percentage_header.empty() &&
|
378
|
+
key == fi_policy_->delay_percentage_header) {
|
379
|
+
maybe_copy_policy_func();
|
380
|
+
copied_policy->delay_percentage_numerator =
|
381
|
+
GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
|
382
|
+
fi_policy_->delay_percentage_numerator);
|
383
|
+
}
|
384
|
+
}
|
385
|
+
if (copied_policy != nullptr) fi_policy_ = copied_policy;
|
386
|
+
}
|
387
|
+
// Roll the dice
|
388
|
+
delay_request_ = fi_policy_->delay != 0 &&
|
389
|
+
UnderFraction(fi_policy_->delay_percentage_numerator,
|
390
|
+
fi_policy_->delay_percentage_denominator);
|
391
|
+
abort_request_ = fi_policy_->abort_code != GRPC_STATUS_OK &&
|
392
|
+
UnderFraction(fi_policy_->abort_percentage_numerator,
|
393
|
+
fi_policy_->abort_percentage_denominator);
|
394
|
+
if (!delay_request_ && !abort_request_) {
|
395
|
+
if (copied_policy != nullptr) copied_policy->~FaultInjectionPolicy();
|
396
|
+
// No fault injection for this call
|
397
|
+
} else {
|
398
|
+
fi_policy_owned_ = copied_policy != nullptr;
|
399
|
+
}
|
400
|
+
}
|
401
|
+
|
402
|
+
bool CallData::HaveActiveFaultsQuota(bool increment) {
|
403
|
+
if (g_active_faults.Load(MemoryOrder::ACQUIRE) >= fi_policy_->max_faults) {
|
404
|
+
return false;
|
405
|
+
}
|
406
|
+
if (increment) g_active_faults.FetchAdd(1, MemoryOrder::RELAXED);
|
407
|
+
return true;
|
408
|
+
}
|
409
|
+
|
410
|
+
bool CallData::MaybeDelay() {
|
411
|
+
if (delay_request_) {
|
412
|
+
return HaveActiveFaultsQuota(true);
|
413
|
+
}
|
414
|
+
return false;
|
415
|
+
}
|
416
|
+
|
417
|
+
grpc_error* CallData::MaybeAbort() {
|
418
|
+
if (abort_request_ && (delay_request_ || HaveActiveFaultsQuota(false))) {
|
419
|
+
return grpc_error_set_int(
|
420
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(fi_policy_->abort_message.c_str()),
|
421
|
+
GRPC_ERROR_INT_GRPC_STATUS, fi_policy_->abort_code);
|
422
|
+
}
|
423
|
+
return GRPC_ERROR_NONE;
|
424
|
+
}
|
425
|
+
|
426
|
+
void CallData::DelayBatch(grpc_call_element* elem,
|
427
|
+
grpc_transport_stream_op_batch* batch) {
|
428
|
+
MutexLock lock(&delay_mu_);
|
429
|
+
delayed_batch_ = batch;
|
430
|
+
resume_batch_canceller_ = new ResumeBatchCanceller(elem);
|
431
|
+
grpc_millis resume_time = ExecCtx::Get()->Now() + fi_policy_->delay;
|
432
|
+
GRPC_CLOSURE_INIT(&batch->handler_private.closure, ResumeBatch, elem,
|
433
|
+
grpc_schedule_on_exec_ctx);
|
434
|
+
grpc_timer_init(&delay_timer_, resume_time, &batch->handler_private.closure);
|
435
|
+
}
|
436
|
+
|
437
|
+
void CallData::ResumeBatch(void* arg, grpc_error* error) {
|
438
|
+
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
|
439
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
440
|
+
MutexLock lock(&calld->delay_mu_);
|
441
|
+
// Cancelled or canceller has already run
|
442
|
+
if (error == GRPC_ERROR_CANCELLED ||
|
443
|
+
calld->resume_batch_canceller_ == nullptr) {
|
444
|
+
return;
|
445
|
+
}
|
446
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
|
447
|
+
gpr_log(GPR_INFO, "chand=%p calld=%p: Resuming delayed stream op batch %p",
|
448
|
+
elem->channel_data, calld, calld->delayed_batch_);
|
449
|
+
}
|
450
|
+
// Lame the canceller
|
451
|
+
calld->resume_batch_canceller_ = nullptr;
|
452
|
+
// Finish fault injection.
|
453
|
+
calld->FaultInjectionFinished();
|
454
|
+
// Abort if needed.
|
455
|
+
error = calld->MaybeAbort();
|
456
|
+
if (error != GRPC_ERROR_NONE) {
|
457
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
458
|
+
calld->delayed_batch_, error, calld->call_combiner_);
|
459
|
+
return;
|
460
|
+
}
|
461
|
+
// Chain to the next filter.
|
462
|
+
grpc_call_next_op(elem, calld->delayed_batch_);
|
463
|
+
}
|
464
|
+
|
465
|
+
void CallData::HijackedRecvTrailingMetadataReady(void* arg, grpc_error* error) {
|
466
|
+
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
|
467
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
468
|
+
if (calld->abort_error_ != GRPC_ERROR_NONE) {
|
469
|
+
error = grpc_error_add_child(GRPC_ERROR_REF(error),
|
470
|
+
GRPC_ERROR_REF(calld->abort_error_));
|
471
|
+
} else {
|
472
|
+
error = GRPC_ERROR_REF(error);
|
473
|
+
}
|
474
|
+
Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
|
475
|
+
error);
|
476
|
+
}
|
477
|
+
|
478
|
+
} // namespace
|
479
|
+
|
480
|
+
extern const grpc_channel_filter FaultInjectionFilterVtable = {
|
481
|
+
CallData::StartTransportStreamOpBatch,
|
482
|
+
grpc_channel_next_op,
|
483
|
+
sizeof(CallData),
|
484
|
+
CallData::Init,
|
485
|
+
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
486
|
+
CallData::Destroy,
|
487
|
+
sizeof(ChannelData),
|
488
|
+
ChannelData::Init,
|
489
|
+
ChannelData::Destroy,
|
490
|
+
grpc_channel_next_get_info,
|
491
|
+
"fault_injection_filter",
|
492
|
+
};
|
493
|
+
|
494
|
+
void FaultInjectionFilterInit(void) {
|
495
|
+
grpc_core::FaultInjectionServiceConfigParser::Register();
|
496
|
+
}
|
497
|
+
|
498
|
+
void FaultInjectionFilterShutdown(void) {}
|
499
|
+
|
500
|
+
} // namespace grpc_core
|