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
@@ -27,11 +27,12 @@
|
|
27
27
|
|
28
28
|
#include "absl/base/thread_annotations.h"
|
29
29
|
#include "absl/container/flat_hash_map.h"
|
30
|
+
#include "absl/container/inlined_vector.h"
|
30
31
|
#include "absl/functional/any_invocable.h"
|
31
|
-
#include "absl/hash/hash.h"
|
32
32
|
#include "absl/status/status.h"
|
33
33
|
#include "absl/status/statusor.h"
|
34
34
|
#include "absl/strings/string_view.h"
|
35
|
+
#include "src/core/lib/event_engine/ares_resolver.h"
|
35
36
|
#include "src/core/lib/event_engine/handle_containers.h"
|
36
37
|
#include "src/core/lib/event_engine/posix.h"
|
37
38
|
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
|
@@ -39,7 +40,6 @@
|
|
39
40
|
#include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
|
40
41
|
#include "src/core/lib/event_engine/thread_pool/thread_pool.h"
|
41
42
|
#include "src/core/lib/iomgr/port.h"
|
42
|
-
#include "src/core/lib/surface/init_internally.h"
|
43
43
|
#include "src/core/util/orphanable.h"
|
44
44
|
#include "src/core/util/sync.h"
|
45
45
|
|
@@ -103,7 +103,7 @@ class PosixEnginePollerManager
|
|
103
103
|
explicit PosixEnginePollerManager(
|
104
104
|
std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
|
105
105
|
poller);
|
106
|
-
grpc_event_engine::experimental::PosixEventPoller* Poller() {
|
106
|
+
grpc_event_engine::experimental::PosixEventPoller* Poller() const {
|
107
107
|
return poller_.get();
|
108
108
|
}
|
109
109
|
|
@@ -118,8 +118,6 @@ class PosixEnginePollerManager
|
|
118
118
|
}
|
119
119
|
void TriggerShutdown();
|
120
120
|
|
121
|
-
~PosixEnginePollerManager() override;
|
122
|
-
|
123
121
|
private:
|
124
122
|
enum class PollerState { kExternal, kOk, kShuttingDown };
|
125
123
|
std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller> poller_;
|
@@ -127,12 +125,12 @@ class PosixEnginePollerManager
|
|
127
125
|
std::shared_ptr<ThreadPool> executor_;
|
128
126
|
bool trigger_shutdown_called_;
|
129
127
|
};
|
128
|
+
|
130
129
|
#endif // GRPC_POSIX_SOCKET_TCP
|
131
130
|
|
132
131
|
// An iomgr-based Posix EventEngine implementation.
|
133
132
|
// All methods require an ExecCtx to already exist on the thread's stack.
|
134
|
-
class PosixEventEngine final : public PosixEventEngineWithFdSupport
|
135
|
-
public grpc_core::KeepsGrpcInitialized {
|
133
|
+
class PosixEventEngine final : public PosixEventEngineWithFdSupport {
|
136
134
|
public:
|
137
135
|
class PosixDNSResolver : public EventEngine::DNSResolver {
|
138
136
|
public:
|
@@ -198,6 +196,13 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
|
|
198
196
|
bool Cancel(TaskHandle handle) override;
|
199
197
|
|
200
198
|
#ifdef GRPC_POSIX_SOCKET_TCP
|
199
|
+
|
200
|
+
#ifdef GRPC_ENABLE_FORK_SUPPORT
|
201
|
+
enum class OnForkRole { kChild, kParent };
|
202
|
+
void AfterFork(OnForkRole on_fork_role);
|
203
|
+
void BeforeFork();
|
204
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
205
|
+
|
201
206
|
// The posix EventEngine returned by this method would have a shared ownership
|
202
207
|
// of the poller and would not be in-charge of driving the poller by calling
|
203
208
|
// its Work(..) method. Instead its upto the test to drive the poller. The
|
@@ -209,15 +214,15 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
|
|
209
214
|
#endif // GRPC_POSIX_SOCKET_TCP
|
210
215
|
|
211
216
|
private:
|
217
|
+
friend class AresResolverTest;
|
212
218
|
struct ClosureData;
|
213
219
|
|
214
220
|
PosixEventEngine();
|
215
221
|
|
216
222
|
#ifdef GRPC_POSIX_SOCKET_TCP
|
217
|
-
// Constructs an EventEngine which has a shared ownership of the poller.
|
218
|
-
//
|
219
|
-
//
|
220
|
-
// tests.
|
223
|
+
// Constructs an EventEngine which has a shared ownership of the poller. Use
|
224
|
+
// the MakeTestOnlyPosixEventEngine static method to call this. Its expected
|
225
|
+
// to be used only in tests.
|
221
226
|
explicit PosixEventEngine(
|
222
227
|
std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
|
223
228
|
poller);
|
@@ -234,11 +239,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
|
|
234
239
|
ABSL_GUARDED_BY(&mu);
|
235
240
|
};
|
236
241
|
|
237
|
-
static void PollerWorkInternal(
|
238
|
-
std::shared_ptr<PosixEnginePollerManager> poller_manager);
|
239
|
-
|
240
242
|
ConnectionHandle CreateEndpointFromUnconnectedFdInternal(
|
241
|
-
|
243
|
+
const FileDescriptor& fd, EventEngine::OnConnectCallback on_connect,
|
242
244
|
const EventEngine::ResolvedAddress& addr, const PosixTcpOptions& options,
|
243
245
|
MemoryAllocator memory_allocator, EventEngine::Duration timeout);
|
244
246
|
|
@@ -249,14 +251,55 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
|
|
249
251
|
|
250
252
|
#endif // GRPC_POSIX_SOCKET_TCP
|
251
253
|
|
254
|
+
#if GRPC_ENABLE_FORK_SUPPORT
|
255
|
+
void AfterForkInChild();
|
256
|
+
#endif
|
257
|
+
|
252
258
|
grpc_core::Mutex mu_;
|
253
259
|
TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_);
|
254
260
|
std::atomic<intptr_t> aba_token_{0};
|
261
|
+
#if GRPC_ENABLE_FORK_SUPPORT && GRPC_ARES == 1 && \
|
262
|
+
defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
|
263
|
+
// A separate mutex to avoid deadlocks.
|
264
|
+
grpc_core::Mutex resolver_handles_mu_;
|
265
|
+
absl::InlinedVector<std::weak_ptr<AresResolver::ReinitHandle>, 16>
|
266
|
+
resolver_handles_ ABSL_GUARDED_BY(resolver_handles_mu_);
|
267
|
+
#endif // defined(GRPC_ENABLE_FORK_SUPPORT) && GRPC_ARES == 1 &&
|
268
|
+
// defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
|
255
269
|
std::shared_ptr<ThreadPool> executor_;
|
270
|
+
|
271
|
+
#if defined(GRPC_POSIX_SOCKET_TCP) && \
|
272
|
+
!defined(GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER)
|
273
|
+
|
274
|
+
// RAII wrapper for a polling cycle. Starts a new one in ctor and stops
|
275
|
+
// in dtor.
|
276
|
+
class PollingCycle {
|
277
|
+
public:
|
278
|
+
explicit PollingCycle(PosixEnginePollerManager* poller_manager);
|
279
|
+
~PollingCycle();
|
280
|
+
|
281
|
+
private:
|
282
|
+
void PollerWorkInternal();
|
283
|
+
|
284
|
+
PosixEnginePollerManager* poller_manager_;
|
285
|
+
grpc_core::Mutex mu_;
|
286
|
+
std::atomic_bool done_{false};
|
287
|
+
int is_scheduled_ ABSL_GUARDED_BY(&mu_) = 0;
|
288
|
+
grpc_core::CondVar cond_;
|
289
|
+
};
|
290
|
+
|
291
|
+
void SchedulePoller();
|
292
|
+
void ResetPollCycle();
|
293
|
+
|
294
|
+
PosixEnginePollerManager poller_manager_;
|
295
|
+
|
296
|
+
// Ensures there's ever only one of these.
|
297
|
+
std::optional<PollingCycle> polling_cycle_ ABSL_GUARDED_BY(&mu_);
|
298
|
+
|
299
|
+
#endif // defined(GRPC_POSIX_SOCKET_TCP) &&
|
300
|
+
// !defined(GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER)
|
301
|
+
|
256
302
|
std::shared_ptr<TimerManager> timer_manager_;
|
257
|
-
#ifdef GRPC_POSIX_SOCKET_TCP
|
258
|
-
std::shared_ptr<PosixEnginePollerManager> poller_manager_;
|
259
|
-
#endif // GRPC_POSIX_SOCKET_TCP
|
260
303
|
};
|
261
304
|
|
262
305
|
} // namespace grpc_event_engine::experimental
|
@@ -30,7 +30,6 @@
|
|
30
30
|
#include <optional>
|
31
31
|
#include <string>
|
32
32
|
#include <tuple>
|
33
|
-
#include <type_traits>
|
34
33
|
#include <utility>
|
35
34
|
|
36
35
|
#include "absl/functional/any_invocable.h"
|
@@ -42,6 +41,7 @@
|
|
42
41
|
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
|
43
42
|
#include "src/core/lib/event_engine/posix_engine/posix_endpoint.h"
|
44
43
|
#include "src/core/lib/event_engine/posix_engine/posix_engine_listener.h"
|
44
|
+
#include "src/core/lib/event_engine/posix_engine/posix_interface.h"
|
45
45
|
#include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
|
46
46
|
#include "src/core/lib/event_engine/tcp_socket_utils.h"
|
47
47
|
#include "src/core/lib/iomgr/socket_mutator.h"
|
@@ -80,16 +80,15 @@ absl::StatusOr<int> PosixEngineListenerImpl::Bind(
|
|
80
80
|
CHECK(addr.size() <= EventEngine::ResolvedAddress::MAX_SIZE_BYTES);
|
81
81
|
UnlinkIfUnixDomainSocket(addr);
|
82
82
|
|
83
|
+
EventEnginePosixInterface& posix_interface = poller_->posix_interface();
|
84
|
+
|
83
85
|
/// Check if this is a wildcard port, and if so, try to keep the port the same
|
84
86
|
/// as some previously created listener socket.
|
85
87
|
for (auto it = acceptors_.begin();
|
86
88
|
requested_port == 0 && it != acceptors_.end(); it++) {
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
const_cast<sockaddr*>(sockname_temp.address()),
|
91
|
-
&len)) {
|
92
|
-
int used_port = ResolvedAddressGetPort(sockname_temp);
|
89
|
+
auto sockname_temp = posix_interface.LocalAddress((*it)->Fd());
|
90
|
+
if (sockname_temp.ok()) {
|
91
|
+
int used_port = ResolvedAddressGetPort(*sockname_temp);
|
93
92
|
if (used_port > 0) {
|
94
93
|
requested_port = used_port;
|
95
94
|
ResolvedAddressSetPort(res_addr, requested_port);
|
@@ -97,21 +96,21 @@ absl::StatusOr<int> PosixEngineListenerImpl::Bind(
|
|
97
96
|
}
|
98
97
|
}
|
99
98
|
}
|
100
|
-
|
101
99
|
auto used_port = MaybeGetWildcardPortFromAddress(res_addr);
|
102
100
|
// Update the callback. Any subsequent new sockets created and added to
|
103
101
|
// acceptors_ in this function will invoke the new callback.
|
104
102
|
acceptors_.UpdateOnAppendCallback(std::move(on_bind_new_fd));
|
105
103
|
if (used_port.has_value()) {
|
106
104
|
requested_port = *used_port;
|
107
|
-
return ListenerContainerAddWildcardAddresses(
|
108
|
-
requested_port);
|
105
|
+
return ListenerContainerAddWildcardAddresses(&posix_interface, acceptors_,
|
106
|
+
options_, requested_port);
|
109
107
|
}
|
110
108
|
if (ResolvedAddressToV4Mapped(res_addr, &addr6_v4mapped)) {
|
111
109
|
res_addr = addr6_v4mapped;
|
112
110
|
}
|
113
111
|
|
114
|
-
auto result =
|
112
|
+
auto result =
|
113
|
+
CreateAndPrepareListenerSocket(&posix_interface, options_, res_addr);
|
115
114
|
GRPC_RETURN_IF_ERROR(result.status());
|
116
115
|
acceptors_.Append(*result);
|
117
116
|
return result->port;
|
@@ -136,22 +135,31 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
|
|
136
135
|
for (;;) {
|
137
136
|
EventEngine::ResolvedAddress addr;
|
138
137
|
memset(const_cast<sockaddr*>(addr.address()), 0, addr.size());
|
138
|
+
auto& posix_interface = handle_->Poller()->posix_interface();
|
139
139
|
// Note: If we ever decide to return this address to the user, remember to
|
140
140
|
// strip off the ::ffff:0.0.0.0/96 prefix first.
|
141
|
-
|
142
|
-
if (fd
|
143
|
-
|
141
|
+
auto fd = posix_interface.Accept4(handle_->WrappedFd(), addr, 1, 1);
|
142
|
+
if (fd.IsWrongGenerationError()) {
|
143
|
+
LOG(ERROR) << "Closing acceptor. accept4 was called with fd from a wrong "
|
144
|
+
"generation";
|
145
|
+
// Shutting down the acceptor. Unref the ref grabbed in
|
146
|
+
// AsyncConnectionAcceptor::Start().
|
147
|
+
Unref();
|
148
|
+
return;
|
149
|
+
}
|
150
|
+
if (fd.IsPosixError()) {
|
151
|
+
switch (*fd.errno_value()) {
|
144
152
|
case EINTR:
|
145
153
|
continue;
|
146
154
|
case EMFILE:
|
147
|
-
// When the process runs out of
|
148
|
-
// this happens, the connection is left in the accept
|
149
|
-
// either a read event triggers the on_read callback, or
|
150
|
-
// passed and the accept should be re-tried regardless. This
|
151
|
-
// is not cancelled, so a spurious wakeup may occur even when
|
152
|
-
// nothing to accept. This is not a performant code path, but
|
153
|
-
// limit has been reached, the system is likely in an unhappy
|
154
|
-
// regardless.
|
155
|
+
// When the process runs out of posix_interface, accept4() returns
|
156
|
+
// EMFILE. When this happens, the connection is left in the accept
|
157
|
+
// queue until either a read event triggers the on_read callback, or
|
158
|
+
// time has passed and the accept should be re-tried regardless. This
|
159
|
+
// callback is not cancelled, so a spurious wakeup may occur even when
|
160
|
+
// there's nothing to accept. This is not a performant code path, but
|
161
|
+
// if an fd limit has been reached, the system is likely in an unhappy
|
162
|
+
// state regardless.
|
155
163
|
LOG_EVERY_N_SEC(ERROR, 1)
|
156
164
|
<< "File descriptor limit reached. Retrying.";
|
157
165
|
handle_->NotifyOnRead(notify_on_accept_);
|
@@ -186,8 +194,8 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
|
|
186
194
|
// For UNIX sockets, the accept call might not fill up the member
|
187
195
|
// sun_path of sockaddr_un, so explicitly call getpeername to get it.
|
188
196
|
if (addr.address()->sa_family == AF_UNIX) {
|
189
|
-
|
190
|
-
if (
|
197
|
+
auto peer_address = posix_interface.PeerAddress(fd.value());
|
198
|
+
if (!peer_address.ok()) {
|
191
199
|
auto listener_addr_uri = ResolvedAddressToURI(socket_.addr);
|
192
200
|
LOG(ERROR) << "Failed getpeername: " << grpc_core::StrError(errno)
|
193
201
|
<< ". Dropping the connection, and continuing "
|
@@ -195,17 +203,16 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
|
|
195
203
|
<< (listener_addr_uri.ok() ? *listener_addr_uri
|
196
204
|
: "<unknown>")
|
197
205
|
<< ":" << socket_.port;
|
198
|
-
|
206
|
+
posix_interface.Close(fd.value());
|
199
207
|
handle_->NotifyOnRead(notify_on_accept_);
|
200
208
|
return;
|
201
209
|
}
|
202
|
-
addr =
|
210
|
+
addr = std::move(peer_address).value();
|
203
211
|
}
|
204
212
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
GRPC_FD_SERVER_CONNECTION_USAGE, listener_->options_);
|
213
|
+
(void)posix_interface.SetSocketNoSigpipeIfPossible(fd.value());
|
214
|
+
auto result = posix_interface.ApplySocketMutatorInOptions(
|
215
|
+
fd.value(), GRPC_FD_SERVER_CONNECTION_USAGE, listener_->options_);
|
209
216
|
if (!result.ok()) {
|
210
217
|
LOG(ERROR) << "Closing acceptor. Failed to apply socket mutator: "
|
211
218
|
<< result;
|
@@ -226,7 +233,7 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
|
|
226
233
|
}
|
227
234
|
auto endpoint = CreatePosixEndpoint(
|
228
235
|
/*handle=*/listener_->poller_->CreateHandle(
|
229
|
-
fd, *peer_name, listener_->poller_->CanTrackErrors()),
|
236
|
+
fd.value(), *peer_name, listener_->poller_->CanTrackErrors()),
|
230
237
|
/*on_shutdown=*/nullptr, /*engine=*/listener_->engine_,
|
231
238
|
// allocator=
|
232
239
|
listener_->memory_allocator_factory_->CreateMemoryAllocator(
|
@@ -238,7 +245,7 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
|
|
238
245
|
// Call on_accept_ and then resume accepting new connections
|
239
246
|
// by continuing the parent for-loop.
|
240
247
|
listener_->on_accept_(
|
241
|
-
/*listener_fd=*/handle_->WrappedFd(),
|
248
|
+
/*listener_fd=*/handle_->WrappedFd().fd(),
|
242
249
|
/*endpoint=*/std::move(endpoint),
|
243
250
|
/*is_external=*/false,
|
244
251
|
/*memory_allocator=*/
|
@@ -260,18 +267,19 @@ absl::Status PosixEngineListenerImpl::HandleExternalConnection(
|
|
260
267
|
return absl::UnknownError(
|
261
268
|
absl::StrCat("HandleExternalConnection: Invalid peer socket: ", fd));
|
262
269
|
}
|
263
|
-
|
264
|
-
|
265
|
-
|
270
|
+
auto& posix_interface = poller_->posix_interface();
|
271
|
+
FileDescriptor wrapped = posix_interface.Adopt(fd);
|
272
|
+
(void)posix_interface.SetSocketNoSigpipeIfPossible(wrapped);
|
273
|
+
auto peer_name = posix_interface.PeerAddressString(wrapped);
|
266
274
|
if (!peer_name.ok()) {
|
267
275
|
return absl::UnknownError(
|
268
276
|
absl::StrCat("HandleExternalConnection: peer not connected: ",
|
269
277
|
peer_name.status().ToString()));
|
270
278
|
}
|
271
279
|
grpc_core::EnsureRunInExecCtx([this, peer_name = std::move(*peer_name),
|
272
|
-
pending_data, listener_fd,
|
280
|
+
pending_data, listener_fd, wrapped]() mutable {
|
273
281
|
auto endpoint = CreatePosixEndpoint(
|
274
|
-
/*handle=*/poller_->CreateHandle(
|
282
|
+
/*handle=*/poller_->CreateHandle(wrapped, peer_name,
|
275
283
|
poller_->CanTrackErrors()),
|
276
284
|
/*on_shutdown=*/nullptr, /*engine=*/engine_,
|
277
285
|
/*allocator=*/
|
@@ -24,7 +24,6 @@
|
|
24
24
|
#include <atomic>
|
25
25
|
#include <list>
|
26
26
|
#include <memory>
|
27
|
-
#include <string>
|
28
27
|
#include <utility>
|
29
28
|
|
30
29
|
#include "absl/base/thread_annotations.h"
|
@@ -32,6 +31,7 @@
|
|
32
31
|
#include "absl/status/status.h"
|
33
32
|
#include "absl/status/statusor.h"
|
34
33
|
#include "src/core/lib/event_engine/posix.h"
|
34
|
+
#include "src/core/lib/event_engine/posix_engine/posix_interface.h"
|
35
35
|
#include "src/core/lib/iomgr/port.h"
|
36
36
|
#include "src/core/util/sync.h"
|
37
37
|
|
@@ -85,7 +85,7 @@ class PosixEngineListenerImpl
|
|
85
85
|
listener_(std::move(listener)),
|
86
86
|
socket_(socket),
|
87
87
|
handle_(listener_->poller_->CreateHandle(
|
88
|
-
socket_.sock
|
88
|
+
socket_.sock,
|
89
89
|
*grpc_event_engine::experimental::
|
90
90
|
ResolvedAddressToNormalizedString(socket_.addr),
|
91
91
|
listener_->poller_->CanTrackErrors())),
|
@@ -105,8 +105,10 @@ class PosixEngineListenerImpl
|
|
105
105
|
}
|
106
106
|
}
|
107
107
|
ListenerSocketsContainer::ListenerSocket& Socket() { return socket_; }
|
108
|
+
FileDescriptor Fd() { return handle_->WrappedFd(); }
|
108
109
|
~AsyncConnectionAcceptor() {
|
109
|
-
auto address =
|
110
|
+
auto address = handle_->Poller()->posix_interface().LocalAddress(
|
111
|
+
handle_->WrappedFd());
|
110
112
|
if (address.ok()) {
|
111
113
|
// If uds socket, unlink it so that the corresponding file is deleted.
|
112
114
|
UnlinkIfUnixDomainSocket(*address);
|
@@ -140,7 +142,7 @@ class PosixEngineListenerImpl
|
|
140
142
|
acceptors_.push_back(new AsyncConnectionAcceptor(
|
141
143
|
listener_->engine_, listener_->shared_from_this(), socket));
|
142
144
|
if (on_append_) {
|
143
|
-
on_append_(socket.sock.
|
145
|
+
on_append_(socket.sock.fd());
|
144
146
|
}
|
145
147
|
}
|
146
148
|
|
@@ -17,7 +17,6 @@
|
|
17
17
|
#include <grpc/event_engine/event_engine.h>
|
18
18
|
#include <grpc/support/port_platform.h>
|
19
19
|
#include <limits.h>
|
20
|
-
#include <stdio.h>
|
21
20
|
#include <stdlib.h>
|
22
21
|
|
23
22
|
#include <cstdint>
|
@@ -29,16 +28,13 @@
|
|
29
28
|
#include "absl/log/log.h"
|
30
29
|
#include "absl/status/status.h"
|
31
30
|
#include "absl/strings/str_cat.h"
|
32
|
-
#include "
|
31
|
+
#include "src/core/lib/event_engine/posix_engine/posix_interface.h"
|
33
32
|
#include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
|
34
33
|
#include "src/core/lib/event_engine/tcp_socket_utils.h"
|
35
34
|
#include "src/core/lib/iomgr/port.h"
|
36
|
-
#include "src/core/lib/iomgr/socket_mutator.h"
|
37
35
|
#include "src/core/util/crash.h" // IWYU pragma: keep
|
38
36
|
#include "src/core/util/status_helper.h"
|
39
37
|
|
40
|
-
#define MIN_SAFE_ACCEPT_QUEUE_SIZE 100
|
41
|
-
|
42
38
|
#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
|
43
39
|
#include <errno.h> // IWYU pragma: keep
|
44
40
|
#include <ifaddrs.h> // IWYU pragma: keep
|
@@ -59,36 +55,6 @@ using ListenerSocket = ListenerSocketsContainer::ListenerSocket;
|
|
59
55
|
|
60
56
|
#ifdef GRPC_HAVE_IFADDRS
|
61
57
|
|
62
|
-
// Bind to "::" to get a port number not used by any address.
|
63
|
-
absl::StatusOr<int> GetUnusedPort() {
|
64
|
-
ResolvedAddress wild = ResolvedAddressMakeWild6(0);
|
65
|
-
PosixSocketWrapper::DSMode dsmode;
|
66
|
-
auto sock = PosixSocketWrapper::CreateDualStackSocket(nullptr, wild,
|
67
|
-
SOCK_STREAM, 0, dsmode);
|
68
|
-
GRPC_RETURN_IF_ERROR(sock.status());
|
69
|
-
if (dsmode == PosixSocketWrapper::DSMode::DSMODE_IPV4) {
|
70
|
-
wild = ResolvedAddressMakeWild4(0);
|
71
|
-
}
|
72
|
-
if (bind(sock->Fd(), wild.address(), wild.size()) != 0) {
|
73
|
-
close(sock->Fd());
|
74
|
-
return absl::FailedPreconditionError(
|
75
|
-
absl::StrCat("bind(GetUnusedPort): ", std::strerror(errno)));
|
76
|
-
}
|
77
|
-
socklen_t len = wild.size();
|
78
|
-
if (getsockname(sock->Fd(), const_cast<sockaddr*>(wild.address()), &len) !=
|
79
|
-
0) {
|
80
|
-
close(sock->Fd());
|
81
|
-
return absl::FailedPreconditionError(
|
82
|
-
absl::StrCat("getsockname(GetUnusedPort): ", std::strerror(errno)));
|
83
|
-
}
|
84
|
-
close(sock->Fd());
|
85
|
-
int port = ResolvedAddressGetPort(wild);
|
86
|
-
if (port <= 0) {
|
87
|
-
return absl::FailedPreconditionError("Bad port");
|
88
|
-
}
|
89
|
-
return port;
|
90
|
-
}
|
91
|
-
|
92
58
|
bool SystemHasIfAddrs() { return true; }
|
93
59
|
|
94
60
|
#else // GRPC_HAVE_IFADDRS
|
@@ -97,108 +63,28 @@ bool SystemHasIfAddrs() { return false; }
|
|
97
63
|
|
98
64
|
#endif // GRPC_HAVE_IFADDRS
|
99
65
|
|
100
|
-
// get max listen queue size on linux
|
101
|
-
int InitMaxAcceptQueueSize() {
|
102
|
-
int n = SOMAXCONN;
|
103
|
-
char buf[64];
|
104
|
-
FILE* fp = fopen("/proc/sys/net/core/somaxconn", "r");
|
105
|
-
int max_accept_queue_size;
|
106
|
-
if (fp == nullptr) {
|
107
|
-
// 2.4 kernel.
|
108
|
-
return SOMAXCONN;
|
109
|
-
}
|
110
|
-
if (fgets(buf, sizeof buf, fp)) {
|
111
|
-
char* end;
|
112
|
-
long i = strtol(buf, &end, 10);
|
113
|
-
if (i > 0 && i <= INT_MAX && end && *end == '\n') {
|
114
|
-
n = static_cast<int>(i);
|
115
|
-
}
|
116
|
-
}
|
117
|
-
fclose(fp);
|
118
|
-
max_accept_queue_size = n;
|
119
|
-
|
120
|
-
if (max_accept_queue_size < MIN_SAFE_ACCEPT_QUEUE_SIZE) {
|
121
|
-
LOG(INFO) << "Suspiciously small accept queue (" << max_accept_queue_size
|
122
|
-
<< ") will probably lead to connection drops";
|
123
|
-
}
|
124
|
-
return max_accept_queue_size;
|
125
|
-
}
|
126
|
-
|
127
|
-
int GetMaxAcceptQueueSize() {
|
128
|
-
static const int kMaxAcceptQueueSize = InitMaxAcceptQueueSize();
|
129
|
-
return kMaxAcceptQueueSize;
|
130
|
-
}
|
131
|
-
|
132
66
|
// Prepare a recently-created socket for listening.
|
133
|
-
absl::Status PrepareSocket(
|
67
|
+
absl::Status PrepareSocket(EventEnginePosixInterface* posix_interface,
|
68
|
+
const PosixTcpOptions& options,
|
134
69
|
ListenerSocket& socket) {
|
135
|
-
|
136
|
-
|
137
|
-
CHECK_GE(fd, 0);
|
70
|
+
FileDescriptor fd = socket.sock;
|
71
|
+
CHECK(fd.ready());
|
138
72
|
bool close_fd = true;
|
139
|
-
socket.zero_copy_enabled = false;
|
140
73
|
socket.port = 0;
|
141
|
-
auto sock_cleanup =
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
#ifdef GRPC_LINUX_ERRQUEUE
|
153
|
-
if (!socket.sock.SetSocketZeroCopy().ok()) {
|
154
|
-
// it's not fatal, so just log it.
|
155
|
-
VLOG(2) << "Node does not support SO_ZEROCOPY, continuing.";
|
156
|
-
} else {
|
157
|
-
socket.zero_copy_enabled = true;
|
158
|
-
}
|
159
|
-
#endif
|
160
|
-
|
161
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketNonBlocking(1));
|
162
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketCloexec(1));
|
163
|
-
|
164
|
-
if (socket.addr.address()->sa_family != AF_UNIX &&
|
165
|
-
!ResolvedAddressIsVSock(socket.addr)) {
|
166
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketLowLatency(1));
|
167
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketReuseAddr(1));
|
168
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketDscp(options.dscp));
|
169
|
-
socket.sock.TrySetSocketTcpUserTimeout(options, false);
|
170
|
-
}
|
171
|
-
GRPC_RETURN_IF_ERROR(socket.sock.SetSocketNoSigpipeIfPossible());
|
172
|
-
GRPC_RETURN_IF_ERROR(socket.sock.ApplySocketMutatorInOptions(
|
173
|
-
GRPC_FD_SERVER_LISTENER_USAGE, options));
|
174
|
-
|
175
|
-
if (bind(fd, socket.addr.address(), socket.addr.size()) < 0) {
|
176
|
-
auto sockaddr_str = ResolvedAddressToString(socket.addr);
|
177
|
-
if (!sockaddr_str.ok()) {
|
178
|
-
LOG(ERROR) << "Could not convert sockaddr to string: "
|
179
|
-
<< sockaddr_str.status();
|
180
|
-
sockaddr_str = "<unparsable>";
|
181
|
-
}
|
182
|
-
sockaddr_str = absl::StrReplaceAll(*sockaddr_str, {{"\0", "@"}});
|
183
|
-
return absl::FailedPreconditionError(
|
184
|
-
absl::StrCat("Error in bind for address '", *sockaddr_str,
|
185
|
-
"': ", std::strerror(errno)));
|
186
|
-
}
|
187
|
-
|
188
|
-
if (listen(fd, GetMaxAcceptQueueSize()) < 0) {
|
189
|
-
return absl::FailedPreconditionError(
|
190
|
-
absl::StrCat("Error in listen: ", std::strerror(errno)));
|
74
|
+
auto sock_cleanup =
|
75
|
+
absl::MakeCleanup([&close_fd, fd, posix_interface]() -> void {
|
76
|
+
if (close_fd && fd.ready()) {
|
77
|
+
posix_interface->Close(fd);
|
78
|
+
}
|
79
|
+
});
|
80
|
+
auto listen_address =
|
81
|
+
posix_interface->PrepareListenerSocket(socket.sock, options, socket.addr);
|
82
|
+
if (!listen_address.ok()) {
|
83
|
+
return std::move(listen_address).status();
|
191
84
|
}
|
192
85
|
socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
|
193
|
-
|
194
|
-
if (getsockname(fd, const_cast<sockaddr*>(sockname_temp.address()), &len) <
|
195
|
-
0) {
|
196
|
-
return absl::FailedPreconditionError(
|
197
|
-
absl::StrCat("Error in getsockname: ", std::strerror(errno)));
|
198
|
-
}
|
199
|
-
|
200
86
|
socket.port =
|
201
|
-
ResolvedAddressGetPort(ResolvedAddress(
|
87
|
+
ResolvedAddressGetPort(ResolvedAddress(listen_address->address(), len));
|
202
88
|
// No errors. Set close_fd to false to ensure the socket is not closed.
|
203
89
|
close_fd = false;
|
204
90
|
return absl::OkStatus();
|
@@ -207,22 +93,23 @@ absl::Status PrepareSocket(const PosixTcpOptions& options,
|
|
207
93
|
} // namespace
|
208
94
|
|
209
95
|
absl::StatusOr<ListenerSocket> CreateAndPrepareListenerSocket(
|
210
|
-
const PosixTcpOptions& options,
|
96
|
+
EventEnginePosixInterface* posix_interface, const PosixTcpOptions& options,
|
97
|
+
const ResolvedAddress& addr) {
|
211
98
|
ResolvedAddress addr4_copy;
|
212
99
|
ListenerSocket socket;
|
213
|
-
auto result =
|
100
|
+
auto result = posix_interface->CreateDualStackSocket(
|
214
101
|
nullptr, addr, SOCK_STREAM, 0, socket.dsmode);
|
215
102
|
if (!result.ok()) {
|
216
103
|
return result.status();
|
217
104
|
}
|
218
105
|
socket.sock = *result;
|
219
|
-
if (socket.dsmode ==
|
106
|
+
if (socket.dsmode == EventEnginePosixInterface::DSMODE_IPV4 &&
|
220
107
|
ResolvedAddressIsV4Mapped(addr, &addr4_copy)) {
|
221
108
|
socket.addr = addr4_copy;
|
222
109
|
} else {
|
223
110
|
socket.addr = addr;
|
224
111
|
}
|
225
|
-
GRPC_RETURN_IF_ERROR(PrepareSocket(options, socket));
|
112
|
+
GRPC_RETURN_IF_ERROR(PrepareSocket(posix_interface, options, socket));
|
226
113
|
CHECK_GT(socket.port, 0);
|
227
114
|
return socket;
|
228
115
|
}
|
@@ -249,6 +136,7 @@ bool IsSockAddrLinkLocal(const EventEngine::ResolvedAddress* resolved_addr) {
|
|
249
136
|
}
|
250
137
|
|
251
138
|
absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
|
139
|
+
EventEnginePosixInterface* posix_interface,
|
252
140
|
ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
|
253
141
|
int requested_port) {
|
254
142
|
#ifdef GRPC_HAVE_IFADDRS
|
@@ -258,7 +146,7 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
|
|
258
146
|
bool no_local_addresses = true;
|
259
147
|
int assigned_port = 0;
|
260
148
|
if (requested_port == 0) {
|
261
|
-
auto result = GetUnusedPort();
|
149
|
+
auto result = posix_interface->GetUnusedPort();
|
262
150
|
GRPC_RETURN_IF_ERROR(result.status());
|
263
151
|
requested_port = *result;
|
264
152
|
VLOG(2) << "Picked unused port " << requested_port;
|
@@ -307,7 +195,8 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
|
|
307
195
|
<< ifa_name;
|
308
196
|
continue;
|
309
197
|
}
|
310
|
-
auto result =
|
198
|
+
auto result =
|
199
|
+
CreateAndPrepareListenerSocket(posix_interface, options, addr);
|
311
200
|
if (!result.ok()) {
|
312
201
|
op_status = absl::FailedPreconditionError(
|
313
202
|
absl::StrCat("Failed to add listener: ", addr_str,
|
@@ -335,6 +224,7 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
|
|
335
224
|
}
|
336
225
|
|
337
226
|
absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
|
227
|
+
EventEnginePosixInterface* posix_interface,
|
338
228
|
ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
|
339
229
|
int requested_port) {
|
340
230
|
ResolvedAddress wild4 = ResolvedAddressMakeWild4(requested_port);
|
@@ -344,24 +234,24 @@ absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
|
|
344
234
|
int assigned_port = 0;
|
345
235
|
|
346
236
|
if (SystemHasIfAddrs() && options.expand_wildcard_addrs) {
|
347
|
-
return ListenerContainerAddAllLocalAddresses(
|
348
|
-
|
237
|
+
return ListenerContainerAddAllLocalAddresses(
|
238
|
+
posix_interface, listener_sockets, options, requested_port);
|
349
239
|
}
|
350
240
|
|
351
241
|
// Try listening on IPv6 first.
|
352
|
-
v6_sock = CreateAndPrepareListenerSocket(options, wild6);
|
242
|
+
v6_sock = CreateAndPrepareListenerSocket(posix_interface, options, wild6);
|
353
243
|
if (v6_sock.ok()) {
|
354
244
|
listener_sockets.Append(*v6_sock);
|
355
245
|
requested_port = v6_sock->port;
|
356
246
|
assigned_port = v6_sock->port;
|
357
|
-
if (v6_sock->dsmode ==
|
358
|
-
v6_sock->dsmode ==
|
247
|
+
if (v6_sock->dsmode == EventEnginePosixInterface::DSMODE_DUALSTACK ||
|
248
|
+
v6_sock->dsmode == EventEnginePosixInterface::DSMODE_IPV4) {
|
359
249
|
return v6_sock->port;
|
360
250
|
}
|
361
251
|
}
|
362
252
|
// If we got a v6-only socket or nothing, try adding 0.0.0.0.
|
363
253
|
ResolvedAddressSetPort(wild4, requested_port);
|
364
|
-
v4_sock = CreateAndPrepareListenerSocket(options, wild4);
|
254
|
+
v4_sock = CreateAndPrepareListenerSocket(posix_interface, options, wild4);
|
365
255
|
if (v4_sock.ok()) {
|
366
256
|
assigned_port = v4_sock->port;
|
367
257
|
listener_sockets.Append(*v4_sock);
|