grpc 1.73.0 → 1.74.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 +38 -17
- data/include/grpc/create_channel_from_endpoint.h +54 -0
- data/include/grpc/credentials.h +11 -5
- data/include/grpc/event_engine/event_engine.h +74 -17
- data/include/grpc/grpc_posix.h +20 -1
- data/include/grpc/impl/channel_arg_names.h +2 -4
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/support/json.h +24 -0
- data/src/core/call/interception_chain.h +7 -11
- data/src/core/channelz/channel_trace.cc +213 -115
- data/src/core/channelz/channel_trace.h +380 -86
- data/src/core/channelz/channelz.cc +270 -181
- data/src/core/channelz/channelz.h +168 -55
- data/src/core/channelz/channelz_registry.cc +2 -1
- data/src/core/channelz/channelz_registry.h +24 -0
- data/src/core/channelz/property_list.cc +357 -0
- data/src/core/channelz/property_list.h +202 -0
- data/src/core/channelz/ztrace_collector.h +3 -2
- data/src/core/client_channel/backup_poller.cc +17 -2
- data/src/core/client_channel/client_channel.cc +17 -28
- data/src/core/client_channel/client_channel_filter.cc +19 -29
- data/src/core/client_channel/config_selector.h +8 -2
- data/src/core/client_channel/dynamic_filters.cc +5 -6
- data/src/core/client_channel/dynamic_filters.h +1 -1
- data/src/core/client_channel/global_subchannel_pool.cc +4 -1
- data/src/core/client_channel/retry_filter.cc +21 -27
- data/src/core/client_channel/retry_filter.h +10 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
- data/src/core/client_channel/retry_interceptor.cc +30 -44
- data/src/core/client_channel/retry_interceptor.h +18 -17
- data/src/core/client_channel/retry_throttle.cc +46 -61
- data/src/core/client_channel/retry_throttle.h +17 -39
- data/src/core/client_channel/subchannel.cc +43 -19
- data/src/core/client_channel/subchannel.h +8 -0
- data/src/core/config/config_vars.cc +2 -0
- data/src/core/config/core_configuration.cc +1 -0
- data/src/core/config/core_configuration.h +11 -0
- data/src/core/credentials/call/call_creds_registry.h +125 -0
- data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
- data/src/core/credentials/call/jwt_util.cc +70 -0
- data/src/core/credentials/call/jwt_util.h +32 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
- data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
- data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
- data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
- data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
- data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
- data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
- data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
- data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
- data/src/core/filter/auth/auth_filters.h +0 -25
- data/src/core/filter/auth/client_auth_filter.cc +0 -118
- data/src/core/filter/filter_args.h +9 -23
- data/src/core/handshaker/handshaker.cc +23 -14
- data/src/core/handshaker/handshaker.h +3 -0
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
- data/src/core/handshaker/security/secure_endpoint.cc +70 -25
- data/src/core/handshaker/security/security_handshaker.cc +4 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
- data/src/core/lib/channel/channel_args.cc +15 -0
- data/src/core/lib/channel/channel_args.h +3 -0
- data/src/core/lib/channel/channel_stack.cc +22 -23
- data/src/core/lib/channel/channel_stack.h +9 -7
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
- data/src/core/lib/channel/promise_based_filter.h +5 -5
- data/src/core/lib/debug/trace_impl.h +0 -1
- data/src/core/lib/event_engine/ares_resolver.cc +165 -46
- data/src/core/lib/event_engine/ares_resolver.h +48 -2
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
- data/src/core/lib/event_engine/event_engine.cc +7 -0
- data/src/core/lib/event_engine/extensions/channelz.h +10 -6
- data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
- data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
- data/src/core/lib/event_engine/shim.cc +9 -0
- data/src/core/lib/event_engine/shim.h +3 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
- data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
- data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
- data/src/core/lib/experiments/experiments.cc +45 -93
- data/src/core/lib/experiments/experiments.h +21 -51
- data/src/core/lib/iomgr/endpoint.cc +4 -3
- data/src/core/lib/iomgr/endpoint.h +7 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
- data/src/core/lib/iomgr/tcp_posix.cc +12 -6
- data/src/core/lib/iomgr/tcp_windows.cc +3 -2
- data/src/core/lib/promise/activity.h +1 -0
- data/src/core/lib/promise/arena_promise.h +23 -7
- data/src/core/lib/promise/detail/promise_factory.h +10 -0
- data/src/core/lib/promise/detail/promise_like.h +118 -11
- data/src/core/lib/promise/detail/promise_variant.h +50 -0
- data/src/core/lib/promise/detail/seq_state.h +687 -548
- data/src/core/lib/promise/if.h +20 -0
- data/src/core/lib/promise/inter_activity_latch.h +147 -0
- data/src/core/lib/promise/inter_activity_mutex.h +547 -0
- data/src/core/lib/promise/loop.h +65 -3
- data/src/core/lib/promise/map.h +24 -0
- data/src/core/lib/promise/match_promise.h +103 -0
- data/src/core/lib/promise/mpsc.cc +425 -0
- data/src/core/lib/promise/mpsc.h +490 -0
- data/src/core/lib/promise/party.cc +50 -1
- data/src/core/lib/promise/party.h +66 -1
- data/src/core/lib/promise/race.h +31 -0
- data/src/core/lib/promise/seq.h +4 -1
- data/src/core/lib/promise/status_flag.h +7 -0
- data/src/core/lib/promise/try_seq.h +4 -1
- data/src/core/lib/promise/wait_set.cc +28 -0
- data/src/core/lib/promise/wait_set.h +86 -0
- data/src/core/lib/resource_quota/arena.h +19 -0
- data/src/core/lib/slice/slice.h +5 -0
- data/src/core/lib/surface/channel_create.cc +88 -13
- data/src/core/lib/surface/channel_create.h +4 -0
- data/src/core/lib/surface/channel_init.cc +164 -47
- data/src/core/lib/surface/channel_init.h +64 -1
- data/src/core/lib/surface/filter_stack_call.cc +18 -9
- data/src/core/lib/surface/init.cc +6 -15
- data/src/core/lib/surface/legacy_channel.cc +3 -5
- data/src/core/lib/surface/legacy_channel.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +110 -0
- data/src/core/lib/transport/promise_endpoint.h +307 -0
- data/src/core/load_balancing/child_policy_handler.cc +2 -4
- data/src/core/load_balancing/delegating_helper.h +2 -3
- data/src/core/load_balancing/health_check_client.cc +1 -5
- data/src/core/load_balancing/lb_policy.h +1 -3
- data/src/core/load_balancing/oob_backend_metric.cc +1 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
- data/src/core/load_balancing/xds/cds.cc +10 -1
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
- data/src/core/resolver/xds/xds_config.cc +6 -3
- data/src/core/resolver/xds/xds_config.h +9 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
- data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +31 -11
- data/src/core/server/server.cc +83 -12
- data/src/core/server/server.h +21 -2
- data/src/core/server/xds_server_config_fetcher.cc +63 -25
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/telemetry/context_list_entry.cc +38 -0
- data/src/core/telemetry/context_list_entry.h +42 -12
- data/src/core/telemetry/stats_data.cc +233 -207
- data/src/core/telemetry/stats_data.h +250 -153
- data/src/core/telemetry/tcp_tracer.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
- data/src/core/tsi/fake_transport_security.cc +17 -0
- data/src/core/tsi/ssl_transport_security.cc +2 -0
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/backoff.cc +1 -5
- data/src/core/util/backoff.h +1 -0
- data/src/core/util/down_cast.h +1 -1
- data/src/core/util/function_signature.h +15 -1
- data/src/core/util/http_client/httpcli.cc +12 -5
- data/src/core/util/http_client/httpcli.h +4 -1
- data/src/core/util/latent_see.h +8 -5
- data/src/core/util/log.cc +4 -0
- data/src/core/util/memory_usage.h +268 -0
- data/src/core/util/per_cpu.cc +2 -0
- data/src/core/util/per_cpu.h +7 -0
- data/src/core/util/shared_bit_gen.h +20 -0
- data/src/core/util/single_set_ptr.h +2 -2
- data/src/core/util/upb_utils.h +42 -0
- data/src/core/util/uri.cc +3 -2
- data/src/core/util/useful.h +53 -2
- data/src/core/util/wait_for_single_owner.cc +31 -0
- data/src/core/util/wait_for_single_owner.h +24 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
- data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
- data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
- data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
- data/src/core/xds/grpc/xds_http_filter.h +7 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
- data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
- data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
- data/src/core/xds/grpc/xds_server_grpc.h +10 -2
- data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
- data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
- data/src/core/xds/xds_client/xds_client.cc +26 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_call.c +1 -8
- data/src/ruby/ext/grpc/rb_channel.c +72 -568
- data/src/ruby/ext/grpc/rb_channel.h +0 -3
- data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
- data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
- data/src/ruby/ext/grpc/rb_grpc.c +9 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/ext/grpc/rb_loader.c +0 -4
- data/src/ruby/ext/grpc/rb_server.c +31 -50
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/core_spec.rb +22 -0
- data/src/ruby/spec/generic/active_call_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
- data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
- data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
- data/third_party/abseil-cpp/absl/base/config.h +20 -129
- data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
- data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
- data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
- data/third_party/abseil-cpp/absl/base/options.h +3 -80
- data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
- data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
- data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
- data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
- data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
- data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
- data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
- data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
- data/third_party/abseil-cpp/absl/log/check.h +2 -1
- data/third_party/abseil-cpp/absl/log/globals.h +4 -5
- data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
- data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
- data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
- data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
- data/third_party/abseil-cpp/absl/log/log.h +48 -35
- data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
- data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
- data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- data/third_party/abseil-cpp/absl/random/random.h +88 -53
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
- data/third_party/abseil-cpp/absl/status/status.cc +4 -8
- data/third_party/abseil-cpp/absl/status/status.h +8 -8
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
- data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
- data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
- data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
- data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
- data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
- data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
- data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
- data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
- data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
- data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- data/third_party/abseil-cpp/absl/time/time.h +20 -15
- data/third_party/abseil-cpp/absl/types/optional.h +7 -747
- data/third_party/abseil-cpp/absl/types/span.h +13 -11
- data/third_party/abseil-cpp/absl/types/variant.h +5 -784
- data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
- metadata +72 -20
- data/src/core/lib/event_engine/forkable.cc +0 -105
- data/src/core/lib/event_engine/forkable.h +0 -67
- data/src/core/lib/iomgr/python_util.h +0 -46
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
- data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
- data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -0,0 +1,307 @@
|
|
1
|
+
// Copyright 2023 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
|
16
|
+
#define GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
|
17
|
+
|
18
|
+
#include <grpc/event_engine/event_engine.h>
|
19
|
+
#include <grpc/event_engine/slice.h>
|
20
|
+
#include <grpc/event_engine/slice_buffer.h>
|
21
|
+
#include <grpc/slice_buffer.h>
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
#include <stddef.h>
|
24
|
+
#include <stdint.h>
|
25
|
+
|
26
|
+
#include <atomic>
|
27
|
+
#include <cstring>
|
28
|
+
#include <functional>
|
29
|
+
#include <memory>
|
30
|
+
#include <optional>
|
31
|
+
#include <utility>
|
32
|
+
|
33
|
+
#include "absl/base/thread_annotations.h"
|
34
|
+
#include "absl/log/check.h"
|
35
|
+
#include "absl/status/status.h"
|
36
|
+
#include "absl/status/statusor.h"
|
37
|
+
#include "src/core/lib/event_engine/extensions/chaotic_good_extension.h"
|
38
|
+
#include "src/core/lib/event_engine/query_extensions.h"
|
39
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
40
|
+
#include "src/core/lib/promise/activity.h"
|
41
|
+
#include "src/core/lib/promise/cancel_callback.h"
|
42
|
+
#include "src/core/lib/promise/if.h"
|
43
|
+
#include "src/core/lib/promise/map.h"
|
44
|
+
#include "src/core/lib/promise/poll.h"
|
45
|
+
#include "src/core/lib/slice/slice.h"
|
46
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
47
|
+
#include "src/core/util/dump_args.h"
|
48
|
+
#include "src/core/util/sync.h"
|
49
|
+
|
50
|
+
namespace grpc_core {
|
51
|
+
|
52
|
+
// Wrapper around event engine endpoint that provides a promise like API.
|
53
|
+
class PromiseEndpoint {
|
54
|
+
public:
|
55
|
+
using WriteArgs =
|
56
|
+
grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs;
|
57
|
+
|
58
|
+
PromiseEndpoint(
|
59
|
+
std::unique_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
|
60
|
+
endpoint,
|
61
|
+
SliceBuffer already_received);
|
62
|
+
PromiseEndpoint() = default;
|
63
|
+
~PromiseEndpoint() = default;
|
64
|
+
/// Prevent copying of PromiseEndpoint; moving is fine.
|
65
|
+
PromiseEndpoint(const PromiseEndpoint&) = delete;
|
66
|
+
PromiseEndpoint& operator=(const PromiseEndpoint&) = delete;
|
67
|
+
PromiseEndpoint(PromiseEndpoint&&) = default;
|
68
|
+
PromiseEndpoint& operator=(PromiseEndpoint&&) = default;
|
69
|
+
|
70
|
+
// Returns a promise that resolves to a `absl::Status` indicating the result
|
71
|
+
// of the write operation.
|
72
|
+
//
|
73
|
+
// Concurrent writes are not supported, which means callers should not call
|
74
|
+
// `Write()` before the previous write finishes. Doing that results in
|
75
|
+
// undefined behavior.
|
76
|
+
auto Write(SliceBuffer data, WriteArgs write_args) {
|
77
|
+
GRPC_LATENT_SEE_PARENT_SCOPE("GRPC:Write");
|
78
|
+
// Start write and assert previous write finishes.
|
79
|
+
auto prev = write_state_->state.exchange(WriteState::kWriting,
|
80
|
+
std::memory_order_relaxed);
|
81
|
+
CHECK(prev == WriteState::kIdle);
|
82
|
+
bool completed;
|
83
|
+
if (data.Length() == 0) {
|
84
|
+
completed = true;
|
85
|
+
} else {
|
86
|
+
// TODO(ladynana): Replace this with `SliceBufferCast<>` when it is
|
87
|
+
// available.
|
88
|
+
grpc_slice_buffer_swap(write_state_->buffer.c_slice_buffer(),
|
89
|
+
data.c_slice_buffer());
|
90
|
+
// If `Write()` returns true immediately, the callback will not be called.
|
91
|
+
// We still need to call our callback to pick up the result.
|
92
|
+
write_state_->waker = GetContext<Activity>()->MakeNonOwningWaker();
|
93
|
+
completed = endpoint_->Write(
|
94
|
+
[write_state = write_state_](absl::Status status) {
|
95
|
+
ExecCtx exec_ctx;
|
96
|
+
write_state->Complete(std::move(status));
|
97
|
+
},
|
98
|
+
&write_state_->buffer, std::move(write_args));
|
99
|
+
if (completed) write_state_->waker = Waker();
|
100
|
+
}
|
101
|
+
return If(
|
102
|
+
completed,
|
103
|
+
[this]() {
|
104
|
+
return [write_state = write_state_]() {
|
105
|
+
auto prev = write_state->state.exchange(WriteState::kIdle,
|
106
|
+
std::memory_order_relaxed);
|
107
|
+
CHECK(prev == WriteState::kWriting);
|
108
|
+
return absl::OkStatus();
|
109
|
+
};
|
110
|
+
},
|
111
|
+
GRPC_LATENT_SEE_PROMISE(
|
112
|
+
"DelayedWrite", ([this]() {
|
113
|
+
return [write_state = write_state_]() -> Poll<absl::Status> {
|
114
|
+
// If current write isn't finished return `Pending()`, else
|
115
|
+
// return write result.
|
116
|
+
WriteState::State expected = WriteState::kWritten;
|
117
|
+
if (write_state->state.compare_exchange_strong(
|
118
|
+
expected, WriteState::kIdle, std::memory_order_acquire,
|
119
|
+
std::memory_order_relaxed)) {
|
120
|
+
// State was Written, and we changed it to Idle. We can return
|
121
|
+
// the result.
|
122
|
+
return std::move(write_state->result);
|
123
|
+
}
|
124
|
+
// State was not Written; since we're polling it must be
|
125
|
+
// Writing. Assert that and return Pending.
|
126
|
+
CHECK(expected == WriteState::kWriting);
|
127
|
+
return Pending();
|
128
|
+
};
|
129
|
+
})));
|
130
|
+
}
|
131
|
+
|
132
|
+
// Returns a promise that resolves to `SliceBuffer` with
|
133
|
+
// `num_bytes` bytes.
|
134
|
+
//
|
135
|
+
// Concurrent reads are not supported, which means callers should not call
|
136
|
+
// `Read()` before the previous read finishes. Doing that results in
|
137
|
+
// undefined behavior.
|
138
|
+
auto Read(size_t num_bytes) {
|
139
|
+
GRPC_LATENT_SEE_PARENT_SCOPE("GRPC:Read");
|
140
|
+
// Assert previous read finishes.
|
141
|
+
CHECK(!read_state_->complete.load(std::memory_order_relaxed));
|
142
|
+
// Should not have pending reads.
|
143
|
+
CHECK_EQ(read_state_->pending_buffer.Count(), 0u);
|
144
|
+
bool complete = true;
|
145
|
+
while (read_state_->buffer.Length() < num_bytes) {
|
146
|
+
GRPC_LATENT_SEE_INNER_SCOPE("GRPC:Read:Loop");
|
147
|
+
// Set read args with hinted bytes.
|
148
|
+
grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs
|
149
|
+
read_args;
|
150
|
+
read_args.set_read_hint_bytes(
|
151
|
+
static_cast<int64_t>(num_bytes - read_state_->buffer.Length()));
|
152
|
+
// If `Read()` returns true immediately, the callback will not be
|
153
|
+
// called.
|
154
|
+
read_state_->waker = GetContext<Activity>()->MakeNonOwningWaker();
|
155
|
+
if (endpoint_->Read(
|
156
|
+
[read_state = read_state_, num_bytes](absl::Status status) {
|
157
|
+
ExecCtx exec_ctx;
|
158
|
+
read_state->Complete(std::move(status), num_bytes);
|
159
|
+
},
|
160
|
+
&read_state_->pending_buffer, std::move(read_args))) {
|
161
|
+
read_state_->waker = Waker();
|
162
|
+
read_state_->pending_buffer.MoveFirstNBytesIntoSliceBuffer(
|
163
|
+
read_state_->pending_buffer.Length(), read_state_->buffer);
|
164
|
+
DCHECK_EQ(read_state_->pending_buffer.Count(), 0u);
|
165
|
+
} else {
|
166
|
+
complete = false;
|
167
|
+
break;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
return If(
|
171
|
+
complete,
|
172
|
+
[this, num_bytes]() {
|
173
|
+
SliceBuffer ret;
|
174
|
+
grpc_slice_buffer_move_first_no_inline(
|
175
|
+
read_state_->buffer.c_slice_buffer(), num_bytes,
|
176
|
+
ret.c_slice_buffer());
|
177
|
+
return [ret = std::move(
|
178
|
+
ret)]() mutable -> Poll<absl::StatusOr<SliceBuffer>> {
|
179
|
+
return std::move(ret);
|
180
|
+
};
|
181
|
+
},
|
182
|
+
GRPC_LATENT_SEE_PROMISE(
|
183
|
+
"DelayedRead", ([this, num_bytes]() {
|
184
|
+
return [read_state = read_state_,
|
185
|
+
num_bytes]() -> Poll<absl::StatusOr<SliceBuffer>> {
|
186
|
+
if (!read_state->complete.load(std::memory_order_acquire)) {
|
187
|
+
return Pending();
|
188
|
+
}
|
189
|
+
// If read succeeds, return `SliceBuffer` with `num_bytes`
|
190
|
+
// bytes.
|
191
|
+
if (read_state->result.ok()) {
|
192
|
+
SliceBuffer ret;
|
193
|
+
grpc_slice_buffer_move_first_no_inline(
|
194
|
+
read_state->buffer.c_slice_buffer(), num_bytes,
|
195
|
+
ret.c_slice_buffer());
|
196
|
+
read_state->complete.store(false, std::memory_order_relaxed);
|
197
|
+
return std::move(ret);
|
198
|
+
}
|
199
|
+
read_state->complete.store(false, std::memory_order_relaxed);
|
200
|
+
return std::move(read_state->result);
|
201
|
+
};
|
202
|
+
})));
|
203
|
+
}
|
204
|
+
|
205
|
+
// Returns a promise that resolves to `Slice` with at least
|
206
|
+
// `num_bytes` bytes which should be less than INT64_MAX bytes.
|
207
|
+
//
|
208
|
+
// Concurrent reads are not supported, which means callers should not call
|
209
|
+
// `ReadSlice()` before the previous read finishes. Doing that results in
|
210
|
+
// undefined behavior.
|
211
|
+
auto ReadSlice(size_t num_bytes) {
|
212
|
+
return Map(Read(num_bytes),
|
213
|
+
[](absl::StatusOr<SliceBuffer> buffer) -> absl::StatusOr<Slice> {
|
214
|
+
if (!buffer.ok()) return buffer.status();
|
215
|
+
return buffer->JoinIntoSlice();
|
216
|
+
});
|
217
|
+
}
|
218
|
+
|
219
|
+
// Returns a promise that resolves to a byte with type `uint8_t`.
|
220
|
+
auto ReadByte() {
|
221
|
+
return Map(ReadSlice(1),
|
222
|
+
[](absl::StatusOr<Slice> slice) -> absl::StatusOr<uint8_t> {
|
223
|
+
if (!slice.ok()) return slice.status();
|
224
|
+
return (*slice)[0];
|
225
|
+
});
|
226
|
+
}
|
227
|
+
|
228
|
+
// Enables RPC receive coalescing and alignment of memory holding received
|
229
|
+
// RPCs.
|
230
|
+
void EnforceRxMemoryAlignmentAndCoalescing() {
|
231
|
+
auto* chaotic_good_ext = grpc_event_engine::experimental::QueryExtension<
|
232
|
+
grpc_event_engine::experimental::ChaoticGoodExtension>(endpoint_.get());
|
233
|
+
if (chaotic_good_ext != nullptr) {
|
234
|
+
chaotic_good_ext->EnforceRxMemoryAlignment();
|
235
|
+
chaotic_good_ext->EnableRpcReceiveCoalescing();
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
|
240
|
+
GetPeerAddress() const;
|
241
|
+
const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
|
242
|
+
GetLocalAddress() const;
|
243
|
+
|
244
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
|
245
|
+
GetEventEngineEndpoint() const {
|
246
|
+
return endpoint_;
|
247
|
+
}
|
248
|
+
|
249
|
+
private:
|
250
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
|
251
|
+
endpoint_;
|
252
|
+
|
253
|
+
struct ReadState : public RefCounted<ReadState> {
|
254
|
+
std::atomic<bool> complete{false};
|
255
|
+
// Read buffer used for storing successful reads given by
|
256
|
+
// `EventEngine::Endpoint` but not yet requested by the caller.
|
257
|
+
grpc_event_engine::experimental::SliceBuffer buffer;
|
258
|
+
// Buffer used to accept data from `EventEngine::Endpoint`.
|
259
|
+
// Every time after a successful read from `EventEngine::Endpoint`, the data
|
260
|
+
// in this buffer should be appended to `buffer`.
|
261
|
+
grpc_event_engine::experimental::SliceBuffer pending_buffer;
|
262
|
+
// Used for store the result from `EventEngine::Endpoint::Read()`.
|
263
|
+
absl::Status result;
|
264
|
+
Waker waker;
|
265
|
+
// Backing endpoint: we keep this on ReadState as reads will need to
|
266
|
+
// repeatedly read until the target size is hit, and we don't want to access
|
267
|
+
// the main object during this dance (indeed the main object may be
|
268
|
+
// deleted).
|
269
|
+
std::weak_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
|
270
|
+
endpoint;
|
271
|
+
|
272
|
+
void Complete(absl::Status status, size_t num_bytes_requested);
|
273
|
+
};
|
274
|
+
|
275
|
+
struct WriteState : public RefCounted<WriteState> {
|
276
|
+
enum State : uint8_t {
|
277
|
+
kIdle, // Not writing.
|
278
|
+
kWriting, // Write started, but not completed.
|
279
|
+
kWritten, // Write completed.
|
280
|
+
};
|
281
|
+
|
282
|
+
std::atomic<State> state{kIdle};
|
283
|
+
// Write buffer used for `EventEngine::Endpoint::Write()` to ensure the
|
284
|
+
// memory behind the buffer is not lost.
|
285
|
+
grpc_event_engine::experimental::SliceBuffer buffer;
|
286
|
+
// Used for store the result from `EventEngine::Endpoint::Write()`.
|
287
|
+
absl::Status result;
|
288
|
+
Waker waker;
|
289
|
+
|
290
|
+
void Complete(absl::Status status) {
|
291
|
+
result = std::move(status);
|
292
|
+
auto w = std::move(waker);
|
293
|
+
auto prev = state.exchange(kWritten, std::memory_order_release);
|
294
|
+
// Previous state should be Writing. If we got anything else we've entered
|
295
|
+
// the callback path twice.
|
296
|
+
CHECK(prev == kWriting);
|
297
|
+
w.Wakeup();
|
298
|
+
}
|
299
|
+
};
|
300
|
+
|
301
|
+
RefCountedPtr<WriteState> write_state_ = MakeRefCounted<WriteState>();
|
302
|
+
RefCountedPtr<ReadState> read_state_ = MakeRefCounted<ReadState>();
|
303
|
+
};
|
304
|
+
|
305
|
+
} // namespace grpc_core
|
306
|
+
|
307
|
+
#endif // GRPC_SRC_CORE_LIB_TRANSPORT_PROMISE_ENDPOINT_H
|
@@ -102,11 +102,10 @@ class ChildPolicyHandler::Helper final
|
|
102
102
|
parent()->channel_control_helper()->RequestReresolution();
|
103
103
|
}
|
104
104
|
|
105
|
-
void AddTraceEvent(
|
106
|
-
absl::string_view message) override {
|
105
|
+
void AddTraceEvent(absl::string_view message) override {
|
107
106
|
if (parent()->shutting_down_) return;
|
108
107
|
if (!CalledByPendingChild() && !CalledByCurrentChild()) return;
|
109
|
-
parent()->channel_control_helper()->AddTraceEvent(
|
108
|
+
parent()->channel_control_helper()->AddTraceEvent(message);
|
110
109
|
}
|
111
110
|
|
112
111
|
void set_child(LoadBalancingPolicy* child) { child_ = child; }
|
@@ -289,7 +288,6 @@ OrphanablePtr<LoadBalancingPolicy> ChildPolicyHandler::CreateChildPolicy(
|
|
289
288
|
<< lb_policy.get() << ")";
|
290
289
|
}
|
291
290
|
channel_control_helper()->AddTraceEvent(
|
292
|
-
ChannelControlHelper::TRACE_INFO,
|
293
291
|
absl::StrCat("Created new LB policy \"", child_policy_name, "\""));
|
294
292
|
grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
|
295
293
|
interested_parties());
|
@@ -81,9 +81,8 @@ class LoadBalancingPolicy::DelegatingChannelControlHelper
|
|
81
81
|
return parent_helper()->GetStatsPluginGroup();
|
82
82
|
}
|
83
83
|
|
84
|
-
void AddTraceEvent(
|
85
|
-
|
86
|
-
parent_helper()->AddTraceEvent(severity, message);
|
84
|
+
void AddTraceEvent(absl::string_view message) override {
|
85
|
+
parent_helper()->AddTraceEvent(message);
|
87
86
|
}
|
88
87
|
|
89
88
|
private:
|
@@ -221,11 +221,7 @@ class HealthProducer::HealthChecker::HealthStreamEventHandler final
|
|
221
221
|
LOG(ERROR) << kErrorMessage;
|
222
222
|
auto* channelz_node =
|
223
223
|
health_checker_->producer_->subchannel_->channelz_node();
|
224
|
-
|
225
|
-
channelz_node->AddTraceEvent(
|
226
|
-
channelz::ChannelTrace::Error,
|
227
|
-
grpc_slice_from_static_string(kErrorMessage));
|
228
|
-
}
|
224
|
+
GRPC_CHANNELZ_LOG(channelz_node) << kErrorMessage;
|
229
225
|
SetHealthStatusLocked(client, GRPC_CHANNEL_READY, kErrorMessage);
|
230
226
|
}
|
231
227
|
}
|
@@ -336,9 +336,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
|
|
336
336
|
GetStatsPluginGroup() = 0;
|
337
337
|
|
338
338
|
/// Adds a trace message associated with the channel.
|
339
|
-
|
340
|
-
virtual void AddTraceEvent(TraceSeverity severity,
|
341
|
-
absl::string_view message) = 0;
|
339
|
+
virtual void AddTraceEvent(absl::string_view message) = 0;
|
342
340
|
};
|
343
341
|
|
344
342
|
class DelegatingChannelControlHelper;
|
@@ -145,11 +145,7 @@ class OrcaProducer::OrcaStreamEventHandler final
|
|
145
145
|
"Orca stream returned UNIMPLEMENTED; disabling";
|
146
146
|
LOG(ERROR) << kErrorMessage;
|
147
147
|
auto* channelz_node = producer_->subchannel_->channelz_node();
|
148
|
-
|
149
|
-
channelz_node->AddTraceEvent(
|
150
|
-
channelz::ChannelTrace::Error,
|
151
|
-
grpc_slice_from_static_string(kErrorMessage));
|
152
|
-
}
|
148
|
+
GRPC_CHANNELZ_LOG(channelz_node) << kErrorMessage;
|
153
149
|
}
|
154
150
|
}
|
155
151
|
|
@@ -528,6 +528,9 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
|
|
528
528
|
});
|
529
529
|
if (endpoints.empty()) {
|
530
530
|
status = absl::UnavailableError("address list must not be empty");
|
531
|
+
// TODO(roth): Replace this one-off special case with a more
|
532
|
+
// general solution.
|
533
|
+
if (IsPickFirstIgnoreEmptyUpdatesEnabled()) args.addresses = status;
|
531
534
|
} else {
|
532
535
|
// Shuffle the list if needed.
|
533
536
|
auto config = static_cast<PickFirstConfig*>(args.config.get());
|
@@ -397,7 +397,14 @@ absl::Status CdsLb::UpdateLocked(UpdateArgs args) {
|
|
397
397
|
cluster_name_, new_cluster_config->cluster->use_http_connect,
|
398
398
|
endpoint_config.endpoints,
|
399
399
|
child_name_state_.priority_child_numbers);
|
400
|
-
|
400
|
+
std::vector<absl::string_view> resolution_notes;
|
401
|
+
if (!args.resolution_note.empty()) {
|
402
|
+
resolution_notes.emplace_back(args.resolution_note);
|
403
|
+
}
|
404
|
+
if (!endpoint_config.resolution_note.empty()) {
|
405
|
+
resolution_notes.emplace_back(endpoint_config.resolution_note);
|
406
|
+
}
|
407
|
+
update_args.resolution_note = absl::StrJoin(resolution_notes, "; ");
|
401
408
|
// Construct child policy config.
|
402
409
|
child_policy_config_json = CreateChildPolicyConfigForLeafCluster(
|
403
410
|
*new_cluster_config, endpoint_config, aggregate_cluster_resource);
|
@@ -405,6 +412,8 @@ absl::Status CdsLb::UpdateLocked(UpdateArgs args) {
|
|
405
412
|
// Aggregate cluster.
|
406
413
|
[&](const XdsConfig::ClusterConfig::AggregateConfig& aggregate_config) {
|
407
414
|
child_name_state_.Reset();
|
415
|
+
// Populate resolution_note for child policy.
|
416
|
+
update_args.resolution_note = aggregate_config.resolution_note;
|
408
417
|
// Construct child policy config.
|
409
418
|
child_policy_config_json =
|
410
419
|
CreateChildPolicyConfigForAggregateCluster(aggregate_config);
|
@@ -28,6 +28,7 @@ extern void GcpAuthenticationFilterRegister(
|
|
28
28
|
extern void RegisterXdsChannelStackModifier(
|
29
29
|
CoreConfiguration::Builder* builder);
|
30
30
|
extern void RegisterChannelDefaultCreds(CoreConfiguration::Builder* builder);
|
31
|
+
extern void RegisterDefaultCallCreds(CoreConfiguration::Builder* builder);
|
31
32
|
extern void RegisterXdsResolver(CoreConfiguration::Builder* builder);
|
32
33
|
extern void RegisterCloud2ProdResolver(CoreConfiguration::Builder* builder);
|
33
34
|
extern void RegisterXdsClusterManagerLbPolicy(
|
@@ -52,6 +53,7 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
|
|
52
53
|
GcpAuthenticationFilterRegister(builder);
|
53
54
|
RegisterXdsChannelStackModifier(builder);
|
54
55
|
RegisterChannelDefaultCreds(builder);
|
56
|
+
RegisterDefaultCallCreds(builder);
|
55
57
|
RegisterXdsResolver(builder);
|
56
58
|
RegisterCloud2ProdResolver(builder);
|
57
59
|
RegisterXdsClusterManagerLbPolicy(builder);
|
@@ -41,10 +41,10 @@ XdsConfig::ClusterConfig::ClusterConfig(
|
|
41
41
|
|
42
42
|
XdsConfig::ClusterConfig::ClusterConfig(
|
43
43
|
std::shared_ptr<const XdsClusterResource> cluster,
|
44
|
-
std::vector<absl::string_view> leaf_clusters)
|
44
|
+
std::vector<absl::string_view> leaf_clusters, std::string resolution_note)
|
45
45
|
: cluster(std::move(cluster)),
|
46
46
|
children(absl::in_place_type_t<AggregateConfig>(),
|
47
|
-
std::move(leaf_clusters)) {}
|
47
|
+
std::move(leaf_clusters), std::move(resolution_note)) {}
|
48
48
|
|
49
49
|
//
|
50
50
|
// XdsConfig
|
@@ -81,7 +81,10 @@ std::string XdsConfig::ToString() const {
|
|
81
81
|
[&](const ClusterConfig::AggregateConfig& aggregate_config) {
|
82
82
|
parts.push_back(absl::StrCat(
|
83
83
|
" leaf_clusters: [",
|
84
|
-
absl::StrJoin(aggregate_config.leaf_clusters, ", "),
|
84
|
+
absl::StrJoin(aggregate_config.leaf_clusters, ", "),
|
85
|
+
"],\n"
|
86
|
+
" resolution_note: \"",
|
87
|
+
aggregate_config.resolution_note, "\"\n"));
|
85
88
|
});
|
86
89
|
parts.push_back(
|
87
90
|
" }\n"
|
@@ -66,11 +66,15 @@ struct XdsConfig : public RefCounted<XdsConfig> {
|
|
66
66
|
// The list of leaf clusters for an aggregate cluster.
|
67
67
|
struct AggregateConfig {
|
68
68
|
std::vector<absl::string_view> leaf_clusters;
|
69
|
+
std::string resolution_note;
|
69
70
|
|
70
|
-
|
71
|
-
|
71
|
+
AggregateConfig(std::vector<absl::string_view> leaf_clusters,
|
72
|
+
std::string resolution_note)
|
73
|
+
: leaf_clusters(std::move(leaf_clusters)),
|
74
|
+
resolution_note(std::move(resolution_note)) {}
|
72
75
|
bool operator==(const AggregateConfig& other) const {
|
73
|
-
return leaf_clusters == other.leaf_clusters
|
76
|
+
return leaf_clusters == other.leaf_clusters &&
|
77
|
+
resolution_note == other.resolution_note;
|
74
78
|
}
|
75
79
|
};
|
76
80
|
std::variant<EndpointConfig, AggregateConfig> children;
|
@@ -81,7 +85,8 @@ struct XdsConfig : public RefCounted<XdsConfig> {
|
|
81
85
|
std::string resolution_note);
|
82
86
|
// Ctor for aggregate clusters.
|
83
87
|
ClusterConfig(std::shared_ptr<const XdsClusterResource> cluster,
|
84
|
-
std::vector<absl::string_view> leaf_clusters
|
88
|
+
std::vector<absl::string_view> leaf_clusters,
|
89
|
+
std::string resolution_note);
|
85
90
|
|
86
91
|
bool operator==(const ClusterConfig& other) const {
|
87
92
|
return cluster == other.cluster && children == other.children;
|
@@ -656,8 +656,12 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
|
|
656
656
|
cluster_config_map,
|
657
657
|
std::set<absl::string_view>* eds_resources_seen,
|
658
658
|
std::set<absl::string_view>* dns_names_seen,
|
659
|
-
absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters
|
660
|
-
|
659
|
+
absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters,
|
660
|
+
std::vector<std::string>* resolution_notes) {
|
661
|
+
if (depth > 0) {
|
662
|
+
CHECK_NE(leaf_clusters, nullptr);
|
663
|
+
CHECK_NE(resolution_notes, nullptr);
|
664
|
+
}
|
661
665
|
if (depth == kMaxXdsAggregateClusterRecursionDepth) {
|
662
666
|
*leaf_clusters =
|
663
667
|
absl::UnavailableError("aggregate cluster graph exceeds max depth");
|
@@ -687,6 +691,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
|
|
687
691
|
// If there was an error fetching the CDS resource, report the error.
|
688
692
|
if (!state.update.ok()) {
|
689
693
|
cluster_config = state.update.status();
|
694
|
+
if (resolution_notes != nullptr) {
|
695
|
+
resolution_notes->emplace_back(state.update.status().message());
|
696
|
+
}
|
690
697
|
return true;
|
691
698
|
}
|
692
699
|
// If we don't have the resource yet, we can't return a config yet.
|
@@ -785,12 +792,13 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
|
|
785
792
|
// Recursively expand leaf clusters.
|
786
793
|
absl::StatusOr<std::vector<absl::string_view>> child_leaf_clusters;
|
787
794
|
child_leaf_clusters.emplace();
|
795
|
+
std::vector<std::string> child_resolution_notes;
|
788
796
|
bool have_all_resources = true;
|
789
797
|
for (const std::string& child_name :
|
790
798
|
aggregate.prioritized_cluster_names) {
|
791
799
|
have_all_resources &= PopulateClusterConfigMap(
|
792
800
|
child_name, depth + 1, cluster_config_map, eds_resources_seen,
|
793
|
-
dns_names_seen, &child_leaf_clusters);
|
801
|
+
dns_names_seen, &child_leaf_clusters, &child_resolution_notes);
|
794
802
|
if (!child_leaf_clusters.ok()) break;
|
795
803
|
}
|
796
804
|
// Note that we cannot use the cluster_config reference we
|
@@ -807,12 +815,18 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
|
|
807
815
|
}
|
808
816
|
return true;
|
809
817
|
}
|
810
|
-
// If needed, propagate leaf cluster list
|
818
|
+
// If needed, propagate leaf cluster list and resolution note
|
819
|
+
// lists up the tree.
|
811
820
|
if (leaf_clusters != nullptr) {
|
812
821
|
(*leaf_clusters)
|
813
822
|
->insert((*leaf_clusters)->end(), child_leaf_clusters->begin(),
|
814
823
|
child_leaf_clusters->end());
|
815
824
|
}
|
825
|
+
if (resolution_notes != nullptr) {
|
826
|
+
resolution_notes->insert(resolution_notes->end(),
|
827
|
+
child_resolution_notes.begin(),
|
828
|
+
child_resolution_notes.end());
|
829
|
+
}
|
816
830
|
// If there are no leaf clusters, report an error for the cluster.
|
817
831
|
if (have_all_resources && child_leaf_clusters->empty()) {
|
818
832
|
aggregate_cluster_config = absl::UnavailableError(
|
@@ -825,8 +839,9 @@ bool XdsDependencyManager::PopulateClusterConfigMap(
|
|
825
839
|
// at the root of the tree, because we need to make sure the list
|
826
840
|
// of underlying cluster names stays alive so that the leaf cluster
|
827
841
|
// list of the root aggregate cluster can point to those strings.
|
828
|
-
aggregate_cluster_config.emplace(
|
829
|
-
|
842
|
+
aggregate_cluster_config.emplace(
|
843
|
+
std::move(cluster_resource), std::move(*child_leaf_clusters),
|
844
|
+
absl::StrJoin(child_resolution_notes, "; "));
|
830
845
|
return have_all_resources;
|
831
846
|
});
|
832
847
|
}
|
@@ -172,7 +172,8 @@ class XdsDependencyManager final : public RefCounted<XdsDependencyManager>,
|
|
172
172
|
cluster_config_map,
|
173
173
|
std::set<absl::string_view>* eds_resources_seen,
|
174
174
|
std::set<absl::string_view>* dns_names_seen,
|
175
|
-
absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters = nullptr
|
175
|
+
absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters = nullptr,
|
176
|
+
std::vector<std::string>* resolution_notes = nullptr);
|
176
177
|
|
177
178
|
// Called when an external cluster subscription is unreffed.
|
178
179
|
void OnClusterSubscriptionUnref(absl::string_view cluster_name,
|