grpc 1.64.3 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +57 -58
- data/include/grpc/event_engine/event_engine.h +13 -6
- data/include/grpc/impl/channel_arg_names.h +7 -3
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/passive_listener.h +62 -0
- data/include/grpc/support/log.h +7 -17
- data/include/grpc/support/port_platform.h +3 -0
- data/src/core/channelz/channel_trace.cc +1 -1
- data/src/core/channelz/channel_trace.h +1 -1
- data/src/core/channelz/channelz.cc +3 -3
- data/src/core/channelz/channelz.h +7 -7
- data/src/core/channelz/channelz_registry.cc +4 -3
- data/src/core/client_channel/backup_poller.cc +4 -5
- data/src/core/client_channel/client_channel.cc +1324 -0
- data/src/core/client_channel/client_channel.h +243 -0
- data/src/core/client_channel/client_channel_filter.cc +266 -709
- data/src/core/client_channel/client_channel_filter.h +11 -64
- data/src/core/client_channel/client_channel_internal.h +16 -5
- data/src/core/client_channel/client_channel_plugin.cc +1 -14
- data/src/core/client_channel/client_channel_service_config.h +3 -3
- data/src/core/client_channel/config_selector.cc +1 -1
- data/src/core/client_channel/config_selector.h +1 -1
- data/src/core/client_channel/dynamic_filters.cc +3 -3
- data/src/core/client_channel/dynamic_filters.h +1 -3
- data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
- data/src/core/client_channel/load_balanced_call_destination.h +49 -0
- data/src/core/client_channel/retry_filter.cc +2 -9
- data/src/core/client_channel/retry_filter.h +2 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
- data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
- data/src/core/client_channel/retry_service_config.cc +4 -5
- data/src/core/client_channel/retry_service_config.h +3 -3
- data/src/core/client_channel/subchannel.cc +220 -112
- data/src/core/client_channel/subchannel.h +31 -18
- data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
- data/src/core/client_channel/subchannel_pool_interface.h +2 -4
- data/src/core/client_channel/subchannel_stream_client.cc +36 -49
- data/src/core/client_channel/subchannel_stream_client.h +2 -4
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
- data/src/core/ext/filters/census/grpc_context.cc +2 -4
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
- 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 +1 -0
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
- data/src/core/ext/filters/http/client_authority_filter.h +1 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
- data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
- data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
- data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
- data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
- data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -43
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
- data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
- data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
- data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
- data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
- data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
- data/src/core/handshaker/handshaker.cc +6 -14
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
- data/src/core/handshaker/security/secure_endpoint.cc +38 -32
- data/src/core/handshaker/security/secure_endpoint.h +0 -2
- data/src/core/handshaker/security/security_handshaker.cc +25 -37
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
- data/src/core/lib/address_utils/parse_address.cc +27 -39
- data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
- data/src/core/lib/avl/avl.h +1 -1
- data/src/core/lib/channel/channel_args.cc +13 -17
- data/src/core/lib/channel/channel_args.h +19 -8
- data/src/core/lib/channel/channel_stack.cc +5 -63
- data/src/core/lib/channel/channel_stack.h +13 -37
- data/src/core/lib/channel/channel_stack_builder.h +0 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
- data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
- data/src/core/lib/channel/connected_channel.cc +37 -676
- data/src/core/lib/channel/promise_based_filter.cc +41 -47
- data/src/core/lib/channel/promise_based_filter.h +124 -477
- data/src/core/lib/channel/status_util.cc +1 -1
- data/src/core/lib/compression/compression.cc +1 -1
- data/src/core/lib/compression/message_compress.cc +6 -6
- data/src/core/lib/config/config_vars.cc +3 -8
- data/src/core/lib/config/config_vars.h +1 -5
- data/src/core/lib/debug/event_log.h +1 -1
- data/src/core/lib/debug/trace.cc +43 -59
- data/src/core/lib/debug/trace.h +2 -97
- data/src/core/lib/debug/trace_flags.cc +255 -0
- data/src/core/lib/debug/trace_flags.h +133 -0
- data/src/core/lib/debug/trace_impl.h +115 -0
- data/src/core/lib/event_engine/ares_resolver.cc +5 -7
- data/src/core/lib/event_engine/ares_resolver.h +1 -3
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
- data/src/core/lib/event_engine/event_engine.cc +29 -4
- data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
- data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
- data/src/core/lib/event_engine/forkable.cc +4 -5
- data/src/core/lib/event_engine/forkable.h +0 -11
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
- data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
- data/src/core/lib/event_engine/shim.cc +1 -1
- data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
- data/src/core/lib/event_engine/thread_local.h +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
- data/src/core/lib/event_engine/trace.h +6 -17
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
- data/src/core/lib/event_engine/windows/win_socket.h +4 -5
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
- data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
- data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
- data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
- data/src/core/lib/experiments/experiments.cc +35 -151
- data/src/core/lib/experiments/experiments.h +12 -45
- data/src/core/lib/gprpp/bitset.h +1 -1
- data/src/core/lib/gprpp/crash.cc +2 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
- data/src/core/lib/gprpp/dump_args.cc +54 -0
- data/src/core/lib/gprpp/dump_args.h +69 -0
- data/src/core/lib/gprpp/glob.cc +70 -0
- data/src/core/lib/gprpp/glob.h +29 -0
- data/src/core/lib/gprpp/per_cpu.cc +1 -1
- data/src/core/lib/gprpp/posix/stat.cc +3 -4
- data/src/core/lib/gprpp/posix/thd.cc +8 -9
- data/src/core/lib/gprpp/ref_counted.h +30 -22
- data/src/core/lib/gprpp/single_set_ptr.h +5 -3
- data/src/core/lib/gprpp/status_helper.cc +11 -30
- data/src/core/lib/gprpp/status_helper.h +3 -31
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +3 -2
- data/src/core/lib/gprpp/unique_type_name.h +1 -1
- data/src/core/lib/gprpp/validation_errors.cc +10 -1
- data/src/core/lib/gprpp/validation_errors.h +11 -0
- data/src/core/lib/gprpp/windows/stat.cc +3 -4
- data/src/core/lib/gprpp/windows/thd.cc +3 -2
- data/src/core/lib/gprpp/work_serializer.cc +48 -57
- data/src/core/lib/iomgr/buffer_list.cc +4 -2
- data/src/core/lib/iomgr/call_combiner.cc +18 -27
- data/src/core/lib/iomgr/call_combiner.h +1 -3
- data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
- data/src/core/lib/iomgr/closure.h +2 -4
- data/src/core/lib/iomgr/combiner.cc +6 -8
- data/src/core/lib/iomgr/combiner.h +0 -2
- data/src/core/lib/iomgr/endpoint.cc +0 -6
- data/src/core/lib/iomgr/endpoint.h +0 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
- data/src/core/lib/iomgr/error.cc +13 -21
- data/src/core/lib/iomgr/error.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +3 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
- data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
- data/src/core/lib/iomgr/ev_posix.cc +8 -9
- data/src/core/lib/iomgr/ev_posix.h +10 -7
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
- data/src/core/lib/iomgr/exec_ctx.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/executor.cc +6 -15
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/fork_posix.cc +8 -10
- data/src/core/lib/iomgr/fork_windows.cc +3 -1
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
- data/src/core/lib/iomgr/iocp_windows.cc +4 -3
- data/src/core/lib/iomgr/iomgr.cc +13 -17
- data/src/core/lib/iomgr/lockfree_event.cc +3 -5
- data/src/core/lib/iomgr/pollset.h +0 -2
- data/src/core/lib/iomgr/pollset_windows.cc +0 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
- data/src/core/lib/iomgr/socket_windows.cc +4 -6
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
- data/src/core/lib/iomgr/tcp_posix.cc +57 -84
- data/src/core/lib/iomgr/tcp_posix.h +0 -2
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
- data/src/core/lib/iomgr/tcp_windows.cc +25 -41
- data/src/core/lib/iomgr/timer_generic.cc +17 -20
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/iomgr/timer_manager.cc +17 -30
- data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
- data/src/core/lib/iomgr/vsock.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
- data/src/core/lib/promise/activity.h +27 -4
- data/src/core/lib/promise/cancel_callback.h +24 -0
- data/src/core/lib/promise/context.h +11 -0
- data/src/core/lib/promise/detail/basic_seq.h +1 -2
- data/src/core/lib/promise/detail/join_state.h +354 -398
- data/src/core/lib/promise/detail/promise_like.h +6 -5
- data/src/core/lib/promise/detail/seq_state.h +1178 -1178
- data/src/core/lib/promise/for_each.h +6 -6
- data/src/core/lib/promise/interceptor_list.h +6 -7
- data/src/core/lib/promise/latch.h +9 -9
- data/src/core/lib/promise/map.h +17 -0
- data/src/core/lib/promise/observable.h +182 -0
- data/src/core/lib/promise/party.cc +7 -8
- data/src/core/lib/promise/party.h +10 -8
- data/src/core/lib/promise/pipe.h +16 -35
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/status_flag.h +2 -0
- data/src/core/lib/resource_quota/arena.cc +56 -79
- data/src/core/lib/resource_quota/arena.h +118 -209
- data/src/core/lib/resource_quota/memory_quota.cc +12 -13
- data/src/core/lib/resource_quota/memory_quota.h +2 -3
- data/src/core/lib/resource_quota/periodic_update.cc +1 -1
- data/src/core/lib/resource_quota/resource_quota.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
- data/src/core/lib/security/authorization/matchers.cc +3 -3
- data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
- data/src/core/lib/security/context/security_context.cc +12 -13
- data/src/core/lib/security/context/security_context.h +31 -8
- data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
- data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
- data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
- data/src/core/lib/security/credentials/credentials.cc +6 -6
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
- data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
- data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
- data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
- data/src/core/lib/security/security_connector/security_connector.cc +1 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
- data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
- data/src/core/lib/security/transport/auth_filters.h +1 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
- data/src/core/lib/security/util/json_util.h +1 -1
- data/src/core/lib/slice/slice.h +1 -1
- data/src/core/lib/slice/slice_refcount.h +2 -4
- data/src/core/lib/slice/slice_string_helpers.cc +1 -1
- data/src/core/lib/surface/api_trace.h +1 -3
- data/src/core/lib/surface/call.cc +64 -3738
- data/src/core/lib/surface/call.h +41 -143
- data/src/core/lib/surface/call_log_batch.cc +1 -1
- data/src/core/lib/surface/call_utils.cc +276 -0
- data/src/core/lib/surface/call_utils.h +449 -0
- data/src/core/lib/surface/channel.cc +8 -3
- data/src/core/lib/surface/channel.h +10 -7
- data/src/core/lib/surface/channel_create.cc +14 -6
- data/src/core/lib/surface/channel_create.h +3 -2
- data/src/core/lib/surface/channel_init.cc +21 -77
- data/src/core/lib/surface/channel_init.h +19 -97
- data/src/core/lib/surface/client_call.cc +419 -0
- data/src/core/lib/surface/client_call.h +180 -0
- data/src/core/lib/surface/completion_queue.cc +28 -33
- data/src/core/lib/surface/completion_queue.h +0 -8
- data/src/core/lib/surface/filter_stack_call.cc +1157 -0
- data/src/core/lib/surface/filter_stack_call.h +369 -0
- data/src/core/lib/surface/init.cc +7 -6
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/legacy_channel.cc +40 -27
- data/src/core/lib/surface/legacy_channel.h +9 -18
- data/src/core/lib/surface/server_call.cc +222 -0
- data/src/core/lib/surface/server_call.h +167 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +3 -5
- data/src/core/lib/transport/bdp_estimator.h +2 -4
- data/src/core/lib/transport/call_arena_allocator.h +9 -7
- data/src/core/lib/transport/call_destination.h +76 -0
- data/src/core/lib/transport/call_filters.cc +28 -10
- data/src/core/lib/transport/call_filters.h +128 -22
- data/src/core/lib/transport/call_spine.cc +5 -6
- data/src/core/lib/transport/call_spine.h +159 -334
- data/src/core/lib/transport/connectivity_state.cc +8 -10
- data/src/core/lib/transport/connectivity_state.h +0 -2
- data/src/core/lib/transport/interception_chain.cc +155 -0
- data/src/core/lib/transport/interception_chain.h +236 -0
- data/src/core/lib/transport/metadata_batch.h +10 -1
- data/src/core/lib/transport/metadata_info.h +1 -1
- data/src/core/lib/transport/transport.cc +3 -6
- data/src/core/lib/transport/transport.h +43 -40
- data/src/core/load_balancing/child_policy_handler.cc +8 -8
- data/src/core/load_balancing/endpoint_list.cc +5 -5
- data/src/core/load_balancing/endpoint_list.h +1 -1
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
- data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
- data/src/core/load_balancing/health_check_client.cc +10 -13
- data/src/core/load_balancing/lb_policy.cc +5 -8
- data/src/core/load_balancing/lb_policy.h +19 -3
- data/src/core/load_balancing/lb_policy_factory.h +1 -1
- data/src/core/load_balancing/lb_policy_registry.cc +2 -3
- data/src/core/load_balancing/lb_policy_registry.h +1 -1
- data/src/core/load_balancing/oob_backend_metric.cc +2 -4
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
- data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
- data/src/core/load_balancing/priority/priority.cc +26 -28
- data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
- data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
- data/src/core/load_balancing/rls/rls.cc +82 -82
- data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
- data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
- data/src/core/load_balancing/xds/cds.cc +14 -16
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
- data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
- data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
- data/src/core/load_balancing/xds/xds_override_host.h +3 -3
- data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
- data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
- data/src/core/resolver/binder/binder_resolver.cc +3 -2
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
- data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
- data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
- data/src/core/resolver/endpoint_addresses.cc +1 -1
- data/src/core/resolver/fake/fake_resolver.cc +1 -1
- data/src/core/resolver/fake/fake_resolver.h +1 -1
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
- data/src/core/resolver/polling_resolver.cc +30 -35
- data/src/core/resolver/resolver.cc +2 -6
- data/src/core/resolver/resolver.h +0 -2
- data/src/core/resolver/resolver_registry.cc +6 -8
- data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
- data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
- data/src/core/resolver/xds/xds_resolver.cc +13 -15
- data/src/core/server/server.cc +269 -389
- data/src/core/server/server.h +37 -19
- data/src/core/server/server_call_tracer_filter.cc +7 -14
- data/src/core/server/server_config_selector.h +1 -1
- data/src/core/server/server_config_selector_filter.cc +3 -3
- data/src/core/server/server_interface.h +2 -0
- data/src/core/server/xds_channel_stack_modifier.cc +1 -1
- data/src/core/server/xds_channel_stack_modifier.h +1 -1
- data/src/core/server/xds_server_config_fetcher.cc +1 -4
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_call_data.h +13 -11
- data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
- data/src/core/service_config/service_config_impl.cc +5 -5
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/service_config/service_config_parser.cc +3 -6
- data/src/core/service_config/service_config_parser.h +1 -1
- data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
- data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
- data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
- data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
- data/src/core/telemetry/metrics.cc +178 -0
- data/src/core/telemetry/metrics.h +562 -0
- data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
- data/src/core/{lib/debug → telemetry}/stats.h +5 -5
- data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
- data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
- data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
- data/src/core/tsi/fake_transport_security.cc +14 -17
- data/src/core/tsi/local_transport_security.cc +6 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
- data/src/core/tsi/ssl_transport_security.cc +76 -81
- data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
- data/src/core/tsi/ssl_transport_security_utils.h +11 -0
- data/src/core/tsi/transport_security.cc +0 -4
- data/src/core/tsi/transport_security.h +0 -2
- data/src/core/tsi/transport_security_interface.h +0 -4
- data/src/core/{lib/gpr → util}/alloc.h +3 -3
- data/src/core/{lib/gpr → util}/android/log.cc +0 -19
- data/src/core/{lib/gpr → util}/atm.cc +1 -1
- data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
- data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
- data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
- data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
- data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
- data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
- data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
- data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
- data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
- data/src/core/{lib/http → util/http_client}/parser.h +5 -6
- data/src/core/{lib → util}/json/json.h +5 -4
- data/src/core/{lib → util}/json/json_args.h +5 -5
- data/src/core/{lib → util}/json/json_channel_args.h +6 -6
- data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
- data/src/core/{lib → util}/json/json_object_loader.h +7 -7
- data/src/core/{lib → util}/json/json_reader.cc +3 -2
- data/src/core/{lib → util}/json/json_reader.h +6 -6
- data/src/core/{lib → util}/json/json_util.cc +4 -4
- data/src/core/{lib → util}/json/json_util.h +6 -6
- data/src/core/{lib → util}/json/json_writer.cc +3 -3
- data/src/core/{lib → util}/json/json_writer.h +6 -6
- data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
- data/src/core/util/log.cc +165 -0
- data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
- data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
- data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
- data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
- data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
- data/src/core/{lib/gpr → util}/spinlock.h +3 -3
- data/src/core/{lib/gpr → util}/string.cc +2 -2
- data/src/core/{lib/gpr → util}/string.h +3 -3
- data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
- data/src/core/{lib/gpr → util}/time_precise.h +3 -3
- data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
- data/src/core/{lib/gpr → util}/useful.h +3 -3
- data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
- data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
- data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
- data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
- data/src/core/xds/grpc/certificate_provider_store.h +4 -4
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
- data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
- data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
- data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
- data/src/core/xds/grpc/xds_client_grpc.h +2 -2
- data/src/core/xds/grpc/xds_cluster.cc +4 -5
- data/src/core/xds/grpc/xds_cluster.h +1 -1
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
- data/src/core/xds/grpc/xds_common_types.cc +1 -1
- data/src/core/xds/grpc/xds_common_types.h +1 -1
- data/src/core/xds/grpc/xds_endpoint.cc +4 -5
- data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
- data/src/core/xds/grpc/xds_http_filters.h +2 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
- data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
- data/src/core/xds/grpc/xds_listener.cc +4 -6
- data/src/core/xds/grpc/xds_route_config.cc +7 -8
- data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
- data/src/core/xds/xds_client/xds_api.cc +5 -9
- data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
- data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
- data/src/core/xds/xds_client/xds_client.cc +39 -45
- data/src/core/xds/xds_client/xds_client.h +0 -3
- data/src/core/xds/xds_client/xds_client_stats.cc +6 -6
- data/src/core/xds/xds_client/xds_client_stats.h +2 -2
- data/src/ruby/bin/math_pb.rb +1 -22
- data/src/ruby/ext/grpc/rb_call.c +8 -1
- data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
- data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/ext/grpc/rb_server.c +39 -22
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
- data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
- data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
- data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
- data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
- metadata +103 -93
- data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
- data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
- data/src/core/handshaker/security/tsi_error.cc +0 -31
- data/src/core/handshaker/security/tsi_error.h +0 -30
- data/src/core/lib/channel/channel_stack_trace.cc +0 -19
- data/src/core/lib/channel/channel_stack_trace.h +0 -24
- data/src/core/lib/channel/context.h +0 -105
- data/src/core/lib/channel/metrics.cc +0 -334
- data/src/core/lib/channel/metrics.h +0 -365
- data/src/core/lib/event_engine/trace.cc +0 -25
- data/src/core/lib/gpr/log.cc +0 -166
- data/src/core/lib/iomgr/ev_windows.cc +0 -30
- data/src/core/lib/promise/trace.cc +0 -20
- data/src/core/lib/promise/trace.h +0 -24
- data/src/core/lib/resource_quota/trace.cc +0 -19
- data/src/core/lib/resource_quota/trace.h +0 -24
- data/src/core/lib/slice/slice_refcount.cc +0 -20
- data/src/core/lib/surface/api_trace.cc +0 -25
- data/src/core/lib/surface/call_trace.h +0 -24
- data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
- data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
- data/src/core/lib/transport/batch_builder.cc +0 -172
- data/src/core/lib/transport/batch_builder.h +0 -474
- data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
- data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
- /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
- /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
- /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
- /data/src/core/{lib/gpr → util}/sync.cc +0 -0
- /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
- /data/src/core/{lib/gpr → util}/time.cc +0 -0
- /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
- /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -44,7 +44,6 @@
|
|
44
44
|
#include "src/core/lib/config/core_configuration.h"
|
45
45
|
#include "src/core/lib/debug/trace.h"
|
46
46
|
#include "src/core/lib/experiments/experiments.h"
|
47
|
-
#include "src/core/lib/gpr/alloc.h"
|
48
47
|
#include "src/core/lib/gprpp/debug_location.h"
|
49
48
|
#include "src/core/lib/gprpp/orphanable.h"
|
50
49
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
@@ -73,12 +72,11 @@
|
|
73
72
|
#include "src/core/lib/slice/slice.h"
|
74
73
|
#include "src/core/lib/slice/slice_buffer.h"
|
75
74
|
#include "src/core/lib/surface/call.h"
|
76
|
-
#include "src/core/lib/surface/call_trace.h"
|
77
75
|
#include "src/core/lib/surface/channel_stack_type.h"
|
78
|
-
#include "src/core/lib/transport/batch_builder.h"
|
79
76
|
#include "src/core/lib/transport/error_utils.h"
|
80
77
|
#include "src/core/lib/transport/metadata_batch.h"
|
81
78
|
#include "src/core/lib/transport/transport.h"
|
79
|
+
#include "src/core/util/alloc.h"
|
82
80
|
|
83
81
|
typedef struct connected_channel_channel_data {
|
84
82
|
grpc_core::Transport* transport;
|
@@ -245,683 +243,48 @@ static void connected_channel_get_channel_info(
|
|
245
243
|
|
246
244
|
namespace grpc_core {
|
247
245
|
namespace {
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
#else
|
274
|
-
(void)reason;
|
275
|
-
grpc_stream_ref(&stream_refcount_);
|
276
|
-
#endif
|
277
|
-
}
|
278
|
-
|
279
|
-
void Unref(const char* reason = "smartptr") {
|
280
|
-
#ifndef NDEBUG
|
281
|
-
grpc_stream_unref(&stream_refcount_, reason);
|
282
|
-
#else
|
283
|
-
(void)reason;
|
284
|
-
grpc_stream_unref(&stream_refcount_);
|
285
|
-
#endif
|
286
|
-
}
|
287
|
-
|
288
|
-
RefCountedPtr<ConnectedChannelStream> InternalRef() {
|
289
|
-
IncrementRefCount("smartptr");
|
290
|
-
return RefCountedPtr<ConnectedChannelStream>(this);
|
291
|
-
}
|
292
|
-
|
293
|
-
void Orphan() final {
|
294
|
-
bool finished = finished_.IsSet();
|
295
|
-
if (grpc_call_trace.enabled()) {
|
296
|
-
gpr_log(GPR_DEBUG, "%s[connected] Orphan stream, finished: %d",
|
297
|
-
party_->DebugTag().c_str(), finished);
|
298
|
-
}
|
299
|
-
// If we hadn't already observed the stream to be finished, we need to
|
300
|
-
// cancel it at the transport.
|
301
|
-
if (!finished) {
|
302
|
-
party_->Spawn(
|
303
|
-
"finish",
|
304
|
-
[self = InternalRef()]() {
|
305
|
-
if (!self->finished_.IsSet()) {
|
306
|
-
self->finished_.Set();
|
307
|
-
}
|
308
|
-
return Empty{};
|
309
|
-
},
|
310
|
-
[](Empty) {});
|
311
|
-
GetContext<BatchBuilder>()->Cancel(batch_target(),
|
312
|
-
absl::CancelledError());
|
313
|
-
}
|
314
|
-
Unref("orphan connected stream");
|
315
|
-
}
|
316
|
-
|
317
|
-
// Returns a promise that implements the receive message loop.
|
318
|
-
auto RecvMessages(PipeSender<MessageHandle>* incoming_messages,
|
319
|
-
bool cancel_on_error);
|
320
|
-
// Returns a promise that implements the send message loop.
|
321
|
-
auto SendMessages(PipeReceiver<MessageHandle>* outgoing_messages);
|
322
|
-
|
323
|
-
void SetStream(grpc_stream* stream) { stream_.reset(stream); }
|
324
|
-
grpc_stream* stream() { return stream_.get(); }
|
325
|
-
grpc_stream_refcount* stream_refcount() { return &stream_refcount_; }
|
326
|
-
|
327
|
-
void set_finished() { finished_.Set(); }
|
328
|
-
auto WaitFinished() { return finished_.Wait(); }
|
329
|
-
|
330
|
-
private:
|
331
|
-
class StreamDeleter {
|
332
|
-
public:
|
333
|
-
explicit StreamDeleter(ConnectedChannelStream* impl) : impl_(impl) {}
|
334
|
-
void operator()(grpc_stream* stream) const {
|
335
|
-
if (stream == nullptr) return;
|
336
|
-
impl_->transport()->filter_stack_transport()->DestroyStream(
|
337
|
-
stream, impl_->stream_destroyed_closure());
|
338
|
-
}
|
339
|
-
|
340
|
-
private:
|
341
|
-
ConnectedChannelStream* impl_;
|
342
|
-
};
|
343
|
-
using StreamPtr = std::unique_ptr<grpc_stream, StreamDeleter>;
|
344
|
-
|
345
|
-
void StreamDestroyed() {
|
346
|
-
call_context_->RunInContext([this] { this->~ConnectedChannelStream(); });
|
347
|
-
}
|
348
|
-
|
349
|
-
void BeginDestroy() {
|
350
|
-
if (stream_ != nullptr) {
|
351
|
-
stream_.reset();
|
352
|
-
} else {
|
353
|
-
StreamDestroyed();
|
354
|
-
}
|
355
|
-
}
|
356
|
-
|
357
|
-
Transport* const transport_;
|
358
|
-
RefCountedPtr<CallContext> const call_context_{
|
359
|
-
GetContext<CallContext>()->Ref()};
|
360
|
-
grpc_closure stream_destroyed_ =
|
361
|
-
MakeMemberClosure<ConnectedChannelStream,
|
362
|
-
&ConnectedChannelStream::StreamDestroyed>(
|
363
|
-
this, DEBUG_LOCATION);
|
364
|
-
grpc_stream_refcount stream_refcount_;
|
365
|
-
StreamPtr stream_;
|
366
|
-
Arena* arena_ = GetContext<Arena>();
|
367
|
-
Party* const party_ = GetContext<Party>();
|
368
|
-
ExternallyObservableLatch<void> finished_;
|
246
|
+
const grpc_channel_filter kConnectedFilter{
|
247
|
+
connected_channel_start_transport_stream_op_batch,
|
248
|
+
connected_channel_start_transport_op,
|
249
|
+
sizeof(call_data),
|
250
|
+
connected_channel_init_call_elem,
|
251
|
+
set_pollset_or_pollset_set,
|
252
|
+
connected_channel_destroy_call_elem,
|
253
|
+
sizeof(channel_data),
|
254
|
+
connected_channel_init_channel_elem,
|
255
|
+
+[](grpc_channel_stack* channel_stack, grpc_channel_element* elem) {
|
256
|
+
// HACK(ctiller): increase call stack size for the channel to make
|
257
|
+
// space for channel data. We need a cleaner (but performant) way to
|
258
|
+
// do this, and I'm not sure what that is yet. This is only "safe"
|
259
|
+
// because call stacks place no additional data after the last call
|
260
|
+
// element, and the last call element MUST be the connected channel.
|
261
|
+
auto* transport =
|
262
|
+
static_cast<channel_data*>(elem->channel_data)->transport;
|
263
|
+
if (transport->filter_stack_transport() != nullptr) {
|
264
|
+
channel_stack->call_stack_size +=
|
265
|
+
transport->filter_stack_transport()->SizeOfStream();
|
266
|
+
}
|
267
|
+
},
|
268
|
+
connected_channel_destroy_channel_elem,
|
269
|
+
connected_channel_get_channel_info,
|
270
|
+
"connected",
|
369
271
|
};
|
370
272
|
|
371
|
-
auto ConnectedChannelStream::RecvMessages(
|
372
|
-
PipeSender<MessageHandle>* incoming_messages, bool cancel_on_error) {
|
373
|
-
return Loop([self = InternalRef(), cancel_on_error,
|
374
|
-
incoming_messages = std::move(*incoming_messages)]() mutable {
|
375
|
-
return Seq(
|
376
|
-
GetContext<BatchBuilder>()->ReceiveMessage(self->batch_target()),
|
377
|
-
[cancel_on_error, &incoming_messages](
|
378
|
-
absl::StatusOr<absl::optional<MessageHandle>> status) mutable {
|
379
|
-
bool has_message = status.ok() && status->has_value();
|
380
|
-
auto publish_message = [&incoming_messages, &status]() {
|
381
|
-
auto pending_message = std::move(**status);
|
382
|
-
if (grpc_call_trace.enabled()) {
|
383
|
-
gpr_log(GPR_INFO,
|
384
|
-
"%s[connected] RecvMessage: received payload of %" PRIdPTR
|
385
|
-
" bytes",
|
386
|
-
GetContext<Activity>()->DebugTag().c_str(),
|
387
|
-
pending_message->payload()->Length());
|
388
|
-
}
|
389
|
-
return Map(incoming_messages.Push(std::move(pending_message)),
|
390
|
-
[](bool ok) -> LoopCtl<absl::Status> {
|
391
|
-
if (!ok) {
|
392
|
-
if (grpc_call_trace.enabled()) {
|
393
|
-
gpr_log(
|
394
|
-
GPR_INFO,
|
395
|
-
"%s[connected] RecvMessage: failed to "
|
396
|
-
"push message towards the application",
|
397
|
-
GetContext<Activity>()->DebugTag().c_str());
|
398
|
-
}
|
399
|
-
return absl::OkStatus();
|
400
|
-
}
|
401
|
-
return Continue{};
|
402
|
-
});
|
403
|
-
};
|
404
|
-
auto publish_close = [cancel_on_error, &incoming_messages,
|
405
|
-
&status]() mutable {
|
406
|
-
if (grpc_call_trace.enabled()) {
|
407
|
-
gpr_log(GPR_INFO,
|
408
|
-
"%s[connected] RecvMessage: reached end of stream with "
|
409
|
-
"status:%s",
|
410
|
-
GetContext<Activity>()->DebugTag().c_str(),
|
411
|
-
status.status().ToString().c_str());
|
412
|
-
}
|
413
|
-
if (cancel_on_error && !status.ok()) {
|
414
|
-
incoming_messages.CloseWithError();
|
415
|
-
} else {
|
416
|
-
incoming_messages.Close();
|
417
|
-
}
|
418
|
-
return Immediate(LoopCtl<absl::Status>(status.status()));
|
419
|
-
};
|
420
|
-
return If(has_message, std::move(publish_message),
|
421
|
-
std::move(publish_close));
|
422
|
-
});
|
423
|
-
});
|
424
|
-
}
|
425
|
-
|
426
|
-
auto ConnectedChannelStream::SendMessages(
|
427
|
-
PipeReceiver<MessageHandle>* outgoing_messages) {
|
428
|
-
return ForEach(std::move(*outgoing_messages),
|
429
|
-
[self = InternalRef()](MessageHandle message) {
|
430
|
-
return GetContext<BatchBuilder>()->SendMessage(
|
431
|
-
self->batch_target(), std::move(message));
|
432
|
-
});
|
433
|
-
}
|
434
|
-
#endif // defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL) ||
|
435
|
-
// defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
|
436
|
-
|
437
|
-
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
|
438
|
-
ArenaPromise<ServerMetadataHandle> MakeClientCallPromise(Transport* transport,
|
439
|
-
CallArgs call_args,
|
440
|
-
NextPromiseFactory) {
|
441
|
-
OrphanablePtr<ConnectedChannelStream> stream(
|
442
|
-
GetContext<Arena>()->New<ConnectedChannelStream>(transport));
|
443
|
-
stream->SetStream(static_cast<grpc_stream*>(GetContext<Arena>()->Alloc(
|
444
|
-
transport->filter_stack_transport()->SizeOfStream())));
|
445
|
-
transport->filter_stack_transport()->InitStream(stream->stream(),
|
446
|
-
stream->stream_refcount(),
|
447
|
-
nullptr, GetContext<Arena>());
|
448
|
-
auto* party = GetContext<Party>();
|
449
|
-
party->Spawn("set_polling_entity", call_args.polling_entity->Wait(),
|
450
|
-
[transport, stream = stream->InternalRef()](
|
451
|
-
grpc_polling_entity polling_entity) {
|
452
|
-
transport->SetPollingEntity(stream->stream(), &polling_entity);
|
453
|
-
});
|
454
|
-
// Start a loop to send messages from client_to_server_messages to the
|
455
|
-
// transport. When the pipe closes and the loop completes, send a trailing
|
456
|
-
// metadata batch to close the stream.
|
457
|
-
party->Spawn(
|
458
|
-
"send_messages",
|
459
|
-
TrySeq(stream->SendMessages(call_args.client_to_server_messages),
|
460
|
-
[stream = stream->InternalRef()]() {
|
461
|
-
return GetContext<BatchBuilder>()->SendClientTrailingMetadata(
|
462
|
-
stream->batch_target());
|
463
|
-
}),
|
464
|
-
[](absl::Status) {});
|
465
|
-
// Start a promise to receive server initial metadata and then forward it up
|
466
|
-
// through the receiving pipe.
|
467
|
-
auto server_initial_metadata = Arena::MakePooled<ServerMetadata>();
|
468
|
-
party->Spawn(
|
469
|
-
"recv_initial_metadata",
|
470
|
-
TrySeq(GetContext<BatchBuilder>()->ReceiveServerInitialMetadata(
|
471
|
-
stream->batch_target()),
|
472
|
-
[pipe = call_args.server_initial_metadata](
|
473
|
-
ServerMetadataHandle server_initial_metadata) {
|
474
|
-
if (grpc_call_trace.enabled()) {
|
475
|
-
gpr_log(GPR_DEBUG,
|
476
|
-
"%s[connected] Publish client initial metadata: %s",
|
477
|
-
GetContext<Activity>()->DebugTag().c_str(),
|
478
|
-
server_initial_metadata->DebugString().c_str());
|
479
|
-
}
|
480
|
-
return Map(pipe->Push(std::move(server_initial_metadata)),
|
481
|
-
[](bool r) {
|
482
|
-
if (r) return absl::OkStatus();
|
483
|
-
return absl::CancelledError();
|
484
|
-
});
|
485
|
-
}),
|
486
|
-
[](absl::Status) {});
|
487
|
-
|
488
|
-
// Build up the rest of the main call promise:
|
489
|
-
|
490
|
-
// Create a promise that will send initial metadata and then signal completion
|
491
|
-
// of that via the token.
|
492
|
-
auto send_initial_metadata = Seq(
|
493
|
-
GetContext<BatchBuilder>()->SendClientInitialMetadata(
|
494
|
-
stream->batch_target(), std::move(call_args.client_initial_metadata)),
|
495
|
-
[sent_initial_metadata_token =
|
496
|
-
std::move(call_args.client_initial_metadata_outstanding)](
|
497
|
-
absl::Status status) mutable {
|
498
|
-
sent_initial_metadata_token.Complete(status.ok());
|
499
|
-
return status;
|
500
|
-
});
|
501
|
-
// Create a promise that will receive server trailing metadata.
|
502
|
-
// If this fails, we massage the error into metadata that we can report
|
503
|
-
// upwards.
|
504
|
-
auto server_trailing_metadata = Arena::MakePooled<ServerMetadata>();
|
505
|
-
auto recv_trailing_metadata = Map(
|
506
|
-
GetContext<BatchBuilder>()->ReceiveServerTrailingMetadata(
|
507
|
-
stream->batch_target()),
|
508
|
-
[](absl::StatusOr<ServerMetadataHandle> status) mutable {
|
509
|
-
if (!status.ok()) {
|
510
|
-
auto server_trailing_metadata = Arena::MakePooled<ServerMetadata>();
|
511
|
-
grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
|
512
|
-
std::string message;
|
513
|
-
grpc_error_get_status(status.status(), Timestamp::InfFuture(),
|
514
|
-
&status_code, &message, nullptr, nullptr);
|
515
|
-
server_trailing_metadata->Set(GrpcStatusMetadata(), status_code);
|
516
|
-
server_trailing_metadata->Set(GrpcMessageMetadata(),
|
517
|
-
Slice::FromCopiedString(message));
|
518
|
-
return server_trailing_metadata;
|
519
|
-
} else {
|
520
|
-
return std::move(*status);
|
521
|
-
}
|
522
|
-
});
|
523
|
-
// Finally the main call promise.
|
524
|
-
// Concurrently: send initial metadata and receive messages, until BOTH
|
525
|
-
// complete (or one fails).
|
526
|
-
// Next: receive trailing metadata, and return that up the stack.
|
527
|
-
auto recv_messages =
|
528
|
-
stream->RecvMessages(call_args.server_to_client_messages, false);
|
529
|
-
return Map(
|
530
|
-
[send_initial_metadata = std::move(send_initial_metadata),
|
531
|
-
recv_messages = std::move(recv_messages),
|
532
|
-
recv_trailing_metadata = std::move(recv_trailing_metadata),
|
533
|
-
done_send_initial_metadata = false, done_recv_messages = false,
|
534
|
-
done_recv_trailing_metadata =
|
535
|
-
false]() mutable -> Poll<ServerMetadataHandle> {
|
536
|
-
if (!done_send_initial_metadata) {
|
537
|
-
auto p = send_initial_metadata();
|
538
|
-
if (auto* r = p.value_if_ready()) {
|
539
|
-
done_send_initial_metadata = true;
|
540
|
-
if (!r->ok()) return StatusCast<ServerMetadataHandle>(*r);
|
541
|
-
}
|
542
|
-
}
|
543
|
-
if (!done_recv_messages) {
|
544
|
-
auto p = recv_messages();
|
545
|
-
if (p.ready()) {
|
546
|
-
// NOTE: ignore errors here, they'll be collected in the
|
547
|
-
// recv_trailing_metadata.
|
548
|
-
done_recv_messages = true;
|
549
|
-
} else {
|
550
|
-
return Pending{};
|
551
|
-
}
|
552
|
-
}
|
553
|
-
if (!done_recv_trailing_metadata) {
|
554
|
-
auto p = recv_trailing_metadata();
|
555
|
-
if (auto* r = p.value_if_ready()) {
|
556
|
-
done_recv_trailing_metadata = true;
|
557
|
-
return std::move(*r);
|
558
|
-
}
|
559
|
-
}
|
560
|
-
return Pending{};
|
561
|
-
},
|
562
|
-
[stream = std::move(stream)](ServerMetadataHandle result) {
|
563
|
-
stream->set_finished();
|
564
|
-
return result;
|
565
|
-
});
|
566
|
-
}
|
567
|
-
#endif
|
568
|
-
|
569
|
-
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
|
570
|
-
ArenaPromise<ServerMetadataHandle> MakeServerCallPromise(
|
571
|
-
Transport* transport, CallArgs, NextPromiseFactory next_promise_factory) {
|
572
|
-
OrphanablePtr<ConnectedChannelStream> stream(
|
573
|
-
GetContext<Arena>()->New<ConnectedChannelStream>(transport));
|
574
|
-
|
575
|
-
stream->SetStream(static_cast<grpc_stream*>(GetContext<Arena>()->Alloc(
|
576
|
-
transport->filter_stack_transport()->SizeOfStream())));
|
577
|
-
transport->filter_stack_transport()->InitStream(
|
578
|
-
stream->stream(), stream->stream_refcount(),
|
579
|
-
GetContext<CallContext>()->server_call_context()->server_stream_data(),
|
580
|
-
GetContext<Arena>());
|
581
|
-
auto* party = GetContext<Party>();
|
582
|
-
|
583
|
-
// Arifacts we need for the lifetime of the call.
|
584
|
-
struct CallData {
|
585
|
-
Pipe<MessageHandle> server_to_client;
|
586
|
-
Pipe<MessageHandle> client_to_server;
|
587
|
-
Pipe<ServerMetadataHandle> server_initial_metadata;
|
588
|
-
Latch<ServerMetadataHandle> failure_latch;
|
589
|
-
Latch<grpc_polling_entity> polling_entity_latch;
|
590
|
-
bool sent_initial_metadata = false;
|
591
|
-
bool sent_trailing_metadata = false;
|
592
|
-
};
|
593
|
-
auto* call_data = GetContext<Arena>()->New<CallData>();
|
594
|
-
GetContext<CallFinalization>()->Add(
|
595
|
-
[call_data](const grpc_call_final_info*) { call_data->~CallData(); });
|
596
|
-
|
597
|
-
party->Spawn("set_polling_entity", call_data->polling_entity_latch.Wait(),
|
598
|
-
[transport, stream = stream->InternalRef()](
|
599
|
-
grpc_polling_entity polling_entity) {
|
600
|
-
transport->SetPollingEntity(stream->stream(), &polling_entity);
|
601
|
-
});
|
602
|
-
|
603
|
-
auto server_to_client_empty =
|
604
|
-
call_data->server_to_client.receiver.AwaitEmpty();
|
605
|
-
|
606
|
-
// Create a promise that will receive client initial metadata, and then run
|
607
|
-
// the main stem of the call (calling next_promise_factory up through the
|
608
|
-
// filters).
|
609
|
-
// Race the main call with failure_latch, allowing us to forcefully complete
|
610
|
-
// the call in the case of a failure.
|
611
|
-
auto recv_initial_metadata_then_run_promise =
|
612
|
-
TrySeq(GetContext<BatchBuilder>()->ReceiveClientInitialMetadata(
|
613
|
-
stream->batch_target()),
|
614
|
-
[next_promise_factory = std::move(next_promise_factory),
|
615
|
-
server_to_client_empty = std::move(server_to_client_empty),
|
616
|
-
call_data](ClientMetadataHandle client_initial_metadata) {
|
617
|
-
auto call_promise = next_promise_factory(CallArgs{
|
618
|
-
std::move(client_initial_metadata),
|
619
|
-
ClientInitialMetadataOutstandingToken::Empty(),
|
620
|
-
&call_data->polling_entity_latch,
|
621
|
-
&call_data->server_initial_metadata.sender,
|
622
|
-
&call_data->client_to_server.receiver,
|
623
|
-
&call_data->server_to_client.sender,
|
624
|
-
});
|
625
|
-
return Race(call_data->failure_latch.Wait(),
|
626
|
-
[call_promise = std::move(call_promise),
|
627
|
-
server_to_client_empty =
|
628
|
-
std::move(server_to_client_empty)]() mutable
|
629
|
-
-> Poll<ServerMetadataHandle> {
|
630
|
-
// TODO(ctiller): this is deeply weird and we need
|
631
|
-
// to clean this up.
|
632
|
-
//
|
633
|
-
// The following few lines check to ensure that
|
634
|
-
// there's no message currently pending in the
|
635
|
-
// outgoing message queue, and if (and only if)
|
636
|
-
// that's true decides to poll the main promise to
|
637
|
-
// see if there's a result.
|
638
|
-
//
|
639
|
-
// This essentially introduces a polling priority
|
640
|
-
// scheme that makes the current promise structure
|
641
|
-
// work out the way we want when talking to
|
642
|
-
// transports.
|
643
|
-
//
|
644
|
-
// The problem is that transports are going to need
|
645
|
-
// to replicate this structure when they convert to
|
646
|
-
// promises, and that becomes troubling as we'll be
|
647
|
-
// replicating weird throughout the stack.
|
648
|
-
//
|
649
|
-
// Instead we likely need to change the way we're
|
650
|
-
// composing promises through the stack.
|
651
|
-
//
|
652
|
-
// Proposed is to change filters from a promise
|
653
|
-
// that takes ClientInitialMetadata and returns
|
654
|
-
// ServerTrailingMetadata with three pipes for
|
655
|
-
// ServerInitialMetadata and
|
656
|
-
// ClientToServerMessages, ServerToClientMessages.
|
657
|
-
// Instead we'll have five pipes, moving
|
658
|
-
// ClientInitialMetadata and ServerTrailingMetadata
|
659
|
-
// to pipes that can be intercepted.
|
660
|
-
//
|
661
|
-
// The effect of this change will be to cripple the
|
662
|
-
// things that can be done in a filter (but cripple
|
663
|
-
// in line with what most filters actually do).
|
664
|
-
// We'll likely need to add a `CallContext::Cancel`
|
665
|
-
// to allow filters to cancel a request, but this
|
666
|
-
// would also have the advantage of centralizing
|
667
|
-
// our cancellation machinery which seems like an
|
668
|
-
// additional win - with the net effect that the
|
669
|
-
// shape of the call gets made explicit at the top
|
670
|
-
// & bottom of the stack.
|
671
|
-
//
|
672
|
-
// There's a small set of filters (retry, this one,
|
673
|
-
// lame client, clinet channel) that terminate
|
674
|
-
// stacks and need a richer set of semantics, but
|
675
|
-
// that ends up being fine because we can spawn
|
676
|
-
// tasks in parties to handle those edge cases, and
|
677
|
-
// keep the majority of filters simple: they just
|
678
|
-
// call InterceptAndMap on a handful of filters at
|
679
|
-
// call initialization time and then proceed to
|
680
|
-
// actually filter.
|
681
|
-
//
|
682
|
-
// So that's the plan, why isn't it enacted here?
|
683
|
-
//
|
684
|
-
// Well, the plan ends up being easy to implement
|
685
|
-
// in the promise based world (I did a prototype on
|
686
|
-
// a branch in an afternoon). It's heinous to
|
687
|
-
// implement in promise_based_filter, and that code
|
688
|
-
// is load bearing for us at the time of writing.
|
689
|
-
// It's not worth delaying promises for a further N
|
690
|
-
// months (N ~ 6) to make that change.
|
691
|
-
//
|
692
|
-
// Instead, we'll move forward with this, get
|
693
|
-
// promise_based_filter out of the picture, and
|
694
|
-
// then during the mop-up phase for promises tweak
|
695
|
-
// the compute structure to move to the magical
|
696
|
-
// five pipes (I'm reminded of an old Onion
|
697
|
-
// article), and end up in a good happy place.
|
698
|
-
if (server_to_client_empty().pending()) {
|
699
|
-
return Pending{};
|
700
|
-
}
|
701
|
-
return call_promise();
|
702
|
-
});
|
703
|
-
});
|
704
|
-
|
705
|
-
// Promise factory that accepts a ServerMetadataHandle, and sends it as the
|
706
|
-
// trailing metadata for this call.
|
707
|
-
auto send_trailing_metadata = [call_data, stream = stream->InternalRef()](
|
708
|
-
ServerMetadataHandle
|
709
|
-
server_trailing_metadata) {
|
710
|
-
bool is_cancellation =
|
711
|
-
server_trailing_metadata->get(GrpcCallWasCancelled()).value_or(false);
|
712
|
-
return GetContext<BatchBuilder>()->SendServerTrailingMetadata(
|
713
|
-
stream->batch_target(), std::move(server_trailing_metadata),
|
714
|
-
is_cancellation ||
|
715
|
-
!std::exchange(call_data->sent_initial_metadata, true));
|
716
|
-
};
|
717
|
-
|
718
|
-
// Runs the receive message loop, either until all the messages
|
719
|
-
// are received or the server call is complete.
|
720
|
-
party->Spawn(
|
721
|
-
"recv_messages",
|
722
|
-
Race(
|
723
|
-
Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
|
724
|
-
Map(stream->RecvMessages(&call_data->client_to_server.sender, true),
|
725
|
-
[failure_latch = &call_data->failure_latch](absl::Status status) {
|
726
|
-
if (!status.ok() && !failure_latch->is_set()) {
|
727
|
-
failure_latch->Set(ServerMetadataFromStatus(status));
|
728
|
-
}
|
729
|
-
return status;
|
730
|
-
})),
|
731
|
-
[](absl::Status) {});
|
732
|
-
|
733
|
-
// Run a promise that will send initial metadata (if that pipe sends some).
|
734
|
-
// And then run the send message loop until that completes.
|
735
|
-
|
736
|
-
auto send_initial_metadata = Seq(
|
737
|
-
Race(Map(stream->WaitFinished(),
|
738
|
-
[](Empty) { return NextResult<ServerMetadataHandle>(true); }),
|
739
|
-
call_data->server_initial_metadata.receiver.Next()),
|
740
|
-
[call_data, stream = stream->InternalRef()](
|
741
|
-
NextResult<ServerMetadataHandle> next_result) mutable {
|
742
|
-
auto md = !call_data->sent_initial_metadata && next_result.has_value()
|
743
|
-
? std::move(next_result.value())
|
744
|
-
: nullptr;
|
745
|
-
if (md != nullptr) {
|
746
|
-
call_data->sent_initial_metadata = true;
|
747
|
-
auto* party = GetContext<Party>();
|
748
|
-
party->Spawn("connected/send_initial_metadata",
|
749
|
-
GetContext<BatchBuilder>()->SendServerInitialMetadata(
|
750
|
-
stream->batch_target(), std::move(md)),
|
751
|
-
[](absl::Status) {});
|
752
|
-
return Immediate(absl::OkStatus());
|
753
|
-
}
|
754
|
-
return Immediate(absl::CancelledError());
|
755
|
-
});
|
756
|
-
party->Spawn(
|
757
|
-
"send_initial_metadata_then_messages",
|
758
|
-
Race(Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
|
759
|
-
TrySeq(std::move(send_initial_metadata),
|
760
|
-
stream->SendMessages(&call_data->server_to_client.receiver))),
|
761
|
-
[](absl::Status) {});
|
762
|
-
|
763
|
-
// Spawn a job to fetch the "client trailing metadata" - if this is OK then
|
764
|
-
// it's client done, otherwise it's a signal of cancellation from the client
|
765
|
-
// which we'll use failure_latch to signal.
|
766
|
-
|
767
|
-
party->Spawn(
|
768
|
-
"recv_trailing_metadata",
|
769
|
-
Seq(GetContext<BatchBuilder>()->ReceiveClientTrailingMetadata(
|
770
|
-
stream->batch_target()),
|
771
|
-
[failure_latch = &call_data->failure_latch](
|
772
|
-
absl::StatusOr<ClientMetadataHandle> status) mutable {
|
773
|
-
if (grpc_call_trace.enabled()) {
|
774
|
-
gpr_log(
|
775
|
-
GPR_DEBUG,
|
776
|
-
"%s[connected] Got trailing metadata; status=%s metadata=%s",
|
777
|
-
GetContext<Activity>()->DebugTag().c_str(),
|
778
|
-
status.status().ToString().c_str(),
|
779
|
-
status.ok() ? (*status)->DebugString().c_str() : "<none>");
|
780
|
-
}
|
781
|
-
ClientMetadataHandle trailing_metadata;
|
782
|
-
if (status.ok()) {
|
783
|
-
trailing_metadata = std::move(*status);
|
784
|
-
} else {
|
785
|
-
trailing_metadata = Arena::MakePooled<ClientMetadata>();
|
786
|
-
grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
|
787
|
-
std::string message;
|
788
|
-
grpc_error_get_status(status.status(), Timestamp::InfFuture(),
|
789
|
-
&status_code, &message, nullptr, nullptr);
|
790
|
-
trailing_metadata->Set(GrpcStatusMetadata(), status_code);
|
791
|
-
trailing_metadata->Set(GrpcMessageMetadata(),
|
792
|
-
Slice::FromCopiedString(message));
|
793
|
-
}
|
794
|
-
if (trailing_metadata->get(GrpcStatusMetadata())
|
795
|
-
.value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK) {
|
796
|
-
if (!failure_latch->is_set()) {
|
797
|
-
failure_latch->Set(std::move(trailing_metadata));
|
798
|
-
}
|
799
|
-
}
|
800
|
-
return Empty{};
|
801
|
-
}),
|
802
|
-
[](Empty) {});
|
803
|
-
|
804
|
-
// Finally assemble the main call promise:
|
805
|
-
// Receive initial metadata from the client and start the promise up the
|
806
|
-
// filter stack.
|
807
|
-
// Upon completion, send trailing metadata to the client and then return it
|
808
|
-
// (allowing the call code to decide on what signalling to give the
|
809
|
-
// application).
|
810
|
-
|
811
|
-
struct CleanupPollingEntityLatch {
|
812
|
-
void operator()(Latch<grpc_polling_entity>* latch) {
|
813
|
-
if (!latch->is_set()) latch->Set(grpc_polling_entity());
|
814
|
-
}
|
815
|
-
};
|
816
|
-
auto cleanup_polling_entity_latch =
|
817
|
-
std::unique_ptr<Latch<grpc_polling_entity>, CleanupPollingEntityLatch>(
|
818
|
-
&call_data->polling_entity_latch);
|
819
|
-
struct CleanupSendInitialMetadata {
|
820
|
-
void operator()(CallData* call_data) {
|
821
|
-
call_data->server_initial_metadata.receiver.CloseWithError();
|
822
|
-
}
|
823
|
-
};
|
824
|
-
auto cleanup_send_initial_metadata =
|
825
|
-
std::unique_ptr<CallData, CleanupSendInitialMetadata>(call_data);
|
826
|
-
|
827
|
-
return Map(
|
828
|
-
Seq(std::move(recv_initial_metadata_then_run_promise),
|
829
|
-
std::move(send_trailing_metadata)),
|
830
|
-
[cleanup_polling_entity_latch = std::move(cleanup_polling_entity_latch),
|
831
|
-
cleanup_send_initial_metadata = std::move(cleanup_send_initial_metadata),
|
832
|
-
stream = std::move(stream)](ServerMetadataHandle md) {
|
833
|
-
stream->set_finished();
|
834
|
-
return md;
|
835
|
-
});
|
836
|
-
}
|
837
|
-
#endif
|
838
|
-
|
839
|
-
template <ArenaPromise<ServerMetadataHandle> (*make_call_promise)(
|
840
|
-
Transport*, CallArgs, NextPromiseFactory)>
|
841
|
-
grpc_channel_filter MakeConnectedFilter() {
|
842
|
-
// Create a vtable that contains both the legacy call methods (for filter
|
843
|
-
// stack based calls) and the new promise based method for creating
|
844
|
-
// promise based calls (the latter iff make_call_promise != nullptr). In
|
845
|
-
// this way the filter can be inserted into either kind of channel stack,
|
846
|
-
// and only if all the filters in the stack are promise based will the
|
847
|
-
// call be promise based.
|
848
|
-
auto make_call_wrapper = +[](grpc_channel_element* elem, CallArgs call_args,
|
849
|
-
NextPromiseFactory next) {
|
850
|
-
Transport* transport =
|
851
|
-
static_cast<channel_data*>(elem->channel_data)->transport;
|
852
|
-
return make_call_promise(transport, std::move(call_args), std::move(next));
|
853
|
-
};
|
854
|
-
return {
|
855
|
-
connected_channel_start_transport_stream_op_batch,
|
856
|
-
make_call_promise != nullptr ? make_call_wrapper : nullptr,
|
857
|
-
/* init_call: */ nullptr,
|
858
|
-
connected_channel_start_transport_op,
|
859
|
-
sizeof(call_data),
|
860
|
-
connected_channel_init_call_elem,
|
861
|
-
set_pollset_or_pollset_set,
|
862
|
-
connected_channel_destroy_call_elem,
|
863
|
-
sizeof(channel_data),
|
864
|
-
connected_channel_init_channel_elem,
|
865
|
-
+[](grpc_channel_stack* channel_stack, grpc_channel_element* elem) {
|
866
|
-
// HACK(ctiller): increase call stack size for the channel to make
|
867
|
-
// space for channel data. We need a cleaner (but performant) way to
|
868
|
-
// do this, and I'm not sure what that is yet. This is only "safe"
|
869
|
-
// because call stacks place no additional data after the last call
|
870
|
-
// element, and the last call element MUST be the connected channel.
|
871
|
-
auto* transport =
|
872
|
-
static_cast<channel_data*>(elem->channel_data)->transport;
|
873
|
-
if (transport->filter_stack_transport() != nullptr) {
|
874
|
-
channel_stack->call_stack_size +=
|
875
|
-
transport->filter_stack_transport()->SizeOfStream();
|
876
|
-
}
|
877
|
-
},
|
878
|
-
connected_channel_destroy_channel_elem,
|
879
|
-
connected_channel_get_channel_info,
|
880
|
-
"connected",
|
881
|
-
};
|
882
|
-
}
|
883
|
-
|
884
|
-
ArenaPromise<ServerMetadataHandle> MakeClientTransportCallPromise(
|
885
|
-
Transport* transport, CallArgs call_args, NextPromiseFactory) {
|
886
|
-
auto spine = GetContext<CallContext>()->MakeCallSpine(std::move(call_args));
|
887
|
-
transport->client_transport()->StartCall(CallHandler{spine});
|
888
|
-
return spine->PullServerTrailingMetadata();
|
889
|
-
}
|
890
|
-
|
891
|
-
const grpc_channel_filter kClientPromiseBasedTransportFilter =
|
892
|
-
MakeConnectedFilter<MakeClientTransportCallPromise>();
|
893
|
-
|
894
|
-
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
|
895
|
-
const grpc_channel_filter kClientEmulatedFilter =
|
896
|
-
MakeConnectedFilter<MakeClientCallPromise>();
|
897
|
-
#else
|
898
|
-
const grpc_channel_filter kClientEmulatedFilter =
|
899
|
-
MakeConnectedFilter<nullptr>();
|
900
|
-
#endif
|
901
|
-
|
902
|
-
#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
|
903
|
-
const grpc_channel_filter kServerEmulatedFilter =
|
904
|
-
MakeConnectedFilter<MakeServerCallPromise>();
|
905
|
-
#else
|
906
|
-
const grpc_channel_filter kServerEmulatedFilter =
|
907
|
-
MakeConnectedFilter<nullptr>();
|
908
|
-
#endif
|
909
|
-
|
910
273
|
// noop filter for the v3 stack: placeholder for now because other code requires
|
911
274
|
// we have a terminator.
|
912
275
|
// TODO(ctiller): delete when v3 transition is complete.
|
913
|
-
const grpc_channel_filter
|
276
|
+
const grpc_channel_filter kPromiseBasedTransportFilter = {
|
914
277
|
nullptr,
|
915
|
-
[](grpc_channel_element*, CallArgs, NextPromiseFactory)
|
916
|
-
-> ArenaPromise<ServerMetadataHandle> { Crash("not implemented"); },
|
917
|
-
/* init_call: */ [](grpc_channel_element*, CallSpineInterface*) {},
|
918
278
|
connected_channel_start_transport_op,
|
919
279
|
0,
|
920
280
|
nullptr,
|
921
281
|
set_pollset_or_pollset_set,
|
922
282
|
nullptr,
|
923
283
|
sizeof(channel_data),
|
924
|
-
|
284
|
+
+[](grpc_channel_element*, grpc_channel_element_args*) {
|
285
|
+
return absl::InternalError(
|
286
|
+
"Cannot use filter based stack with promise based transports");
|
287
|
+
},
|
925
288
|
+[](grpc_channel_stack*, grpc_channel_element*) {},
|
926
289
|
connected_channel_destroy_channel_elem,
|
927
290
|
connected_channel_get_channel_info,
|
@@ -937,7 +300,6 @@ bool TransportSupportsServerPromiseBasedCalls(const ChannelArgs& args) {
|
|
937
300
|
auto* transport = args.GetObject<Transport>();
|
938
301
|
return transport->server_transport() != nullptr;
|
939
302
|
}
|
940
|
-
|
941
303
|
} // namespace
|
942
304
|
|
943
305
|
void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
|
@@ -950,31 +312,30 @@ void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
|
|
950
312
|
// Option 1, and our ideal: the transport supports promise based calls,
|
951
313
|
// and so we simply use the transport directly.
|
952
314
|
builder->channel_init()
|
953
|
-
->RegisterFilter(GRPC_CLIENT_SUBCHANNEL,
|
954
|
-
&kClientPromiseBasedTransportFilter)
|
315
|
+
->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kPromiseBasedTransportFilter)
|
955
316
|
.Terminal()
|
956
317
|
.If(TransportSupportsClientPromiseBasedCalls);
|
957
318
|
builder->channel_init()
|
958
319
|
->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL,
|
959
|
-
&
|
320
|
+
&kPromiseBasedTransportFilter)
|
960
321
|
.Terminal()
|
961
322
|
.If(TransportSupportsClientPromiseBasedCalls);
|
962
323
|
builder->channel_init()
|
963
|
-
->RegisterFilter(GRPC_SERVER_CHANNEL, &
|
324
|
+
->RegisterFilter(GRPC_SERVER_CHANNEL, &kPromiseBasedTransportFilter)
|
964
325
|
.Terminal()
|
965
326
|
.If(TransportSupportsServerPromiseBasedCalls);
|
966
327
|
|
967
328
|
// Option 2: the transport does not support promise based calls.
|
968
329
|
builder->channel_init()
|
969
|
-
->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &
|
330
|
+
->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kConnectedFilter)
|
970
331
|
.Terminal()
|
971
332
|
.IfNot(TransportSupportsClientPromiseBasedCalls);
|
972
333
|
builder->channel_init()
|
973
|
-
->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &
|
334
|
+
->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &kConnectedFilter)
|
974
335
|
.Terminal()
|
975
336
|
.IfNot(TransportSupportsClientPromiseBasedCalls);
|
976
337
|
builder->channel_init()
|
977
|
-
->RegisterFilter(GRPC_SERVER_CHANNEL, &
|
338
|
+
->RegisterFilter(GRPC_SERVER_CHANNEL, &kConnectedFilter)
|
978
339
|
.Terminal()
|
979
340
|
.IfNot(TransportSupportsServerPromiseBasedCalls);
|
980
341
|
}
|