grpc 1.45.0 → 1.46.3
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 +36 -29
- data/include/grpc/impl/codegen/grpc_types.h +7 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
- data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
- data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +3 -3
- data/src/core/ext/filters/client_channel/client_channel.cc +163 -96
- data/src/core/ext/filters/client_channel/client_channel.h +2 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +124 -581
- data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
- data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
- data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +182 -142
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +87 -58
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +51 -48
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +229 -284
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +92 -257
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +51 -221
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +102 -55
- data/src/core/ext/filters/client_channel/retry_filter.cc +18 -3
- data/src/core/ext/filters/client_channel/subchannel.cc +5 -5
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +127 -367
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +78 -458
- data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
- data/src/core/ext/filters/http/client_authority_filter.cc +17 -22
- data/src/core/ext/filters/http/client_authority_filter.h +6 -5
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -6
- data/src/core/ext/filters/http/server/http_server_filter.cc +2 -116
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +2 -8
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +73 -201
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -28
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +24 -13
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +143 -63
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +37 -35
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +177 -77
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +115 -111
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +547 -207
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +26 -13
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +18 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +13 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +9 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +217 -78
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +10 -2
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +20 -2
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +289 -110
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +133 -125
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +656 -267
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +96 -23
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +185 -173
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +860 -309
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +10 -2
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +165 -40
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +433 -174
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +33 -31
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +154 -52
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +14 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +89 -89
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +460 -166
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +379 -69
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +14 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +10 -91
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +26 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +369 -131
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +94 -65
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +447 -161
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +27 -11
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +104 -85
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +378 -113
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +3 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +30 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +43 -16
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +58 -24
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +14 -4
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +100 -43
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +31 -30
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +171 -71
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +196 -95
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +7 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +53 -46
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +284 -129
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +337 -146
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +13 -11
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +49 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +14 -4
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +20 -4
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +205 -86
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +175 -74
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +56 -52
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +370 -146
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +27 -23
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +173 -74
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +362 -341
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2056 -845
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +49 -16
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +56 -50
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +293 -111
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +10 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +26 -10
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +27 -12
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +83 -36
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +7 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +46 -17
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +38 -12
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +10 -6
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +71 -28
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -65
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +8 -7
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +30 -12
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +42 -15
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +173 -144
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +898 -323
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +51 -45
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +261 -116
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +70 -25
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +80 -55
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +410 -124
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +44 -44
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +261 -122
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +47 -21
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +32 -32
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +175 -66
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +17 -6
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +38 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +12 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +43 -18
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +20 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +24 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +14 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +40 -16
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +70 -25
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +37 -18
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +81 -30
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +76 -30
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +28 -10
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +3 -0
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +13 -4
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +9 -0
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +17 -4
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +410 -162
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +440 -158
- data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
- data/src/core/ext/upb-generated/google/api/http.upb.h +116 -43
- data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
- data/src/core/ext/upb-generated/google/api/httpbody.upb.h +19 -7
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +163 -162
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1157 -435
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +10 -4
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +108 -40
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +10 -4
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +19 -7
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +65 -22
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +49 -12
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +364 -149
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +20 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +150 -58
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +51 -18
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +97 -10
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +23 -2
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +27 -6
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +20 -2
- data/src/core/ext/upb-generated/validate/validate.upb.c +261 -250
- data/src/core/ext/upb-generated/validate/validate.upb.h +1836 -663
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +97 -10
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +23 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +70 -10
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +20 -2
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +3 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +38 -12
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +27 -10
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +10 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +21 -8
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +71 -30
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +16 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +12 -12
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +69 -26
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +255 -103
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +19 -8
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +70 -25
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +10 -2
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +195 -185
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +163 -155
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +26 -20
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +738 -730
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +271 -251
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +207 -193
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
- data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
- data/src/core/ext/xds/certificate_provider_store.cc +8 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/xds_api.cc +20 -0
- data/src/core/ext/xds/xds_bootstrap.cc +2 -2
- data/src/core/ext/xds/xds_bootstrap.h +2 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
- data/src/core/ext/xds/xds_certificate_provider.h +8 -0
- data/src/core/ext/xds/xds_client.cc +87 -95
- data/src/core/ext/xds/xds_client.h +13 -5
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
- data/src/core/ext/xds/xds_common_types.cc +9 -9
- data/src/core/ext/xds/xds_common_types.h +3 -3
- data/src/core/ext/xds/xds_endpoint.cc +12 -5
- data/src/core/ext/xds/xds_http_fault_filter.cc +1 -1
- data/src/core/ext/xds/xds_listener.cc +1 -1
- data/src/core/ext/xds/xds_route_config.cc +162 -25
- data/src/core/ext/xds/xds_route_config.h +13 -10
- data/src/core/ext/xds/xds_server_config_fetcher.cc +17 -22
- data/src/core/lib/avl/avl.h +68 -5
- data/src/core/lib/channel/call_tracer.h +4 -1
- data/src/core/lib/channel/channel_args.cc +138 -59
- data/src/core/lib/channel/channel_args.h +210 -9
- data/src/core/lib/channel/channel_args_preconditioning.cc +3 -9
- data/src/core/lib/channel/channel_args_preconditioning.h +1 -2
- data/src/core/lib/channel/channel_stack.h +2 -5
- data/src/core/lib/channel/channel_stack_builder.cc +0 -65
- data/src/core/lib/channel/channel_stack_builder.h +27 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
- data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +495 -162
- data/src/core/lib/channel/promise_based_filter.h +55 -41
- data/src/core/lib/compression/compression_internal.cc +1 -7
- data/src/core/lib/debug/stats_data.cc +2 -6
- data/src/core/lib/debug/stats_data.h +18 -21
- data/src/core/lib/gpr/tls.h +1 -0
- data/src/core/lib/gprpp/bitset.h +12 -0
- data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
- data/src/core/lib/gprpp/match.h +73 -0
- data/src/core/lib/gprpp/overload.h +59 -0
- data/src/core/lib/gprpp/ref_counted.h +2 -0
- data/src/core/lib/gprpp/single_set_ptr.h +87 -0
- data/src/core/lib/gprpp/status_helper.cc +18 -2
- data/src/core/lib/gprpp/time.cc +12 -0
- data/src/core/lib/gprpp/time.h +1 -1
- data/src/core/lib/http/format_request.cc +1 -2
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/http/parser.cc +80 -9
- data/src/core/lib/http/parser.h +14 -1
- data/src/core/lib/iomgr/ev_posix.cc +6 -7
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/port.h +0 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
- data/src/core/lib/iomgr/tcp_posix.cc +93 -35
- data/src/core/lib/iomgr/tcp_server_posix.cc +26 -17
- data/src/core/lib/json/json_util.h +3 -3
- data/src/core/lib/promise/call_push_pull.h +144 -0
- data/src/core/lib/promise/detail/status.h +2 -1
- data/src/core/lib/promise/intra_activity_waiter.h +49 -0
- data/src/core/lib/promise/latch.h +104 -0
- data/src/core/lib/resource_quota/api.cc +5 -30
- data/src/core/lib/resource_quota/api.h +1 -1
- data/src/core/lib/resource_quota/resource_quota.h +8 -0
- data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +9 -12
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
- data/src/core/lib/security/context/security_context.h +8 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
- data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
- data/src/core/lib/security/credentials/call_creds_util.cc +3 -3
- data/src/core/lib/security/credentials/call_creds_util.h +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +15 -10
- data/src/core/lib/security/credentials/composite/composite_credentials.h +9 -8
- data/src/core/lib/security/credentials/credentials.h +16 -33
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -12
- data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -4
- data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +22 -29
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
- data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -9
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -6
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +6 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +49 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +8 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +42 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +9 -6
- data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +48 -50
- data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.h +9 -0
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -2
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
- data/src/core/lib/security/transport/auth_filters.h +7 -7
- data/src/core/lib/security/transport/client_auth_filter.cc +28 -20
- data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
- data/src/core/lib/security/transport/secure_endpoint.h +1 -1
- data/src/core/lib/security/transport/security_handshaker.cc +6 -4
- data/src/core/lib/surface/call.cc +1023 -903
- data/src/core/lib/surface/call.h +0 -14
- data/src/core/lib/surface/channel.cc +4 -3
- data/src/core/lib/surface/channel_init.cc +2 -3
- data/src/core/lib/surface/channel_init.h +2 -6
- data/src/core/lib/surface/init.cc +1 -1
- data/src/core/lib/surface/server.cc +3 -14
- data/src/core/lib/surface/server.h +1 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/byte_stream.cc +2 -0
- data/src/core/lib/transport/metadata_batch.h +12 -8
- data/src/core/lib/transport/transport.h +20 -5
- data/src/core/lib/transport/transport_impl.h +4 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
- data/src/core/tsi/ssl_transport_security.cc +75 -38
- data/src/core/tsi/ssl_transport_security.h +8 -2
- data/src/core/tsi/transport_security_interface.h +2 -0
- data/src/ruby/ext/grpc/extconf.rb +1 -1
- data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
- data/src/ruby/lib/grpc/grpc.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +1 -0
- data/src/ruby/pb/test/client.rb +769 -0
- data/src/ruby/pb/test/server.rb +252 -0
- data/src/ruby/pb/test/xds_client.rb +415 -0
- data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
- data/third_party/upb/upb/decode.c +32 -16
- data/third_party/upb/upb/def.c +118 -55
- data/third_party/upb/upb/def.h +12 -3
- data/third_party/upb/upb/encode.c +14 -8
- data/third_party/upb/upb/json_encode.c +776 -0
- data/third_party/upb/upb/json_encode.h +62 -0
- data/third_party/upb/upb/msg.c +5 -7
- data/third_party/upb/upb/msg.h +1 -2
- data/third_party/upb/upb/msg_internal.h +49 -36
- data/third_party/upb/upb/port_def.inc +8 -0
- data/third_party/upb/upb/port_undef.inc +1 -0
- data/third_party/upb/upb/table.c +10 -6
- data/third_party/upb/upb/table_internal.h +2 -0
- data/third_party/upb/upb/upb.h +41 -11
- data/third_party/zlib/crc32.c +966 -292
- data/third_party/zlib/crc32.h +9441 -436
- data/third_party/zlib/deflate.c +78 -30
- data/third_party/zlib/deflate.h +12 -15
- data/third_party/zlib/gzguts.h +3 -2
- data/third_party/zlib/gzlib.c +5 -3
- data/third_party/zlib/gzread.c +5 -7
- data/third_party/zlib/gzwrite.c +25 -13
- data/third_party/zlib/infback.c +2 -1
- data/third_party/zlib/inffast.c +14 -14
- data/third_party/zlib/inflate.c +39 -8
- data/third_party/zlib/inflate.h +3 -2
- data/third_party/zlib/inftrees.c +3 -3
- data/third_party/zlib/trees.c +27 -48
- data/third_party/zlib/zlib.h +123 -100
- data/third_party/zlib/zutil.c +2 -2
- data/third_party/zlib/zutil.h +12 -9
- metadata +66 -45
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
- data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
- data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
- data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
- data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
- data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
@@ -61,6 +61,7 @@
|
|
61
61
|
#include "src/core/lib/profiling/timers.h"
|
62
62
|
#include "src/core/lib/resource_quota/api.h"
|
63
63
|
#include "src/core/lib/resource_quota/memory_quota.h"
|
64
|
+
#include "src/core/lib/resource_quota/trace.h"
|
64
65
|
#include "src/core/lib/slice/slice_internal.h"
|
65
66
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
66
67
|
|
@@ -365,6 +366,7 @@ struct grpc_tcp {
|
|
365
366
|
/* Used by the endpoint read function to distinguish the very first read call
|
366
367
|
* from the rest */
|
367
368
|
bool is_first_read;
|
369
|
+
bool has_posted_reclaimer;
|
368
370
|
double target_length;
|
369
371
|
double bytes_read_this_round;
|
370
372
|
grpc_core::RefCount refcount;
|
@@ -376,7 +378,8 @@ struct grpc_tcp {
|
|
376
378
|
/* garbage after the last read */
|
377
379
|
grpc_slice_buffer last_read_buffer;
|
378
380
|
|
379
|
-
|
381
|
+
absl::Mutex read_mu;
|
382
|
+
grpc_slice_buffer* incoming_buffer ABSL_GUARDED_BY(read_mu) = nullptr;
|
380
383
|
int inq; /* bytes pending on the socket from the last read. */
|
381
384
|
bool inq_capable; /* cache whether kernel supports inq */
|
382
385
|
|
@@ -423,6 +426,9 @@ struct grpc_tcp {
|
|
423
426
|
on errors anymore */
|
424
427
|
TcpZerocopySendCtx tcp_zerocopy_send_ctx;
|
425
428
|
TcpZerocopySendRecord* current_zerocopy_send = nullptr;
|
429
|
+
|
430
|
+
bool curr_read_completed;
|
431
|
+
int curr_min_read_chunk_size;
|
426
432
|
};
|
427
433
|
|
428
434
|
struct backup_poller {
|
@@ -661,9 +667,35 @@ static void tcp_destroy(grpc_endpoint* ep) {
|
|
661
667
|
TCP_UNREF(tcp, "destroy");
|
662
668
|
}
|
663
669
|
|
664
|
-
static void
|
665
|
-
|
670
|
+
static void perform_reclamation(grpc_tcp* tcp)
|
671
|
+
ABSL_LOCKS_EXCLUDED(tcp->read_mu) {
|
672
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
|
673
|
+
gpr_log(GPR_INFO, "TCP: benign reclamation to free memory");
|
674
|
+
}
|
675
|
+
tcp->read_mu.Lock();
|
676
|
+
if (tcp->incoming_buffer != nullptr) {
|
677
|
+
grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
|
678
|
+
}
|
679
|
+
tcp->read_mu.Unlock();
|
680
|
+
tcp->has_posted_reclaimer = false;
|
681
|
+
}
|
666
682
|
|
683
|
+
static void maybe_post_reclaimer(grpc_tcp* tcp)
|
684
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
|
685
|
+
if (!tcp->has_posted_reclaimer) {
|
686
|
+
tcp->has_posted_reclaimer = true;
|
687
|
+
tcp->memory_owner.PostReclaimer(
|
688
|
+
grpc_core::ReclamationPass::kBenign,
|
689
|
+
[tcp](absl::optional<grpc_core::ReclamationSweep> sweep) {
|
690
|
+
if (!sweep.has_value()) return;
|
691
|
+
perform_reclamation(tcp);
|
692
|
+
});
|
693
|
+
}
|
694
|
+
}
|
695
|
+
|
696
|
+
static void tcp_trace_read(grpc_tcp* tcp, grpc_error_handle error)
|
697
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
|
698
|
+
grpc_closure* cb = tcp->read_cb;
|
667
699
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
668
700
|
gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp, cb, cb->cb, cb->cb_arg);
|
669
701
|
size_t i;
|
@@ -678,15 +710,16 @@ static void call_read_cb(grpc_tcp* tcp, grpc_error_handle error) {
|
|
678
710
|
}
|
679
711
|
}
|
680
712
|
}
|
681
|
-
|
682
|
-
tcp->read_cb = nullptr;
|
683
|
-
tcp->incoming_buffer = nullptr;
|
684
|
-
grpc_core::Closure::Run(DEBUG_LOCATION, cb, error);
|
685
713
|
}
|
686
714
|
|
715
|
+
/* Returns true if data available to read or error other than EAGAIN. */
|
687
716
|
#define MAX_READ_IOVEC 4
|
688
|
-
static
|
717
|
+
static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
|
718
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
|
689
719
|
GPR_TIMER_SCOPE("tcp_do_read", 0);
|
720
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
721
|
+
gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
|
722
|
+
}
|
690
723
|
struct msghdr msg;
|
691
724
|
struct iovec iov[MAX_READ_IOVEC];
|
692
725
|
ssize_t read_bytes;
|
@@ -746,17 +779,16 @@ static void tcp_do_read(grpc_tcp* tcp) {
|
|
746
779
|
/* NB: After calling call_read_cb a parallel call of the read handler may
|
747
780
|
* be running. */
|
748
781
|
if (errno == EAGAIN) {
|
782
|
+
tcp->curr_read_completed = true;
|
749
783
|
finish_estimate(tcp);
|
750
784
|
tcp->inq = 0;
|
751
|
-
|
752
|
-
notify_on_read(tcp);
|
785
|
+
return false;
|
753
786
|
} else {
|
787
|
+
tcp->curr_read_completed = false;
|
754
788
|
grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
|
755
|
-
|
756
|
-
|
757
|
-
TCP_UNREF(tcp, "read");
|
789
|
+
*error = tcp_annotate_error(GRPC_OS_ERROR(errno, "recvmsg"), tcp);
|
790
|
+
return true;
|
758
791
|
}
|
759
|
-
return;
|
760
792
|
}
|
761
793
|
if (read_bytes == 0) {
|
762
794
|
/* 0 read size ==> end of stream
|
@@ -764,12 +796,11 @@ static void tcp_do_read(grpc_tcp* tcp) {
|
|
764
796
|
* We may have read something, i.e., total_read_bytes > 0, but
|
765
797
|
* since the connection is closed we will drop the data here, because we
|
766
798
|
* can't call the callback multiple times. */
|
799
|
+
tcp->curr_read_completed = true;
|
767
800
|
grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
TCP_UNREF(tcp, "read");
|
772
|
-
return;
|
801
|
+
*error = tcp_annotate_error(
|
802
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), tcp);
|
803
|
+
return true;
|
773
804
|
}
|
774
805
|
|
775
806
|
GRPC_STATS_INC_TCP_READ_SIZE(read_bytes);
|
@@ -822,17 +853,20 @@ static void tcp_do_read(grpc_tcp* tcp) {
|
|
822
853
|
finish_estimate(tcp);
|
823
854
|
}
|
824
855
|
|
856
|
+
// There may be more data to be read because recvmsg did not return EAGAIN.
|
857
|
+
tcp->curr_read_completed = false;
|
825
858
|
GPR_DEBUG_ASSERT(total_read_bytes > 0);
|
826
859
|
if (total_read_bytes < tcp->incoming_buffer->length) {
|
827
860
|
grpc_slice_buffer_trim_end(tcp->incoming_buffer,
|
828
861
|
tcp->incoming_buffer->length - total_read_bytes,
|
829
862
|
&tcp->last_read_buffer);
|
830
863
|
}
|
831
|
-
|
832
|
-
|
864
|
+
*error = GRPC_ERROR_NONE;
|
865
|
+
return true;
|
833
866
|
}
|
834
867
|
|
835
|
-
static void
|
868
|
+
static void maybe_make_read_slices(grpc_tcp* tcp)
|
869
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
|
836
870
|
if (tcp->incoming_buffer->length == 0 &&
|
837
871
|
tcp->incoming_buffer->count < MAX_READ_IOVEC) {
|
838
872
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
@@ -845,17 +879,24 @@ static void tcp_continue_read(grpc_tcp* tcp) {
|
|
845
879
|
int target_length = static_cast<int>(tcp->target_length);
|
846
880
|
int extra_wanted =
|
847
881
|
target_length - static_cast<int>(tcp->incoming_buffer->length);
|
882
|
+
if (tcp->curr_read_completed) {
|
883
|
+
// Set it to false again to start the next block of reads
|
884
|
+
tcp->curr_read_completed = false;
|
885
|
+
// Reset curr_min_read_chunk_size for the next block of reads
|
886
|
+
tcp->curr_min_read_chunk_size = tcp->min_read_chunk_size;
|
887
|
+
} else {
|
888
|
+
// Last read is not completed yet. Double the last min read chunk size.
|
889
|
+
tcp->curr_min_read_chunk_size =
|
890
|
+
std::min(2 * tcp->curr_min_read_chunk_size, tcp->max_read_chunk_size);
|
891
|
+
}
|
848
892
|
grpc_slice_buffer_add_indexed(
|
849
893
|
tcp->incoming_buffer,
|
850
894
|
tcp->memory_owner.MakeSlice(grpc_core::MemoryRequest(
|
851
|
-
tcp->
|
852
|
-
grpc_core::Clamp(extra_wanted, tcp->
|
895
|
+
tcp->curr_min_read_chunk_size,
|
896
|
+
grpc_core::Clamp(extra_wanted, tcp->curr_min_read_chunk_size,
|
853
897
|
tcp->max_read_chunk_size))));
|
898
|
+
maybe_post_reclaimer(tcp);
|
854
899
|
}
|
855
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
856
|
-
gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
|
857
|
-
}
|
858
|
-
tcp_do_read(tcp);
|
859
900
|
}
|
860
901
|
|
861
902
|
static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
|
@@ -864,15 +905,28 @@ static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
|
|
864
905
|
gpr_log(GPR_INFO, "TCP:%p got_read: %s", tcp,
|
865
906
|
grpc_error_std_string(error).c_str());
|
866
907
|
}
|
867
|
-
|
868
|
-
|
908
|
+
tcp->read_mu.Lock();
|
909
|
+
grpc_error_handle tcp_read_error;
|
910
|
+
if (GPR_LIKELY(error == GRPC_ERROR_NONE)) {
|
911
|
+
maybe_make_read_slices(tcp);
|
912
|
+
if (!tcp_do_read(tcp, &tcp_read_error)) {
|
913
|
+
/* We've consumed the edge, request a new one */
|
914
|
+
tcp->read_mu.Unlock();
|
915
|
+
notify_on_read(tcp);
|
916
|
+
return;
|
917
|
+
}
|
918
|
+
tcp_trace_read(tcp, tcp_read_error);
|
919
|
+
} else {
|
920
|
+
tcp_read_error = GRPC_ERROR_REF(error);
|
869
921
|
grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
|
870
922
|
grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
|
871
|
-
call_read_cb(tcp, GRPC_ERROR_REF(error));
|
872
|
-
TCP_UNREF(tcp, "read");
|
873
|
-
} else {
|
874
|
-
tcp_continue_read(tcp);
|
875
923
|
}
|
924
|
+
grpc_closure* cb = tcp->read_cb;
|
925
|
+
tcp->read_cb = nullptr;
|
926
|
+
tcp->incoming_buffer = nullptr;
|
927
|
+
tcp->read_mu.Unlock();
|
928
|
+
grpc_core::Closure::Run(DEBUG_LOCATION, cb, tcp_read_error);
|
929
|
+
TCP_UNREF(tcp, "read");
|
876
930
|
}
|
877
931
|
|
878
932
|
static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
|
@@ -880,9 +934,11 @@ static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
|
|
880
934
|
grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
|
881
935
|
GPR_ASSERT(tcp->read_cb == nullptr);
|
882
936
|
tcp->read_cb = cb;
|
937
|
+
tcp->read_mu.Lock();
|
883
938
|
tcp->incoming_buffer = incoming_buffer;
|
884
939
|
grpc_slice_buffer_reset_and_unref_internal(incoming_buffer);
|
885
940
|
grpc_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
|
941
|
+
tcp->read_mu.Unlock();
|
886
942
|
TCP_REF(tcp, "read");
|
887
943
|
if (tcp->is_first_read) {
|
888
944
|
/* Endpoint read called for the very first time. Register read callback with
|
@@ -1741,17 +1797,19 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
|
|
1741
1797
|
tcp->current_zerocopy_send = nullptr;
|
1742
1798
|
tcp->release_fd_cb = nullptr;
|
1743
1799
|
tcp->release_fd = nullptr;
|
1744
|
-
tcp->incoming_buffer = nullptr;
|
1745
1800
|
tcp->target_length = static_cast<double>(tcp_read_chunk_size);
|
1746
1801
|
tcp->min_read_chunk_size = tcp_min_read_chunk_size;
|
1747
1802
|
tcp->max_read_chunk_size = tcp_max_read_chunk_size;
|
1748
1803
|
tcp->bytes_read_this_round = 0;
|
1749
1804
|
/* Will be set to false by the very first endpoint read function */
|
1750
1805
|
tcp->is_first_read = true;
|
1806
|
+
tcp->has_posted_reclaimer = false;
|
1751
1807
|
tcp->bytes_counter = -1;
|
1752
1808
|
tcp->socket_ts_enabled = false;
|
1753
1809
|
tcp->ts_capable = true;
|
1754
1810
|
tcp->outgoing_buffer_arg = nullptr;
|
1811
|
+
tcp->curr_read_completed = true;
|
1812
|
+
tcp->curr_min_read_chunk_size = tcp->min_read_chunk_size;
|
1755
1813
|
if (tcp_tx_zerocopy_enabled && !tcp->tcp_zerocopy_send_ctx.memory_limited()) {
|
1756
1814
|
#ifdef GRPC_LINUX_ERRQUEUE
|
1757
1815
|
const int enable = 1;
|
@@ -29,6 +29,7 @@
|
|
29
29
|
|
30
30
|
#include <errno.h>
|
31
31
|
#include <fcntl.h>
|
32
|
+
#include <inttypes.h>
|
32
33
|
#include <netinet/in.h>
|
33
34
|
#include <netinet/tcp.h>
|
34
35
|
#include <string.h>
|
@@ -61,6 +62,8 @@
|
|
61
62
|
#include "src/core/lib/iomgr/unix_sockets_posix.h"
|
62
63
|
#include "src/core/lib/resource_quota/api.h"
|
63
64
|
|
65
|
+
static std::atomic<int64_t> num_dropped_connections{0};
|
66
|
+
|
64
67
|
static grpc_error_handle tcp_server_create(grpc_closure* shutdown_complete,
|
65
68
|
const grpc_channel_args* args,
|
66
69
|
grpc_tcp_server** server) {
|
@@ -201,27 +204,33 @@ static void on_read(void* arg, grpc_error_handle err) {
|
|
201
204
|
strip off the ::ffff:0.0.0.0/96 prefix first. */
|
202
205
|
int fd = grpc_accept4(sp->fd, &addr, 1, 1);
|
203
206
|
if (fd < 0) {
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
207
|
+
if (errno == EINTR) {
|
208
|
+
continue;
|
209
|
+
} else if (errno == EAGAIN || errno == ECONNABORTED ||
|
210
|
+
errno == EWOULDBLOCK) {
|
211
|
+
grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
|
212
|
+
return;
|
213
|
+
} else {
|
214
|
+
gpr_mu_lock(&sp->server->mu);
|
215
|
+
if (!sp->server->shutdown_listeners) {
|
216
|
+
gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno));
|
217
|
+
} else {
|
218
|
+
/* if we have shutdown listeners, accept4 could fail, and we
|
219
|
+
needn't notify users */
|
220
|
+
}
|
221
|
+
gpr_mu_unlock(&sp->server->mu);
|
222
|
+
goto error;
|
220
223
|
}
|
221
224
|
}
|
222
225
|
|
223
226
|
if (sp->server->memory_quota->IsMemoryPressureHigh()) {
|
224
|
-
|
227
|
+
int64_t dropped_connections_count = ++num_dropped_connections;
|
228
|
+
if (dropped_connections_count % 1000 == 0) {
|
229
|
+
gpr_log(GPR_INFO,
|
230
|
+
"Dropped >= %" PRId64
|
231
|
+
" new connection attempts due to high memory pressure",
|
232
|
+
dropped_connections_count);
|
233
|
+
}
|
225
234
|
close(fd);
|
226
235
|
continue;
|
227
236
|
}
|
@@ -45,9 +45,9 @@ bool ExtractJsonNumber(const Json& json, absl::string_view field_name,
|
|
45
45
|
NumericType* output,
|
46
46
|
std::vector<grpc_error_handle>* error_list) {
|
47
47
|
static_assert(std::is_integral<NumericType>::value, "Integral required");
|
48
|
-
if (json.type() != Json::Type::NUMBER) {
|
49
|
-
error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
|
50
|
-
|
48
|
+
if (json.type() != Json::Type::NUMBER && json.type() != Json::Type::STRING) {
|
49
|
+
error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
|
50
|
+
"field:", field_name, " error:type should be NUMBER or STRING")));
|
51
51
|
return false;
|
52
52
|
}
|
53
53
|
if (!absl::SimpleAtoi(json.string_value(), output)) {
|
@@ -0,0 +1,144 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <assert.h>
|
21
|
+
|
22
|
+
#include "src/core/lib/gprpp/bitset.h"
|
23
|
+
#include "src/core/lib/gprpp/construct_destruct.h"
|
24
|
+
#include "src/core/lib/promise/detail/promise_like.h"
|
25
|
+
#include "src/core/lib/promise/detail/status.h"
|
26
|
+
#include "src/core/lib/promise/poll.h"
|
27
|
+
|
28
|
+
namespace grpc_core {
|
29
|
+
|
30
|
+
namespace promise_detail {
|
31
|
+
|
32
|
+
template <typename FMain, typename FPush, typename FPull>
|
33
|
+
class CallPushPull {
|
34
|
+
public:
|
35
|
+
CallPushPull(FMain f_main, FPush f_push, FPull f_pull)
|
36
|
+
: push_(std::move(f_push)), pull_(std::move(f_pull)) {
|
37
|
+
Construct(&main_, std::move(f_main));
|
38
|
+
}
|
39
|
+
|
40
|
+
CallPushPull(const CallPushPull&) = delete;
|
41
|
+
CallPushPull& operator=(const CallPushPull&) = delete;
|
42
|
+
CallPushPull(CallPushPull&& other) noexcept
|
43
|
+
: done_(other.done_),
|
44
|
+
push_(std::move(other.push_)),
|
45
|
+
pull_(std::move(other.pull_)) {
|
46
|
+
assert(!done_.is_set(kDoneMain));
|
47
|
+
Construct(&main_, std::move(other.main_));
|
48
|
+
}
|
49
|
+
|
50
|
+
CallPushPull& operator=(CallPushPull&& other) noexcept {
|
51
|
+
assert(!done_.is_set(kDoneMain));
|
52
|
+
done_ = other.done_;
|
53
|
+
assert(!done_.is_set(kDoneMain));
|
54
|
+
push_ = std::move(other.push_);
|
55
|
+
main_ = std::move(other.main_);
|
56
|
+
pull_ = std::move(other.pull_);
|
57
|
+
return *this;
|
58
|
+
}
|
59
|
+
|
60
|
+
~CallPushPull() {
|
61
|
+
if (done_.is_set(kDoneMain)) {
|
62
|
+
Destruct(&result_);
|
63
|
+
} else {
|
64
|
+
Destruct(&main_);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
using Result =
|
69
|
+
typename PollTraits<decltype(std::declval<PromiseLike<FMain>>()())>::Type;
|
70
|
+
|
71
|
+
Poll<Result> operator()() {
|
72
|
+
if (!done_.is_set(kDonePush)) {
|
73
|
+
auto p = push_();
|
74
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
|
75
|
+
if (IsStatusOk(*status)) {
|
76
|
+
done_.set(kDonePush);
|
77
|
+
} else {
|
78
|
+
return Result(std::move(*status));
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
if (!done_.is_set(kDoneMain)) {
|
83
|
+
auto p = main_();
|
84
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
|
85
|
+
if (IsStatusOk(*status)) {
|
86
|
+
done_.set(kDoneMain);
|
87
|
+
Destruct(&main_);
|
88
|
+
Construct(&result_, std::move(*status));
|
89
|
+
} else {
|
90
|
+
return std::move(*status);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
94
|
+
if (!done_.is_set(kDonePull)) {
|
95
|
+
auto p = pull_();
|
96
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
|
97
|
+
if (IsStatusOk(*status)) {
|
98
|
+
done_.set(kDonePull);
|
99
|
+
} else {
|
100
|
+
return Result(std::move(*status));
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
if (done_.all()) return std::move(result_);
|
105
|
+
return Pending{};
|
106
|
+
}
|
107
|
+
|
108
|
+
private:
|
109
|
+
enum { kDonePull = 0, kDoneMain = 1, kDonePush = 2 };
|
110
|
+
BitSet<3> done_;
|
111
|
+
GPR_NO_UNIQUE_ADDRESS PromiseLike<FPush> push_;
|
112
|
+
union {
|
113
|
+
PromiseLike<FMain> main_;
|
114
|
+
Result result_;
|
115
|
+
};
|
116
|
+
GPR_NO_UNIQUE_ADDRESS PromiseLike<FPull> pull_;
|
117
|
+
};
|
118
|
+
|
119
|
+
} // namespace promise_detail
|
120
|
+
|
121
|
+
// For promises representing calls a common pattern emerges:
|
122
|
+
// There's a process pushing data down the stack, a process handling the main
|
123
|
+
// call part, and a process pulling data back up the stack.
|
124
|
+
//
|
125
|
+
// This can reasonably be represented by the right combinations of TryJoins and
|
126
|
+
// Maps, but since the structure is fundamental to the domain we introduce
|
127
|
+
// this simple helper to make it easier to write the common case.
|
128
|
+
//
|
129
|
+
// It takes three promises: the main call, the push and the pull.
|
130
|
+
// When polling, the push is polled first, then the main call (descending the
|
131
|
+
// stack), then the pull (as we ascend once more).
|
132
|
+
//
|
133
|
+
// This strategy minimizes repolls.
|
134
|
+
template <typename FMain, typename FPush, typename FPull>
|
135
|
+
promise_detail::CallPushPull<FMain, FPush, FPull> CallPushPull(FMain f_main,
|
136
|
+
FPush f_push,
|
137
|
+
FPull f_pull) {
|
138
|
+
return promise_detail::CallPushPull<FMain, FPush, FPull>(
|
139
|
+
std::move(f_main), std::move(f_push), std::move(f_pull));
|
140
|
+
}
|
141
|
+
|
142
|
+
} // namespace grpc_core
|
143
|
+
|
144
|
+
#endif // GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
|
@@ -39,11 +39,12 @@ inline absl::Status IntoStatus(absl::Status* status) {
|
|
39
39
|
}
|
40
40
|
|
41
41
|
} // namespace promise_detail
|
42
|
-
} // namespace grpc_core
|
43
42
|
|
44
43
|
// Return true if the status represented by the argument is ok, false if not.
|
45
44
|
// By implementing this function for other, non-absl::Status types, those types
|
46
45
|
// can participate in TrySeq as result types that affect control flow.
|
47
46
|
inline bool IsStatusOk(const absl::Status& status) { return status.ok(); }
|
48
47
|
|
48
|
+
} // namespace grpc_core
|
49
|
+
|
49
50
|
#endif // GRPC_CORE_LIB_PROMISE_DETAIL_STATUS_H
|
@@ -0,0 +1,49 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include "src/core/lib/promise/activity.h"
|
21
|
+
#include "src/core/lib/promise/poll.h"
|
22
|
+
|
23
|
+
namespace grpc_core {
|
24
|
+
|
25
|
+
// Helper type to track wakeups between objects in the same activity.
|
26
|
+
// Can be fairly fast as no ref counting or locking needs to occur.
|
27
|
+
class IntraActivityWaiter {
|
28
|
+
public:
|
29
|
+
// Register for wakeup, return Pending(). If state is not ready to proceed,
|
30
|
+
// Promises should bottom out here.
|
31
|
+
Pending pending() {
|
32
|
+
waiting_ = true;
|
33
|
+
return Pending();
|
34
|
+
}
|
35
|
+
// Wake the activity
|
36
|
+
void Wake() {
|
37
|
+
if (waiting_) {
|
38
|
+
waiting_ = false;
|
39
|
+
Activity::current()->ForceImmediateRepoll();
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
private:
|
44
|
+
bool waiting_ = false;
|
45
|
+
};
|
46
|
+
|
47
|
+
} // namespace grpc_core
|
48
|
+
|
49
|
+
#endif // GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
|
@@ -0,0 +1,104 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_PROMISE_LATCH_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_LATCH_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <grpc/support/log.h>
|
21
|
+
|
22
|
+
#include "src/core/lib/promise/activity.h"
|
23
|
+
#include "src/core/lib/promise/intra_activity_waiter.h"
|
24
|
+
#include "src/core/lib/promise/poll.h"
|
25
|
+
|
26
|
+
namespace grpc_core {
|
27
|
+
|
28
|
+
// Latch provides a single set waitable object.
|
29
|
+
// Initially the Latch is unset.
|
30
|
+
// It can be waited upon by the Wait method, which produces a Promise that
|
31
|
+
// resolves when the Latch is Set to a value of type T.
|
32
|
+
template <typename T>
|
33
|
+
class Latch {
|
34
|
+
public:
|
35
|
+
// This is the type of the promise returned by Wait.
|
36
|
+
class WaitPromise {
|
37
|
+
public:
|
38
|
+
Poll<T*> operator()() const {
|
39
|
+
if (latch_->has_value_) {
|
40
|
+
return &latch_->value_;
|
41
|
+
} else {
|
42
|
+
return latch_->waiter_.pending();
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
private:
|
47
|
+
friend class Latch;
|
48
|
+
explicit WaitPromise(Latch* latch) : latch_(latch) {}
|
49
|
+
Latch* latch_;
|
50
|
+
};
|
51
|
+
|
52
|
+
Latch() = default;
|
53
|
+
Latch(const Latch&) = delete;
|
54
|
+
Latch& operator=(const Latch&) = delete;
|
55
|
+
Latch(Latch&& other) noexcept
|
56
|
+
: value_(std::move(other.value_)), has_value_(other.has_value_) {
|
57
|
+
#ifndef NDEBUG
|
58
|
+
GPR_DEBUG_ASSERT(!other.has_had_waiters_);
|
59
|
+
#endif
|
60
|
+
}
|
61
|
+
Latch& operator=(Latch&& other) noexcept {
|
62
|
+
#ifndef NDEBUG
|
63
|
+
GPR_DEBUG_ASSERT(!other.has_had_waiters_);
|
64
|
+
#endif
|
65
|
+
value_ = std::move(other.value_);
|
66
|
+
has_value_ = other.has_value_;
|
67
|
+
return *this;
|
68
|
+
}
|
69
|
+
|
70
|
+
// Produce a promise to wait for a value from this latch.
|
71
|
+
WaitPromise Wait() {
|
72
|
+
#ifndef NDEBUG
|
73
|
+
has_had_waiters_ = true;
|
74
|
+
#endif
|
75
|
+
return WaitPromise(this);
|
76
|
+
}
|
77
|
+
|
78
|
+
// Set the value of the latch. Can only be called once.
|
79
|
+
void Set(T value) {
|
80
|
+
GPR_DEBUG_ASSERT(!has_value_);
|
81
|
+
value_ = std::move(value);
|
82
|
+
has_value_ = true;
|
83
|
+
waiter_.Wake();
|
84
|
+
}
|
85
|
+
|
86
|
+
private:
|
87
|
+
// The value stored (if has_value_ is true), otherwise some random value, we
|
88
|
+
// don't care.
|
89
|
+
// Why not absl::optional<>? Writing things this way lets us compress
|
90
|
+
// has_value_ with waiter_ and leads to some significant memory savings for
|
91
|
+
// some scenarios.
|
92
|
+
GPR_NO_UNIQUE_ADDRESS T value_;
|
93
|
+
// True if we have a value set, false otherwise.
|
94
|
+
bool has_value_ = false;
|
95
|
+
#ifndef NDEBUG
|
96
|
+
// Has this latch ever had waiters.
|
97
|
+
bool has_had_waiters_ = false;
|
98
|
+
#endif
|
99
|
+
IntraActivityWaiter waiter_;
|
100
|
+
};
|
101
|
+
|
102
|
+
} // namespace grpc_core
|
103
|
+
|
104
|
+
#endif // GRPC_CORE_LIB_PROMISE_LATCH_H
|