grpc 1.46.3-x86_64-linux → 1.47.0-x86_64-linux
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 +49 -97
- data/include/grpc/event_engine/event_engine.h +42 -7
- data/include/grpc/event_engine/memory_allocator.h +0 -15
- data/include/grpc/event_engine/port.h +1 -1
- data/include/grpc/event_engine/slice.h +286 -0
- data/include/grpc/event_engine/slice_buffer.h +112 -0
- data/include/grpc/grpc_security.h +11 -0
- data/include/grpc/impl/codegen/port_platform.h +100 -36
- data/include/grpc/impl/codegen/slice.h +1 -1
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
- data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
- data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
- data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
- data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
- data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
- data/src/core/ext/filters/client_channel/client_channel.h +26 -6
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
- data/src/core/ext/filters/client_channel/config_selector.h +7 -5
- data/src/core/ext/filters/client_channel/connector.h +8 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
- data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
- data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
- data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
- data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
- data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
- data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
- data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
- data/src/core/ext/filters/client_channel/subchannel.h +80 -20
- data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
- data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
- data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
- data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
- data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
- data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
- data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
- data/src/core/ext/xds/certificate_provider_store.cc +4 -2
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
- data/src/core/ext/xds/xds_certificate_provider.h +1 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
- data/src/core/ext/xds/xds_client.cc +46 -22
- data/src/core/ext/xds/xds_cluster.cc +106 -16
- data/src/core/ext/xds/xds_cluster.h +3 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
- data/src/core/ext/xds/xds_listener.cc +19 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
- data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
- data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
- data/src/core/lib/avl/avl.h +3 -1
- data/src/core/lib/channel/call_finalization.h +4 -0
- data/src/core/lib/channel/call_tracer.h +8 -2
- data/src/core/lib/channel/channel_args.cc +41 -22
- data/src/core/lib/channel/channel_args.h +33 -3
- data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
- data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
- data/src/core/lib/channel/channel_stack.cc +41 -3
- data/src/core/lib/channel/channel_stack.h +49 -3
- data/src/core/lib/channel/channel_stack_builder.cc +9 -19
- data/src/core/lib/channel/channel_stack_builder.h +15 -27
- data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
- data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
- data/src/core/lib/channel/channel_trace.cc +8 -13
- data/src/core/lib/channel/channel_trace.h +6 -3
- data/src/core/lib/channel/channelz.cc +8 -13
- data/src/core/lib/channel/channelz.h +13 -4
- data/src/core/lib/channel/channelz_registry.cc +7 -14
- data/src/core/lib/channel/channelz_registry.h +10 -9
- data/src/core/lib/channel/connected_channel.cc +21 -31
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +444 -189
- data/src/core/lib/channel/promise_based_filter.h +160 -27
- data/src/core/lib/channel/status_util.cc +2 -0
- data/src/core/lib/channel/status_util.h +0 -3
- data/src/core/lib/compression/compression_internal.cc +45 -10
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +3 -0
- data/src/core/lib/config/core_configuration.h +2 -1
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
- data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
- data/src/core/lib/event_engine/event_engine.cc +12 -2
- data/src/core/lib/event_engine/event_engine_factory.h +5 -0
- data/src/core/lib/event_engine/handle_containers.h +67 -0
- data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
- data/src/core/lib/event_engine/iomgr_engine.h +118 -0
- data/src/core/lib/event_engine/memory_allocator.cc +12 -4
- data/src/core/lib/event_engine/resolved_address.cc +4 -2
- data/src/core/lib/event_engine/slice.cc +102 -0
- data/src/core/lib/event_engine/slice_buffer.cc +50 -0
- data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
- data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
- data/src/core/lib/gpr/log.cc +5 -0
- data/src/core/lib/gpr/tls.h +3 -5
- data/src/core/lib/gprpp/bitset.h +5 -1
- data/src/core/lib/gprpp/chunked_vector.h +4 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
- data/src/core/lib/gprpp/examine_stack.h +0 -1
- data/src/core/lib/gprpp/fork.cc +3 -6
- data/src/core/lib/gprpp/global_config.h +2 -4
- data/src/core/lib/gprpp/global_config_env.cc +3 -2
- data/src/core/lib/gprpp/global_config_env.h +3 -1
- data/src/core/lib/gprpp/global_config_generic.h +0 -4
- data/src/core/lib/gprpp/host_port.cc +2 -0
- data/src/core/lib/gprpp/manual_constructor.h +0 -1
- data/src/core/lib/gprpp/match.h +2 -0
- data/src/core/lib/gprpp/memory.h +1 -5
- data/src/core/lib/gprpp/orphanable.h +1 -4
- data/src/core/lib/gprpp/ref_counted.h +1 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
- data/src/core/lib/gprpp/stat.h +0 -2
- data/src/core/lib/gprpp/stat_posix.cc +7 -2
- data/src/core/lib/gprpp/status_helper.cc +8 -4
- data/src/core/lib/gprpp/status_helper.h +4 -0
- data/src/core/lib/gprpp/sync.h +3 -1
- data/src/core/lib/gprpp/table.h +10 -0
- data/src/core/lib/gprpp/thd.h +2 -5
- data/src/core/lib/gprpp/thd_posix.cc +4 -2
- data/src/core/lib/gprpp/thd_windows.cc +2 -0
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +6 -1
- data/src/core/lib/gprpp/time_util.cc +4 -0
- data/src/core/lib/gprpp/time_util.h +1 -1
- data/src/core/lib/gprpp/unique_type_name.h +104 -0
- data/src/core/lib/http/format_request.cc +29 -0
- data/src/core/lib/http/format_request.h +2 -0
- data/src/core/lib/http/httpcli.cc +88 -81
- data/src/core/lib/http/httpcli.h +39 -7
- data/src/core/lib/http/httpcli_security_connector.cc +3 -4
- data/src/core/lib/iomgr/endpoint.cc +4 -4
- data/src/core/lib/iomgr/endpoint.h +6 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/ev_posix.cc +1 -4
- data/src/core/lib/iomgr/exec_ctx.h +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
- data/src/core/lib/iomgr/internal_errqueue.h +1 -6
- data/src/core/lib/iomgr/iomgr.cc +0 -1
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
- data/src/core/lib/iomgr/pollset_set.h +1 -2
- data/src/core/lib/iomgr/port.h +25 -6
- data/src/core/lib/iomgr/resolve_address.cc +8 -0
- data/src/core/lib/iomgr/resolve_address.h +21 -14
- data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
- data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
- data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
- data/src/core/lib/iomgr/sockaddr.h +2 -3
- data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
- data/src/core/lib/iomgr/tcp_posix.cc +9 -27
- data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
- data/src/core/lib/iomgr/tcp_windows.cc +7 -4
- data/src/core/lib/json/json.h +1 -2
- data/src/core/lib/json/json_reader.cc +9 -1
- data/src/core/lib/json/json_util.cc +7 -0
- data/src/core/lib/json/json_util.h +10 -1
- data/src/core/lib/json/json_writer.cc +6 -1
- data/src/core/lib/promise/activity.cc +1 -1
- data/src/core/lib/promise/activity.h +6 -6
- data/src/core/lib/promise/arena_promise.h +11 -1
- data/src/core/lib/promise/call_push_pull.h +4 -0
- data/src/core/lib/promise/context.h +1 -1
- data/src/core/lib/promise/detail/basic_seq.h +2 -2
- data/src/core/lib/promise/detail/promise_factory.h +0 -1
- data/src/core/lib/promise/latch.h +0 -1
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/race.h +0 -1
- data/src/core/lib/promise/seq.h +0 -2
- data/src/core/lib/promise/sleep.cc +2 -0
- data/src/core/lib/promise/sleep.h +10 -0
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resolver/resolver_factory.h +1 -2
- data/src/core/lib/resolver/server_address.cc +9 -3
- data/src/core/lib/resolver/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.cc +14 -1
- data/src/core/lib/resource_quota/api.h +4 -1
- data/src/core/lib/resource_quota/arena.cc +0 -6
- data/src/core/lib/resource_quota/arena.h +1 -2
- data/src/core/lib/resource_quota/memory_quota.cc +47 -5
- data/src/core/lib/resource_quota/memory_quota.h +24 -5
- data/src/core/lib/resource_quota/resource_quota.h +8 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -0
- data/src/core/lib/resource_quota/thread_quota.h +4 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
- data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
- data/src/core/lib/security/credentials/credentials.h +17 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
- data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
- data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
- data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
- data/src/core/lib/security/transport/security_handshaker.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.h +1 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
- data/src/core/lib/service_config/service_config.h +4 -8
- data/src/core/lib/service_config/service_config_call_data.h +4 -1
- data/src/core/lib/service_config/service_config_impl.cc +7 -0
- data/src/core/lib/service_config/service_config_impl.h +9 -2
- data/src/core/lib/service_config/service_config_parser.cc +8 -0
- data/src/core/lib/service_config/service_config_parser.h +7 -0
- data/src/core/lib/slice/b64.cc +1 -1
- data/src/core/lib/slice/b64.h +2 -0
- data/src/core/lib/slice/percent_encoding.cc +4 -1
- data/src/core/lib/slice/percent_encoding.h +0 -6
- data/src/core/lib/slice/slice.cc +2 -1
- data/src/core/lib/slice/slice.h +10 -5
- data/src/core/lib/slice/slice_api.cc +1 -1
- data/src/core/lib/slice/slice_buffer.cc +50 -23
- data/src/core/lib/slice/slice_buffer.h +106 -0
- data/src/core/lib/slice/slice_buffer_api.cc +35 -0
- data/src/core/lib/slice/slice_internal.h +4 -3
- data/src/core/lib/slice/slice_refcount.h +2 -3
- data/src/core/lib/slice/slice_refcount_base.h +2 -3
- data/src/core/lib/slice/slice_split.cc +3 -0
- data/src/core/lib/slice/slice_split.h +0 -4
- data/src/core/lib/slice/slice_string_helpers.cc +4 -0
- data/src/core/lib/slice/slice_string_helpers.h +1 -4
- data/src/core/lib/surface/builtins.cc +7 -2
- data/src/core/lib/surface/byte_buffer.cc +7 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +41 -26
- data/src/core/lib/surface/call.h +16 -2
- data/src/core/lib/surface/call_details.cc +4 -4
- data/src/core/lib/surface/call_log_batch.cc +7 -1
- data/src/core/lib/surface/call_test_only.h +4 -1
- data/src/core/lib/surface/channel.cc +179 -242
- data/src/core/lib/surface/channel.h +94 -57
- data/src/core/lib/surface/channel_init.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +8 -2
- data/src/core/lib/surface/channel_stack_type.cc +0 -2
- data/src/core/lib/surface/channel_stack_type.h +0 -2
- data/src/core/lib/surface/completion_queue.cc +14 -6
- data/src/core/lib/surface/completion_queue.h +5 -1
- data/src/core/lib/surface/completion_queue_factory.cc +1 -0
- data/src/core/lib/surface/completion_queue_factory.h +1 -3
- data/src/core/lib/surface/event_string.cc +1 -7
- data/src/core/lib/surface/event_string.h +1 -1
- data/src/core/lib/surface/init.cc +17 -45
- data/src/core/lib/surface/init.h +0 -8
- data/src/core/lib/surface/lame_client.cc +64 -110
- data/src/core/lib/surface/lame_client.h +40 -2
- data/src/core/lib/surface/metadata_array.cc +2 -0
- data/src/core/lib/surface/server.cc +69 -56
- data/src/core/lib/surface/server.h +39 -9
- data/src/core/lib/surface/validate_metadata.cc +2 -5
- data/src/core/lib/surface/validate_metadata.h +3 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +3 -1
- data/src/core/lib/transport/bdp_estimator.h +2 -3
- data/src/core/lib/transport/byte_stream.cc +4 -3
- data/src/core/lib/transport/byte_stream.h +5 -1
- data/src/core/lib/transport/connectivity_state.cc +6 -4
- data/src/core/lib/transport/connectivity_state.h +2 -3
- data/src/core/lib/transport/error_utils.cc +4 -2
- data/src/core/lib/transport/error_utils.h +5 -1
- data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
- data/src/core/lib/{channel → transport}/handshaker.h +13 -6
- data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
- data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
- data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
- data/src/core/lib/transport/metadata_batch.cc +287 -0
- data/src/core/lib/transport/metadata_batch.h +133 -264
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +10 -3
- data/src/core/lib/transport/status_conversion.cc +2 -0
- data/src/core/lib/transport/status_conversion.h +2 -2
- data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
- data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
- data/src/core/lib/transport/timeout_encoding.cc +2 -6
- data/src/core/lib/transport/timeout_encoding.h +5 -1
- data/src/core/lib/transport/transport.cc +18 -17
- data/src/core/lib/transport/transport.h +28 -2
- data/src/core/lib/transport/transport_impl.h +10 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -10
- data/src/core/lib/uri/uri_parser.cc +11 -3
- data/src/core/lib/uri/uri_parser.h +0 -2
- data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
- data/src/ruby/ext/grpc/extconf.rb +2 -2
- data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
- metadata +36 -29
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
- data/src/core/lib/event_engine/sockaddr.cc +0 -40
- data/src/core/lib/event_engine/sockaddr.h +0 -44
- data/src/core/lib/gprpp/capture.h +0 -76
- data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
- data/src/core/lib/iomgr/event_engine/closure.h +0 -42
- data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
- data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
- data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
- data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
- data/src/core/lib/iomgr/event_engine/promise.h +0 -51
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
- data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
- data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
- data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
- data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -16,9 +16,20 @@
|
|
16
16
|
|
17
17
|
#include "src/core/lib/channel/promise_based_filter.h"
|
18
18
|
|
19
|
-
#include <
|
19
|
+
#include <memory>
|
20
|
+
#include <string>
|
21
|
+
|
22
|
+
#include "absl/base/attributes.h"
|
23
|
+
#include "absl/memory/memory.h"
|
24
|
+
#include "absl/types/variant.h"
|
25
|
+
#include "absl/utility/utility.h"
|
26
|
+
|
27
|
+
#include <grpc/status.h>
|
20
28
|
|
21
29
|
#include "src/core/lib/channel/channel_stack.h"
|
30
|
+
#include "src/core/lib/gprpp/manual_constructor.h"
|
31
|
+
#include "src/core/lib/iomgr/error.h"
|
32
|
+
#include "src/core/lib/slice/slice.h"
|
22
33
|
|
23
34
|
namespace grpc_core {
|
24
35
|
namespace promise_filter_detail {
|
@@ -70,6 +81,131 @@ void BaseCallData::Wakeup() {
|
|
70
81
|
|
71
82
|
void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
|
72
83
|
|
84
|
+
///////////////////////////////////////////////////////////////////////////////
|
85
|
+
// BaseCallData::CapturedBatch
|
86
|
+
|
87
|
+
namespace {
|
88
|
+
uintptr_t* RefCountField(grpc_transport_stream_op_batch* b) {
|
89
|
+
return &b->handler_private.closure.error_data.scratch;
|
90
|
+
}
|
91
|
+
} // namespace
|
92
|
+
|
93
|
+
BaseCallData::CapturedBatch::CapturedBatch() : batch_(nullptr) {}
|
94
|
+
|
95
|
+
BaseCallData::CapturedBatch::CapturedBatch(
|
96
|
+
grpc_transport_stream_op_batch* batch) {
|
97
|
+
*RefCountField(batch) = 1;
|
98
|
+
batch_ = batch;
|
99
|
+
}
|
100
|
+
|
101
|
+
BaseCallData::CapturedBatch::~CapturedBatch() {
|
102
|
+
if (batch_ == nullptr) return;
|
103
|
+
// A ref can be dropped by destruction, but it must not release the batch
|
104
|
+
uintptr_t& refcnt = *RefCountField(batch_);
|
105
|
+
if (refcnt == 0) return; // refcnt==0 ==> cancelled
|
106
|
+
--refcnt;
|
107
|
+
GPR_ASSERT(refcnt != 0);
|
108
|
+
}
|
109
|
+
|
110
|
+
BaseCallData::CapturedBatch::CapturedBatch(const CapturedBatch& rhs)
|
111
|
+
: batch_(rhs.batch_) {
|
112
|
+
if (batch_ == nullptr) return;
|
113
|
+
uintptr_t& refcnt = *RefCountField(batch_);
|
114
|
+
if (refcnt == 0) return; // refcnt==0 ==> cancelled
|
115
|
+
++refcnt;
|
116
|
+
}
|
117
|
+
|
118
|
+
BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
|
119
|
+
const CapturedBatch& b) {
|
120
|
+
CapturedBatch temp(b);
|
121
|
+
Swap(&temp);
|
122
|
+
return *this;
|
123
|
+
}
|
124
|
+
|
125
|
+
BaseCallData::CapturedBatch::CapturedBatch(CapturedBatch&& rhs) noexcept
|
126
|
+
: batch_(rhs.batch_) {
|
127
|
+
rhs.batch_ = nullptr;
|
128
|
+
}
|
129
|
+
|
130
|
+
BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
|
131
|
+
CapturedBatch&& b) noexcept {
|
132
|
+
Swap(&b);
|
133
|
+
return *this;
|
134
|
+
}
|
135
|
+
|
136
|
+
void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) {
|
137
|
+
auto* batch = absl::exchange(batch_, nullptr);
|
138
|
+
GPR_ASSERT(batch != nullptr);
|
139
|
+
uintptr_t& refcnt = *RefCountField(batch);
|
140
|
+
if (refcnt == 0) return; // refcnt==0 ==> cancelled
|
141
|
+
if (--refcnt == 0) {
|
142
|
+
releaser->Resume(batch);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
void BaseCallData::CapturedBatch::CompleteWith(Flusher* releaser) {
|
147
|
+
auto* batch = absl::exchange(batch_, nullptr);
|
148
|
+
GPR_ASSERT(batch != nullptr);
|
149
|
+
uintptr_t& refcnt = *RefCountField(batch);
|
150
|
+
if (refcnt == 0) return; // refcnt==0 ==> cancelled
|
151
|
+
if (--refcnt == 0) {
|
152
|
+
releaser->Complete(batch);
|
153
|
+
}
|
154
|
+
}
|
155
|
+
|
156
|
+
void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
|
157
|
+
Flusher* releaser) {
|
158
|
+
auto* batch = absl::exchange(batch_, nullptr);
|
159
|
+
GPR_ASSERT(batch != nullptr);
|
160
|
+
uintptr_t& refcnt = *RefCountField(batch);
|
161
|
+
if (refcnt == 0) {
|
162
|
+
// refcnt==0 ==> cancelled
|
163
|
+
GRPC_ERROR_UNREF(error);
|
164
|
+
return;
|
165
|
+
}
|
166
|
+
refcnt = 0;
|
167
|
+
releaser->Cancel(batch, error);
|
168
|
+
}
|
169
|
+
|
170
|
+
///////////////////////////////////////////////////////////////////////////////
|
171
|
+
// BaseCallData::Flusher
|
172
|
+
|
173
|
+
BaseCallData::Flusher::Flusher(BaseCallData* call) : call_(call) {
|
174
|
+
GRPC_CALL_STACK_REF(call_->call_stack(), "flusher");
|
175
|
+
}
|
176
|
+
|
177
|
+
BaseCallData::Flusher::~Flusher() {
|
178
|
+
if (release_.empty()) {
|
179
|
+
if (call_closures_.size() == 0) {
|
180
|
+
GRPC_CALL_COMBINER_STOP(call_->call_combiner(), "nothing to flush");
|
181
|
+
GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
|
182
|
+
return;
|
183
|
+
}
|
184
|
+
call_closures_.RunClosures(call_->call_combiner());
|
185
|
+
GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
|
186
|
+
return;
|
187
|
+
}
|
188
|
+
auto call_next_op = [](void* p, grpc_error_handle) {
|
189
|
+
auto* batch = static_cast<grpc_transport_stream_op_batch*>(p);
|
190
|
+
BaseCallData* call =
|
191
|
+
static_cast<BaseCallData*>(batch->handler_private.extra_arg);
|
192
|
+
grpc_call_next_op(call->elem(), batch);
|
193
|
+
GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch");
|
194
|
+
};
|
195
|
+
for (size_t i = 1; i < release_.size(); i++) {
|
196
|
+
auto* batch = release_[i];
|
197
|
+
batch->handler_private.extra_arg = call_;
|
198
|
+
GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch,
|
199
|
+
nullptr);
|
200
|
+
GRPC_CALL_STACK_REF(call_->call_stack(), "flusher_batch");
|
201
|
+
call_closures_.Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
|
202
|
+
"flusher_batch");
|
203
|
+
}
|
204
|
+
call_closures_.RunClosuresWithoutYielding(call_->call_combiner());
|
205
|
+
grpc_call_next_op(call_->elem(), release_[0]);
|
206
|
+
GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
|
207
|
+
}
|
208
|
+
|
73
209
|
///////////////////////////////////////////////////////////////////////////////
|
74
210
|
// ClientCallData
|
75
211
|
|
@@ -104,8 +240,10 @@ struct ClientCallData::RecvInitialMetadata final {
|
|
104
240
|
|
105
241
|
class ClientCallData::PollContext {
|
106
242
|
public:
|
107
|
-
explicit PollContext(ClientCallData* self
|
243
|
+
explicit PollContext(ClientCallData* self, Flusher* flusher)
|
244
|
+
: self_(self), flusher_(flusher) {
|
108
245
|
GPR_ASSERT(self_->poll_ctx_ == nullptr);
|
246
|
+
|
109
247
|
self_->poll_ctx_ = this;
|
110
248
|
scoped_activity_.Init(self_);
|
111
249
|
have_scoped_activity_ = true;
|
@@ -143,7 +281,7 @@ class ClientCallData::PollContext {
|
|
143
281
|
}
|
144
282
|
self_->recv_initial_metadata_->state =
|
145
283
|
RecvInitialMetadata::kResponded;
|
146
|
-
|
284
|
+
flusher_->AddClosure(
|
147
285
|
absl::exchange(self_->recv_initial_metadata_->original_on_ready,
|
148
286
|
nullptr),
|
149
287
|
GRPC_ERROR_NONE,
|
@@ -171,7 +309,7 @@ class ClientCallData::PollContext {
|
|
171
309
|
destroy_md = false;
|
172
310
|
}
|
173
311
|
self_->recv_trailing_state_ = RecvTrailingState::kResponded;
|
174
|
-
|
312
|
+
flusher_->AddClosure(
|
175
313
|
absl::exchange(self_->original_recv_trailing_metadata_ready_,
|
176
314
|
nullptr),
|
177
315
|
GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:1");
|
@@ -195,7 +333,7 @@ class ClientCallData::PollContext {
|
|
195
333
|
case RecvInitialMetadata::kCompleteWaitingForLatch:
|
196
334
|
self_->recv_initial_metadata_->state =
|
197
335
|
RecvInitialMetadata::kResponded;
|
198
|
-
|
336
|
+
flusher_->AddClosure(
|
199
337
|
absl::exchange(
|
200
338
|
self_->recv_initial_metadata_->original_on_ready,
|
201
339
|
nullptr),
|
@@ -237,7 +375,7 @@ class ClientCallData::PollContext {
|
|
237
375
|
case RecvInitialMetadata::kCompleteAndSetLatch:
|
238
376
|
self_->recv_initial_metadata_->state =
|
239
377
|
RecvInitialMetadata::kResponded;
|
240
|
-
|
378
|
+
flusher_->AddClosure(
|
241
379
|
absl::exchange(
|
242
380
|
self_->recv_initial_metadata_->original_on_ready,
|
243
381
|
nullptr),
|
@@ -247,21 +385,21 @@ class ClientCallData::PollContext {
|
|
247
385
|
}
|
248
386
|
if (self_->send_initial_state_ == SendInitialState::kQueued) {
|
249
387
|
self_->send_initial_state_ = SendInitialState::kCancelled;
|
250
|
-
|
388
|
+
self_->send_initial_metadata_batch_.CancelWith(error, flusher_);
|
251
389
|
} else {
|
252
390
|
GPR_ASSERT(
|
253
391
|
self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
|
254
392
|
self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
|
255
393
|
self_->call_combiner()->Cancel(GRPC_ERROR_REF(error));
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
394
|
+
CapturedBatch b(grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
|
395
|
+
[](void* p, grpc_error_handle) {
|
396
|
+
GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
|
397
|
+
"finish_cancel");
|
398
|
+
},
|
399
|
+
self_->call_combiner(), nullptr)));
|
400
|
+
b->cancel_stream = true;
|
401
|
+
b->payload->cancel_stream.cancel_error = error;
|
402
|
+
b.ResumeWith(flusher_);
|
265
403
|
}
|
266
404
|
self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
|
267
405
|
}
|
@@ -280,7 +418,7 @@ class ClientCallData::PollContext {
|
|
280
418
|
// promise transition).
|
281
419
|
if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
|
282
420
|
self_->recv_trailing_state_ = RecvTrailingState::kResponded;
|
283
|
-
|
421
|
+
flusher_->AddClosure(
|
284
422
|
absl::exchange(self_->original_recv_trailing_metadata_ready_,
|
285
423
|
nullptr),
|
286
424
|
GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:2");
|
@@ -292,77 +430,42 @@ class ClientCallData::PollContext {
|
|
292
430
|
~PollContext() {
|
293
431
|
self_->poll_ctx_ = nullptr;
|
294
432
|
if (have_scoped_activity_) scoped_activity_.Destroy();
|
295
|
-
GRPC_CALL_STACK_REF(self_->call_stack(), "finish_poll");
|
296
|
-
bool in_combiner = true;
|
297
|
-
if (call_closures_.size() != 0) {
|
298
|
-
if (forward_batch_ != nullptr) {
|
299
|
-
call_closures_.RunClosuresWithoutYielding(self_->call_combiner());
|
300
|
-
} else {
|
301
|
-
in_combiner = false;
|
302
|
-
call_closures_.RunClosures(self_->call_combiner());
|
303
|
-
}
|
304
|
-
}
|
305
|
-
if (forward_batch_ != nullptr) {
|
306
|
-
GPR_ASSERT(in_combiner);
|
307
|
-
in_combiner = false;
|
308
|
-
forward_send_initial_metadata_ = false;
|
309
|
-
grpc_call_next_op(self_->elem(), forward_batch_);
|
310
|
-
}
|
311
|
-
if (cancel_send_initial_metadata_error_ != GRPC_ERROR_NONE) {
|
312
|
-
GPR_ASSERT(in_combiner);
|
313
|
-
forward_send_initial_metadata_ = false;
|
314
|
-
in_combiner = false;
|
315
|
-
grpc_transport_stream_op_batch_finish_with_failure(
|
316
|
-
absl::exchange(self_->send_initial_metadata_batch_, nullptr),
|
317
|
-
cancel_send_initial_metadata_error_, self_->call_combiner());
|
318
|
-
}
|
319
|
-
if (absl::exchange(forward_send_initial_metadata_, false)) {
|
320
|
-
GPR_ASSERT(in_combiner);
|
321
|
-
in_combiner = false;
|
322
|
-
grpc_call_next_op(
|
323
|
-
self_->elem(),
|
324
|
-
absl::exchange(self_->send_initial_metadata_batch_, nullptr));
|
325
|
-
}
|
326
433
|
if (repoll_) {
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
} else if (in_combiner) {
|
349
|
-
GRPC_CALL_COMBINER_STOP(self_->call_combiner(), "poll paused");
|
434
|
+
struct NextPoll : public grpc_closure {
|
435
|
+
grpc_call_stack* call_stack;
|
436
|
+
ClientCallData* call_data;
|
437
|
+
};
|
438
|
+
auto run = [](void* p, grpc_error_handle) {
|
439
|
+
auto* next_poll = static_cast<NextPoll*>(p);
|
440
|
+
{
|
441
|
+
Flusher flusher(next_poll->call_data);
|
442
|
+
next_poll->call_data->WakeInsideCombiner(&flusher);
|
443
|
+
}
|
444
|
+
GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
|
445
|
+
delete next_poll;
|
446
|
+
};
|
447
|
+
// Unique ptr --> release to suppress clang-tidy warnings about allocating
|
448
|
+
// in a destructor.
|
449
|
+
auto* p = absl::make_unique<NextPoll>().release();
|
450
|
+
p->call_stack = self_->call_stack();
|
451
|
+
p->call_data = self_;
|
452
|
+
GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
|
453
|
+
GRPC_CLOSURE_INIT(p, run, p, nullptr);
|
454
|
+
flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
|
350
455
|
}
|
351
|
-
GRPC_CALL_STACK_UNREF(self_->call_stack(), "finish_poll");
|
352
456
|
}
|
353
457
|
|
354
458
|
void Repoll() { repoll_ = true; }
|
355
459
|
|
356
|
-
void ForwardSendInitialMetadata() {
|
460
|
+
void ForwardSendInitialMetadata() {
|
461
|
+
self_->send_initial_metadata_batch_.ResumeWith(flusher_);
|
462
|
+
}
|
357
463
|
|
358
464
|
private:
|
359
465
|
ManualConstructor<ScopedActivity> scoped_activity_;
|
360
466
|
ClientCallData* self_;
|
361
|
-
|
362
|
-
grpc_error_handle cancel_send_initial_metadata_error_ = GRPC_ERROR_NONE;
|
363
|
-
grpc_transport_stream_op_batch* forward_batch_ = nullptr;
|
467
|
+
Flusher* flusher_;
|
364
468
|
bool repoll_ = false;
|
365
|
-
bool forward_send_initial_metadata_ = false;
|
366
469
|
bool have_scoped_activity_;
|
367
470
|
};
|
368
471
|
|
@@ -393,9 +496,11 @@ void ClientCallData::ForceImmediateRepoll() {
|
|
393
496
|
}
|
394
497
|
|
395
498
|
// Handle one grpc_transport_stream_op_batch
|
396
|
-
void ClientCallData::StartBatch(grpc_transport_stream_op_batch*
|
499
|
+
void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
397
500
|
// Fake out the activity based context.
|
398
501
|
ScopedContext context(this);
|
502
|
+
CapturedBatch batch(b);
|
503
|
+
Flusher flusher(this);
|
399
504
|
|
400
505
|
// If this is a cancel stream, cancel anything we have pending and propagate
|
401
506
|
// the cancellation.
|
@@ -405,7 +510,12 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
|
|
405
510
|
!batch->recv_initial_metadata && !batch->recv_message &&
|
406
511
|
!batch->recv_trailing_metadata);
|
407
512
|
Cancel(batch->payload->cancel_stream.cancel_error);
|
408
|
-
|
513
|
+
if (is_last()) {
|
514
|
+
GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
|
515
|
+
batch.CompleteWith(&flusher);
|
516
|
+
} else {
|
517
|
+
batch.ResumeWith(&flusher);
|
518
|
+
}
|
409
519
|
return;
|
410
520
|
}
|
411
521
|
|
@@ -451,40 +561,37 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
|
|
451
561
|
// If we're already cancelled, just terminate the batch.
|
452
562
|
if (send_initial_state_ == SendInitialState::kCancelled ||
|
453
563
|
recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
564
|
+
batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
|
565
|
+
} else {
|
566
|
+
// Otherwise, we should not have seen a send_initial_metadata op yet.
|
567
|
+
GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
|
568
|
+
// Mark ourselves as queued.
|
569
|
+
send_initial_state_ = SendInitialState::kQueued;
|
570
|
+
if (batch->recv_trailing_metadata) {
|
571
|
+
// If there's a recv_trailing_metadata op, we queue that too.
|
572
|
+
GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
|
573
|
+
recv_trailing_state_ = RecvTrailingState::kQueued;
|
574
|
+
}
|
575
|
+
// This is the queuing!
|
576
|
+
send_initial_metadata_batch_ = batch;
|
577
|
+
// And kick start the promise.
|
578
|
+
StartPromise(&flusher);
|
466
579
|
}
|
467
|
-
|
468
|
-
|
469
|
-
//
|
470
|
-
StartPromise();
|
471
|
-
return;
|
472
|
-
}
|
473
|
-
|
474
|
-
// recv_trailing_metadata *without* send_initial_metadata: hook it so we can
|
475
|
-
// respond to it, and push it down.
|
476
|
-
if (batch->recv_trailing_metadata) {
|
580
|
+
} else if (batch->recv_trailing_metadata) {
|
581
|
+
// recv_trailing_metadata *without* send_initial_metadata: hook it so we
|
582
|
+
// can respond to it, and push it down.
|
477
583
|
if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
478
|
-
|
479
|
-
|
480
|
-
|
584
|
+
batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
|
585
|
+
} else {
|
586
|
+
GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
|
587
|
+
recv_trailing_state_ = RecvTrailingState::kForwarded;
|
588
|
+
HookRecvTrailingMetadata(batch);
|
481
589
|
}
|
482
|
-
|
483
|
-
|
484
|
-
HookRecvTrailingMetadata(batch);
|
590
|
+
} else if (cancelled_error_ != GRPC_ERROR_NONE) {
|
591
|
+
batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
|
485
592
|
}
|
486
593
|
|
487
|
-
|
594
|
+
if (batch.is_captured()) batch.ResumeWith(&flusher);
|
488
595
|
}
|
489
596
|
|
490
597
|
// Handle cancellation.
|
@@ -502,19 +609,23 @@ void ClientCallData::Cancel(grpc_error_handle error) {
|
|
502
609
|
recv_trailing_state_ = RecvTrailingState::kCancelled;
|
503
610
|
}
|
504
611
|
struct FailBatch : public grpc_closure {
|
505
|
-
|
506
|
-
|
612
|
+
CapturedBatch batch;
|
613
|
+
ClientCallData* call;
|
507
614
|
};
|
508
615
|
auto fail = [](void* p, grpc_error_handle error) {
|
509
616
|
auto* f = static_cast<FailBatch*>(p);
|
510
|
-
|
511
|
-
|
617
|
+
{
|
618
|
+
Flusher flusher(f->call);
|
619
|
+
f->batch.CancelWith(GRPC_ERROR_REF(error), &flusher);
|
620
|
+
GRPC_CALL_STACK_UNREF(f->call->call_stack(), "cancel pending batch");
|
621
|
+
}
|
512
622
|
delete f;
|
513
623
|
};
|
514
624
|
auto* b = new FailBatch();
|
515
625
|
GRPC_CLOSURE_INIT(b, fail, b, nullptr);
|
516
|
-
b->batch =
|
517
|
-
b->
|
626
|
+
b->batch = std::move(send_initial_metadata_batch_);
|
627
|
+
b->call = this;
|
628
|
+
GRPC_CALL_STACK_REF(call_stack(), "cancel pending batch");
|
518
629
|
GRPC_CALL_COMBINER_START(call_combiner(), b,
|
519
630
|
GRPC_ERROR_REF(cancelled_error_),
|
520
631
|
"cancel pending batch");
|
@@ -545,12 +656,12 @@ void ClientCallData::Cancel(grpc_error_handle error) {
|
|
545
656
|
|
546
657
|
// Begin running the promise - which will ultimately take some initial
|
547
658
|
// metadata and return some trailing metadata.
|
548
|
-
void ClientCallData::StartPromise() {
|
659
|
+
void ClientCallData::StartPromise(Flusher* flusher) {
|
549
660
|
GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
|
550
661
|
ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
|
551
662
|
|
552
663
|
// Construct the promise.
|
553
|
-
PollContext ctx(this);
|
664
|
+
PollContext ctx(this, flusher);
|
554
665
|
promise_ = filter->MakeCallPromise(
|
555
666
|
CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
|
556
667
|
->send_initial_metadata.send_initial_metadata),
|
@@ -580,28 +691,26 @@ void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
|
580
691
|
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
581
692
|
abort(); // unreachable
|
582
693
|
}
|
694
|
+
Flusher flusher(this);
|
583
695
|
if (error != GRPC_ERROR_NONE) {
|
584
696
|
recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
|
585
|
-
|
586
|
-
call_combiner(),
|
697
|
+
flusher.AddClosure(
|
587
698
|
absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
|
588
699
|
GRPC_ERROR_REF(error), "propagate cancellation");
|
589
700
|
} else if (send_initial_state_ == SendInitialState::kCancelled ||
|
590
701
|
recv_trailing_state_ == RecvTrailingState::kResponded) {
|
591
702
|
recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
|
592
|
-
|
593
|
-
call_combiner(),
|
703
|
+
flusher.AddClosure(
|
594
704
|
absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
|
595
705
|
GRPC_ERROR_REF(cancelled_error_), "propagate cancellation");
|
596
706
|
}
|
597
|
-
WakeInsideCombiner();
|
707
|
+
WakeInsideCombiner(&flusher);
|
598
708
|
}
|
599
709
|
|
600
710
|
// Interject our callback into the op batch for recv trailing metadata ready.
|
601
711
|
// Stash a pointer to the trailing metadata that will be filled in, so we can
|
602
712
|
// manipulate it later.
|
603
|
-
void ClientCallData::HookRecvTrailingMetadata(
|
604
|
-
grpc_transport_stream_op_batch* batch) {
|
713
|
+
void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) {
|
605
714
|
recv_trailing_metadata_ =
|
606
715
|
batch->payload->recv_trailing_metadata.recv_trailing_metadata;
|
607
716
|
original_recv_trailing_metadata_ready_ =
|
@@ -665,7 +774,7 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
|
|
665
774
|
GPR_ASSERT(poll_ctx_ != nullptr);
|
666
775
|
if (send_initial_state_ == SendInitialState::kQueued) {
|
667
776
|
// First poll: pass the send_initial_metadata op down the stack.
|
668
|
-
GPR_ASSERT(send_initial_metadata_batch_
|
777
|
+
GPR_ASSERT(send_initial_metadata_batch_.is_captured());
|
669
778
|
send_initial_state_ = SendInitialState::kForwarded;
|
670
779
|
if (recv_trailing_state_ == RecvTrailingState::kQueued) {
|
671
780
|
// (and the recv_trailing_metadata op if it's part of the queuing)
|
@@ -707,12 +816,14 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
|
|
707
816
|
}
|
708
817
|
|
709
818
|
void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
|
819
|
+
Flusher flusher(this);
|
710
820
|
// If we were cancelled prior to receiving this callback, we should simply
|
711
821
|
// forward the callback up with the same error.
|
712
822
|
if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
713
823
|
if (grpc_closure* call_closure =
|
714
824
|
absl::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
|
715
|
-
|
825
|
+
flusher.AddClosure(call_closure, GRPC_ERROR_REF(error),
|
826
|
+
"propagate failure");
|
716
827
|
}
|
717
828
|
return;
|
718
829
|
}
|
@@ -726,7 +837,7 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
|
|
726
837
|
recv_trailing_state_ = RecvTrailingState::kComplete;
|
727
838
|
// Repoll the promise.
|
728
839
|
ScopedContext context(this);
|
729
|
-
WakeInsideCombiner();
|
840
|
+
WakeInsideCombiner(&flusher);
|
730
841
|
}
|
731
842
|
|
732
843
|
// Given an error, fill in ServerMetadataHandle to represent that error.
|
@@ -743,37 +854,114 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
|
|
743
854
|
}
|
744
855
|
|
745
856
|
// Wakeup and poll the promise if appropriate.
|
746
|
-
void ClientCallData::WakeInsideCombiner() {
|
857
|
+
void ClientCallData::WakeInsideCombiner(Flusher* flusher) {
|
858
|
+
PollContext(this, flusher).Run();
|
859
|
+
}
|
747
860
|
|
748
861
|
void ClientCallData::OnWakeup() {
|
862
|
+
Flusher flusher(this);
|
749
863
|
ScopedContext context(this);
|
750
|
-
WakeInsideCombiner();
|
864
|
+
WakeInsideCombiner(&flusher);
|
751
865
|
}
|
752
866
|
|
753
867
|
///////////////////////////////////////////////////////////////////////////////
|
754
868
|
// ServerCallData
|
755
869
|
|
870
|
+
struct ServerCallData::SendInitialMetadata {
|
871
|
+
enum State {
|
872
|
+
kInitial,
|
873
|
+
kGotLatch,
|
874
|
+
kQueuedWaitingForLatch,
|
875
|
+
kQueuedAndGotLatch,
|
876
|
+
kQueuedAndSetLatch,
|
877
|
+
kForwarded,
|
878
|
+
kCancelled,
|
879
|
+
};
|
880
|
+
State state = kInitial;
|
881
|
+
CapturedBatch batch;
|
882
|
+
Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
|
883
|
+
};
|
884
|
+
|
885
|
+
class ServerCallData::PollContext {
|
886
|
+
public:
|
887
|
+
explicit PollContext(ServerCallData* self, Flusher* flusher)
|
888
|
+
: self_(self), flusher_(flusher) {
|
889
|
+
GPR_ASSERT(self_->poll_ctx_ == nullptr);
|
890
|
+
self_->poll_ctx_ = this;
|
891
|
+
scoped_activity_.Init(self_);
|
892
|
+
have_scoped_activity_ = true;
|
893
|
+
}
|
894
|
+
|
895
|
+
PollContext(const PollContext&) = delete;
|
896
|
+
PollContext& operator=(const PollContext&) = delete;
|
897
|
+
|
898
|
+
~PollContext() {
|
899
|
+
self_->poll_ctx_ = nullptr;
|
900
|
+
if (have_scoped_activity_) scoped_activity_.Destroy();
|
901
|
+
if (repoll_) {
|
902
|
+
struct NextPoll : public grpc_closure {
|
903
|
+
grpc_call_stack* call_stack;
|
904
|
+
ServerCallData* call_data;
|
905
|
+
};
|
906
|
+
auto run = [](void* p, grpc_error_handle) {
|
907
|
+
auto* next_poll = static_cast<NextPoll*>(p);
|
908
|
+
{
|
909
|
+
Flusher flusher(next_poll->call_data);
|
910
|
+
next_poll->call_data->WakeInsideCombiner(&flusher);
|
911
|
+
}
|
912
|
+
GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
|
913
|
+
delete next_poll;
|
914
|
+
};
|
915
|
+
auto* p = absl::make_unique<NextPoll>().release();
|
916
|
+
p->call_stack = self_->call_stack();
|
917
|
+
p->call_data = self_;
|
918
|
+
GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
|
919
|
+
GRPC_CLOSURE_INIT(p, run, p, nullptr);
|
920
|
+
flusher_->AddClosure(p, GRPC_ERROR_NONE, "re-poll");
|
921
|
+
}
|
922
|
+
}
|
923
|
+
|
924
|
+
void Repoll() { repoll_ = true; }
|
925
|
+
void ClearRepoll() { repoll_ = false; }
|
926
|
+
|
927
|
+
private:
|
928
|
+
ManualConstructor<ScopedActivity> scoped_activity_;
|
929
|
+
ServerCallData* const self_;
|
930
|
+
Flusher* const flusher_;
|
931
|
+
bool repoll_ = false;
|
932
|
+
bool have_scoped_activity_;
|
933
|
+
};
|
934
|
+
|
756
935
|
ServerCallData::ServerCallData(grpc_call_element* elem,
|
757
936
|
const grpc_call_element_args* args,
|
758
937
|
uint8_t flags)
|
759
938
|
: BaseCallData(elem, args, flags) {
|
939
|
+
if (server_initial_metadata_latch() != nullptr) {
|
940
|
+
send_initial_metadata_ = arena()->New<SendInitialMetadata>();
|
941
|
+
}
|
760
942
|
GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
|
761
943
|
RecvInitialMetadataReadyCallback, this,
|
762
944
|
grpc_schedule_on_exec_ctx);
|
763
945
|
}
|
764
946
|
|
765
947
|
ServerCallData::~ServerCallData() {
|
766
|
-
GPR_ASSERT(
|
948
|
+
GPR_ASSERT(poll_ctx_ == nullptr);
|
767
949
|
GRPC_ERROR_UNREF(cancelled_error_);
|
768
950
|
}
|
769
951
|
|
770
952
|
// Activity implementation.
|
771
|
-
void ServerCallData::ForceImmediateRepoll() {
|
953
|
+
void ServerCallData::ForceImmediateRepoll() {
|
954
|
+
GPR_ASSERT(poll_ctx_ != nullptr);
|
955
|
+
poll_ctx_->Repoll();
|
956
|
+
}
|
772
957
|
|
773
958
|
// Handle one grpc_transport_stream_op_batch
|
774
|
-
void ServerCallData::StartBatch(grpc_transport_stream_op_batch*
|
959
|
+
void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
775
960
|
// Fake out the activity based context.
|
776
961
|
ScopedContext context(this);
|
962
|
+
CapturedBatch batch(b);
|
963
|
+
Flusher flusher(this);
|
964
|
+
bool wake = false;
|
777
965
|
|
778
966
|
// If this is a cancel stream, cancel anything we have pending and
|
779
967
|
// propagate the cancellation.
|
@@ -782,8 +970,14 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
|
|
782
970
|
!batch->send_trailing_metadata && !batch->send_message &&
|
783
971
|
!batch->recv_initial_metadata && !batch->recv_message &&
|
784
972
|
!batch->recv_trailing_metadata);
|
785
|
-
Cancel(batch->payload->cancel_stream.cancel_error)
|
786
|
-
|
973
|
+
Cancel(GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error),
|
974
|
+
&flusher);
|
975
|
+
if (is_last()) {
|
976
|
+
GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
|
977
|
+
batch.CompleteWith(&flusher);
|
978
|
+
} else {
|
979
|
+
batch.ResumeWith(&flusher);
|
980
|
+
}
|
787
981
|
return;
|
788
982
|
}
|
789
983
|
|
@@ -805,61 +999,85 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
|
|
805
999
|
recv_initial_state_ = RecvInitialState::kForwarded;
|
806
1000
|
}
|
807
1001
|
|
1002
|
+
// send_initial_metadata
|
1003
|
+
if (send_initial_metadata_ != nullptr && batch->send_initial_metadata) {
|
1004
|
+
switch (send_initial_metadata_->state) {
|
1005
|
+
case SendInitialMetadata::kInitial:
|
1006
|
+
send_initial_metadata_->state =
|
1007
|
+
SendInitialMetadata::kQueuedWaitingForLatch;
|
1008
|
+
break;
|
1009
|
+
case SendInitialMetadata::kGotLatch:
|
1010
|
+
send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
|
1011
|
+
break;
|
1012
|
+
case SendInitialMetadata::kCancelled:
|
1013
|
+
batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
|
1014
|
+
break;
|
1015
|
+
case SendInitialMetadata::kQueuedAndGotLatch:
|
1016
|
+
case SendInitialMetadata::kQueuedWaitingForLatch:
|
1017
|
+
case SendInitialMetadata::kQueuedAndSetLatch:
|
1018
|
+
case SendInitialMetadata::kForwarded:
|
1019
|
+
abort(); // not reachable
|
1020
|
+
}
|
1021
|
+
send_initial_metadata_->batch = batch;
|
1022
|
+
wake = true;
|
1023
|
+
}
|
1024
|
+
|
808
1025
|
// send_trailing_metadata
|
809
|
-
if (batch->send_trailing_metadata) {
|
1026
|
+
if (batch.is_captured() && batch->send_trailing_metadata) {
|
810
1027
|
switch (send_trailing_state_) {
|
811
1028
|
case SendTrailingState::kInitial:
|
812
1029
|
send_trailing_metadata_batch_ = batch;
|
813
1030
|
send_trailing_state_ = SendTrailingState::kQueued;
|
814
|
-
|
815
|
-
GPR_ASSERT(send_trailing_state_ == SendTrailingState::kQueued);
|
816
|
-
Cancel(error);
|
817
|
-
});
|
1031
|
+
wake = true;
|
818
1032
|
break;
|
819
1033
|
case SendTrailingState::kQueued:
|
820
1034
|
case SendTrailingState::kForwarded:
|
821
1035
|
abort(); // unreachable
|
822
1036
|
break;
|
823
1037
|
case SendTrailingState::kCancelled:
|
824
|
-
|
825
|
-
batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
|
1038
|
+
batch.CancelWith(GRPC_ERROR_REF(cancelled_error_), &flusher);
|
826
1039
|
break;
|
827
1040
|
}
|
828
|
-
return;
|
829
1041
|
}
|
830
1042
|
|
831
|
-
|
1043
|
+
if (wake) WakeInsideCombiner(&flusher);
|
1044
|
+
if (batch.is_captured()) batch.ResumeWith(&flusher);
|
832
1045
|
}
|
833
1046
|
|
834
1047
|
// Handle cancellation.
|
835
|
-
void ServerCallData::Cancel(grpc_error_handle error) {
|
1048
|
+
void ServerCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
|
836
1049
|
// Track the latest reason for cancellation.
|
837
1050
|
GRPC_ERROR_UNREF(cancelled_error_);
|
838
|
-
cancelled_error_ =
|
1051
|
+
cancelled_error_ = error;
|
839
1052
|
// Stop running the promise.
|
840
1053
|
promise_ = ArenaPromise<ServerMetadataHandle>();
|
841
1054
|
if (send_trailing_state_ == SendTrailingState::kQueued) {
|
842
1055
|
send_trailing_state_ = SendTrailingState::kCancelled;
|
843
|
-
|
844
|
-
grpc_transport_stream_op_batch* batch;
|
845
|
-
CallCombiner* call_combiner;
|
846
|
-
};
|
847
|
-
auto fail = [](void* p, grpc_error_handle error) {
|
848
|
-
auto* f = static_cast<FailBatch*>(p);
|
849
|
-
grpc_transport_stream_op_batch_finish_with_failure(
|
850
|
-
f->batch, GRPC_ERROR_REF(error), f->call_combiner);
|
851
|
-
delete f;
|
852
|
-
};
|
853
|
-
auto* b = new FailBatch();
|
854
|
-
GRPC_CLOSURE_INIT(b, fail, b, nullptr);
|
855
|
-
b->batch = absl::exchange(send_trailing_metadata_batch_, nullptr);
|
856
|
-
b->call_combiner = call_combiner();
|
857
|
-
GRPC_CALL_COMBINER_START(call_combiner(), b,
|
858
|
-
GRPC_ERROR_REF(cancelled_error_),
|
859
|
-
"cancel pending batch");
|
1056
|
+
send_trailing_metadata_batch_.CancelWith(GRPC_ERROR_REF(error), flusher);
|
860
1057
|
} else {
|
861
1058
|
send_trailing_state_ = SendTrailingState::kCancelled;
|
862
1059
|
}
|
1060
|
+
if (send_initial_metadata_ != nullptr) {
|
1061
|
+
switch (send_initial_metadata_->state) {
|
1062
|
+
case SendInitialMetadata::kInitial:
|
1063
|
+
case SendInitialMetadata::kGotLatch:
|
1064
|
+
case SendInitialMetadata::kForwarded:
|
1065
|
+
case SendInitialMetadata::kCancelled:
|
1066
|
+
break;
|
1067
|
+
case SendInitialMetadata::kQueuedWaitingForLatch:
|
1068
|
+
case SendInitialMetadata::kQueuedAndGotLatch:
|
1069
|
+
case SendInitialMetadata::kQueuedAndSetLatch:
|
1070
|
+
send_initial_metadata_->batch.CancelWith(GRPC_ERROR_REF(error),
|
1071
|
+
flusher);
|
1072
|
+
break;
|
1073
|
+
}
|
1074
|
+
send_initial_metadata_->state = SendInitialMetadata::kCancelled;
|
1075
|
+
}
|
1076
|
+
if (auto* closure =
|
1077
|
+
absl::exchange(original_recv_initial_metadata_ready_, nullptr)) {
|
1078
|
+
flusher->AddClosure(closure, GRPC_ERROR_REF(error),
|
1079
|
+
"original_recv_initial_metadata");
|
1080
|
+
}
|
863
1081
|
}
|
864
1082
|
|
865
1083
|
// Construct a promise that will "call" the next filter.
|
@@ -872,6 +1090,31 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
|
|
872
1090
|
GPR_ASSERT(UnwrapMetadata(std::move(call_args.client_initial_metadata)) ==
|
873
1091
|
recv_initial_metadata_);
|
874
1092
|
forward_recv_initial_metadata_callback_ = true;
|
1093
|
+
if (send_initial_metadata_ != nullptr) {
|
1094
|
+
GPR_ASSERT(send_initial_metadata_->server_initial_metadata_publisher ==
|
1095
|
+
nullptr);
|
1096
|
+
GPR_ASSERT(call_args.server_initial_metadata != nullptr);
|
1097
|
+
send_initial_metadata_->server_initial_metadata_publisher =
|
1098
|
+
call_args.server_initial_metadata;
|
1099
|
+
switch (send_initial_metadata_->state) {
|
1100
|
+
case SendInitialMetadata::kInitial:
|
1101
|
+
send_initial_metadata_->state = SendInitialMetadata::kGotLatch;
|
1102
|
+
break;
|
1103
|
+
case SendInitialMetadata::kGotLatch:
|
1104
|
+
case SendInitialMetadata::kQueuedAndGotLatch:
|
1105
|
+
case SendInitialMetadata::kQueuedAndSetLatch:
|
1106
|
+
case SendInitialMetadata::kForwarded:
|
1107
|
+
abort(); // not reachable
|
1108
|
+
break;
|
1109
|
+
case SendInitialMetadata::kQueuedWaitingForLatch:
|
1110
|
+
send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
|
1111
|
+
break;
|
1112
|
+
case SendInitialMetadata::kCancelled:
|
1113
|
+
break;
|
1114
|
+
}
|
1115
|
+
} else {
|
1116
|
+
GPR_ASSERT(call_args.server_initial_metadata == nullptr);
|
1117
|
+
}
|
875
1118
|
return ArenaPromise<ServerMetadataHandle>(
|
876
1119
|
[this]() { return PollTrailingMetadata(); });
|
877
1120
|
}
|
@@ -903,12 +1146,14 @@ void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
|
|
903
1146
|
}
|
904
1147
|
|
905
1148
|
void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
1149
|
+
Flusher flusher(this);
|
906
1150
|
GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded);
|
907
1151
|
// If there was an error we just propagate that through
|
908
1152
|
if (error != GRPC_ERROR_NONE) {
|
909
1153
|
recv_initial_state_ = RecvInitialState::kResponded;
|
910
|
-
|
911
|
-
|
1154
|
+
flusher.AddClosure(
|
1155
|
+
absl::exchange(original_recv_initial_metadata_ready_, nullptr),
|
1156
|
+
GRPC_ERROR_REF(error), "propagate error");
|
912
1157
|
return;
|
913
1158
|
}
|
914
1159
|
// Record that we've got the callback.
|
@@ -925,30 +1170,46 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
|
925
1170
|
return MakeNextPromise(std::move(call_args));
|
926
1171
|
});
|
927
1172
|
// Poll once.
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
}
|
934
|
-
Closure::Run(DEBUG_LOCATION, original_recv_initial_metadata_ready_,
|
935
|
-
GRPC_ERROR_REF(error));
|
936
|
-
if (own_error) GRPC_ERROR_UNREF(error);
|
1173
|
+
WakeInsideCombiner(&flusher);
|
1174
|
+
if (auto* closure =
|
1175
|
+
absl::exchange(original_recv_initial_metadata_ready_, nullptr)) {
|
1176
|
+
flusher.AddClosure(closure, GRPC_ERROR_NONE,
|
1177
|
+
"original_recv_initial_metadata");
|
1178
|
+
}
|
937
1179
|
}
|
938
1180
|
|
939
1181
|
// Wakeup and poll the promise if appropriate.
|
940
|
-
void ServerCallData::WakeInsideCombiner(
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
1182
|
+
void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
|
1183
|
+
PollContext poll_ctx(this, flusher);
|
1184
|
+
if (send_initial_metadata_ != nullptr &&
|
1185
|
+
send_initial_metadata_->state ==
|
1186
|
+
SendInitialMetadata::kQueuedAndGotLatch) {
|
1187
|
+
send_initial_metadata_->state = SendInitialMetadata::kQueuedAndSetLatch;
|
1188
|
+
send_initial_metadata_->server_initial_metadata_publisher->Set(
|
1189
|
+
send_initial_metadata_->batch->payload->send_initial_metadata
|
1190
|
+
.send_initial_metadata);
|
1191
|
+
}
|
1192
|
+
poll_ctx.ClearRepoll();
|
1193
|
+
if (promise_.has_value()) {
|
946
1194
|
Poll<ServerMetadataHandle> poll;
|
947
|
-
|
948
|
-
|
949
|
-
|
1195
|
+
poll = promise_();
|
1196
|
+
if (send_initial_metadata_ != nullptr &&
|
1197
|
+
send_initial_metadata_->state ==
|
1198
|
+
SendInitialMetadata::kQueuedAndSetLatch) {
|
1199
|
+
Poll<ServerMetadata**> p = server_initial_metadata_latch()->Wait()();
|
1200
|
+
if (ServerMetadata*** ppp = absl::get_if<ServerMetadata**>(&p)) {
|
1201
|
+
ServerMetadata* md = **ppp;
|
1202
|
+
if (send_initial_metadata_->batch->payload->send_initial_metadata
|
1203
|
+
.send_initial_metadata != md) {
|
1204
|
+
*send_initial_metadata_->batch->payload->send_initial_metadata
|
1205
|
+
.send_initial_metadata = std::move(*md);
|
1206
|
+
}
|
1207
|
+
send_initial_metadata_->state = SendInitialMetadata::kForwarded;
|
1208
|
+
send_initial_metadata_->batch.ResumeWith(flusher);
|
1209
|
+
}
|
950
1210
|
}
|
951
1211
|
if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
|
1212
|
+
promise_ = ArenaPromise<ServerMetadataHandle>();
|
952
1213
|
auto* md = UnwrapMetadata(std::move(*r));
|
953
1214
|
bool destroy_md = true;
|
954
1215
|
switch (send_trailing_state_) {
|
@@ -960,7 +1221,7 @@ void ServerCallData::WakeInsideCombiner(
|
|
960
1221
|
} else {
|
961
1222
|
destroy_md = false;
|
962
1223
|
}
|
963
|
-
|
1224
|
+
send_trailing_metadata_batch_.ResumeWith(flusher);
|
964
1225
|
send_trailing_state_ = SendTrailingState::kForwarded;
|
965
1226
|
} break;
|
966
1227
|
case SendTrailingState::kForwarded:
|
@@ -977,8 +1238,7 @@ void ServerCallData::WakeInsideCombiner(
|
|
977
1238
|
error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
978
1239
|
message->as_string_view());
|
979
1240
|
}
|
980
|
-
|
981
|
-
GRPC_ERROR_UNREF(error);
|
1241
|
+
Cancel(error, flusher);
|
982
1242
|
} break;
|
983
1243
|
case SendTrailingState::kCancelled:
|
984
1244
|
// Nothing to do.
|
@@ -989,11 +1249,6 @@ void ServerCallData::WakeInsideCombiner(
|
|
989
1249
|
}
|
990
1250
|
}
|
991
1251
|
}
|
992
|
-
is_polling_ = false;
|
993
|
-
if (forward_send_trailing_metadata) {
|
994
|
-
grpc_call_next_op(elem(),
|
995
|
-
absl::exchange(send_trailing_metadata_batch_, nullptr));
|
996
|
-
}
|
997
1252
|
}
|
998
1253
|
|
999
1254
|
void ServerCallData::OnWakeup() { abort(); } // not implemented
|