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
@@ -62,6 +62,9 @@ class GrpcPolledFd {
|
|
62
62
|
virtual ares_socket_t GetWrappedAresSocketLocked() = 0;
|
63
63
|
// A unique name, for logging
|
64
64
|
virtual const char* GetName() const = 0;
|
65
|
+
// Return if the FD is "current" - particularly, if it is of the same fork
|
66
|
+
// generation in case of Posix
|
67
|
+
virtual bool IsCurrent() const = 0;
|
65
68
|
};
|
66
69
|
|
67
70
|
// A GrpcPolledFdFactory is 1-to-1 with and owned by a GrpcAresRequest. It knows
|
@@ -80,6 +83,8 @@ class GrpcPolledFdFactory {
|
|
80
83
|
ares_socket_t as) = 0;
|
81
84
|
// Optionally configures the ares channel after creation
|
82
85
|
virtual void ConfigureAresChannelLocked(ares_channel channel) = 0;
|
86
|
+
// Creates a new instance of the same class. This is used during the fork.
|
87
|
+
virtual std::unique_ptr<GrpcPolledFdFactory> NewEmptyInstance() const = 0;
|
83
88
|
};
|
84
89
|
|
85
90
|
} // namespace grpc_event_engine::experimental
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#include "absl/status/statusor.h"
|
29
29
|
#include "absl/strings/str_format.h"
|
30
30
|
#include "src/core/lib/event_engine/poller.h"
|
31
|
+
#include "src/core/lib/event_engine/posix_engine/posix_interface.h"
|
31
32
|
#include "src/core/lib/event_engine/time_util.h"
|
32
33
|
#include "src/core/lib/iomgr/port.h"
|
33
34
|
#include "src/core/util/crash.h"
|
@@ -46,7 +47,6 @@
|
|
46
47
|
#include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
|
47
48
|
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
|
48
49
|
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h"
|
49
|
-
#include "src/core/util/fork.h"
|
50
50
|
#include "src/core/util/status_helper.h"
|
51
51
|
#include "src/core/util/strerror.h"
|
52
52
|
#include "src/core/util/sync.h"
|
@@ -57,26 +57,24 @@ namespace grpc_event_engine::experimental {
|
|
57
57
|
|
58
58
|
class Epoll1EventHandle : public EventHandle {
|
59
59
|
public:
|
60
|
-
Epoll1EventHandle(
|
60
|
+
Epoll1EventHandle(const FileDescriptor& fd, Epoll1Poller* poller)
|
61
61
|
: fd_(fd),
|
62
|
-
list_(this),
|
63
62
|
poller_(poller),
|
64
|
-
read_closure_(
|
65
|
-
write_closure_(
|
66
|
-
error_closure_(
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
error_closure_->InitEvent();
|
63
|
+
read_closure_(poller->GetScheduler()),
|
64
|
+
write_closure_(poller->GetScheduler()),
|
65
|
+
error_closure_(poller->GetScheduler()) {
|
66
|
+
read_closure_.InitEvent();
|
67
|
+
write_closure_.InitEvent();
|
68
|
+
error_closure_.InitEvent();
|
71
69
|
pending_read_.store(false, std::memory_order_relaxed);
|
72
70
|
pending_write_.store(false, std::memory_order_relaxed);
|
73
71
|
pending_error_.store(false, std::memory_order_relaxed);
|
74
72
|
}
|
75
|
-
void ReInit(
|
73
|
+
void ReInit(FileDescriptor fd) {
|
76
74
|
fd_ = fd;
|
77
|
-
read_closure_
|
78
|
-
write_closure_
|
79
|
-
error_closure_
|
75
|
+
read_closure_.InitEvent();
|
76
|
+
write_closure_.InitEvent();
|
77
|
+
error_closure_.InitEvent();
|
80
78
|
pending_read_.store(false, std::memory_order_relaxed);
|
81
79
|
pending_write_.store(false, std::memory_order_relaxed);
|
82
80
|
pending_error_.store(false, std::memory_order_relaxed);
|
@@ -106,8 +104,8 @@ class Epoll1EventHandle : public EventHandle {
|
|
106
104
|
|
107
105
|
return pending_read || pending_write || pending_error;
|
108
106
|
}
|
109
|
-
|
110
|
-
void OrphanHandle(PosixEngineClosure* on_done,
|
107
|
+
FileDescriptor WrappedFd() override { return fd_; }
|
108
|
+
void OrphanHandle(PosixEngineClosure* on_done, FileDescriptor* release_fd,
|
111
109
|
absl::string_view reason) override;
|
112
110
|
void ShutdownHandle(absl::Status why) override;
|
113
111
|
void NotifyOnRead(PosixEngineClosure* on_read) override;
|
@@ -121,20 +119,19 @@ class Epoll1EventHandle : public EventHandle {
|
|
121
119
|
// These may execute in Parallel with ShutdownHandle. Thats not an issue
|
122
120
|
// because the lockfree event implementation should be able to handle it.
|
123
121
|
if (pending_read_.exchange(false, std::memory_order_acq_rel)) {
|
124
|
-
read_closure_
|
122
|
+
read_closure_.SetReady();
|
125
123
|
}
|
126
124
|
if (pending_write_.exchange(false, std::memory_order_acq_rel)) {
|
127
|
-
write_closure_
|
125
|
+
write_closure_.SetReady();
|
128
126
|
}
|
129
127
|
if (pending_error_.exchange(false, std::memory_order_acq_rel)) {
|
130
|
-
error_closure_
|
128
|
+
error_closure_.SetReady();
|
131
129
|
}
|
132
130
|
}
|
133
131
|
grpc_core::Mutex* mu() { return &mu_; }
|
134
|
-
LockfreeEvent* ReadClosure() { return read_closure_
|
135
|
-
LockfreeEvent* WriteClosure() { return write_closure_
|
136
|
-
LockfreeEvent* ErrorClosure() { return error_closure_
|
137
|
-
Epoll1Poller::HandlesList& ForkFdListPos() { return list_; }
|
132
|
+
LockfreeEvent* ReadClosure() { return &read_closure_; }
|
133
|
+
LockfreeEvent* WriteClosure() { return &write_closure_; }
|
134
|
+
LockfreeEvent* ErrorClosure() { return &error_closure_; }
|
138
135
|
~Epoll1EventHandle() override = default;
|
139
136
|
|
140
137
|
private:
|
@@ -142,141 +139,80 @@ class Epoll1EventHandle : public EventHandle {
|
|
142
139
|
// See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
|
143
140
|
// required.
|
144
141
|
grpc_core::Mutex mu_;
|
145
|
-
|
142
|
+
FileDescriptor fd_;
|
146
143
|
// See Epoll1Poller::SetPendingActions for explanation on why pending_<***>_
|
147
144
|
// need to be atomic.
|
148
145
|
std::atomic<bool> pending_read_{false};
|
149
146
|
std::atomic<bool> pending_write_{false};
|
150
147
|
std::atomic<bool> pending_error_{false};
|
151
|
-
Epoll1Poller::HandlesList list_;
|
152
148
|
Epoll1Poller* poller_;
|
153
|
-
|
154
|
-
|
155
|
-
|
149
|
+
LockfreeEvent read_closure_;
|
150
|
+
LockfreeEvent write_closure_;
|
151
|
+
LockfreeEvent error_closure_;
|
156
152
|
};
|
157
153
|
|
158
154
|
namespace {
|
159
155
|
|
160
|
-
int EpollCreateAndCloexec() {
|
161
|
-
#ifdef GRPC_LINUX_EPOLL_CREATE1
|
162
|
-
int fd = epoll_create1(EPOLL_CLOEXEC);
|
163
|
-
if (fd < 0) {
|
164
|
-
LOG(ERROR) << "epoll_create1 unavailable";
|
165
|
-
}
|
166
|
-
#else
|
167
|
-
int fd = epoll_create(MAX_EPOLL_EVENTS);
|
168
|
-
if (fd < 0) {
|
169
|
-
LOG(ERROR) << "epoll_create unavailable";
|
170
|
-
} else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
|
171
|
-
LOG(ERROR) << "fcntl following epoll_create failed";
|
172
|
-
return -1;
|
173
|
-
}
|
174
|
-
#endif
|
175
|
-
return fd;
|
176
|
-
}
|
177
|
-
|
178
|
-
// Only used when GRPC_ENABLE_FORK_SUPPORT=1
|
179
|
-
std::list<Epoll1Poller*> fork_poller_list;
|
180
|
-
|
181
|
-
gpr_mu fork_fd_list_mu;
|
182
|
-
|
183
|
-
void ForkPollerListAddPoller(Epoll1Poller* poller) {
|
184
|
-
if (grpc_core::Fork::Enabled()) {
|
185
|
-
gpr_mu_lock(&fork_fd_list_mu);
|
186
|
-
fork_poller_list.push_back(poller);
|
187
|
-
gpr_mu_unlock(&fork_fd_list_mu);
|
188
|
-
}
|
189
|
-
}
|
190
|
-
|
191
|
-
void ForkPollerListRemovePoller(Epoll1Poller* poller) {
|
192
|
-
if (grpc_core::Fork::Enabled()) {
|
193
|
-
gpr_mu_lock(&fork_fd_list_mu);
|
194
|
-
fork_poller_list.remove(poller);
|
195
|
-
gpr_mu_unlock(&fork_fd_list_mu);
|
196
|
-
}
|
197
|
-
}
|
198
|
-
|
199
|
-
bool InitEpoll1PollerLinux();
|
200
|
-
|
201
|
-
// Called by the child process's post-fork handler to close open fds,
|
202
|
-
// including the global epoll fd of each poller. This allows gRPC to shutdown in
|
203
|
-
// the child process without interfering with connections or RPCs ongoing in the
|
204
|
-
// parent.
|
205
|
-
void ResetEventManagerOnFork() {
|
206
|
-
gpr_mu_lock(&fork_fd_list_mu);
|
207
|
-
// Delete all registered pollers. This also closes all open epoll_sets
|
208
|
-
while (!fork_poller_list.empty()) {
|
209
|
-
Epoll1Poller* poller = fork_poller_list.front();
|
210
|
-
fork_poller_list.pop_front();
|
211
|
-
poller->Close();
|
212
|
-
}
|
213
|
-
gpr_mu_unlock(&fork_fd_list_mu);
|
214
|
-
InitEpoll1PollerLinux();
|
215
|
-
}
|
216
|
-
|
217
156
|
// It is possible that GLIBC has epoll but the underlying kernel doesn't.
|
218
157
|
// Create epoll_fd to make sure epoll support is available
|
219
158
|
bool InitEpoll1PollerLinux() {
|
220
159
|
if (!grpc_event_engine::experimental::SupportsWakeupFd()) {
|
221
160
|
return false;
|
222
161
|
}
|
223
|
-
|
224
|
-
|
162
|
+
EventEnginePosixInterface posix_interface;
|
163
|
+
auto fd = posix_interface.EpollCreateAndCloexec();
|
164
|
+
if (!fd.ok()) {
|
225
165
|
return false;
|
226
166
|
}
|
227
|
-
|
228
|
-
if (grpc_core::Fork::RegisterResetChildPollingEngineFunc(
|
229
|
-
ResetEventManagerOnFork)) {
|
230
|
-
gpr_mu_init(&fork_fd_list_mu);
|
231
|
-
}
|
232
|
-
}
|
233
|
-
close(fd);
|
167
|
+
posix_interface.Close(fd.value());
|
234
168
|
return true;
|
235
169
|
}
|
236
170
|
|
237
171
|
} // namespace
|
238
172
|
|
239
173
|
void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
|
240
|
-
|
174
|
+
FileDescriptor* release_fd,
|
241
175
|
absl::string_view reason) {
|
242
176
|
bool is_release_fd = (release_fd != nullptr);
|
243
177
|
bool was_shutdown = false;
|
244
|
-
if (!read_closure_
|
178
|
+
if (!read_closure_.IsShutdown()) {
|
245
179
|
was_shutdown = true;
|
246
180
|
HandleShutdownInternal(absl::Status(absl::StatusCode::kUnknown, reason),
|
247
181
|
is_release_fd);
|
248
182
|
}
|
249
|
-
|
183
|
+
auto& posix_interface = poller_->posix_interface();
|
250
184
|
// If release_fd is not NULL, we should be relinquishing control of the file
|
251
185
|
// descriptor fd->fd (but we still own the grpc_fd structure).
|
252
186
|
if (is_release_fd) {
|
253
187
|
if (!was_shutdown) {
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
LOG(ERROR) << "OrphanHandle: epoll_ctl failed: "
|
258
|
-
<< grpc_core::StrError(errno);
|
188
|
+
auto result =
|
189
|
+
posix_interface.EpollCtlDel(poller_->g_epoll_set_.epfd, fd_);
|
190
|
+
if (!result.ok()) {
|
191
|
+
LOG(ERROR) << "OrphanHandle: epoll_ctl failed: " << result.StrError();
|
259
192
|
}
|
260
193
|
}
|
261
194
|
*release_fd = fd_;
|
262
195
|
} else {
|
263
|
-
|
264
|
-
|
196
|
+
posix_interface.Shutdown(fd_, SHUT_RDWR);
|
197
|
+
posix_interface.Close(fd_);
|
265
198
|
}
|
266
199
|
|
267
200
|
{
|
268
201
|
// See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
|
269
202
|
// required here.
|
270
203
|
grpc_core::MutexLock lock(&mu_);
|
271
|
-
read_closure_
|
272
|
-
write_closure_
|
273
|
-
error_closure_
|
204
|
+
read_closure_.DestroyEvent();
|
205
|
+
write_closure_.DestroyEvent();
|
206
|
+
error_closure_.DestroyEvent();
|
274
207
|
}
|
275
208
|
pending_read_.store(false, std::memory_order_release);
|
276
209
|
pending_write_.store(false, std::memory_order_release);
|
277
210
|
pending_error_.store(false, std::memory_order_release);
|
278
211
|
{
|
279
212
|
grpc_core::MutexLock lock(&poller_->mu_);
|
213
|
+
#ifdef GRPC_ENABLE_FORK_SUPPORT
|
214
|
+
poller_->fork_handles_set_.erase(this);
|
215
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
280
216
|
poller_->free_epoll1_handles_list_.push_back(this);
|
281
217
|
}
|
282
218
|
if (on_done != nullptr) {
|
@@ -290,49 +226,45 @@ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
|
|
290
226
|
// shutdown() syscall on that fd)
|
291
227
|
void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
|
292
228
|
bool releasing_fd) {
|
293
|
-
grpc_core::StatusSetInt(
|
294
|
-
|
295
|
-
|
229
|
+
grpc_core::StatusSetInt(
|
230
|
+
&why, grpc_core::StatusIntProperty::kRpcStatus,
|
231
|
+
absl::IsCancelled(why) ? GRPC_STATUS_CANCELLED : GRPC_STATUS_UNAVAILABLE);
|
232
|
+
if (read_closure_.SetShutdown(why)) {
|
296
233
|
if (releasing_fd) {
|
297
|
-
|
298
|
-
|
299
|
-
|
234
|
+
auto result = poller_->posix_interface().EpollCtlDel(
|
235
|
+
poller_->g_epoll_set_.epfd, fd_);
|
236
|
+
if (!result.ok()) {
|
300
237
|
LOG(ERROR) << "HandleShutdownInternal: epoll_ctl failed: "
|
301
|
-
<<
|
238
|
+
<< result.StrError();
|
302
239
|
}
|
303
240
|
}
|
304
|
-
write_closure_
|
305
|
-
error_closure_
|
241
|
+
write_closure_.SetShutdown(why);
|
242
|
+
error_closure_.SetShutdown(why);
|
306
243
|
}
|
307
244
|
}
|
308
245
|
|
309
246
|
Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
|
310
247
|
: scheduler_(scheduler), was_kicked_(false), closed_(false) {
|
311
|
-
g_epoll_set_.epfd = EpollCreateAndCloexec();
|
312
|
-
wakeup_fd_ =
|
248
|
+
g_epoll_set_.epfd = posix_interface().EpollCreateAndCloexec().value();
|
249
|
+
wakeup_fd_ = CreateWakeupFd(&posix_interface()).value();
|
313
250
|
CHECK(wakeup_fd_ != nullptr);
|
314
|
-
|
251
|
+
CHECK(g_epoll_set_.epfd.ready());
|
315
252
|
GRPC_TRACE_LOG(event_engine_poller, INFO)
|
316
253
|
<< "grpc epoll fd: " << g_epoll_set_.epfd;
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
CHECK(epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, wakeup_fd_->ReadFd(),
|
321
|
-
&ev) == 0);
|
254
|
+
auto result = posix_interface().EpollCtlAdd(
|
255
|
+
g_epoll_set_.epfd, false, wakeup_fd_->ReadFd(), wakeup_fd_.get());
|
256
|
+
CHECK(result.ok()) << result.StrError();
|
322
257
|
g_epoll_set_.num_events = 0;
|
323
258
|
g_epoll_set_.cursor = 0;
|
324
|
-
ForkPollerListAddPoller(this);
|
325
259
|
}
|
326
260
|
|
327
|
-
void Epoll1Poller::Shutdown() { ForkPollerListRemovePoller(this); }
|
328
|
-
|
329
261
|
void Epoll1Poller::Close() {
|
330
262
|
grpc_core::MutexLock lock(&mu_);
|
331
263
|
if (closed_) return;
|
332
264
|
|
333
|
-
if (g_epoll_set_.epfd
|
334
|
-
|
335
|
-
g_epoll_set_.epfd =
|
265
|
+
if (g_epoll_set_.epfd.ready()) {
|
266
|
+
posix_interface().Close(g_epoll_set_.epfd);
|
267
|
+
g_epoll_set_.epfd = FileDescriptor::Invalid();
|
336
268
|
}
|
337
269
|
|
338
270
|
while (!free_epoll1_handles_list_.empty()) {
|
@@ -346,7 +278,8 @@ void Epoll1Poller::Close() {
|
|
346
278
|
|
347
279
|
Epoll1Poller::~Epoll1Poller() { Close(); }
|
348
280
|
|
349
|
-
EventHandle* Epoll1Poller::CreateHandle(
|
281
|
+
EventHandle* Epoll1Poller::CreateHandle(FileDescriptor fd,
|
282
|
+
absl::string_view /*name*/,
|
350
283
|
bool track_err) {
|
351
284
|
Epoll1EventHandle* new_handle = nullptr;
|
352
285
|
{
|
@@ -359,18 +292,21 @@ EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view /*name*/,
|
|
359
292
|
free_epoll1_handles_list_.pop_front();
|
360
293
|
new_handle->ReInit(fd);
|
361
294
|
}
|
295
|
+
#ifdef GRPC_ENABLE_FORK_SUPPORT
|
296
|
+
fork_handles_set_.emplace(new_handle);
|
297
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
362
298
|
}
|
363
|
-
struct epoll_event ev;
|
364
|
-
ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLOUT | EPOLLET);
|
365
299
|
// Use the least significant bit of ev.data.ptr to store track_err. We expect
|
366
300
|
// the addresses to be word aligned. We need to store track_err to avoid
|
367
301
|
// synchronization issues when accessing it after receiving an event.
|
368
302
|
// Accessing fd would be a data race there because the fd might have been
|
369
303
|
// returned to the free list at that point.
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
304
|
+
auto result = posix_interface().EpollCtlAdd(
|
305
|
+
g_epoll_set_.epfd, true, fd,
|
306
|
+
reinterpret_cast<void*>(reinterpret_cast<intptr_t>(new_handle) |
|
307
|
+
(track_err ? 1 : 0)));
|
308
|
+
if (!result.ok()) {
|
309
|
+
LOG(ERROR) << "epoll_ctl failed: " << result.StrError();
|
374
310
|
}
|
375
311
|
|
376
312
|
return new_handle;
|
@@ -421,9 +357,13 @@ bool Epoll1Poller::ProcessEpollEvents(int max_epoll_events_to_handle,
|
|
421
357
|
// See ProcessEpollEvents() function for more details. It returns the number
|
422
358
|
// of events generated by epoll_wait.
|
423
359
|
int Epoll1Poller::DoEpollWait(EventEngine::Duration timeout) {
|
360
|
+
auto fd = posix_interface().GetFd(g_epoll_set_.epfd);
|
361
|
+
if (fd.IsWrongGenerationError()) {
|
362
|
+
grpc_core::Crash("File descriptor from the wrong generation");
|
363
|
+
}
|
424
364
|
int r;
|
425
365
|
do {
|
426
|
-
r = epoll_wait(
|
366
|
+
r = epoll_wait(*fd, g_epoll_set_.events, MAX_EPOLL_EVENTS,
|
427
367
|
static_cast<int>(
|
428
368
|
grpc_event_engine::experimental::Milliseconds(timeout)));
|
429
369
|
} while (r < 0 && errno == EINTR);
|
@@ -450,26 +390,26 @@ void Epoll1EventHandle::ShutdownHandle(absl::Status why) {
|
|
450
390
|
}
|
451
391
|
|
452
392
|
bool Epoll1EventHandle::IsHandleShutdown() {
|
453
|
-
return read_closure_
|
393
|
+
return read_closure_.IsShutdown();
|
454
394
|
}
|
455
395
|
|
456
396
|
void Epoll1EventHandle::NotifyOnRead(PosixEngineClosure* on_read) {
|
457
|
-
read_closure_
|
397
|
+
read_closure_.NotifyOn(on_read);
|
458
398
|
}
|
459
399
|
|
460
400
|
void Epoll1EventHandle::NotifyOnWrite(PosixEngineClosure* on_write) {
|
461
|
-
write_closure_
|
401
|
+
write_closure_.NotifyOn(on_write);
|
462
402
|
}
|
463
403
|
|
464
404
|
void Epoll1EventHandle::NotifyOnError(PosixEngineClosure* on_error) {
|
465
|
-
error_closure_
|
405
|
+
error_closure_.NotifyOn(on_error);
|
466
406
|
}
|
467
407
|
|
468
|
-
void Epoll1EventHandle::SetReadable() { read_closure_
|
408
|
+
void Epoll1EventHandle::SetReadable() { read_closure_.SetReady(); }
|
469
409
|
|
470
|
-
void Epoll1EventHandle::SetWritable() { write_closure_
|
410
|
+
void Epoll1EventHandle::SetWritable() { write_closure_.SetReady(); }
|
471
411
|
|
472
|
-
void Epoll1EventHandle::SetHasError() { error_closure_
|
412
|
+
void Epoll1EventHandle::SetHasError() { error_closure_.SetReady(); }
|
473
413
|
|
474
414
|
// Polls the registered Fds for events until timeout is reached or there is a
|
475
415
|
// Kick(). If there is a Kick(), it collects and processes any previously
|
@@ -516,6 +456,43 @@ void Epoll1Poller::Kick() {
|
|
516
456
|
CHECK(wakeup_fd_->Wakeup().ok());
|
517
457
|
}
|
518
458
|
|
459
|
+
#ifdef GRPC_ENABLE_FORK_SUPPORT
|
460
|
+
|
461
|
+
void Epoll1Poller::HandleForkInChild() {
|
462
|
+
// Experiment guards closing fds/incrementing the generation. epoll fd
|
463
|
+
// needs to be reset outside the experiment to support iomgr
|
464
|
+
if (grpc_core::IsEventEngineForkEnabled()) {
|
465
|
+
posix_interface().AdvanceGeneration();
|
466
|
+
}
|
467
|
+
{
|
468
|
+
grpc_core::MutexLock lock(&mu_);
|
469
|
+
for (EventHandle* handle : fork_handles_set_) {
|
470
|
+
handle->ShutdownHandle(absl::CancelledError("Closed on fork"));
|
471
|
+
}
|
472
|
+
}
|
473
|
+
g_epoll_set_ = {};
|
474
|
+
g_epoll_set_.epfd = posix_interface().EpollCreateAndCloexec().value();
|
475
|
+
CHECK(g_epoll_set_.epfd.ready());
|
476
|
+
GRPC_TRACE_LOG(event_engine_poller, INFO)
|
477
|
+
<< "Post-fork grpc epoll fd: " << g_epoll_set_.epfd;
|
478
|
+
g_epoll_set_.num_events = 0;
|
479
|
+
g_epoll_set_.cursor = 0;
|
480
|
+
}
|
481
|
+
|
482
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
483
|
+
|
484
|
+
void Epoll1Poller::ResetKickState() {
|
485
|
+
// Wakeup fd is always recreated to ensure FD state is reset
|
486
|
+
// Ok to fail in the fork child
|
487
|
+
posix_interface().EpollCtlDel(g_epoll_set_.epfd, wakeup_fd_->ReadFd());
|
488
|
+
wakeup_fd_ = *CreateWakeupFd(&posix_interface());
|
489
|
+
auto status = posix_interface().EpollCtlAdd(
|
490
|
+
g_epoll_set_.epfd, false, wakeup_fd_->ReadFd(), wakeup_fd_.get());
|
491
|
+
CHECK(status.ok()) << status.StrError();
|
492
|
+
grpc_core::MutexLock lock(&mu_);
|
493
|
+
was_kicked_ = false;
|
494
|
+
}
|
495
|
+
|
519
496
|
std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler) {
|
520
497
|
static bool kEpoll1PollerSupported = InitEpoll1PollerLinux();
|
521
498
|
if (kEpoll1PollerSupported) {
|
@@ -524,14 +501,6 @@ std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler) {
|
|
524
501
|
return nullptr;
|
525
502
|
}
|
526
503
|
|
527
|
-
void Epoll1Poller::PrepareFork() { Kick(); }
|
528
|
-
|
529
|
-
// TODO(vigneshbabu): implement
|
530
|
-
void Epoll1Poller::PostforkParent() {}
|
531
|
-
|
532
|
-
// TODO(vigneshbabu): implement
|
533
|
-
void Epoll1Poller::PostforkChild() {}
|
534
|
-
|
535
504
|
} // namespace grpc_event_engine::experimental
|
536
505
|
|
537
506
|
#else // defined(GRPC_LINUX_EPOLL)
|
@@ -546,11 +515,10 @@ Epoll1Poller::Epoll1Poller(Scheduler* /* engine */) {
|
|
546
515
|
grpc_core::Crash("unimplemented");
|
547
516
|
}
|
548
517
|
|
549
|
-
void Epoll1Poller::Shutdown() { grpc_core::Crash("unimplemented"); }
|
550
|
-
|
551
518
|
Epoll1Poller::~Epoll1Poller() { grpc_core::Crash("unimplemented"); }
|
552
519
|
|
553
|
-
EventHandle* Epoll1Poller::CreateHandle(
|
520
|
+
EventHandle* Epoll1Poller::CreateHandle(FileDescriptor /*fd*/,
|
521
|
+
absl::string_view /*name*/,
|
554
522
|
bool /*track_err*/) {
|
555
523
|
grpc_core::Crash("unimplemented");
|
556
524
|
}
|
@@ -572,18 +540,18 @@ Poller::WorkResult Epoll1Poller::Work(
|
|
572
540
|
|
573
541
|
void Epoll1Poller::Kick() { grpc_core::Crash("unimplemented"); }
|
574
542
|
|
543
|
+
#if GRPC_ENABLE_FORK_SUPPORT
|
544
|
+
void Epoll1Poller::HandleForkInChild() { grpc_core::Crash("unimplemented"); }
|
545
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
546
|
+
|
547
|
+
void Epoll1Poller::ResetKickState() { grpc_core::Crash("unimplemented"); }
|
548
|
+
|
575
549
|
// If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
|
576
550
|
// nullptr.
|
577
551
|
std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* /*scheduler*/) {
|
578
552
|
return nullptr;
|
579
553
|
}
|
580
554
|
|
581
|
-
void Epoll1Poller::PrepareFork() {}
|
582
|
-
|
583
|
-
void Epoll1Poller::PostforkParent() {}
|
584
|
-
|
585
|
-
void Epoll1Poller::PostforkChild() {}
|
586
|
-
|
587
555
|
} // namespace grpc_event_engine::experimental
|
588
556
|
|
589
557
|
#endif // defined(GRPC_POSIX_SOCKET_EV_EPOLL1)
|
@@ -22,6 +22,7 @@
|
|
22
22
|
#include <string>
|
23
23
|
|
24
24
|
#include "absl/base/thread_annotations.h"
|
25
|
+
#include "absl/container/flat_hash_set.h"
|
25
26
|
#include "absl/container/inlined_vector.h"
|
26
27
|
#include "absl/functional/function_ref.h"
|
27
28
|
#include "absl/strings/string_view.h"
|
@@ -46,7 +47,7 @@ class Epoll1EventHandle;
|
|
46
47
|
class Epoll1Poller : public PosixEventPoller {
|
47
48
|
public:
|
48
49
|
explicit Epoll1Poller(Scheduler* scheduler);
|
49
|
-
EventHandle* CreateHandle(
|
50
|
+
EventHandle* CreateHandle(FileDescriptor fd, absl::string_view name,
|
50
51
|
bool track_err) override;
|
51
52
|
Poller::WorkResult Work(
|
52
53
|
grpc_event_engine::experimental::EventEngine::Duration timeout,
|
@@ -54,7 +55,6 @@ class Epoll1Poller : public PosixEventPoller {
|
|
54
55
|
std::string Name() override { return "epoll1"; }
|
55
56
|
void Kick() override;
|
56
57
|
Scheduler* GetScheduler() { return scheduler_; }
|
57
|
-
void Shutdown() override;
|
58
58
|
bool CanTrackErrors() const override {
|
59
59
|
#ifdef GRPC_POSIX_SOCKET_TCP
|
60
60
|
return KernelSupportsErrqueue();
|
@@ -64,13 +64,13 @@ class Epoll1Poller : public PosixEventPoller {
|
|
64
64
|
}
|
65
65
|
~Epoll1Poller() override;
|
66
66
|
|
67
|
-
// Forkable
|
68
|
-
void PrepareFork() override;
|
69
|
-
void PostforkParent() override;
|
70
|
-
void PostforkChild() override;
|
71
|
-
|
72
67
|
void Close();
|
73
68
|
|
69
|
+
#ifdef GRPC_ENABLE_FORK_SUPPORT
|
70
|
+
void HandleForkInChild() override;
|
71
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
72
|
+
void ResetKickState() override;
|
73
|
+
|
74
74
|
private:
|
75
75
|
// This initial vector size may need to be tuned
|
76
76
|
using Events = absl::InlinedVector<Epoll1EventHandle*, 5>;
|
@@ -90,17 +90,10 @@ class Epoll1Poller : public PosixEventPoller {
|
|
90
90
|
// of events generated by epoll_wait.
|
91
91
|
int DoEpollWait(
|
92
92
|
grpc_event_engine::experimental::EventEngine::Duration timeout);
|
93
|
-
class HandlesList {
|
94
|
-
public:
|
95
|
-
explicit HandlesList(Epoll1EventHandle* handle) : handle(handle) {}
|
96
|
-
Epoll1EventHandle* handle;
|
97
|
-
Epoll1EventHandle* next = nullptr;
|
98
|
-
Epoll1EventHandle* prev = nullptr;
|
99
|
-
};
|
100
93
|
friend class Epoll1EventHandle;
|
101
94
|
#ifdef GRPC_LINUX_EPOLL
|
102
95
|
struct EpollSet {
|
103
|
-
|
96
|
+
FileDescriptor epfd;
|
104
97
|
|
105
98
|
// The epoll_events after the last call to epoll_wait()
|
106
99
|
struct epoll_event events[MAX_EPOLL_EVENTS]{};
|
@@ -121,6 +114,9 @@ class Epoll1Poller : public PosixEventPoller {
|
|
121
114
|
EpollSet g_epoll_set_;
|
122
115
|
bool was_kicked_ ABSL_GUARDED_BY(mu_);
|
123
116
|
std::list<EventHandle*> free_epoll1_handles_list_ ABSL_GUARDED_BY(mu_);
|
117
|
+
#if GRPC_ENABLE_FORK_SUPPORT
|
118
|
+
absl::flat_hash_set<EventHandle*> fork_handles_set_ ABSL_GUARDED_BY(mu_);
|
119
|
+
#endif // GRPC_ENABLE_FORK_SUPPORT
|
124
120
|
std::unique_ptr<WakeupFd> wakeup_fd_;
|
125
121
|
bool closed_;
|
126
122
|
};
|