grpc 1.52.2 → 1.53.0.pre2
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 +50 -5
- data/include/grpc/event_engine/event_engine.h +24 -2
- data/include/grpc/event_engine/slice_buffer.h +13 -1
- data/include/grpc/impl/grpc_types.h +3 -0
- data/include/grpc/support/time.h +6 -4
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +3 -3
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +3 -3
- data/src/core/ext/filters/client_channel/backend_metric.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.h +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +29 -33
- data/src/core/ext/filters/client_channel/client_channel.h +3 -3
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +3 -3
- data/src/core/ext/filters/client_channel/client_channel_factory.h +3 -3
- data/src/core/ext/filters/client_channel/client_channel_service_config.h +3 -3
- data/src/core/ext/filters/client_channel/config_selector.h +3 -3
- data/src/core/ext/filters/client_channel/connector.h +8 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -3
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_proxy.h +3 -3
- data/src/core/ext/filters/client_channel/lb_call_state_internal.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +1 -78
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +12 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +275 -107
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +10 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +5 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +3 -3
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -3
- data/src/core/ext/filters/client_channel/retry_filter.cc +10 -13
- data/src/core/ext/filters/client_channel/retry_filter.h +3 -3
- data/src/core/ext/filters/client_channel/retry_service_config.h +3 -3
- data/src/core/ext/filters/client_channel/retry_throttle.h +3 -3
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +4 -4
- data/src/core/ext/filters/client_channel/subchannel.cc +5 -1
- data/src/core/ext/filters/client_channel/subchannel.h +3 -3
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -3
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -3
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +3 -3
- data/src/core/ext/filters/deadline/deadline_filter.cc +40 -48
- data/src/core/ext/filters/deadline/deadline_filter.h +6 -10
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +3 -3
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +26 -21
- data/src/core/ext/filters/http/client/http_client_filter.h +3 -3
- data/src/core/ext/filters/http/client_authority_filter.h +3 -3
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +109 -117
- data/src/core/ext/filters/http/message_compress/compression_filter.h +17 -10
- data/src/core/ext/filters/http/server/http_server_filter.cc +25 -24
- data/src/core/ext/filters/http/server/http_server_filter.h +3 -3
- data/src/core/ext/filters/message_size/message_size_filter.cc +2 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +3 -3
- data/src/core/ext/filters/rbac/rbac_filter.cc +4 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +3 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +3 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +3 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +27 -37
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +5 -5
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
- data/src/core/ext/transport/chttp2/alpn/alpn.h +3 -3
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +3 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +3 -3
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +3 -3
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +3 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +195 -111
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
- data/src/core/ext/transport/chttp2/transport/context_list.h +3 -3
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +17 -406
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +3 -3
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +3 -3
- data/src/core/ext/transport/chttp2/transport/http_trace.h +3 -3
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +3 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +28 -23
- data/src/core/ext/transport/chttp2/transport/parsing.cc +111 -31
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +9 -8
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -3
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +9 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +38 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +185 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +7 -3
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +44 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +16 -25
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +48 -74
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +30 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +137 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +83 -51
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +17 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +61 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +11 -5
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +37 -6
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +24 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +6 -3
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +24 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +24 -5
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +50 -0
- 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 +254 -17
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +9 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +9 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -6
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +21 -12
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +10 -7
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +42 -12
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +7 -3
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +8 -6
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +31 -9
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +24 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +34 -13
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +195 -187
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +232 -224
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +94 -93
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +81 -75
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +189 -187
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +137 -133
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -133
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +81 -70
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +771 -741
- 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/datadog.upbdefs.c +16 -14
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +14 -13
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +363 -356
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +149 -145
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +16 -13
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +14 -14
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
- data/src/core/ext/xds/certificate_provider_store.h +3 -3
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +1 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +3 -3
- data/src/core/ext/xds/upb_utils.h +3 -3
- data/src/core/ext/xds/xds_api.h +3 -3
- data/src/core/ext/xds/xds_bootstrap.h +3 -3
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +1 -0
- data/src/core/ext/xds/xds_bootstrap_grpc.h +3 -3
- data/src/core/ext/xds/xds_certificate_provider.h +3 -3
- data/src/core/ext/xds/xds_channel_args.h +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.h +3 -3
- data/src/core/ext/xds/xds_client.cc +8 -3
- data/src/core/ext/xds/xds_client.h +3 -3
- data/src/core/ext/xds/xds_client_grpc.cc +0 -1
- data/src/core/ext/xds/xds_client_grpc.h +3 -3
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +11 -7
- data/src/core/ext/xds/xds_cluster.h +6 -6
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +3 -3
- data/src/core/ext/xds/xds_common_types.cc +1 -0
- data/src/core/ext/xds/xds_common_types.h +3 -3
- data/src/core/ext/xds/xds_endpoint.cc +1 -1
- data/src/core/ext/xds/xds_endpoint.h +3 -3
- data/src/core/ext/xds/xds_health_status.h +30 -3
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
- data/src/core/ext/xds/xds_http_filters.cc +1 -1
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +3 -3
- data/src/core/ext/xds/xds_lb_policy_registry.cc +95 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +3 -3
- data/src/core/ext/xds/xds_listener.cc +1 -0
- data/src/core/ext/xds/xds_listener.h +3 -3
- data/src/core/ext/xds/xds_resource_type.h +3 -3
- data/src/core/ext/xds/xds_resource_type_impl.h +3 -3
- data/src/core/ext/xds/xds_route_config.cc +6 -0
- data/src/core/ext/xds/xds_route_config.h +3 -3
- data/src/core/ext/xds/xds_routing.h +3 -3
- data/src/core/ext/xds/xds_transport.h +3 -3
- data/src/core/ext/xds/xds_transport_grpc.h +3 -3
- data/src/core/lib/address_utils/parse_address.h +3 -3
- data/src/core/lib/address_utils/sockaddr_utils.cc +1 -0
- data/src/core/lib/address_utils/sockaddr_utils.h +3 -3
- data/src/core/lib/avl/avl.h +3 -3
- data/src/core/lib/backoff/backoff.h +3 -3
- data/src/core/lib/channel/call_finalization.h +3 -3
- data/src/core/lib/channel/call_tracer.h +3 -3
- data/src/core/lib/channel/channel_args.cc +1 -0
- data/src/core/lib/channel/channel_args.h +11 -5
- data/src/core/lib/channel/channel_args_preconditioning.h +3 -3
- data/src/core/lib/channel/channel_fwd.h +3 -3
- data/src/core/lib/channel/channel_stack.cc +1 -2
- data/src/core/lib/channel/channel_stack.h +4 -4
- data/src/core/lib/channel/channel_stack_builder.h +3 -3
- data/src/core/lib/channel/channel_stack_builder_impl.cc +14 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +3 -3
- data/src/core/lib/channel/channel_trace.h +3 -3
- data/src/core/lib/channel/channelz.h +3 -3
- data/src/core/lib/channel/channelz_registry.h +3 -3
- data/src/core/lib/channel/connected_channel.cc +883 -354
- data/src/core/lib/channel/connected_channel.h +3 -3
- data/src/core/lib/channel/context.h +7 -3
- data/src/core/lib/channel/promise_based_filter.cc +509 -259
- data/src/core/lib/channel/promise_based_filter.h +118 -43
- data/src/core/lib/channel/status_util.h +3 -3
- data/src/core/lib/compression/compression_internal.h +3 -3
- data/src/core/lib/compression/message_compress.h +3 -3
- data/src/core/lib/config/core_configuration.h +3 -3
- data/src/core/lib/debug/event_log.h +3 -3
- data/src/core/lib/debug/histogram_view.h +3 -3
- data/src/core/lib/debug/stats.h +3 -3
- data/src/core/lib/debug/stats_data.cc +66 -65
- data/src/core/lib/debug/stats_data.h +42 -33
- data/src/core/lib/debug/trace.h +4 -26
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +5 -0
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -3
- data/src/core/lib/event_engine/common_closures.h +3 -3
- data/src/core/lib/event_engine/default_event_engine.cc +9 -4
- data/src/core/lib/event_engine/default_event_engine.h +30 -6
- data/src/core/lib/event_engine/default_event_engine_factory.h +3 -3
- data/src/core/lib/event_engine/event_engine.cc +25 -0
- data/src/core/lib/event_engine/executor/executor.h +3 -3
- data/src/core/lib/event_engine/forkable.cc +11 -6
- data/src/core/lib/event_engine/forkable.h +3 -3
- data/src/core/lib/event_engine/handle_containers.h +10 -3
- data/src/core/lib/event_engine/poller.h +3 -3
- data/src/core/lib/event_engine/posix.h +158 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +44 -16
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +14 -4
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +6 -7
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/event_poller.h +3 -3
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -3
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +3 -3
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +52 -55
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +46 -13
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +82 -12
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +23 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +60 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +65 -14
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +0 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -6
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -3
- data/src/core/lib/event_engine/posix_engine/timer.h +3 -3
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +3 -3
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +3 -3
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +3 -3
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +3 -3
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +3 -3
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -3
- data/src/core/lib/event_engine/resolved_address.cc +19 -0
- data/src/core/lib/event_engine/resolved_address_internal.h +34 -0
- data/src/core/lib/event_engine/shim.cc +56 -0
- data/src/core/lib/event_engine/shim.h +33 -0
- data/src/core/lib/event_engine/slice.cc +1 -1
- data/src/core/lib/event_engine/tcp_socket_utils.cc +18 -2
- data/src/core/lib/event_engine/tcp_socket_utils.h +8 -3
- data/src/core/lib/event_engine/thread_local.cc +29 -0
- data/src/core/lib/event_engine/thread_local.h +32 -0
- data/src/core/lib/event_engine/thread_pool.cc +41 -65
- data/src/core/lib/event_engine/thread_pool.h +21 -17
- data/src/core/lib/event_engine/time_util.h +3 -3
- data/src/core/lib/event_engine/trace.cc +6 -0
- data/src/core/lib/event_engine/trace.h +16 -3
- data/src/core/lib/event_engine/utils.cc +2 -2
- data/src/core/lib/event_engine/utils.h +12 -4
- data/src/core/lib/event_engine/windows/iocp.cc +24 -40
- data/src/core/lib/event_engine/windows/iocp.h +3 -3
- data/src/core/lib/event_engine/windows/win_socket.cc +56 -33
- data/src/core/lib/event_engine/windows/win_socket.h +34 -25
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +243 -20
- data/src/core/lib/event_engine/windows/windows_engine.h +62 -23
- data/src/core/lib/experiments/config.cc +16 -1
- data/src/core/lib/experiments/config.h +13 -3
- data/src/core/lib/experiments/experiments.cc +14 -8
- data/src/core/lib/experiments/experiments.h +80 -21
- data/src/core/lib/gpr/alloc.h +3 -3
- data/src/core/lib/gpr/spinlock.h +3 -3
- data/src/core/lib/gpr/string.h +3 -3
- data/src/core/lib/gpr/sync_abseil.cc +15 -7
- data/src/core/lib/gpr/time_precise.h +3 -3
- data/src/core/lib/gpr/tmpfile.h +3 -3
- data/src/core/lib/gpr/useful.h +3 -3
- data/src/core/lib/gprpp/atomic_utils.h +3 -3
- data/src/core/lib/gprpp/bitset.h +3 -3
- data/src/core/lib/gprpp/chunked_vector.h +3 -3
- data/src/core/lib/gprpp/construct_destruct.h +3 -3
- data/src/core/lib/gprpp/cpp_impl_of.h +3 -3
- data/src/core/lib/gprpp/crash.h +3 -3
- data/src/core/lib/gprpp/debug_location.h +3 -6
- data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
- data/src/core/lib/gprpp/env.h +3 -3
- data/src/core/lib/gprpp/examine_stack.h +3 -3
- data/src/core/lib/gprpp/fork.cc +21 -4
- data/src/core/lib/gprpp/fork.h +7 -5
- data/src/core/lib/gprpp/global_config.h +3 -3
- data/src/core/lib/gprpp/global_config_custom.h +3 -3
- data/src/core/lib/gprpp/global_config_env.cc +1 -0
- data/src/core/lib/gprpp/global_config_env.h +3 -3
- data/src/core/lib/gprpp/global_config_generic.h +3 -3
- data/src/core/lib/gprpp/host_port.cc +2 -0
- data/src/core/lib/gprpp/host_port.h +3 -3
- data/src/core/lib/gprpp/load_file.h +3 -3
- data/src/core/lib/gprpp/manual_constructor.h +3 -3
- data/src/core/lib/gprpp/match.h +3 -3
- data/src/core/lib/gprpp/memory.h +3 -3
- data/src/core/lib/gprpp/mpscq.h +3 -3
- data/src/core/lib/gprpp/no_destruct.h +3 -3
- data/src/core/lib/gprpp/notification.h +3 -3
- data/src/core/lib/gprpp/orphanable.h +3 -3
- data/src/core/lib/gprpp/overload.h +3 -3
- data/src/core/lib/gprpp/packed_table.h +3 -3
- data/src/core/lib/gprpp/per_cpu.h +3 -3
- data/src/core/lib/gprpp/ref_counted.h +3 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +3 -3
- data/src/core/lib/gprpp/single_set_ptr.h +3 -3
- data/src/core/lib/gprpp/sorted_pack.h +3 -3
- data/src/core/lib/gprpp/stat.h +3 -3
- data/src/core/lib/gprpp/status_helper.h +3 -3
- data/src/core/lib/gprpp/strerror.cc +2 -0
- data/src/core/lib/gprpp/strerror.h +3 -3
- data/src/core/lib/gprpp/sync.h +3 -3
- data/src/core/lib/gprpp/table.h +3 -3
- data/src/core/lib/gprpp/tchar.h +3 -3
- data/src/core/lib/gprpp/thd.h +3 -3
- data/src/core/lib/gprpp/time.cc +1 -0
- data/src/core/lib/gprpp/time.h +3 -3
- data/src/core/lib/gprpp/time_averaged_stats.h +3 -3
- data/src/core/lib/gprpp/time_util.h +3 -3
- data/src/core/lib/gprpp/unique_type_name.h +3 -3
- data/src/core/lib/gprpp/validation_errors.h +3 -3
- data/src/core/lib/gprpp/work_serializer.h +3 -3
- data/src/core/lib/handshaker/proxy_mapper.h +3 -3
- data/src/core/lib/handshaker/proxy_mapper_registry.h +3 -3
- data/src/core/lib/http/format_request.cc +1 -0
- data/src/core/lib/http/format_request.h +3 -3
- data/src/core/lib/http/httpcli.cc +1 -0
- data/src/core/lib/http/httpcli.h +3 -3
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -3
- data/src/core/lib/http/parser.h +3 -3
- data/src/core/lib/iomgr/block_annotate.h +3 -3
- data/src/core/lib/iomgr/buffer_list.h +3 -3
- data/src/core/lib/iomgr/call_combiner.cc +4 -4
- data/src/core/lib/iomgr/call_combiner.h +3 -3
- data/src/core/lib/iomgr/cfstream_handle.h +3 -3
- data/src/core/lib/iomgr/closure.cc +27 -0
- data/src/core/lib/iomgr/closure.h +5 -3
- data/src/core/lib/iomgr/combiner.h +3 -3
- data/src/core/lib/iomgr/dynamic_annotations.h +3 -3
- data/src/core/lib/iomgr/endpoint.h +3 -3
- data/src/core/lib/iomgr/endpoint_cfstream.h +3 -3
- data/src/core/lib/iomgr/endpoint_pair.h +3 -3
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +10 -2
- data/src/core/lib/iomgr/error.h +3 -3
- data/src/core/lib/iomgr/error_cfstream.h +3 -3
- data/src/core/lib/iomgr/ev_apple.h +3 -3
- data/src/core/lib/iomgr/ev_epoll1_linux.h +3 -3
- data/src/core/lib/iomgr/ev_poll_posix.h +3 -3
- data/src/core/lib/iomgr/ev_posix.h +3 -3
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +62 -0
- data/src/core/lib/iomgr/event_engine_shims/closure.h +39 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
- data/src/core/lib/iomgr/exec_ctx.h +3 -3
- data/src/core/lib/iomgr/executor.h +3 -3
- data/src/core/lib/iomgr/fork_posix.cc +5 -4
- data/src/core/lib/iomgr/gethostname.h +3 -3
- data/src/core/lib/iomgr/grpc_if_nametoindex.h +3 -3
- data/src/core/lib/iomgr/internal_errqueue.h +3 -3
- data/src/core/lib/iomgr/iocp_windows.h +3 -3
- data/src/core/lib/iomgr/iomgr.h +3 -3
- data/src/core/lib/iomgr/iomgr_fwd.h +3 -3
- data/src/core/lib/iomgr/iomgr_internal.h +3 -3
- data/src/core/lib/iomgr/load_file.h +3 -3
- data/src/core/lib/iomgr/lockfree_event.h +3 -3
- data/src/core/lib/iomgr/nameser.h +3 -3
- data/src/core/lib/iomgr/polling_entity.h +3 -3
- data/src/core/lib/iomgr/pollset.h +3 -3
- data/src/core/lib/iomgr/pollset_set.h +3 -3
- data/src/core/lib/iomgr/pollset_set_windows.h +3 -3
- data/src/core/lib/iomgr/pollset_windows.cc +2 -2
- data/src/core/lib/iomgr/pollset_windows.h +3 -3
- data/src/core/lib/iomgr/port.h +3 -3
- data/src/core/lib/iomgr/python_util.h +3 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -3
- data/src/core/lib/iomgr/resolve_address_impl.h +3 -3
- data/src/core/lib/iomgr/resolve_address_posix.h +3 -3
- data/src/core/lib/iomgr/resolve_address_windows.h +3 -3
- data/src/core/lib/iomgr/resolved_address.h +3 -3
- data/src/core/lib/iomgr/sockaddr.h +3 -3
- data/src/core/lib/iomgr/sockaddr_posix.h +3 -3
- data/src/core/lib/iomgr/sockaddr_windows.h +3 -3
- data/src/core/lib/iomgr/socket_factory_posix.h +3 -3
- data/src/core/lib/iomgr/socket_mutator.h +3 -3
- data/src/core/lib/iomgr/socket_utils.h +3 -3
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -3
- data/src/core/lib/iomgr/socket_windows.h +3 -3
- data/src/core/lib/iomgr/systemd_utils.cc +19 -19
- data/src/core/lib/iomgr/systemd_utils.h +24 -24
- data/src/core/lib/iomgr/tcp_client.h +3 -3
- data/src/core/lib/iomgr/tcp_client_posix.cc +12 -0
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +13 -1
- data/src/core/lib/iomgr/tcp_posix.cc +49 -65
- data/src/core/lib/iomgr/tcp_posix.h +3 -3
- data/src/core/lib/iomgr/tcp_server.h +3 -3
- data/src/core/lib/iomgr/tcp_server_posix.cc +219 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -3
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -6
- data/src/core/lib/iomgr/tcp_windows.h +3 -3
- data/src/core/lib/iomgr/timer.h +3 -3
- data/src/core/lib/iomgr/timer_generic.h +3 -3
- data/src/core/lib/iomgr/timer_heap.h +3 -3
- data/src/core/lib/iomgr/timer_manager.h +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +3 -3
- data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -3
- data/src/core/lib/json/json.h +3 -3
- data/src/core/lib/json/json_args.h +3 -3
- data/src/core/lib/json/json_channel_args.h +3 -3
- data/src/core/lib/json/json_object_loader.h +3 -3
- data/src/core/lib/json/json_reader.cc +1 -0
- data/src/core/lib/json/json_util.h +3 -3
- data/src/core/lib/load_balancing/lb_policy.cc +9 -0
- data/src/core/lib/load_balancing/lb_policy.h +9 -5
- data/src/core/lib/load_balancing/lb_policy_factory.h +3 -3
- data/src/core/lib/load_balancing/lb_policy_registry.cc +1 -0
- data/src/core/lib/load_balancing/lb_policy_registry.h +3 -3
- data/src/core/lib/load_balancing/subchannel_interface.h +8 -6
- data/src/core/lib/matchers/matchers.cc +1 -0
- data/src/core/lib/matchers/matchers.h +3 -3
- data/src/core/lib/promise/activity.cc +8 -6
- data/src/core/lib/promise/activity.h +52 -66
- data/src/core/lib/promise/arena_promise.h +3 -3
- data/src/core/lib/promise/context.h +3 -3
- data/src/core/lib/promise/detail/basic_join.h +197 -0
- data/src/core/lib/promise/detail/basic_seq.h +10 -16
- data/src/core/lib/promise/detail/promise_factory.h +3 -3
- data/src/core/lib/promise/detail/promise_like.h +3 -3
- data/src/core/lib/promise/detail/status.h +3 -3
- data/src/core/lib/promise/detail/switch.h +3 -3
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -3
- data/src/core/lib/promise/if.h +195 -0
- data/src/core/lib/promise/interceptor_list.h +308 -0
- data/src/core/lib/promise/intra_activity_waiter.h +9 -3
- data/src/core/lib/promise/latch.h +99 -5
- data/src/core/lib/promise/loop.h +4 -4
- data/src/core/lib/promise/map.h +4 -6
- data/src/core/lib/promise/pipe.h +296 -193
- data/src/core/lib/promise/poll.h +113 -14
- data/src/core/lib/promise/promise.h +4 -5
- data/src/core/lib/promise/race.h +6 -9
- data/src/core/lib/promise/seq.h +3 -3
- data/src/core/lib/promise/sleep.h +3 -3
- data/src/core/lib/promise/{pipe.cc → trace.cc} +3 -2
- data/src/core/lib/promise/trace.h +24 -0
- data/src/core/lib/promise/try_join.h +82 -0
- data/src/core/lib/promise/try_seq.h +3 -3
- data/src/core/lib/resolver/resolver.h +3 -3
- data/src/core/lib/resolver/resolver_factory.h +4 -4
- data/src/core/lib/resolver/resolver_registry.cc +15 -0
- data/src/core/lib/resolver/resolver_registry.h +3 -3
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +3 -3
- data/src/core/lib/resource_quota/api.h +3 -3
- data/src/core/lib/resource_quota/arena.cc +36 -9
- data/src/core/lib/resource_quota/arena.h +84 -22
- data/src/core/lib/resource_quota/memory_quota.h +3 -3
- data/src/core/lib/resource_quota/periodic_update.h +3 -3
- data/src/core/lib/resource_quota/resource_quota.h +3 -3
- data/src/core/lib/resource_quota/thread_quota.h +3 -3
- data/src/core/lib/resource_quota/trace.h +3 -3
- data/src/core/lib/security/authorization/authorization_engine.h +3 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +3 -3
- data/src/core/lib/security/authorization/evaluate_args.h +3 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +3 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +3 -3
- data/src/core/lib/security/authorization/matchers.h +3 -3
- data/src/core/lib/security/authorization/rbac_policy.cc +1 -0
- data/src/core/lib/security/authorization/rbac_policy.h +3 -3
- data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +3 -3
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +3 -3
- data/src/core/lib/security/context/security_context.h +3 -3
- data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -3
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +3 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +3 -3
- data/src/core/lib/security/credentials/call_creds_util.h +3 -3
- data/src/core/lib/security/credentials/channel_creds_registry.h +3 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -3
- data/src/core/lib/security/credentials/credentials.h +3 -3
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +1 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +1 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.h +3 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.h +3 -3
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -3
- data/src/core/lib/security/credentials/jwt/json_token.h +3 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
- data/src/core/lib/security/credentials/local/local_credentials.h +3 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -3
- data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/tls_utils.h +3 -3
- data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/load_system_roots.h +3 -3
- data/src/core/lib/security/security_connector/load_system_roots_supported.h +3 -3
- data/src/core/lib/security/security_connector/local/local_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl_utils.h +3 -3
- data/src/core/lib/security/security_connector/ssl_utils_config.h +3 -3
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +3 -3
- data/src/core/lib/security/transport/auth_filters.h +27 -5
- data/src/core/lib/security/transport/secure_endpoint.h +3 -3
- data/src/core/lib/security/transport/security_handshaker.cc +9 -0
- data/src/core/lib/security/transport/security_handshaker.h +3 -3
- data/src/core/lib/security/transport/server_auth_filter.cc +120 -251
- data/src/core/lib/security/transport/tsi_error.h +3 -3
- data/src/core/lib/security/util/json_util.h +3 -3
- data/src/core/lib/service_config/service_config.h +3 -3
- data/src/core/lib/service_config/service_config_call_data.h +3 -3
- data/src/core/lib/service_config/service_config_impl.h +3 -3
- data/src/core/lib/service_config/service_config_parser.h +3 -3
- data/src/core/lib/slice/b64.h +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +3 -3
- data/src/core/lib/slice/slice.h +14 -21
- data/src/core/lib/slice/slice_buffer.h +10 -4
- data/src/core/lib/slice/slice_internal.h +3 -3
- data/src/core/lib/slice/slice_refcount.cc +20 -0
- data/src/core/lib/slice/slice_refcount.h +26 -6
- data/src/core/lib/slice/slice_string_helpers.h +3 -3
- data/src/core/lib/surface/api_trace.h +3 -3
- data/src/core/lib/surface/builtins.h +3 -3
- data/src/core/lib/surface/call.cc +866 -252
- data/src/core/lib/surface/call.h +31 -3
- data/src/core/lib/surface/call_log_batch.cc +1 -0
- data/src/core/lib/surface/call_test_only.h +3 -3
- data/src/core/lib/surface/call_trace.cc +21 -11
- data/src/core/lib/surface/call_trace.h +3 -3
- data/src/core/lib/surface/channel.h +3 -3
- data/src/core/lib/surface/channel_init.h +3 -3
- data/src/core/lib/surface/channel_stack_type.h +3 -3
- data/src/core/lib/surface/completion_queue.cc +1 -0
- data/src/core/lib/surface/completion_queue.h +3 -3
- data/src/core/lib/surface/completion_queue_factory.h +3 -3
- data/src/core/lib/surface/event_string.cc +1 -0
- data/src/core/lib/surface/event_string.h +3 -3
- data/src/core/lib/surface/init.cc +1 -1
- data/src/core/lib/surface/init.h +3 -3
- data/src/core/lib/surface/init_internally.h +3 -3
- data/src/core/lib/surface/lame_client.cc +3 -1
- data/src/core/lib/surface/lame_client.h +3 -3
- data/src/core/lib/surface/server.cc +273 -27
- data/src/core/lib/surface/server.h +6 -3
- data/src/core/lib/surface/validate_metadata.h +3 -3
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.h +3 -3
- data/src/core/lib/transport/connectivity_state.h +3 -3
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +11 -0
- data/src/core/lib/transport/handshaker.h +4 -4
- data/src/core/lib/transport/handshaker_factory.h +3 -3
- data/src/core/lib/transport/handshaker_registry.h +3 -3
- data/src/core/lib/transport/http2_errors.h +3 -3
- data/src/core/lib/transport/http_connect_handshaker.h +3 -3
- data/src/core/lib/transport/metadata_batch.h +3 -3
- data/src/core/lib/transport/parsed_metadata.h +3 -3
- data/src/core/lib/transport/pid_controller.h +3 -3
- data/src/core/lib/transport/status_conversion.h +3 -3
- data/src/core/lib/transport/tcp_connect_handshaker.cc +0 -1
- data/src/core/lib/transport/tcp_connect_handshaker.h +3 -3
- data/src/core/lib/transport/timeout_encoding.h +3 -3
- data/src/core/lib/transport/transport.cc +3 -8
- data/src/core/lib/transport/transport.h +16 -8
- data/src/core/lib/transport/transport_fwd.h +3 -3
- data/src/core/lib/transport/transport_impl.h +3 -3
- data/src/core/lib/transport/transport_op_string.cc +1 -0
- data/src/core/lib/uri/uri_parser.cc +1 -1
- data/src/core/lib/uri/uri_parser.h +3 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -0
- data/src/core/tsi/alts/crypt/gsec.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_counter.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +3 -3
- data/src/core/tsi/alts/frame_protector/frame_handler.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +3 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +3 -3
- data/src/core/tsi/fake_transport_security.h +3 -3
- data/src/core/tsi/local_transport_security.h +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
- data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -3
- data/src/core/tsi/ssl_transport_security.cc +113 -24
- data/src/core/tsi/ssl_transport_security.h +5 -3
- data/src/core/tsi/ssl_transport_security_utils.h +3 -3
- data/src/core/tsi/ssl_types.h +3 -3
- data/src/core/tsi/transport_security.h +3 -3
- data/src/core/tsi/transport_security_grpc.h +3 -3
- data/src/core/tsi/transport_security_interface.h +3 -3
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +0 -6
- data/third_party/abseil-cpp/absl/algorithm/container.h +56 -57
- data/third_party/abseil-cpp/absl/base/attributes.h +39 -19
- data/third_party/abseil-cpp/absl/base/config.h +44 -3
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +3 -18
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +2 -1
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +10 -6
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +23 -24
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -3
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +2 -6
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -10
- data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -40
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
- data/third_party/abseil-cpp/absl/base/macros.h +4 -21
- data/third_party/abseil-cpp/absl/base/optimization.h +58 -6
- data/third_party/abseil-cpp/absl/base/options.h +1 -7
- data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
- data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -5
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -7
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +66 -18
- data/third_party/abseil-cpp/absl/container/internal/common.h +3 -3
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +13 -1
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +50 -5
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +14 -46
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +110 -32
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +155 -4
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +661 -341
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -13
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -9
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +40 -85
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +33 -8
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +118 -94
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +5 -2
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +47 -26
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +18 -4
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
- data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
- data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -3
- data/third_party/abseil-cpp/absl/numeric/int128.cc +10 -8
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +14 -6
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +2 -23
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
- data/third_party/abseil-cpp/absl/random/random.h +6 -6
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +1 -0
- data/third_party/abseil-cpp/absl/status/status.cc +19 -12
- data/third_party/abseil-cpp/absl/status/status.h +2 -2
- data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
- data/third_party/abseil-cpp/absl/strings/cord.cc +92 -40
- data/third_party/abseil-cpp/absl/strings/cord.h +71 -80
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +8 -5
- data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
- data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +326 -70
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +8 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +26 -14
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +9 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +8 -5
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +12 -10
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
- data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +126 -29
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +4 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +49 -287
- data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +10 -101
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +34 -31
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/str_cat.h +50 -3
- data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
- data/third_party/abseil-cpp/absl/strings/string_view.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -10
- data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +46 -20
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +104 -55
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +85 -46
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
- data/third_party/abseil-cpp/absl/synchronization/notification.h +0 -1
- data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
- data/third_party/abseil-cpp/absl/time/duration.cc +7 -7
- data/third_party/abseil-cpp/absl/time/format.cc +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
- data/third_party/abseil-cpp/absl/time/time.cc +2 -2
- data/third_party/abseil-cpp/absl/time/time.h +253 -158
- data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
- data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
- data/third_party/abseil-cpp/absl/types/span.h +29 -7
- metadata +75 -10
- data/src/core/lib/event_engine/socket_notifier.h +0 -55
- data/src/core/lib/promise/for_each.h +0 -155
- data/src/core/lib/promise/map_pipe.h +0 -88
- data/src/core/lib/promise/try_concurrently.h +0 -342
@@ -26,6 +26,7 @@
|
|
26
26
|
|
27
27
|
#include <algorithm>
|
28
28
|
#include <atomic>
|
29
|
+
#include <initializer_list>
|
29
30
|
#include <memory>
|
30
31
|
#include <new>
|
31
32
|
#include <string>
|
@@ -83,7 +84,7 @@
|
|
83
84
|
#include "src/core/lib/promise/activity.h"
|
84
85
|
#include "src/core/lib/promise/arena_promise.h"
|
85
86
|
#include "src/core/lib/promise/context.h"
|
86
|
-
#include "src/core/lib/promise/
|
87
|
+
#include "src/core/lib/promise/detail/basic_seq.h"
|
87
88
|
#include "src/core/lib/promise/pipe.h"
|
88
89
|
#include "src/core/lib/promise/poll.h"
|
89
90
|
#include "src/core/lib/resource_quota/arena.h"
|
@@ -102,7 +103,7 @@
|
|
102
103
|
grpc_core::TraceFlag grpc_call_error_trace(false, "call_error");
|
103
104
|
grpc_core::TraceFlag grpc_compression_trace(false, "compression");
|
104
105
|
grpc_core::TraceFlag grpc_call_trace(false, "call");
|
105
|
-
grpc_core::
|
106
|
+
grpc_core::DebugOnlyTraceFlag grpc_call_refcount_trace(false, "call_refcount");
|
106
107
|
|
107
108
|
namespace grpc_core {
|
108
109
|
|
@@ -347,7 +348,8 @@ void Call::DeleteThis() {
|
|
347
348
|
RefCountedPtr<Channel> channel = std::move(channel_);
|
348
349
|
Arena* arena = arena_;
|
349
350
|
this->~Call();
|
350
|
-
channel->UpdateCallSizeEstimate(arena->
|
351
|
+
channel->UpdateCallSizeEstimate(arena->TotalUsedBytes());
|
352
|
+
arena->Destroy();
|
351
353
|
}
|
352
354
|
|
353
355
|
///////////////////////////////////////////////////////////////////////////////
|
@@ -451,6 +453,31 @@ class FilterStackCall final : public Call {
|
|
451
453
|
static constexpr gpr_atm kRecvNone = 0;
|
452
454
|
static constexpr gpr_atm kRecvInitialMetadataFirst = 1;
|
453
455
|
|
456
|
+
enum class PendingOp {
|
457
|
+
kRecvMessage,
|
458
|
+
kRecvInitialMetadata,
|
459
|
+
kRecvTrailingMetadata,
|
460
|
+
kSends
|
461
|
+
};
|
462
|
+
static intptr_t PendingOpMask(PendingOp op) {
|
463
|
+
return static_cast<intptr_t>(1) << static_cast<intptr_t>(op);
|
464
|
+
}
|
465
|
+
static std::string PendingOpString(intptr_t pending_ops) {
|
466
|
+
std::vector<absl::string_view> pending_op_strings;
|
467
|
+
if (pending_ops & PendingOpMask(PendingOp::kRecvMessage)) {
|
468
|
+
pending_op_strings.push_back("kRecvMessage");
|
469
|
+
}
|
470
|
+
if (pending_ops & PendingOpMask(PendingOp::kRecvInitialMetadata)) {
|
471
|
+
pending_op_strings.push_back("kRecvInitialMetadata");
|
472
|
+
}
|
473
|
+
if (pending_ops & PendingOpMask(PendingOp::kRecvTrailingMetadata)) {
|
474
|
+
pending_op_strings.push_back("kRecvTrailingMetadata");
|
475
|
+
}
|
476
|
+
if (pending_ops & PendingOpMask(PendingOp::kSends)) {
|
477
|
+
pending_op_strings.push_back("kSends");
|
478
|
+
}
|
479
|
+
return absl::StrCat("{", absl::StrJoin(pending_op_strings, ","), "}");
|
480
|
+
}
|
454
481
|
struct BatchControl {
|
455
482
|
FilterStackCall* call_ = nullptr;
|
456
483
|
grpc_transport_stream_op_batch op_;
|
@@ -475,17 +502,26 @@ class FilterStackCall final : public Call {
|
|
475
502
|
} completion_data_;
|
476
503
|
grpc_closure start_batch_;
|
477
504
|
grpc_closure finish_batch_;
|
478
|
-
std::atomic<intptr_t>
|
505
|
+
std::atomic<intptr_t> ops_pending_{0};
|
479
506
|
AtomicError batch_error_;
|
480
|
-
void
|
481
|
-
|
507
|
+
void set_pending_ops(uintptr_t ops) {
|
508
|
+
ops_pending_.store(ops, std::memory_order_release);
|
482
509
|
}
|
483
|
-
bool completed_batch_step() {
|
484
|
-
|
510
|
+
bool completed_batch_step(PendingOp op) {
|
511
|
+
auto mask = PendingOpMask(op);
|
512
|
+
auto r = ops_pending_.fetch_sub(mask, std::memory_order_acq_rel);
|
513
|
+
if (grpc_call_trace.enabled()) {
|
514
|
+
gpr_log(GPR_DEBUG, "BATCH:%p COMPLETE:%s REMAINING:%s (tag:%p)", this,
|
515
|
+
PendingOpString(mask).c_str(),
|
516
|
+
PendingOpString(r & ~mask).c_str(),
|
517
|
+
completion_data_.notify_tag.tag);
|
518
|
+
}
|
519
|
+
GPR_ASSERT((r & mask) != 0);
|
520
|
+
return r == mask;
|
485
521
|
}
|
486
522
|
|
487
523
|
void PostCompletion();
|
488
|
-
void FinishStep();
|
524
|
+
void FinishStep(PendingOp op);
|
489
525
|
void ProcessDataAfterMetadata();
|
490
526
|
void ReceivingStreamReady(grpc_error_handle error);
|
491
527
|
void ValidateFilteredMetadata();
|
@@ -1104,6 +1140,10 @@ FilterStackCall::BatchControl* FilterStackCall::ReuseOrAllocateBatchControl(
|
|
1104
1140
|
void FilterStackCall::BatchControl::PostCompletion() {
|
1105
1141
|
FilterStackCall* call = call_;
|
1106
1142
|
grpc_error_handle error = batch_error_.get();
|
1143
|
+
if (grpc_call_trace.enabled()) {
|
1144
|
+
gpr_log(GPR_DEBUG, "tag:%p batch_error=%s", completion_data_.notify_tag.tag,
|
1145
|
+
error.ToString().c_str());
|
1146
|
+
}
|
1107
1147
|
|
1108
1148
|
if (op_.send_initial_metadata) {
|
1109
1149
|
call->send_initial_metadata_.Clear();
|
@@ -1133,14 +1173,12 @@ void FilterStackCall::BatchControl::PostCompletion() {
|
|
1133
1173
|
batch_error_.set(absl::OkStatus());
|
1134
1174
|
|
1135
1175
|
if (completion_data_.notify_tag.is_closure) {
|
1136
|
-
// unrefs error
|
1137
1176
|
call_ = nullptr;
|
1138
1177
|
Closure::Run(DEBUG_LOCATION,
|
1139
1178
|
static_cast<grpc_closure*>(completion_data_.notify_tag.tag),
|
1140
1179
|
error);
|
1141
1180
|
call->InternalUnref("completion");
|
1142
1181
|
} else {
|
1143
|
-
// unrefs error
|
1144
1182
|
grpc_cq_end_op(
|
1145
1183
|
call->cq_, completion_data_.notify_tag.tag, error,
|
1146
1184
|
[](void* user_data, grpc_cq_completion* /*storage*/) {
|
@@ -1153,8 +1191,8 @@ void FilterStackCall::BatchControl::PostCompletion() {
|
|
1153
1191
|
}
|
1154
1192
|
}
|
1155
1193
|
|
1156
|
-
void FilterStackCall::BatchControl::FinishStep() {
|
1157
|
-
if (GPR_UNLIKELY(completed_batch_step())) {
|
1194
|
+
void FilterStackCall::BatchControl::FinishStep(PendingOp op) {
|
1195
|
+
if (GPR_UNLIKELY(completed_batch_step(op))) {
|
1158
1196
|
PostCompletion();
|
1159
1197
|
}
|
1160
1198
|
}
|
@@ -1164,7 +1202,7 @@ void FilterStackCall::BatchControl::ProcessDataAfterMetadata() {
|
|
1164
1202
|
if (!call->receiving_slice_buffer_.has_value()) {
|
1165
1203
|
*call->receiving_buffer_ = nullptr;
|
1166
1204
|
call->receiving_message_ = false;
|
1167
|
-
FinishStep();
|
1205
|
+
FinishStep(PendingOp::kRecvMessage);
|
1168
1206
|
} else {
|
1169
1207
|
call->test_only_last_message_flags_ = call->receiving_stream_flags_;
|
1170
1208
|
if ((call->receiving_stream_flags_ & GRPC_WRITE_INTERNAL_COMPRESS) &&
|
@@ -1179,12 +1217,20 @@ void FilterStackCall::BatchControl::ProcessDataAfterMetadata() {
|
|
1179
1217
|
&(*call->receiving_buffer_)->data.raw.slice_buffer);
|
1180
1218
|
call->receiving_message_ = false;
|
1181
1219
|
call->receiving_slice_buffer_.reset();
|
1182
|
-
FinishStep();
|
1220
|
+
FinishStep(PendingOp::kRecvMessage);
|
1183
1221
|
}
|
1184
1222
|
}
|
1185
1223
|
|
1186
1224
|
void FilterStackCall::BatchControl::ReceivingStreamReady(
|
1187
1225
|
grpc_error_handle error) {
|
1226
|
+
if (grpc_call_trace.enabled()) {
|
1227
|
+
gpr_log(GPR_DEBUG,
|
1228
|
+
"tag:%p ReceivingStreamReady error=%s "
|
1229
|
+
"receiving_slice_buffer.has_value=%d recv_state=%" PRIdPTR,
|
1230
|
+
completion_data_.notify_tag.tag, error.ToString().c_str(),
|
1231
|
+
call_->receiving_slice_buffer_.has_value(),
|
1232
|
+
gpr_atm_no_barrier_load(&call_->recv_state_));
|
1233
|
+
}
|
1188
1234
|
FilterStackCall* call = call_;
|
1189
1235
|
if (!error.ok()) {
|
1190
1236
|
call->receiving_slice_buffer_.reset();
|
@@ -1302,7 +1348,7 @@ void FilterStackCall::BatchControl::ReceivingInitialMetadataReady(
|
|
1302
1348
|
Closure::Run(DEBUG_LOCATION, saved_rsr_closure, error);
|
1303
1349
|
}
|
1304
1350
|
|
1305
|
-
FinishStep();
|
1351
|
+
FinishStep(PendingOp::kRecvInitialMetadata);
|
1306
1352
|
}
|
1307
1353
|
|
1308
1354
|
void FilterStackCall::BatchControl::ReceivingTrailingMetadataReady(
|
@@ -1311,7 +1357,7 @@ void FilterStackCall::BatchControl::ReceivingTrailingMetadataReady(
|
|
1311
1357
|
"recv_trailing_metadata_ready");
|
1312
1358
|
grpc_metadata_batch* md = &call_->recv_trailing_metadata_;
|
1313
1359
|
call_->RecvTrailingFilter(md, error);
|
1314
|
-
FinishStep();
|
1360
|
+
FinishStep(PendingOp::kRecvTrailingMetadata);
|
1315
1361
|
}
|
1316
1362
|
|
1317
1363
|
void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) {
|
@@ -1322,7 +1368,7 @@ void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) {
|
|
1322
1368
|
if (!error.ok()) {
|
1323
1369
|
call_->CancelWithError(error);
|
1324
1370
|
}
|
1325
|
-
FinishStep();
|
1371
|
+
FinishStep(PendingOp::kSends);
|
1326
1372
|
}
|
1327
1373
|
|
1328
1374
|
namespace {
|
@@ -1349,12 +1395,11 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1349
1395
|
size_t i;
|
1350
1396
|
const grpc_op* op;
|
1351
1397
|
BatchControl* bctl;
|
1352
|
-
bool has_send_ops = false;
|
1353
|
-
int num_recv_ops = 0;
|
1354
1398
|
grpc_call_error error = GRPC_CALL_OK;
|
1355
1399
|
grpc_transport_stream_op_batch* stream_op;
|
1356
1400
|
grpc_transport_stream_op_batch_payload* stream_op_payload;
|
1357
1401
|
uint32_t seen_ops = 0;
|
1402
|
+
intptr_t pending_ops = 0;
|
1358
1403
|
|
1359
1404
|
for (i = 0; i < nops; i++) {
|
1360
1405
|
if (seen_ops & (1u << ops[i].op)) {
|
@@ -1471,7 +1516,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1471
1516
|
stream_op_payload->send_initial_metadata.peer_string =
|
1472
1517
|
peer_string_atm_ptr();
|
1473
1518
|
}
|
1474
|
-
|
1519
|
+
pending_ops |= PendingOpMask(PendingOp::kSends);
|
1475
1520
|
break;
|
1476
1521
|
}
|
1477
1522
|
case GRPC_OP_SEND_MESSAGE: {
|
@@ -1503,7 +1548,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1503
1548
|
send_slice_buffer_.c_slice_buffer());
|
1504
1549
|
stream_op_payload->send_message.flags = flags;
|
1505
1550
|
stream_op_payload->send_message.send_message = &send_slice_buffer_;
|
1506
|
-
|
1551
|
+
pending_ops |= PendingOpMask(PendingOp::kSends);
|
1507
1552
|
break;
|
1508
1553
|
}
|
1509
1554
|
case GRPC_OP_SEND_CLOSE_FROM_CLIENT: {
|
@@ -1524,7 +1569,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1524
1569
|
sent_final_op_ = true;
|
1525
1570
|
stream_op_payload->send_trailing_metadata.send_trailing_metadata =
|
1526
1571
|
&send_trailing_metadata_;
|
1527
|
-
|
1572
|
+
pending_ops |= PendingOpMask(PendingOp::kSends);
|
1528
1573
|
break;
|
1529
1574
|
}
|
1530
1575
|
case GRPC_OP_SEND_STATUS_FROM_SERVER: {
|
@@ -1588,7 +1633,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1588
1633
|
&send_trailing_metadata_;
|
1589
1634
|
stream_op_payload->send_trailing_metadata.sent =
|
1590
1635
|
&sent_server_trailing_metadata_;
|
1591
|
-
|
1636
|
+
pending_ops |= PendingOpMask(PendingOp::kSends);
|
1592
1637
|
break;
|
1593
1638
|
}
|
1594
1639
|
case GRPC_OP_RECV_INITIAL_METADATA: {
|
@@ -1623,7 +1668,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1623
1668
|
stream_op_payload->recv_initial_metadata.peer_string =
|
1624
1669
|
peer_string_atm_ptr();
|
1625
1670
|
}
|
1626
|
-
|
1671
|
+
pending_ops |= PendingOpMask(PendingOp::kRecvInitialMetadata);
|
1627
1672
|
break;
|
1628
1673
|
}
|
1629
1674
|
case GRPC_OP_RECV_MESSAGE: {
|
@@ -1659,7 +1704,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1659
1704
|
bctl, grpc_schedule_on_exec_ctx);
|
1660
1705
|
stream_op_payload->recv_message.recv_message_ready =
|
1661
1706
|
&receiving_stream_ready_;
|
1662
|
-
|
1707
|
+
pending_ops |= PendingOpMask(PendingOp::kRecvMessage);
|
1663
1708
|
break;
|
1664
1709
|
}
|
1665
1710
|
case GRPC_OP_RECV_STATUS_ON_CLIENT: {
|
@@ -1698,7 +1743,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1698
1743
|
bctl, grpc_schedule_on_exec_ctx);
|
1699
1744
|
stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
1700
1745
|
&receiving_trailing_metadata_ready_;
|
1701
|
-
|
1746
|
+
pending_ops |= PendingOpMask(PendingOp::kRecvTrailingMetadata);
|
1702
1747
|
break;
|
1703
1748
|
}
|
1704
1749
|
case GRPC_OP_RECV_CLOSE_ON_SERVER: {
|
@@ -1731,7 +1776,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1731
1776
|
bctl, grpc_schedule_on_exec_ctx);
|
1732
1777
|
stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
1733
1778
|
&receiving_trailing_metadata_ready_;
|
1734
|
-
|
1779
|
+
pending_ops |= PendingOpMask(PendingOp::kRecvTrailingMetadata);
|
1735
1780
|
break;
|
1736
1781
|
}
|
1737
1782
|
}
|
@@ -1741,9 +1786,9 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1741
1786
|
if (!is_notify_tag_closure) {
|
1742
1787
|
GPR_ASSERT(grpc_cq_begin_op(cq_, notify_tag));
|
1743
1788
|
}
|
1744
|
-
bctl->
|
1789
|
+
bctl->set_pending_ops(pending_ops);
|
1745
1790
|
|
1746
|
-
if (
|
1791
|
+
if (pending_ops & PendingOpMask(PendingOp::kSends)) {
|
1747
1792
|
GRPC_CLOSURE_INIT(
|
1748
1793
|
&bctl->finish_batch_,
|
1749
1794
|
[](void* bctl, grpc_error_handle error) {
|
@@ -1753,6 +1798,13 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
|
|
1753
1798
|
stream_op->on_complete = &bctl->finish_batch_;
|
1754
1799
|
}
|
1755
1800
|
|
1801
|
+
if (grpc_call_trace.enabled()) {
|
1802
|
+
gpr_log(GPR_DEBUG, "BATCH:%p START:%s BATCH:%s (tag:%p)", bctl,
|
1803
|
+
PendingOpString(pending_ops).c_str(),
|
1804
|
+
grpc_transport_stream_op_batch_string(stream_op).c_str(),
|
1805
|
+
bctl->completion_data_.notify_tag.tag);
|
1806
|
+
}
|
1807
|
+
|
1756
1808
|
ExecuteBatch(stream_op, &bctl->start_batch_);
|
1757
1809
|
|
1758
1810
|
done:
|
@@ -1826,21 +1878,52 @@ class PromiseBasedCall : public Call,
|
|
1826
1878
|
public grpc_event_engine::experimental::EventEngine::
|
1827
1879
|
Closure /* for deadlines */ {
|
1828
1880
|
public:
|
1829
|
-
PromiseBasedCall(Arena* arena,
|
1881
|
+
PromiseBasedCall(Arena* arena, uint32_t initial_external_refs,
|
1882
|
+
const grpc_call_create_args& args);
|
1830
1883
|
|
1831
1884
|
void ContextSet(grpc_context_index elem, void* value,
|
1832
1885
|
void (*destroy)(void* value)) override;
|
1833
1886
|
void* ContextGet(grpc_context_index elem) const override;
|
1834
1887
|
void SetCompletionQueue(grpc_completion_queue* cq) override;
|
1888
|
+
void SetCompletionQueueLocked(grpc_completion_queue* cq)
|
1889
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
1890
|
+
void CancelWithError(absl::Status error) final ABSL_LOCKS_EXCLUDED(mu_) {
|
1891
|
+
MutexLock lock(&mu_);
|
1892
|
+
CancelWithErrorLocked(std::move(error));
|
1893
|
+
}
|
1894
|
+
virtual void CancelWithErrorLocked(absl::Status error)
|
1895
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) = 0;
|
1896
|
+
bool Completed() final ABSL_LOCKS_EXCLUDED(mu_) {
|
1897
|
+
MutexLock lock(&mu_);
|
1898
|
+
return completed_;
|
1899
|
+
}
|
1900
|
+
|
1901
|
+
void Orphan() final {
|
1902
|
+
MutexLock lock(&mu_);
|
1903
|
+
if (!completed_) {
|
1904
|
+
CancelWithErrorLocked(absl::CancelledError("Call orphaned"));
|
1905
|
+
}
|
1906
|
+
}
|
1835
1907
|
|
1836
1908
|
// Implementation of call refcounting: move this to DualRefCounted once we
|
1837
1909
|
// don't need to maintain FilterStackCall compatibility
|
1838
1910
|
void ExternalRef() final {
|
1839
|
-
|
1911
|
+
const uint64_t prev_ref_pair =
|
1912
|
+
refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed);
|
1913
|
+
if (grpc_call_refcount_trace.enabled()) {
|
1914
|
+
gpr_log(GPR_DEBUG, "%s EXTERNAL_REF: %d:%d->%d:%d", DebugTag().c_str(),
|
1915
|
+
GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
|
1916
|
+
GetStrongRefs(prev_ref_pair) + 1, GetWeakRefs(prev_ref_pair));
|
1917
|
+
}
|
1840
1918
|
}
|
1841
1919
|
void ExternalUnref() final {
|
1842
1920
|
const uint64_t prev_ref_pair =
|
1843
1921
|
refs_.fetch_add(MakeRefPair(-1, 1), std::memory_order_acq_rel);
|
1922
|
+
if (grpc_call_refcount_trace.enabled()) {
|
1923
|
+
gpr_log(GPR_DEBUG, "%s EXTERNAL_UNREF: %d:%d->%d:%d", DebugTag().c_str(),
|
1924
|
+
GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
|
1925
|
+
GetStrongRefs(prev_ref_pair) - 1, GetWeakRefs(prev_ref_pair) + 1);
|
1926
|
+
}
|
1844
1927
|
const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
|
1845
1928
|
if (GPR_UNLIKELY(strong_refs == 1)) {
|
1846
1929
|
Orphan();
|
@@ -1848,12 +1931,22 @@ class PromiseBasedCall : public Call,
|
|
1848
1931
|
// Now drop the weak ref.
|
1849
1932
|
InternalUnref("external_ref");
|
1850
1933
|
}
|
1851
|
-
void InternalRef(const char*) final {
|
1852
|
-
refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_relaxed);
|
1934
|
+
void InternalRef(const char* reason) final {
|
1935
|
+
uint64_t n = refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_relaxed);
|
1936
|
+
if (grpc_call_refcount_trace.enabled()) {
|
1937
|
+
gpr_log(GPR_DEBUG, "%s REF: %s %d:%d->%d:%d", DebugTag().c_str(), reason,
|
1938
|
+
GetStrongRefs(n), GetWeakRefs(n), GetStrongRefs(n),
|
1939
|
+
GetWeakRefs(n) + 1);
|
1940
|
+
}
|
1853
1941
|
}
|
1854
|
-
void InternalUnref(const char*) final {
|
1942
|
+
void InternalUnref(const char* reason) final {
|
1855
1943
|
const uint64_t prev_ref_pair =
|
1856
1944
|
refs_.fetch_sub(MakeRefPair(0, 1), std::memory_order_acq_rel);
|
1945
|
+
if (grpc_call_refcount_trace.enabled()) {
|
1946
|
+
gpr_log(GPR_DEBUG, "%s UNREF: %s %d:%d->%d:%d", DebugTag().c_str(),
|
1947
|
+
reason, GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
|
1948
|
+
GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair) - 1);
|
1949
|
+
}
|
1857
1950
|
if (GPR_UNLIKELY(prev_ref_pair == MakeRefPair(0, 1))) {
|
1858
1951
|
DeleteThis();
|
1859
1952
|
}
|
@@ -1877,34 +1970,34 @@ class PromiseBasedCall : public Call,
|
|
1877
1970
|
public:
|
1878
1971
|
explicit AsanWaker(PromiseBasedCall* call) : call_(call) {}
|
1879
1972
|
|
1880
|
-
void Wakeup() override {
|
1881
|
-
call_->Wakeup();
|
1973
|
+
void Wakeup(void*) override {
|
1974
|
+
call_->Wakeup(nullptr);
|
1882
1975
|
delete this;
|
1883
1976
|
}
|
1884
1977
|
|
1885
|
-
void Drop() override {
|
1886
|
-
call_->Drop();
|
1978
|
+
void Drop(void*) override {
|
1979
|
+
call_->Drop(nullptr);
|
1887
1980
|
delete this;
|
1888
1981
|
}
|
1889
1982
|
|
1890
|
-
std::string ActivityDebugTag() const override {
|
1983
|
+
std::string ActivityDebugTag(void*) const override {
|
1891
1984
|
return call_->DebugTag();
|
1892
1985
|
}
|
1893
1986
|
|
1894
1987
|
private:
|
1895
1988
|
PromiseBasedCall* call_;
|
1896
1989
|
};
|
1897
|
-
return Waker(new AsanWaker(this));
|
1990
|
+
return Waker(new AsanWaker(this), nullptr);
|
1898
1991
|
#endif
|
1899
1992
|
#endif
|
1900
1993
|
#ifndef GRPC_CALL_USES_ASAN_WAKER
|
1901
|
-
return Waker(this);
|
1994
|
+
return Waker(this, nullptr);
|
1902
1995
|
#endif
|
1903
1996
|
}
|
1904
1997
|
Waker MakeNonOwningWaker() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) override;
|
1905
1998
|
|
1906
1999
|
// Wakeable methods
|
1907
|
-
void Wakeup() override {
|
2000
|
+
void Wakeup(void*) override {
|
1908
2001
|
channel()->event_engine()->Run([this] {
|
1909
2002
|
ApplicationCallbackExecCtx app_exec_ctx;
|
1910
2003
|
ExecCtx exec_ctx;
|
@@ -1916,7 +2009,7 @@ class PromiseBasedCall : public Call,
|
|
1916
2009
|
InternalUnref("wakeup");
|
1917
2010
|
});
|
1918
2011
|
}
|
1919
|
-
void Drop() override { InternalUnref("wakeup"); }
|
2012
|
+
void Drop(void*) override { InternalUnref("wakeup"); }
|
1920
2013
|
|
1921
2014
|
void RunInContext(absl::AnyInvocable<void()> fn) {
|
1922
2015
|
if (Activity::current() == this) {
|
@@ -1953,9 +2046,12 @@ class PromiseBasedCall : public Call,
|
|
1953
2046
|
|
1954
2047
|
void UpdateDeadline(Timestamp deadline);
|
1955
2048
|
void ResetDeadline();
|
2049
|
+
|
1956
2050
|
// Implementation of EventEngine::Closure, called when deadline expires
|
1957
2051
|
void Run() override;
|
1958
2052
|
|
2053
|
+
virtual ServerCallContext* server_call_context() { return nullptr; }
|
2054
|
+
|
1959
2055
|
protected:
|
1960
2056
|
class ScopedContext
|
1961
2057
|
: public ScopedActivity,
|
@@ -1993,11 +2089,6 @@ class PromiseBasedCall : public Call,
|
|
1993
2089
|
uint8_t TakeIndex() { return std::exchange(index_, kNullIndex); }
|
1994
2090
|
bool has_value() const { return index_ != kNullIndex; }
|
1995
2091
|
|
1996
|
-
std::string ToString() const {
|
1997
|
-
return index_ == kNullIndex ? "null"
|
1998
|
-
: std::to_string(static_cast<int>(index_));
|
1999
|
-
}
|
2000
|
-
|
2001
2092
|
private:
|
2002
2093
|
enum : uint8_t { kNullIndex = 0xff };
|
2003
2094
|
uint8_t index_;
|
@@ -2015,22 +2106,27 @@ class PromiseBasedCall : public Call,
|
|
2015
2106
|
// The following correspond with the batch operations from above
|
2016
2107
|
kReceiveInitialMetadata,
|
2017
2108
|
kReceiveStatusOnClient,
|
2109
|
+
kReceiveCloseOnServer = kReceiveStatusOnClient,
|
2018
2110
|
kSendMessage,
|
2019
2111
|
kReceiveMessage,
|
2112
|
+
kSendStatusFromServer,
|
2113
|
+
kSendCloseFromClient = kSendStatusFromServer,
|
2020
2114
|
};
|
2021
2115
|
|
2022
|
-
|
2116
|
+
const char* PendingOpString(PendingOp reason) const {
|
2023
2117
|
switch (reason) {
|
2024
2118
|
case PendingOp::kStartingBatch:
|
2025
2119
|
return "StartingBatch";
|
2026
2120
|
case PendingOp::kReceiveInitialMetadata:
|
2027
2121
|
return "ReceiveInitialMetadata";
|
2028
2122
|
case PendingOp::kReceiveStatusOnClient:
|
2029
|
-
return "ReceiveStatusOnClient";
|
2123
|
+
return is_client() ? "ReceiveStatusOnClient" : "ReceiveCloseOnServer";
|
2030
2124
|
case PendingOp::kSendMessage:
|
2031
2125
|
return "SendMessage";
|
2032
2126
|
case PendingOp::kReceiveMessage:
|
2033
2127
|
return "ReceiveMessage";
|
2128
|
+
case PendingOp::kSendStatusFromServer:
|
2129
|
+
return is_client() ? "SendCloseFromClient" : "SendStatusFromServer";
|
2034
2130
|
}
|
2035
2131
|
return "Unknown";
|
2036
2132
|
}
|
@@ -2040,7 +2136,6 @@ class PromiseBasedCall : public Call,
|
|
2040
2136
|
}
|
2041
2137
|
|
2042
2138
|
Mutex* mu() const ABSL_LOCK_RETURNED(mu_) { return &mu_; }
|
2043
|
-
|
2044
2139
|
// Begin work on a completion, recording the tag/closure to notify.
|
2045
2140
|
// Use the op selected in \a ops to determine the index to allocate into.
|
2046
2141
|
// Starts the "StartingBatch" PendingOp immediately.
|
@@ -2050,12 +2145,21 @@ class PromiseBasedCall : public Call,
|
|
2050
2145
|
// Add one pending op to the completion, and return it.
|
2051
2146
|
Completion AddOpToCompletion(const Completion& completion, PendingOp reason)
|
2052
2147
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2148
|
+
// Stringify a completion
|
2149
|
+
std::string CompletionString(const Completion& completion) const {
|
2150
|
+
return completion.has_value()
|
2151
|
+
? absl::StrFormat(
|
2152
|
+
"%d:tag=%p", static_cast<int>(completion.index()),
|
2153
|
+
completion_info_[completion.index()].pending.tag)
|
2154
|
+
: "no-completion";
|
2155
|
+
}
|
2053
2156
|
// Finish one op on the completion. Must have been previously been added.
|
2054
2157
|
// The completion as a whole finishes when all pending ops finish.
|
2055
2158
|
void FinishOpOnCompletion(Completion* completion, PendingOp reason)
|
2056
2159
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2057
2160
|
// Mark the completion as failed. Does not finish it.
|
2058
|
-
void FailCompletion(const Completion& completion
|
2161
|
+
void FailCompletion(const Completion& completion,
|
2162
|
+
SourceLocation source_location = {});
|
2059
2163
|
// Run the promise polling loop until it stalls.
|
2060
2164
|
void Update() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2061
2165
|
// Update the promise state once.
|
@@ -2075,7 +2179,7 @@ class PromiseBasedCall : public Call,
|
|
2075
2179
|
void CToMetadata(grpc_metadata* metadata, size_t count,
|
2076
2180
|
grpc_metadata_batch* batch);
|
2077
2181
|
|
2078
|
-
std::string ActivityDebugTag() const override { return DebugTag(); }
|
2182
|
+
std::string ActivityDebugTag(void*) const override { return DebugTag(); }
|
2079
2183
|
|
2080
2184
|
// At the end of the call run any finalization actions.
|
2081
2185
|
void RunFinalization(grpc_status_code status, const char* status_details) {
|
@@ -2086,6 +2190,56 @@ class PromiseBasedCall : public Call,
|
|
2086
2190
|
finalization_.Run(&final_info);
|
2087
2191
|
}
|
2088
2192
|
|
2193
|
+
std::string PresentAndCompletionText(const char* caption, bool has,
|
2194
|
+
const Completion& completion) const {
|
2195
|
+
if (has) {
|
2196
|
+
if (completion.has_value()) {
|
2197
|
+
return absl::StrCat(caption, ":", CompletionString(completion), " ");
|
2198
|
+
} else {
|
2199
|
+
return absl::StrCat(caption,
|
2200
|
+
":!!BUG:operation is present, no completion!! ");
|
2201
|
+
}
|
2202
|
+
} else {
|
2203
|
+
if (!completion.has_value()) {
|
2204
|
+
return "";
|
2205
|
+
} else {
|
2206
|
+
return absl::StrCat(caption, ":no-op:", CompletionString(completion),
|
2207
|
+
" ");
|
2208
|
+
}
|
2209
|
+
}
|
2210
|
+
}
|
2211
|
+
|
2212
|
+
std::string PollStateDebugString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
2213
|
+
return absl::StrCat(PresentAndCompletionText("outstanding_send",
|
2214
|
+
outstanding_send_.has_value(),
|
2215
|
+
send_message_completion_)
|
2216
|
+
.c_str(),
|
2217
|
+
PresentAndCompletionText("outstanding_recv",
|
2218
|
+
outstanding_recv_.has_value(),
|
2219
|
+
recv_message_completion_)
|
2220
|
+
.c_str());
|
2221
|
+
}
|
2222
|
+
|
2223
|
+
void StartRecvMessage(const grpc_op& op, const Completion& completion,
|
2224
|
+
PipeReceiver<MessageHandle>* receiver)
|
2225
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2226
|
+
void PollRecvMessage(grpc_compression_algorithm compression_algorithm)
|
2227
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2228
|
+
void CancelRecvMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2229
|
+
void StartSendMessage(const grpc_op& op, const Completion& completion,
|
2230
|
+
PipeSender<MessageHandle>* sender)
|
2231
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2232
|
+
bool PollSendMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2233
|
+
void CancelSendMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
2234
|
+
|
2235
|
+
bool completed() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
2236
|
+
return completed_;
|
2237
|
+
}
|
2238
|
+
void set_completed() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { completed_ = true; }
|
2239
|
+
bool is_sending() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
2240
|
+
return outstanding_send_.has_value();
|
2241
|
+
}
|
2242
|
+
|
2089
2243
|
private:
|
2090
2244
|
union CompletionInfo {
|
2091
2245
|
struct Pending {
|
@@ -2116,7 +2270,7 @@ class PromiseBasedCall : public Call,
|
|
2116
2270
|
|
2117
2271
|
// Activity needs to wake up (if it still exists!) - wake it up, and drop
|
2118
2272
|
// the ref that was kept for this handle.
|
2119
|
-
void Wakeup() override ABSL_LOCKS_EXCLUDED(mu_) {
|
2273
|
+
void Wakeup(void*) override ABSL_LOCKS_EXCLUDED(mu_) {
|
2120
2274
|
// Drop the ref to the handle at end of scope (we have one ref = one
|
2121
2275
|
// wakeup semantics).
|
2122
2276
|
auto unref = absl::MakeCleanup([this]() { Unref(); });
|
@@ -2124,21 +2278,21 @@ class PromiseBasedCall : public Call,
|
|
2124
2278
|
// Note that activity refcount can drop to zero, but we could win the lock
|
2125
2279
|
// against DropActivity, so we need to only increase activities refcount
|
2126
2280
|
// if it is non-zero.
|
2127
|
-
|
2128
|
-
|
2281
|
+
PromiseBasedCall* call = call_;
|
2282
|
+
if (call != nullptr && call->RefIfNonZero()) {
|
2129
2283
|
lock.Release();
|
2130
2284
|
// Activity still exists and we have a reference: wake it up, which will
|
2131
2285
|
// drop the ref.
|
2132
|
-
call->Wakeup();
|
2286
|
+
call->Wakeup(nullptr);
|
2133
2287
|
}
|
2134
2288
|
}
|
2135
2289
|
|
2136
|
-
std::string ActivityDebugTag() const override {
|
2290
|
+
std::string ActivityDebugTag(void*) const override {
|
2137
2291
|
MutexLock lock(&mu_);
|
2138
2292
|
return call_ == nullptr ? "<unknown>" : call_->DebugTag();
|
2139
2293
|
}
|
2140
2294
|
|
2141
|
-
void Drop() override { Unref(); }
|
2295
|
+
void Drop(void*) override { Unref(); }
|
2142
2296
|
|
2143
2297
|
private:
|
2144
2298
|
// Unref the Handle (not the activity).
|
@@ -2185,7 +2339,7 @@ class PromiseBasedCall : public Call,
|
|
2185
2339
|
}
|
2186
2340
|
|
2187
2341
|
mutable Mutex mu_;
|
2188
|
-
std::atomic<uint64_t> refs_
|
2342
|
+
std::atomic<uint64_t> refs_;
|
2189
2343
|
CallContext call_context_{this};
|
2190
2344
|
bool keep_polling_ ABSL_GUARDED_BY(mu()) = false;
|
2191
2345
|
|
@@ -2199,6 +2353,14 @@ class PromiseBasedCall : public Call,
|
|
2199
2353
|
// Current deadline.
|
2200
2354
|
Timestamp deadline_ = Timestamp::InfFuture();
|
2201
2355
|
grpc_event_engine::experimental::EventEngine::TaskHandle deadline_task_;
|
2356
|
+
absl::optional<PipeSender<MessageHandle>::PushType> outstanding_send_
|
2357
|
+
ABSL_GUARDED_BY(mu_);
|
2358
|
+
absl::optional<PipeReceiverNextType<MessageHandle>> outstanding_recv_
|
2359
|
+
ABSL_GUARDED_BY(mu_);
|
2360
|
+
grpc_byte_buffer** recv_message_ ABSL_GUARDED_BY(mu_) = nullptr;
|
2361
|
+
Completion send_message_completion_ ABSL_GUARDED_BY(mu_);
|
2362
|
+
Completion recv_message_completion_ ABSL_GUARDED_BY(mu_);
|
2363
|
+
bool completed_ ABSL_GUARDED_BY(mu_) = false;
|
2202
2364
|
};
|
2203
2365
|
|
2204
2366
|
template <typename T>
|
@@ -2214,10 +2376,11 @@ grpc_error_handle MakePromiseBasedCall(grpc_call_create_args* args,
|
|
2214
2376
|
return absl::OkStatus();
|
2215
2377
|
}
|
2216
2378
|
|
2217
|
-
PromiseBasedCall::PromiseBasedCall(Arena* arena,
|
2379
|
+
PromiseBasedCall::PromiseBasedCall(Arena* arena, uint32_t initial_external_refs,
|
2218
2380
|
const grpc_call_create_args& args)
|
2219
2381
|
: Call(arena, args.server_transport_data == nullptr, args.send_deadline,
|
2220
2382
|
args.channel->Ref()),
|
2383
|
+
refs_(MakeRefPair(initial_external_refs, 0)),
|
2221
2384
|
cq_(args.cq) {
|
2222
2385
|
if (args.cq != nullptr) {
|
2223
2386
|
GPR_ASSERT(args.pollset_set_alternative == nullptr &&
|
@@ -2239,7 +2402,7 @@ Waker PromiseBasedCall::MakeNonOwningWaker() {
|
|
2239
2402
|
} else {
|
2240
2403
|
non_owning_wakeable_->Ref();
|
2241
2404
|
}
|
2242
|
-
return Waker(non_owning_wakeable_);
|
2405
|
+
return Waker(non_owning_wakeable_, nullptr);
|
2243
2406
|
}
|
2244
2407
|
|
2245
2408
|
void PromiseBasedCall::CToMetadata(grpc_metadata* metadata, size_t count,
|
@@ -2277,8 +2440,8 @@ PromiseBasedCall::Completion PromiseBasedCall::StartCompletion(
|
|
2277
2440
|
void* tag, bool is_closure, const grpc_op* ops) {
|
2278
2441
|
Completion c(BatchSlotForOp(ops[0].op));
|
2279
2442
|
if (grpc_call_trace.enabled()) {
|
2280
|
-
gpr_log(GPR_INFO, "%
|
2281
|
-
c
|
2443
|
+
gpr_log(GPR_INFO, "%s[call] StartCompletion %s tag=%p", DebugTag().c_str(),
|
2444
|
+
CompletionString(c).c_str(), tag);
|
2282
2445
|
}
|
2283
2446
|
if (!is_closure) {
|
2284
2447
|
grpc_cq_begin_op(cq(), tag);
|
@@ -2291,9 +2454,10 @@ PromiseBasedCall::Completion PromiseBasedCall::StartCompletion(
|
|
2291
2454
|
PromiseBasedCall::Completion PromiseBasedCall::AddOpToCompletion(
|
2292
2455
|
const Completion& completion, PendingOp reason) {
|
2293
2456
|
if (grpc_call_trace.enabled()) {
|
2294
|
-
gpr_log(GPR_INFO, "%
|
2295
|
-
completion
|
2457
|
+
gpr_log(GPR_INFO, "%s[call] AddOpToCompletion %s %s", DebugTag().c_str(),
|
2458
|
+
CompletionString(completion).c_str(), PendingOpString(reason));
|
2296
2459
|
}
|
2460
|
+
GPR_ASSERT(completion.has_value());
|
2297
2461
|
auto& pending_op_bits =
|
2298
2462
|
completion_info_[completion.index()].pending.pending_op_bits;
|
2299
2463
|
GPR_ASSERT((pending_op_bits & PendingOpBit(reason)) == 0);
|
@@ -2301,10 +2465,12 @@ PromiseBasedCall::Completion PromiseBasedCall::AddOpToCompletion(
|
|
2301
2465
|
return Completion(completion.index());
|
2302
2466
|
}
|
2303
2467
|
|
2304
|
-
void PromiseBasedCall::FailCompletion(const Completion& completion
|
2468
|
+
void PromiseBasedCall::FailCompletion(const Completion& completion,
|
2469
|
+
SourceLocation location) {
|
2305
2470
|
if (grpc_call_trace.enabled()) {
|
2306
|
-
gpr_log(
|
2307
|
-
|
2471
|
+
gpr_log(location.file(), location.line(), GPR_LOG_SEVERITY_ERROR,
|
2472
|
+
"%s[call] FailCompletion %s", DebugTag().c_str(),
|
2473
|
+
CompletionString(completion).c_str());
|
2308
2474
|
}
|
2309
2475
|
completion_info_[completion.index()].pending.success = false;
|
2310
2476
|
}
|
@@ -2323,8 +2489,9 @@ void PromiseBasedCall::FinishOpOnCompletion(Completion* completion,
|
|
2323
2489
|
}
|
2324
2490
|
}
|
2325
2491
|
gpr_log(
|
2326
|
-
GPR_INFO, "%
|
2327
|
-
|
2492
|
+
GPR_INFO, "%s[call] FinishOpOnCompletion tag:%p %s %s %s",
|
2493
|
+
DebugTag().c_str(), completion_info_[completion->index()].pending.tag,
|
2494
|
+
CompletionString(*completion).c_str(), PendingOpString(reason),
|
2328
2495
|
(pending.empty()
|
2329
2496
|
? (success ? std::string("done") : std::string("failed"))
|
2330
2497
|
: absl::StrFormat("pending_ops={%s}", absl::StrJoin(pending, ",")))
|
@@ -2359,6 +2526,10 @@ void PromiseBasedCall::ForceImmediateRepoll() { keep_polling_ = true; }
|
|
2359
2526
|
|
2360
2527
|
void PromiseBasedCall::SetCompletionQueue(grpc_completion_queue* cq) {
|
2361
2528
|
MutexLock lock(&mu_);
|
2529
|
+
SetCompletionQueueLocked(cq);
|
2530
|
+
}
|
2531
|
+
|
2532
|
+
void PromiseBasedCall::SetCompletionQueueLocked(grpc_completion_queue* cq) {
|
2362
2533
|
cq_ = cq;
|
2363
2534
|
GRPC_CQ_INTERNAL_REF(cq, "bind");
|
2364
2535
|
call_context_.pollent_ =
|
@@ -2391,6 +2562,121 @@ void PromiseBasedCall::Run() {
|
|
2391
2562
|
InternalUnref("deadline");
|
2392
2563
|
}
|
2393
2564
|
|
2565
|
+
void PromiseBasedCall::StartSendMessage(const grpc_op& op,
|
2566
|
+
const Completion& completion,
|
2567
|
+
PipeSender<MessageHandle>* sender) {
|
2568
|
+
GPR_ASSERT(!outstanding_send_.has_value());
|
2569
|
+
if (!completed_) {
|
2570
|
+
send_message_completion_ =
|
2571
|
+
AddOpToCompletion(completion, PendingOp::kSendMessage);
|
2572
|
+
SliceBuffer send;
|
2573
|
+
grpc_slice_buffer_swap(
|
2574
|
+
&op.data.send_message.send_message->data.raw.slice_buffer,
|
2575
|
+
send.c_slice_buffer());
|
2576
|
+
outstanding_send_.emplace(sender->Push(
|
2577
|
+
GetContext<Arena>()->MakePooled<Message>(std::move(send), op.flags)));
|
2578
|
+
} else {
|
2579
|
+
FailCompletion(completion);
|
2580
|
+
}
|
2581
|
+
}
|
2582
|
+
|
2583
|
+
bool PromiseBasedCall::PollSendMessage() {
|
2584
|
+
if (!outstanding_send_.has_value()) return true;
|
2585
|
+
Poll<bool> r = (*outstanding_send_)();
|
2586
|
+
if (const bool* result = r.value_if_ready()) {
|
2587
|
+
if (grpc_call_trace.enabled()) {
|
2588
|
+
gpr_log(GPR_DEBUG, "%sPollSendMessage completes %s", DebugTag().c_str(),
|
2589
|
+
*result ? "successfully" : "with failure");
|
2590
|
+
}
|
2591
|
+
if (!*result) {
|
2592
|
+
FailCompletion(send_message_completion_);
|
2593
|
+
return false;
|
2594
|
+
}
|
2595
|
+
FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
|
2596
|
+
outstanding_send_.reset();
|
2597
|
+
}
|
2598
|
+
return true;
|
2599
|
+
}
|
2600
|
+
|
2601
|
+
void PromiseBasedCall::CancelSendMessage() {
|
2602
|
+
if (!outstanding_send_.has_value()) return;
|
2603
|
+
FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
|
2604
|
+
outstanding_send_.reset();
|
2605
|
+
}
|
2606
|
+
|
2607
|
+
void PromiseBasedCall::StartRecvMessage(const grpc_op& op,
|
2608
|
+
const Completion& completion,
|
2609
|
+
PipeReceiver<MessageHandle>* receiver) {
|
2610
|
+
GPR_ASSERT(!outstanding_recv_.has_value());
|
2611
|
+
recv_message_ = op.data.recv_message.recv_message;
|
2612
|
+
recv_message_completion_ =
|
2613
|
+
AddOpToCompletion(completion, PendingOp::kReceiveMessage);
|
2614
|
+
outstanding_recv_.emplace(receiver->Next());
|
2615
|
+
}
|
2616
|
+
|
2617
|
+
void PromiseBasedCall::PollRecvMessage(
|
2618
|
+
grpc_compression_algorithm incoming_compression_algorithm) {
|
2619
|
+
if (!outstanding_recv_.has_value()) return;
|
2620
|
+
Poll<NextResult<MessageHandle>> r = (*outstanding_recv_)();
|
2621
|
+
if (auto* result = r.value_if_ready()) {
|
2622
|
+
outstanding_recv_.reset();
|
2623
|
+
if (result->has_value()) {
|
2624
|
+
MessageHandle& message = **result;
|
2625
|
+
if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
|
2626
|
+
(incoming_compression_algorithm != GRPC_COMPRESS_NONE)) {
|
2627
|
+
*recv_message_ = grpc_raw_compressed_byte_buffer_create(
|
2628
|
+
nullptr, 0, incoming_compression_algorithm);
|
2629
|
+
} else {
|
2630
|
+
*recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0);
|
2631
|
+
}
|
2632
|
+
grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(),
|
2633
|
+
&(*recv_message_)->data.raw.slice_buffer);
|
2634
|
+
if (grpc_call_trace.enabled()) {
|
2635
|
+
gpr_log(GPR_INFO,
|
2636
|
+
"%s[call] PollRecvMessage: outstanding_recv finishes: received "
|
2637
|
+
"%" PRIdPTR " byte message",
|
2638
|
+
DebugTag().c_str(),
|
2639
|
+
(*recv_message_)->data.raw.slice_buffer.length);
|
2640
|
+
}
|
2641
|
+
} else if (result->cancelled()) {
|
2642
|
+
if (grpc_call_trace.enabled()) {
|
2643
|
+
gpr_log(GPR_INFO,
|
2644
|
+
"%s[call] PollRecvMessage: outstanding_recv finishes: received "
|
2645
|
+
"end-of-stream with error",
|
2646
|
+
DebugTag().c_str());
|
2647
|
+
}
|
2648
|
+
FailCompletion(recv_message_completion_);
|
2649
|
+
*recv_message_ = nullptr;
|
2650
|
+
} else {
|
2651
|
+
if (grpc_call_trace.enabled()) {
|
2652
|
+
gpr_log(GPR_INFO,
|
2653
|
+
"%s[call] PollRecvMessage: outstanding_recv finishes: received "
|
2654
|
+
"end-of-stream",
|
2655
|
+
DebugTag().c_str());
|
2656
|
+
}
|
2657
|
+
*recv_message_ = nullptr;
|
2658
|
+
}
|
2659
|
+
FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
|
2660
|
+
} else if (completed_) {
|
2661
|
+
if (grpc_call_trace.enabled()) {
|
2662
|
+
gpr_log(GPR_INFO,
|
2663
|
+
"%s[call] UpdateOnce: outstanding_recv finishes: promise has "
|
2664
|
+
"completed without queuing a message, forcing end-of-stream",
|
2665
|
+
DebugTag().c_str());
|
2666
|
+
}
|
2667
|
+
outstanding_recv_.reset();
|
2668
|
+
*recv_message_ = nullptr;
|
2669
|
+
FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
|
2670
|
+
}
|
2671
|
+
}
|
2672
|
+
|
2673
|
+
void PromiseBasedCall::CancelRecvMessage() {
|
2674
|
+
if (!outstanding_recv_.has_value()) return;
|
2675
|
+
*recv_message_ = nullptr;
|
2676
|
+
outstanding_recv_.reset();
|
2677
|
+
FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
|
2678
|
+
}
|
2679
|
+
|
2394
2680
|
///////////////////////////////////////////////////////////////////////////////
|
2395
2681
|
// CallContext
|
2396
2682
|
|
@@ -2404,17 +2690,43 @@ void CallContext::IncrementRefCount(const char* reason) {
|
|
2404
2690
|
|
2405
2691
|
void CallContext::Unref(const char* reason) { call_->InternalUnref(reason); }
|
2406
2692
|
|
2693
|
+
gpr_atm* CallContext::peer_string_atm_ptr() {
|
2694
|
+
return call_->peer_string_atm_ptr();
|
2695
|
+
}
|
2696
|
+
|
2407
2697
|
void CallContext::UpdateDeadline(Timestamp deadline) {
|
2408
2698
|
call_->UpdateDeadline(deadline);
|
2409
2699
|
}
|
2410
2700
|
|
2701
|
+
ServerCallContext* CallContext::server_call_context() {
|
2702
|
+
return call_->server_call_context();
|
2703
|
+
}
|
2704
|
+
|
2705
|
+
///////////////////////////////////////////////////////////////////////////////
|
2706
|
+
// PublishMetadataArray
|
2707
|
+
|
2708
|
+
namespace {
|
2709
|
+
void PublishMetadataArray(grpc_metadata_batch* md, grpc_metadata_array* array) {
|
2710
|
+
const auto md_count = md->count();
|
2711
|
+
if (md_count > array->capacity) {
|
2712
|
+
array->capacity =
|
2713
|
+
std::max(array->capacity + md->count(), array->capacity * 3 / 2);
|
2714
|
+
array->metadata = static_cast<grpc_metadata*>(
|
2715
|
+
gpr_realloc(array->metadata, sizeof(grpc_metadata) * array->capacity));
|
2716
|
+
}
|
2717
|
+
PublishToAppEncoder encoder(array);
|
2718
|
+
md->Encode(&encoder);
|
2719
|
+
}
|
2720
|
+
} // namespace
|
2721
|
+
|
2411
2722
|
///////////////////////////////////////////////////////////////////////////////
|
2412
2723
|
// ClientPromiseBasedCall
|
2413
2724
|
|
2725
|
+
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
|
2414
2726
|
class ClientPromiseBasedCall final : public PromiseBasedCall {
|
2415
2727
|
public:
|
2416
2728
|
ClientPromiseBasedCall(Arena* arena, grpc_call_create_args* args)
|
2417
|
-
: PromiseBasedCall(arena, *args) {
|
2729
|
+
: PromiseBasedCall(arena, 1, *args) {
|
2418
2730
|
global_stats().IncrementClientCallsCreated();
|
2419
2731
|
ScopedContext context(this);
|
2420
2732
|
send_initial_metadata_ =
|
@@ -2442,16 +2754,12 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
|
|
2442
2754
|
// before context.
|
2443
2755
|
auto c2s = std::move(client_to_server_messages_);
|
2444
2756
|
auto s2c = std::move(server_to_client_messages_);
|
2757
|
+
auto sim = std::move(server_initial_metadata_);
|
2445
2758
|
}
|
2446
2759
|
|
2447
2760
|
absl::string_view GetServerAuthority() const override { abort(); }
|
2448
|
-
void
|
2449
|
-
|
2450
|
-
void Orphan() override {
|
2451
|
-
MutexLock lock(mu());
|
2452
|
-
ScopedContext ctx(this);
|
2453
|
-
if (!completed_) Finish(ServerMetadataFromStatus(absl::CancelledError()));
|
2454
|
-
}
|
2761
|
+
void CancelWithErrorLocked(grpc_error_handle error) override
|
2762
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
2455
2763
|
bool is_trailers_only() const override {
|
2456
2764
|
MutexLock lock(mu());
|
2457
2765
|
return is_trailers_only_;
|
@@ -2481,9 +2789,6 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
|
|
2481
2789
|
// Start the underlying promise.
|
2482
2790
|
void StartPromise(ClientMetadataHandle client_initial_metadata)
|
2483
2791
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
2484
|
-
// Publish some metadata out to the application.
|
2485
|
-
static void PublishMetadataArray(grpc_metadata_array* array,
|
2486
|
-
ServerMetadata* md);
|
2487
2792
|
// Publish status out to the application.
|
2488
2793
|
void PublishStatus(
|
2489
2794
|
grpc_op::grpc_op_data::grpc_op_recv_status_on_client op_args,
|
@@ -2494,29 +2799,23 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
|
|
2494
2799
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
2495
2800
|
|
2496
2801
|
ArenaPromise<ServerMetadataHandle> promise_ ABSL_GUARDED_BY(mu());
|
2497
|
-
|
2802
|
+
Pipe<ServerMetadataHandle> server_initial_metadata_ ABSL_GUARDED_BY(mu()){
|
2803
|
+
arena()};
|
2498
2804
|
Pipe<MessageHandle> client_to_server_messages_ ABSL_GUARDED_BY(mu()){arena()};
|
2499
2805
|
Pipe<MessageHandle> server_to_client_messages_ ABSL_GUARDED_BY(mu()){arena()};
|
2500
2806
|
|
2501
2807
|
ClientMetadataHandle send_initial_metadata_;
|
2502
2808
|
grpc_metadata_array* recv_initial_metadata_ ABSL_GUARDED_BY(mu()) = nullptr;
|
2503
|
-
grpc_byte_buffer** recv_message_ ABSL_GUARDED_BY(mu()) = nullptr;
|
2504
2809
|
absl::variant<absl::monostate,
|
2505
2810
|
grpc_op::grpc_op_data::grpc_op_recv_status_on_client,
|
2506
2811
|
ServerMetadataHandle>
|
2507
2812
|
recv_status_on_client_ ABSL_GUARDED_BY(mu());
|
2508
|
-
absl::optional<
|
2509
|
-
ABSL_GUARDED_BY(mu());
|
2510
|
-
absl::optional<PipeReceiver<MessageHandle>::NextType> outstanding_recv_
|
2511
|
-
ABSL_GUARDED_BY(mu());
|
2512
|
-
absl::optional<LatchWaitPromise<ServerMetadata*>>
|
2813
|
+
absl::optional<PipeReceiverNextType<ServerMetadataHandle>>
|
2513
2814
|
server_initial_metadata_ready_;
|
2514
2815
|
absl::optional<grpc_compression_algorithm> incoming_compression_algorithm_;
|
2515
2816
|
Completion recv_initial_metadata_completion_ ABSL_GUARDED_BY(mu());
|
2516
2817
|
Completion recv_status_on_client_completion_ ABSL_GUARDED_BY(mu());
|
2517
|
-
Completion
|
2518
|
-
Completion recv_message_completion_ ABSL_GUARDED_BY(mu());
|
2519
|
-
bool completed_ ABSL_GUARDED_BY(mu()) = false;
|
2818
|
+
Completion close_send_completion_ ABSL_GUARDED_BY(mu());
|
2520
2819
|
bool is_trailers_only_ ABSL_GUARDED_BY(mu());
|
2521
2820
|
};
|
2522
2821
|
|
@@ -2525,14 +2824,13 @@ void ClientPromiseBasedCall::StartPromise(
|
|
2525
2824
|
GPR_ASSERT(!promise_.has_value());
|
2526
2825
|
promise_ = channel()->channel_stack()->MakeClientCallPromise(CallArgs{
|
2527
2826
|
std::move(client_initial_metadata),
|
2528
|
-
&server_initial_metadata_,
|
2827
|
+
&server_initial_metadata_.sender,
|
2529
2828
|
&client_to_server_messages_.receiver,
|
2530
2829
|
&server_to_client_messages_.sender,
|
2531
2830
|
});
|
2532
2831
|
}
|
2533
2832
|
|
2534
|
-
void ClientPromiseBasedCall::
|
2535
|
-
MutexLock lock(mu());
|
2833
|
+
void ClientPromiseBasedCall::CancelWithErrorLocked(grpc_error_handle error) {
|
2536
2834
|
ScopedContext context(this);
|
2537
2835
|
Finish(ServerMetadataFromStatus(grpc_error_to_absl_status(error)));
|
2538
2836
|
}
|
@@ -2582,7 +2880,7 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
|
|
2582
2880
|
// compression not implemented
|
2583
2881
|
GPR_ASSERT(
|
2584
2882
|
!op.data.send_initial_metadata.maybe_compression_level.is_set);
|
2585
|
-
if (!
|
2883
|
+
if (!completed()) {
|
2586
2884
|
CToMetadata(op.data.send_initial_metadata.metadata,
|
2587
2885
|
op.data.send_initial_metadata.count,
|
2588
2886
|
send_initial_metadata_.get());
|
@@ -2592,7 +2890,8 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
|
|
2592
2890
|
case GRPC_OP_RECV_INITIAL_METADATA: {
|
2593
2891
|
recv_initial_metadata_ =
|
2594
2892
|
op.data.recv_initial_metadata.recv_initial_metadata;
|
2595
|
-
server_initial_metadata_ready_.emplace(
|
2893
|
+
server_initial_metadata_ready_.emplace(
|
2894
|
+
server_initial_metadata_.receiver.Next());
|
2596
2895
|
recv_initial_metadata_completion_ =
|
2597
2896
|
AddOpToCompletion(completion, PendingOp::kReceiveInitialMetadata);
|
2598
2897
|
} break;
|
@@ -2607,32 +2906,17 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
|
|
2607
2906
|
recv_status_on_client_ = op.data.recv_status_on_client;
|
2608
2907
|
}
|
2609
2908
|
} break;
|
2610
|
-
case GRPC_OP_SEND_MESSAGE:
|
2611
|
-
|
2612
|
-
|
2613
|
-
|
2614
|
-
|
2615
|
-
|
2616
|
-
|
2617
|
-
|
2618
|
-
|
2619
|
-
|
2620
|
-
|
2621
|
-
op.flags)));
|
2622
|
-
} else {
|
2623
|
-
FailCompletion(completion);
|
2624
|
-
}
|
2625
|
-
} break;
|
2626
|
-
case GRPC_OP_RECV_MESSAGE: {
|
2627
|
-
GPR_ASSERT(!outstanding_recv_.has_value());
|
2628
|
-
recv_message_ = op.data.recv_message.recv_message;
|
2629
|
-
recv_message_completion_ =
|
2630
|
-
AddOpToCompletion(completion, PendingOp::kReceiveMessage);
|
2631
|
-
outstanding_recv_.emplace(server_to_client_messages_.receiver.Next());
|
2632
|
-
} break;
|
2633
|
-
case GRPC_OP_SEND_CLOSE_FROM_CLIENT: {
|
2634
|
-
client_to_server_messages_.sender.Close();
|
2635
|
-
} break;
|
2909
|
+
case GRPC_OP_SEND_MESSAGE:
|
2910
|
+
StartSendMessage(op, completion, &client_to_server_messages_.sender);
|
2911
|
+
break;
|
2912
|
+
case GRPC_OP_RECV_MESSAGE:
|
2913
|
+
StartRecvMessage(op, completion, &server_to_client_messages_.receiver);
|
2914
|
+
break;
|
2915
|
+
case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
|
2916
|
+
close_send_completion_ =
|
2917
|
+
AddOpToCompletion(completion, PendingOp::kSendCloseFromClient);
|
2918
|
+
GPR_ASSERT(close_send_completion_.has_value());
|
2919
|
+
break;
|
2636
2920
|
case GRPC_OP_SEND_STATUS_FROM_SERVER:
|
2637
2921
|
case GRPC_OP_RECV_CLOSE_ON_SERVER:
|
2638
2922
|
abort(); // unreachable
|
@@ -2667,153 +2951,83 @@ void ClientPromiseBasedCall::PublishInitialMetadata(ServerMetadata* metadata) {
|
|
2667
2951
|
metadata->Take(GrpcEncodingMetadata()).value_or(GRPC_COMPRESS_NONE);
|
2668
2952
|
server_initial_metadata_ready_.reset();
|
2669
2953
|
GPR_ASSERT(recv_initial_metadata_ != nullptr);
|
2670
|
-
PublishMetadataArray(
|
2671
|
-
|
2954
|
+
PublishMetadataArray(metadata,
|
2955
|
+
std::exchange(recv_initial_metadata_, nullptr));
|
2672
2956
|
FinishOpOnCompletion(&recv_initial_metadata_completion_,
|
2673
2957
|
PendingOp::kReceiveInitialMetadata);
|
2674
2958
|
}
|
2675
2959
|
|
2676
2960
|
void ClientPromiseBasedCall::UpdateOnce() {
|
2677
2961
|
if (grpc_call_trace.enabled()) {
|
2678
|
-
|
2679
|
-
|
2680
|
-
|
2681
|
-
|
2682
|
-
|
2683
|
-
|
2684
|
-
|
2685
|
-
|
2686
|
-
return absl::StrCat(caption,
|
2687
|
-
":!!BUG:operation is present, no completion!! ");
|
2688
|
-
}
|
2689
|
-
} else {
|
2690
|
-
if (!completion.has_value()) {
|
2691
|
-
return "";
|
2692
|
-
} else {
|
2693
|
-
return absl::StrCat(
|
2694
|
-
caption, ":no-op:", static_cast<int>(completion.index()), " ");
|
2695
|
-
}
|
2696
|
-
}
|
2697
|
-
};
|
2698
|
-
gpr_log(
|
2699
|
-
GPR_INFO, "%sUpdateOnce: %s%s%shas_promise=%s", DebugTag().c_str(),
|
2700
|
-
present_and_completion_text("server_initial_metadata_ready",
|
2701
|
-
server_initial_metadata_ready_.has_value(),
|
2702
|
-
recv_initial_metadata_completion_)
|
2703
|
-
.c_str(),
|
2704
|
-
present_and_completion_text("outstanding_send",
|
2705
|
-
outstanding_send_.has_value(),
|
2706
|
-
send_message_completion_)
|
2707
|
-
.c_str(),
|
2708
|
-
present_and_completion_text("outstanding_recv",
|
2709
|
-
outstanding_recv_.has_value(),
|
2710
|
-
recv_message_completion_)
|
2711
|
-
.c_str(),
|
2712
|
-
promise_.has_value() ? "true" : "false");
|
2713
|
-
}
|
2714
|
-
if (send_message_completion_.has_value()) {
|
2715
|
-
FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
|
2962
|
+
gpr_log(GPR_INFO, "%s[call] UpdateOnce: %s%shas_promise=%s",
|
2963
|
+
DebugTag().c_str(),
|
2964
|
+
PresentAndCompletionText("server_initial_metadata_ready",
|
2965
|
+
server_initial_metadata_ready_.has_value(),
|
2966
|
+
recv_initial_metadata_completion_)
|
2967
|
+
.c_str(),
|
2968
|
+
PollStateDebugString().c_str(),
|
2969
|
+
promise_.has_value() ? "true" : "false");
|
2716
2970
|
}
|
2717
2971
|
if (server_initial_metadata_ready_.has_value()) {
|
2718
|
-
Poll<
|
2719
|
-
|
2720
|
-
|
2721
|
-
PublishInitialMetadata(
|
2722
|
-
} else if (
|
2972
|
+
Poll<NextResult<ServerMetadataHandle>> r =
|
2973
|
+
(*server_initial_metadata_ready_)();
|
2974
|
+
if (auto* server_initial_metadata = r.value_if_ready()) {
|
2975
|
+
PublishInitialMetadata(server_initial_metadata->value().get());
|
2976
|
+
} else if (completed()) {
|
2723
2977
|
ServerMetadata no_metadata{GetContext<Arena>()};
|
2724
2978
|
PublishInitialMetadata(&no_metadata);
|
2725
2979
|
}
|
2726
2980
|
}
|
2727
|
-
if (
|
2728
|
-
|
2729
|
-
|
2730
|
-
|
2731
|
-
|
2732
|
-
|
2733
|
-
|
2734
|
-
|
2735
|
-
}
|
2736
|
-
}
|
2981
|
+
if (!PollSendMessage()) {
|
2982
|
+
Finish(ServerMetadataFromStatus(absl::Status(
|
2983
|
+
absl::StatusCode::kInternal, "Failed to send message to server")));
|
2984
|
+
}
|
2985
|
+
if (!is_sending() && close_send_completion_.has_value()) {
|
2986
|
+
client_to_server_messages_.sender.Close();
|
2987
|
+
FinishOpOnCompletion(&close_send_completion_,
|
2988
|
+
PendingOp::kSendCloseFromClient);
|
2737
2989
|
}
|
2738
2990
|
if (promise_.has_value()) {
|
2739
2991
|
Poll<ServerMetadataHandle> r = promise_();
|
2740
2992
|
if (grpc_call_trace.enabled()) {
|
2741
|
-
gpr_log(GPR_INFO, "%
|
2993
|
+
gpr_log(GPR_INFO, "%s[call] UpdateOnce: promise returns %s",
|
2994
|
+
DebugTag().c_str(),
|
2742
2995
|
PollToString(r, [](const ServerMetadataHandle& h) {
|
2743
2996
|
return h->DebugString();
|
2744
2997
|
}).c_str());
|
2745
2998
|
}
|
2746
|
-
if (auto* result =
|
2999
|
+
if (auto* result = r.value_if_ready()) {
|
2747
3000
|
AcceptTransportStatsFromContext();
|
2748
3001
|
Finish(std::move(*result));
|
2749
3002
|
}
|
2750
3003
|
}
|
2751
|
-
if (incoming_compression_algorithm_.has_value()
|
2752
|
-
|
2753
|
-
Poll<NextResult<MessageHandle>> r = (*outstanding_recv_)();
|
2754
|
-
if (auto* result = absl::get_if<NextResult<MessageHandle>>(&r)) {
|
2755
|
-
outstanding_recv_.reset();
|
2756
|
-
if (result->has_value()) {
|
2757
|
-
MessageHandle& message = **result;
|
2758
|
-
if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
|
2759
|
-
(incoming_compression_algorithm_ != GRPC_COMPRESS_NONE)) {
|
2760
|
-
*recv_message_ = grpc_raw_compressed_byte_buffer_create(
|
2761
|
-
nullptr, 0, *incoming_compression_algorithm_);
|
2762
|
-
} else {
|
2763
|
-
*recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0);
|
2764
|
-
}
|
2765
|
-
grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(),
|
2766
|
-
&(*recv_message_)->data.raw.slice_buffer);
|
2767
|
-
if (grpc_call_trace.enabled()) {
|
2768
|
-
gpr_log(GPR_INFO,
|
2769
|
-
"%sUpdateOnce: outstanding_recv finishes: received %" PRIdPTR
|
2770
|
-
" byte message",
|
2771
|
-
DebugTag().c_str(),
|
2772
|
-
(*recv_message_)->data.raw.slice_buffer.length);
|
2773
|
-
}
|
2774
|
-
} else {
|
2775
|
-
if (grpc_call_trace.enabled()) {
|
2776
|
-
gpr_log(
|
2777
|
-
GPR_INFO,
|
2778
|
-
"%sUpdateOnce: outstanding_recv finishes: received end-of-stream",
|
2779
|
-
DebugTag().c_str());
|
2780
|
-
}
|
2781
|
-
*recv_message_ = nullptr;
|
2782
|
-
}
|
2783
|
-
FinishOpOnCompletion(&recv_message_completion_,
|
2784
|
-
PendingOp::kReceiveMessage);
|
2785
|
-
} else if (completed_) {
|
2786
|
-
if (grpc_call_trace.enabled()) {
|
2787
|
-
gpr_log(GPR_INFO,
|
2788
|
-
"%sUpdateOnce: outstanding_recv finishes: promise has "
|
2789
|
-
"completed without queuing a message, forcing end-of-stream",
|
2790
|
-
DebugTag().c_str());
|
2791
|
-
}
|
2792
|
-
outstanding_recv_.reset();
|
2793
|
-
*recv_message_ = nullptr;
|
2794
|
-
FinishOpOnCompletion(&recv_message_completion_,
|
2795
|
-
PendingOp::kReceiveMessage);
|
2796
|
-
}
|
3004
|
+
if (incoming_compression_algorithm_.has_value()) {
|
3005
|
+
PollRecvMessage(*incoming_compression_algorithm_);
|
2797
3006
|
}
|
2798
3007
|
}
|
2799
3008
|
|
2800
3009
|
void ClientPromiseBasedCall::Finish(ServerMetadataHandle trailing_metadata) {
|
2801
3010
|
if (grpc_call_trace.enabled()) {
|
2802
|
-
gpr_log(GPR_INFO, "%
|
3011
|
+
gpr_log(GPR_INFO, "%s[call] Finish: %s", DebugTag().c_str(),
|
2803
3012
|
trailing_metadata->DebugString().c_str());
|
2804
3013
|
}
|
2805
3014
|
promise_ = ArenaPromise<ServerMetadataHandle>();
|
2806
3015
|
ResetDeadline();
|
2807
|
-
|
3016
|
+
set_completed();
|
2808
3017
|
if (recv_initial_metadata_ != nullptr) {
|
2809
3018
|
ForceImmediateRepoll();
|
2810
3019
|
}
|
2811
3020
|
const bool pending_initial_metadata =
|
2812
3021
|
server_initial_metadata_ready_.has_value();
|
3022
|
+
if (!pending_initial_metadata) {
|
3023
|
+
server_initial_metadata_ready_.emplace(
|
3024
|
+
server_initial_metadata_.receiver.Next());
|
3025
|
+
}
|
3026
|
+
Poll<NextResult<ServerMetadataHandle>> r =
|
3027
|
+
(*server_initial_metadata_ready_)();
|
2813
3028
|
server_initial_metadata_ready_.reset();
|
2814
|
-
|
2815
|
-
|
2816
|
-
if (pending_initial_metadata) PublishInitialMetadata(**result);
|
3029
|
+
if (auto* result = r.value_if_ready()) {
|
3030
|
+
if (pending_initial_metadata) PublishInitialMetadata(result->value().get());
|
2817
3031
|
is_trailers_only_ = false;
|
2818
3032
|
} else {
|
2819
3033
|
if (pending_initial_metadata) {
|
@@ -2885,36 +3099,429 @@ void ClientPromiseBasedCall::PublishStatus(
|
|
2885
3099
|
*op_args.error_string =
|
2886
3100
|
gpr_strdup(MakeErrorString(trailing_metadata.get()).c_str());
|
2887
3101
|
}
|
2888
|
-
PublishMetadataArray(
|
3102
|
+
PublishMetadataArray(trailing_metadata.get(), op_args.trailing_metadata);
|
2889
3103
|
// Clear state saying we have a RECV_STATUS_ON_CLIENT outstanding
|
2890
3104
|
// (so we don't call through twice)
|
2891
3105
|
recv_status_on_client_ = absl::monostate();
|
2892
3106
|
FinishOpOnCompletion(&recv_status_on_client_completion_,
|
2893
3107
|
PendingOp::kReceiveStatusOnClient);
|
2894
3108
|
}
|
3109
|
+
#endif
|
2895
3110
|
|
2896
|
-
|
2897
|
-
|
2898
|
-
|
2899
|
-
|
2900
|
-
|
2901
|
-
|
2902
|
-
|
2903
|
-
|
3111
|
+
///////////////////////////////////////////////////////////////////////////////
|
3112
|
+
// ServerPromiseBasedCall
|
3113
|
+
|
3114
|
+
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
|
3115
|
+
|
3116
|
+
class ServerPromiseBasedCall final : public PromiseBasedCall {
|
3117
|
+
public:
|
3118
|
+
ServerPromiseBasedCall(Arena* arena, grpc_call_create_args* args);
|
3119
|
+
|
3120
|
+
void CancelWithErrorLocked(grpc_error_handle) override
|
3121
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
3122
|
+
grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag,
|
3123
|
+
bool is_notify_tag_closure) override;
|
3124
|
+
bool failed_before_recv_message() const override { abort(); }
|
3125
|
+
bool is_trailers_only() const override { abort(); }
|
3126
|
+
absl::string_view GetServerAuthority() const override { return ""; }
|
3127
|
+
|
3128
|
+
// Polling order for the server promise stack:
|
3129
|
+
//
|
3130
|
+
// │ ┌───────────────────────────────────────┐
|
3131
|
+
// │ │ ServerPromiseBasedCall::UpdateOnce ├──► Lifetime management,
|
3132
|
+
// │ ├───────────────────────────────────────┤ signal call end to app
|
3133
|
+
// │ │ ConnectedChannel ├─┐
|
3134
|
+
// │ ├───────────────────────────────────────┤ └► Interactions with the
|
3135
|
+
// │ │ ... closest to transport filter │ transport - send/recv msgs
|
3136
|
+
// │ ├───────────────────────────────────────┤ and metadata, call phase
|
3137
|
+
// │ │ ... │ ordering
|
3138
|
+
// │ ├───────────────────────────────────────┤
|
3139
|
+
// │ │ ... closest to app filter │ ┌► Request matching, initial
|
3140
|
+
// │ ├───────────────────────────────────────┤ │ setup, publishing call to
|
3141
|
+
// │ │ Server::ChannelData::MakeCallPromise ├─┘ application
|
3142
|
+
// │ ├───────────────────────────────────────┤
|
3143
|
+
// │ │ ServerPromiseBasedCall::PollTopOfCall ├──► Application interactions,
|
3144
|
+
// ▼ └───────────────────────────────────────┘ forwarding messages,
|
3145
|
+
// Polling & sending trailing metadata
|
3146
|
+
// instantiation
|
3147
|
+
// order
|
3148
|
+
|
3149
|
+
void UpdateOnce() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) override;
|
3150
|
+
Poll<ServerMetadataHandle> PollTopOfCall()
|
3151
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
3152
|
+
|
3153
|
+
std::string DebugTag() const override {
|
3154
|
+
return absl::StrFormat("SERVER_CALL[%p]: ", this);
|
2904
3155
|
}
|
2905
|
-
|
2906
|
-
|
3156
|
+
|
3157
|
+
ServerCallContext* server_call_context() override { return &call_context_; }
|
3158
|
+
|
3159
|
+
private:
|
3160
|
+
class RecvCloseOpCancelState {
|
3161
|
+
public:
|
3162
|
+
// Request that receiver be filled in per grpc_op_recv_close_on_server.
|
3163
|
+
// Returns true if the request can be fulfilled immediately.
|
3164
|
+
// Returns false if the request will be fulfilled later.
|
3165
|
+
bool ReceiveCloseOnServerOpStarted(int* receiver) {
|
3166
|
+
switch (state_) {
|
3167
|
+
case kUnset:
|
3168
|
+
state_ = reinterpret_cast<uintptr_t>(receiver);
|
3169
|
+
return false;
|
3170
|
+
case kFinishedWithFailure:
|
3171
|
+
*receiver = 1;
|
3172
|
+
return true;
|
3173
|
+
case kFinishedWithSuccess:
|
3174
|
+
*receiver = 0;
|
3175
|
+
return true;
|
3176
|
+
default:
|
3177
|
+
abort(); // unreachable
|
3178
|
+
}
|
3179
|
+
}
|
3180
|
+
|
3181
|
+
// Mark the call as having completed.
|
3182
|
+
// Returns true if this finishes a previous RequestReceiveCloseOnServer.
|
3183
|
+
bool CompleteCall(bool success) {
|
3184
|
+
switch (state_) {
|
3185
|
+
case kUnset:
|
3186
|
+
state_ = success ? kFinishedWithSuccess : kFinishedWithFailure;
|
3187
|
+
return false;
|
3188
|
+
case kFinishedWithFailure:
|
3189
|
+
case kFinishedWithSuccess:
|
3190
|
+
abort(); // unreachable
|
3191
|
+
default:
|
3192
|
+
*reinterpret_cast<int*>(state_) = success ? 0 : 1;
|
3193
|
+
state_ = success ? kFinishedWithSuccess : kFinishedWithFailure;
|
3194
|
+
return true;
|
3195
|
+
}
|
3196
|
+
}
|
3197
|
+
|
3198
|
+
std::string ToString() const {
|
3199
|
+
switch (state_) {
|
3200
|
+
case kUnset:
|
3201
|
+
return "Unset";
|
3202
|
+
case kFinishedWithFailure:
|
3203
|
+
return "FinishedWithFailure";
|
3204
|
+
case kFinishedWithSuccess:
|
3205
|
+
return "FinishedWithSuccess";
|
3206
|
+
default:
|
3207
|
+
return absl::StrFormat("WaitingForReceiver(%p)",
|
3208
|
+
reinterpret_cast<void*>(state_));
|
3209
|
+
}
|
3210
|
+
}
|
3211
|
+
|
3212
|
+
private:
|
3213
|
+
static constexpr uintptr_t kUnset = 0;
|
3214
|
+
static constexpr uintptr_t kFinishedWithFailure = 1;
|
3215
|
+
static constexpr uintptr_t kFinishedWithSuccess = 2;
|
3216
|
+
// Holds one of kUnset, kFinishedWithFailure, or kFinishedWithSuccess
|
3217
|
+
// OR an int* that wants to receive the final status.
|
3218
|
+
uintptr_t state_ = kUnset;
|
3219
|
+
};
|
3220
|
+
|
3221
|
+
grpc_call_error ValidateBatch(const grpc_op* ops, size_t nops) const;
|
3222
|
+
void CommitBatch(const grpc_op* ops, size_t nops,
|
3223
|
+
const Completion& completion)
|
3224
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
|
3225
|
+
|
3226
|
+
friend class ServerCallContext;
|
3227
|
+
ServerCallContext call_context_;
|
3228
|
+
Server* const server_;
|
3229
|
+
ArenaPromise<ServerMetadataHandle> promise_ ABSL_GUARDED_BY(mu());
|
3230
|
+
PipeSender<MessageHandle>* server_to_client_messages_ ABSL_GUARDED_BY(mu()) =
|
3231
|
+
nullptr;
|
3232
|
+
PipeReceiver<MessageHandle>* client_to_server_messages_
|
3233
|
+
ABSL_GUARDED_BY(mu()) = nullptr;
|
3234
|
+
using SendInitialMetadataState =
|
3235
|
+
absl::variant<absl::monostate, PipeSender<ServerMetadataHandle>*,
|
3236
|
+
typename PipeSender<ServerMetadataHandle>::PushType>;
|
3237
|
+
SendInitialMetadataState send_initial_metadata_state_ ABSL_GUARDED_BY(mu()) =
|
3238
|
+
absl::monostate{};
|
3239
|
+
ServerMetadataHandle send_trailing_metadata_ ABSL_GUARDED_BY(mu());
|
3240
|
+
grpc_compression_algorithm incoming_compression_algorithm_
|
3241
|
+
ABSL_GUARDED_BY(mu());
|
3242
|
+
RecvCloseOpCancelState recv_close_op_cancel_state_ ABSL_GUARDED_BY(mu());
|
3243
|
+
Completion recv_close_completion_ ABSL_GUARDED_BY(mu());
|
3244
|
+
bool cancel_send_and_receive_ ABSL_GUARDED_BY(mu()) = false;
|
3245
|
+
Completion send_status_from_server_completion_ ABSL_GUARDED_BY(mu());
|
3246
|
+
ClientMetadataHandle client_initial_metadata_ ABSL_GUARDED_BY(mu());
|
3247
|
+
};
|
3248
|
+
|
3249
|
+
ServerPromiseBasedCall::ServerPromiseBasedCall(Arena* arena,
|
3250
|
+
grpc_call_create_args* args)
|
3251
|
+
: PromiseBasedCall(arena, 0, *args),
|
3252
|
+
call_context_(this, args->server_transport_data),
|
3253
|
+
server_(args->server) {
|
3254
|
+
global_stats().IncrementServerCallsCreated();
|
3255
|
+
channelz::ServerNode* channelz_node = server_->channelz_node();
|
3256
|
+
if (channelz_node != nullptr) {
|
3257
|
+
channelz_node->RecordCallStarted();
|
3258
|
+
}
|
3259
|
+
MutexLock lock(mu());
|
3260
|
+
ScopedContext activity_context(this);
|
3261
|
+
promise_ = channel()->channel_stack()->MakeServerCallPromise(
|
3262
|
+
CallArgs{nullptr, nullptr, nullptr, nullptr});
|
2907
3263
|
}
|
2908
3264
|
|
2909
|
-
|
3265
|
+
Poll<ServerMetadataHandle> ServerPromiseBasedCall::PollTopOfCall() {
|
3266
|
+
if (grpc_call_trace.enabled()) {
|
3267
|
+
gpr_log(GPR_INFO, "%s[call] PollTopOfCall: %s%s%s", DebugTag().c_str(),
|
3268
|
+
cancel_send_and_receive_ ? "force-" : "",
|
3269
|
+
send_trailing_metadata_ != nullptr
|
3270
|
+
? absl::StrCat("send-metadata:",
|
3271
|
+
send_trailing_metadata_->DebugString(), " ")
|
3272
|
+
.c_str()
|
3273
|
+
: " ",
|
3274
|
+
PollStateDebugString().c_str());
|
3275
|
+
}
|
3276
|
+
|
3277
|
+
if (cancel_send_and_receive_) {
|
3278
|
+
CancelSendMessage();
|
3279
|
+
CancelRecvMessage();
|
3280
|
+
}
|
3281
|
+
|
3282
|
+
PollSendMessage();
|
3283
|
+
PollRecvMessage(incoming_compression_algorithm_);
|
3284
|
+
|
3285
|
+
if (!is_sending() && send_trailing_metadata_ != nullptr) {
|
3286
|
+
server_to_client_messages_->Close();
|
3287
|
+
return std::move(send_trailing_metadata_);
|
3288
|
+
}
|
3289
|
+
|
3290
|
+
return Pending{};
|
3291
|
+
}
|
3292
|
+
|
3293
|
+
void ServerPromiseBasedCall::UpdateOnce() {
|
3294
|
+
if (grpc_call_trace.enabled()) {
|
3295
|
+
gpr_log(
|
3296
|
+
GPR_INFO, "%s[call] UpdateOnce: recv_close:%s%s %s%shas_promise=%s",
|
3297
|
+
DebugTag().c_str(), recv_close_op_cancel_state_.ToString().c_str(),
|
3298
|
+
recv_close_completion_.has_value()
|
3299
|
+
? absl::StrCat(":", CompletionString(recv_close_completion_))
|
3300
|
+
.c_str()
|
3301
|
+
: "",
|
3302
|
+
send_status_from_server_completion_.has_value()
|
3303
|
+
? absl::StrCat(
|
3304
|
+
"send_status:",
|
3305
|
+
CompletionString(send_status_from_server_completion_), " ")
|
3306
|
+
.c_str()
|
3307
|
+
: "",
|
3308
|
+
PollStateDebugString().c_str(),
|
3309
|
+
promise_.has_value() ? "true" : "false");
|
3310
|
+
}
|
3311
|
+
if (auto* p =
|
3312
|
+
absl::get_if<typename PipeSender<ServerMetadataHandle>::PushType>(
|
3313
|
+
&send_initial_metadata_state_)) {
|
3314
|
+
if ((*p)().ready()) {
|
3315
|
+
send_initial_metadata_state_ = absl::monostate{};
|
3316
|
+
}
|
3317
|
+
}
|
3318
|
+
if (promise_.has_value()) {
|
3319
|
+
auto r = promise_();
|
3320
|
+
if (grpc_call_trace.enabled()) {
|
3321
|
+
gpr_log(GPR_INFO, "%s[call] UpdateOnce: promise returns %s",
|
3322
|
+
DebugTag().c_str(),
|
3323
|
+
PollToString(r, [](const ServerMetadataHandle& h) {
|
3324
|
+
return h->DebugString();
|
3325
|
+
}).c_str());
|
3326
|
+
}
|
3327
|
+
if (auto* result = r.value_if_ready()) {
|
3328
|
+
if (grpc_call_trace.enabled()) {
|
3329
|
+
gpr_log(GPR_INFO, "%s[call] UpdateOnce: GotResult %s result:%s",
|
3330
|
+
DebugTag().c_str(),
|
3331
|
+
recv_close_op_cancel_state_.ToString().c_str(),
|
3332
|
+
(*result)->DebugString().c_str());
|
3333
|
+
}
|
3334
|
+
if (recv_close_op_cancel_state_.CompleteCall(
|
3335
|
+
(*result)->get(GrpcStatusFromWire()).value_or(false))) {
|
3336
|
+
FinishOpOnCompletion(&recv_close_completion_,
|
3337
|
+
PendingOp::kReceiveCloseOnServer);
|
3338
|
+
}
|
3339
|
+
channelz::ServerNode* channelz_node = server_->channelz_node();
|
3340
|
+
if (channelz_node != nullptr) {
|
3341
|
+
if ((*result)
|
3342
|
+
->get(GrpcStatusMetadata())
|
3343
|
+
.value_or(GRPC_STATUS_UNKNOWN) == GRPC_STATUS_OK) {
|
3344
|
+
channelz_node->RecordCallSucceeded();
|
3345
|
+
} else {
|
3346
|
+
channelz_node->RecordCallFailed();
|
3347
|
+
}
|
3348
|
+
}
|
3349
|
+
if (send_status_from_server_completion_.has_value()) {
|
3350
|
+
FinishOpOnCompletion(&send_status_from_server_completion_,
|
3351
|
+
PendingOp::kSendStatusFromServer);
|
3352
|
+
}
|
3353
|
+
CancelSendMessage();
|
3354
|
+
CancelRecvMessage();
|
3355
|
+
set_completed();
|
3356
|
+
promise_ = ArenaPromise<ServerMetadataHandle>();
|
3357
|
+
}
|
3358
|
+
}
|
3359
|
+
}
|
3360
|
+
|
3361
|
+
grpc_call_error ServerPromiseBasedCall::ValidateBatch(const grpc_op* ops,
|
3362
|
+
size_t nops) const {
|
3363
|
+
BitSet<8> got_ops;
|
3364
|
+
for (size_t op_idx = 0; op_idx < nops; op_idx++) {
|
3365
|
+
const grpc_op& op = ops[op_idx];
|
3366
|
+
switch (op.op) {
|
3367
|
+
case GRPC_OP_SEND_INITIAL_METADATA:
|
3368
|
+
if (!AreInitialMetadataFlagsValid(op.flags)) {
|
3369
|
+
return GRPC_CALL_ERROR_INVALID_FLAGS;
|
3370
|
+
}
|
3371
|
+
if (!ValidateMetadata(op.data.send_initial_metadata.count,
|
3372
|
+
op.data.send_initial_metadata.metadata)) {
|
3373
|
+
return GRPC_CALL_ERROR_INVALID_METADATA;
|
3374
|
+
}
|
3375
|
+
break;
|
3376
|
+
case GRPC_OP_SEND_MESSAGE:
|
3377
|
+
if (!AreWriteFlagsValid(op.flags)) {
|
3378
|
+
return GRPC_CALL_ERROR_INVALID_FLAGS;
|
3379
|
+
}
|
3380
|
+
break;
|
3381
|
+
case GRPC_OP_RECV_MESSAGE:
|
3382
|
+
case GRPC_OP_RECV_CLOSE_ON_SERVER:
|
3383
|
+
case GRPC_OP_SEND_STATUS_FROM_SERVER:
|
3384
|
+
if (op.flags != 0) return GRPC_CALL_ERROR_INVALID_FLAGS;
|
3385
|
+
break;
|
3386
|
+
case GRPC_OP_RECV_INITIAL_METADATA:
|
3387
|
+
case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
|
3388
|
+
case GRPC_OP_RECV_STATUS_ON_CLIENT:
|
3389
|
+
return GRPC_CALL_ERROR_NOT_ON_SERVER;
|
3390
|
+
}
|
3391
|
+
if (got_ops.is_set(op.op)) return GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
|
3392
|
+
got_ops.set(op.op);
|
3393
|
+
}
|
3394
|
+
return GRPC_CALL_OK;
|
3395
|
+
}
|
3396
|
+
|
3397
|
+
void ServerPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
|
3398
|
+
const Completion& completion) {
|
3399
|
+
for (size_t op_idx = 0; op_idx < nops; op_idx++) {
|
3400
|
+
const grpc_op& op = ops[op_idx];
|
3401
|
+
switch (op.op) {
|
3402
|
+
case GRPC_OP_SEND_INITIAL_METADATA: {
|
3403
|
+
// compression not implemented
|
3404
|
+
GPR_ASSERT(
|
3405
|
+
!op.data.send_initial_metadata.maybe_compression_level.is_set);
|
3406
|
+
if (!completed()) {
|
3407
|
+
auto metadata = arena()->MakePooled<ServerMetadata>(arena());
|
3408
|
+
CToMetadata(op.data.send_initial_metadata.metadata,
|
3409
|
+
op.data.send_initial_metadata.count, metadata.get());
|
3410
|
+
if (grpc_call_trace.enabled()) {
|
3411
|
+
gpr_log(GPR_INFO, "%s[call] Send initial metadata",
|
3412
|
+
DebugTag().c_str());
|
3413
|
+
}
|
3414
|
+
auto* pipe = absl::get<PipeSender<ServerMetadataHandle>*>(
|
3415
|
+
send_initial_metadata_state_);
|
3416
|
+
send_initial_metadata_state_ = pipe->Push(std::move(metadata));
|
3417
|
+
}
|
3418
|
+
} break;
|
3419
|
+
case GRPC_OP_SEND_MESSAGE:
|
3420
|
+
StartSendMessage(op, completion, server_to_client_messages_);
|
3421
|
+
break;
|
3422
|
+
case GRPC_OP_RECV_MESSAGE:
|
3423
|
+
StartRecvMessage(op, completion, client_to_server_messages_);
|
3424
|
+
break;
|
3425
|
+
case GRPC_OP_SEND_STATUS_FROM_SERVER:
|
3426
|
+
send_trailing_metadata_ = arena()->MakePooled<ServerMetadata>(arena());
|
3427
|
+
CToMetadata(op.data.send_status_from_server.trailing_metadata,
|
3428
|
+
op.data.send_status_from_server.trailing_metadata_count,
|
3429
|
+
send_trailing_metadata_.get());
|
3430
|
+
send_trailing_metadata_->Set(GrpcStatusMetadata(),
|
3431
|
+
op.data.send_status_from_server.status);
|
3432
|
+
if (auto* details = op.data.send_status_from_server.status_details) {
|
3433
|
+
send_trailing_metadata_->Set(GrpcMessageMetadata(),
|
3434
|
+
Slice(CSliceRef(*details)));
|
3435
|
+
}
|
3436
|
+
send_status_from_server_completion_ =
|
3437
|
+
AddOpToCompletion(completion, PendingOp::kSendStatusFromServer);
|
3438
|
+
break;
|
3439
|
+
case GRPC_OP_RECV_CLOSE_ON_SERVER:
|
3440
|
+
if (grpc_call_trace.enabled()) {
|
3441
|
+
gpr_log(GPR_INFO, "%s[call] StartBatch: RecvClose %s",
|
3442
|
+
DebugTag().c_str(),
|
3443
|
+
recv_close_op_cancel_state_.ToString().c_str());
|
3444
|
+
}
|
3445
|
+
if (!recv_close_op_cancel_state_.ReceiveCloseOnServerOpStarted(
|
3446
|
+
op.data.recv_close_on_server.cancelled)) {
|
3447
|
+
recv_close_completion_ =
|
3448
|
+
AddOpToCompletion(completion, PendingOp::kReceiveCloseOnServer);
|
3449
|
+
}
|
3450
|
+
break;
|
3451
|
+
case GRPC_OP_RECV_STATUS_ON_CLIENT:
|
3452
|
+
case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
|
3453
|
+
case GRPC_OP_RECV_INITIAL_METADATA:
|
3454
|
+
abort(); // unreachable
|
3455
|
+
}
|
3456
|
+
}
|
3457
|
+
}
|
3458
|
+
|
3459
|
+
grpc_call_error ServerPromiseBasedCall::StartBatch(const grpc_op* ops,
|
3460
|
+
size_t nops,
|
3461
|
+
void* notify_tag,
|
3462
|
+
bool is_notify_tag_closure) {
|
2910
3463
|
MutexLock lock(mu());
|
2911
|
-
|
3464
|
+
ScopedContext activity_context(this);
|
3465
|
+
if (nops == 0) {
|
3466
|
+
EndOpImmediately(cq(), notify_tag, is_notify_tag_closure);
|
3467
|
+
return GRPC_CALL_OK;
|
3468
|
+
}
|
3469
|
+
const grpc_call_error validation_result = ValidateBatch(ops, nops);
|
3470
|
+
if (validation_result != GRPC_CALL_OK) {
|
3471
|
+
return validation_result;
|
3472
|
+
}
|
3473
|
+
Completion completion =
|
3474
|
+
StartCompletion(notify_tag, is_notify_tag_closure, ops);
|
3475
|
+
CommitBatch(ops, nops, completion);
|
3476
|
+
Update();
|
3477
|
+
FinishOpOnCompletion(&completion, PendingOp::kStartingBatch);
|
3478
|
+
return GRPC_CALL_OK;
|
2912
3479
|
}
|
2913
3480
|
|
2914
|
-
|
2915
|
-
|
3481
|
+
void ServerPromiseBasedCall::CancelWithErrorLocked(absl::Status error) {
|
3482
|
+
if (!promise_.has_value()) return;
|
3483
|
+
cancel_send_and_receive_ = true;
|
3484
|
+
send_trailing_metadata_ = ServerMetadataFromStatus(error, arena());
|
3485
|
+
ForceWakeup();
|
2916
3486
|
}
|
2917
3487
|
|
3488
|
+
#endif
|
3489
|
+
|
3490
|
+
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
|
3491
|
+
ArenaPromise<ServerMetadataHandle>
|
3492
|
+
ServerCallContext::MakeTopOfServerCallPromise(
|
3493
|
+
CallArgs call_args, grpc_completion_queue* cq,
|
3494
|
+
grpc_metadata_array* publish_initial_metadata,
|
3495
|
+
absl::FunctionRef<void(grpc_call* call)> publish) {
|
3496
|
+
call_->mu()->AssertHeld();
|
3497
|
+
call_->SetCompletionQueueLocked(cq);
|
3498
|
+
call_->server_to_client_messages_ = call_args.server_to_client_messages;
|
3499
|
+
call_->client_to_server_messages_ = call_args.client_to_server_messages;
|
3500
|
+
call_->send_initial_metadata_state_ = call_args.server_initial_metadata;
|
3501
|
+
call_->incoming_compression_algorithm_ =
|
3502
|
+
call_args.client_initial_metadata->get(GrpcEncodingMetadata())
|
3503
|
+
.value_or(GRPC_COMPRESS_NONE);
|
3504
|
+
call_->client_initial_metadata_ =
|
3505
|
+
std::move(call_args.client_initial_metadata);
|
3506
|
+
PublishMetadataArray(call_->client_initial_metadata_.get(),
|
3507
|
+
publish_initial_metadata);
|
3508
|
+
call_->ExternalRef();
|
3509
|
+
publish(call_->c_ptr());
|
3510
|
+
return [this]() {
|
3511
|
+
call_->mu()->AssertHeld();
|
3512
|
+
return call_->PollTopOfCall();
|
3513
|
+
};
|
3514
|
+
}
|
3515
|
+
#else
|
3516
|
+
ArenaPromise<ServerMetadataHandle>
|
3517
|
+
ServerCallContext::MakeTopOfServerCallPromise(
|
3518
|
+
CallArgs, grpc_completion_queue*, grpc_metadata_array*,
|
3519
|
+
absl::FunctionRef<void(grpc_call*)>) {
|
3520
|
+
(void)call_;
|
3521
|
+
Crash("Promise-based server call is not enabled");
|
3522
|
+
}
|
3523
|
+
#endif
|
3524
|
+
|
2918
3525
|
} // namespace grpc_core
|
2919
3526
|
|
2920
3527
|
///////////////////////////////////////////////////////////////////////////////
|
@@ -2931,13 +3538,20 @@ size_t grpc_call_get_initial_size_estimate() {
|
|
2931
3538
|
|
2932
3539
|
grpc_error_handle grpc_call_create(grpc_call_create_args* args,
|
2933
3540
|
grpc_call** out_call) {
|
3541
|
+
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
|
2934
3542
|
if (grpc_core::IsPromiseBasedClientCallEnabled() &&
|
2935
|
-
args->channel->is_promising()) {
|
2936
|
-
|
2937
|
-
|
2938
|
-
args, out_call);
|
2939
|
-
}
|
3543
|
+
args->server_transport_data == nullptr && args->channel->is_promising()) {
|
3544
|
+
return grpc_core::MakePromiseBasedCall<grpc_core::ClientPromiseBasedCall>(
|
3545
|
+
args, out_call);
|
2940
3546
|
}
|
3547
|
+
#endif
|
3548
|
+
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
|
3549
|
+
if (grpc_core::IsPromiseBasedServerCallEnabled() &&
|
3550
|
+
args->server_transport_data != nullptr && args->channel->is_promising()) {
|
3551
|
+
return grpc_core::MakePromiseBasedCall<grpc_core::ServerPromiseBasedCall>(
|
3552
|
+
args, out_call);
|
3553
|
+
}
|
3554
|
+
#endif
|
2941
3555
|
return grpc_core::FilterStackCall::Create(args, out_call);
|
2942
3556
|
}
|
2943
3557
|
|