grpc 1.50.0.pre1 → 1.51.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +131 -42
- data/include/grpc/event_engine/event_engine.h +10 -3
- data/include/grpc/event_engine/slice_buffer.h +17 -0
- data/include/grpc/grpc.h +0 -10
- data/include/grpc/impl/codegen/grpc_types.h +1 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
- data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
- data/src/core/ext/filters/client_channel/client_channel.h +3 -4
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
- data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
- data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
- data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
- data/src/core/ext/filters/client_channel/subchannel.h +2 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
- data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
- data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
- data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
- data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
- data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +15 -68
- data/src/core/ext/xds/xds_api.h +3 -7
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_client.cc +122 -90
- data/src/core/ext/xds/xds_client.h +7 -2
- data/src/core/ext/xds/xds_client_grpc.cc +5 -24
- data/src/core/ext/xds/xds_cluster.cc +291 -183
- data/src/core/ext/xds/xds_cluster.h +11 -15
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
- data/src/core/ext/xds/xds_common_types.cc +208 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +214 -129
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
- data/src/core/ext/xds/xds_http_filters.cc +60 -73
- data/src/core/ext/xds/xds_http_filters.h +67 -19
- data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
- data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +459 -417
- data/src/core/ext/xds/xds_listener.h +43 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
- data/src/core/ext/xds/xds_route_config.cc +94 -80
- data/src/core/ext/xds/xds_route_config.h +10 -10
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
- data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
- data/src/core/lib/address_utils/parse_address.cc +11 -10
- data/src/core/lib/channel/channel_args.h +16 -1
- data/src/core/lib/channel/channel_stack.cc +23 -20
- data/src/core/lib/channel/channel_stack.h +17 -4
- data/src/core/lib/channel/channel_stack_builder.cc +4 -7
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +4 -5
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +695 -35
- data/src/core/lib/channel/connected_channel.h +0 -4
- data/src/core/lib/channel/promise_based_filter.cc +1004 -140
- data/src/core/lib/channel/promise_based_filter.h +364 -87
- data/src/core/lib/compression/message_compress.cc +5 -5
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +22 -119
- data/src/core/lib/debug/stats.h +29 -35
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/thread_pool.cc +106 -25
- data/src/core/lib/event_engine/thread_pool.h +32 -9
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -2
- data/src/core/lib/experiments/experiments.h +8 -1
- data/src/core/lib/gpr/cpu_linux.cc +6 -2
- data/src/core/lib/gpr/log_linux.cc +3 -4
- data/src/core/lib/gpr/string.h +1 -1
- data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +3 -2
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
- data/src/core/lib/gprpp/thd_windows.cc +1 -2
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +13 -2
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/http/httpcli.cc +40 -44
- data/src/core/lib/http/httpcli.h +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +4 -6
- data/src/core/lib/http/parser.cc +54 -65
- data/src/core/lib/iomgr/buffer_list.cc +105 -116
- data/src/core/lib/iomgr/buffer_list.h +60 -44
- data/src/core/lib/iomgr/call_combiner.cc +11 -10
- data/src/core/lib/iomgr/call_combiner.h +3 -4
- data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
- data/src/core/lib/iomgr/closure.h +49 -5
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +27 -42
- data/src/core/lib/iomgr/error.h +22 -152
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
- data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
- data/src/core/lib/iomgr/exec_ctx.cc +3 -4
- data/src/core/lib/iomgr/exec_ctx.h +2 -3
- data/src/core/lib/iomgr/executor.cc +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
- data/src/core/lib/iomgr/load_file.cc +5 -9
- data/src/core/lib/iomgr/lockfree_event.cc +10 -10
- data/src/core/lib/iomgr/pollset_windows.cc +4 -4
- data/src/core/lib/iomgr/python_util.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +8 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -4
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
- data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
- data/src/core/lib/iomgr/tcp_posix.cc +92 -108
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
- data/src/core/lib/iomgr/tcp_windows.cc +27 -34
- data/src/core/lib/iomgr/timer.h +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +9 -15
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +7 -2
- data/src/core/lib/json/json_object_loader.h +22 -0
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/load_balancing/lb_policy.cc +1 -1
- data/src/core/lib/load_balancing/lb_policy.h +4 -0
- data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +38 -15
- data/src/core/lib/promise/arena_promise.h +80 -51
- data/src/core/lib/promise/context.h +13 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +58 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
- data/src/core/lib/promise/for_each.h +129 -0
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map_pipe.h +87 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +13 -0
- data/src/core/lib/promise/seq.h +3 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +341 -0
- data/src/core/lib/promise/try_seq.h +10 -13
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +1 -3
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/arena.cc +19 -0
- data/src/core/lib/resource_quota/arena.h +89 -0
- data/src/core/lib/resource_quota/memory_quota.cc +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/context/security_context.h +10 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
- data/src/core/lib/security/transport/security_handshaker.cc +53 -53
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/tsi_error.cc +6 -3
- data/src/core/lib/security/util/json_util.cc +4 -5
- data/src/core/lib/service_config/service_config.h +1 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +2 -2
- data/src/core/lib/slice/slice.cc +7 -1
- data/src/core/lib/slice/slice.h +19 -6
- data/src/core/lib/slice/slice_buffer.cc +13 -14
- data/src/core/lib/slice/slice_internal.h +13 -21
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/surface/byte_buffer.cc +3 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +1366 -239
- data/src/core/lib/surface/call.h +44 -0
- data/src/core/lib/surface/call_details.cc +3 -3
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +44 -49
- data/src/core/lib/surface/channel.h +9 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/channel_stack_type.cc +4 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.cc +38 -52
- data/src/core/lib/surface/init.cc +8 -39
- data/src/core/lib/surface/init_internally.h +8 -0
- data/src/core/lib/surface/lame_client.cc +10 -8
- data/src/core/lib/surface/server.cc +48 -70
- data/src/core/lib/surface/server.h +3 -4
- data/src/core/lib/surface/validate_metadata.cc +11 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +34 -28
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +14 -14
- data/src/core/lib/transport/handshaker.h +1 -1
- data/src/core/lib/transport/handshaker_factory.h +26 -0
- data/src/core/lib/transport/handshaker_registry.cc +8 -2
- data/src/core/lib/transport/handshaker_registry.h +3 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
- data/src/core/lib/transport/metadata_batch.h +17 -1
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/transport.cc +63 -17
- data/src/core/lib/transport/transport.h +64 -68
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +7 -6
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
- data/src/core/tsi/fake_transport_security.cc +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +57 -20
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_buffer_api.cc +0 -35
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -15,24 +15,377 @@
|
|
15
15
|
|
16
16
|
#include "src/core/lib/event_engine/posix_engine/posix_engine.h"
|
17
17
|
|
18
|
+
#include <algorithm>
|
19
|
+
#include <atomic>
|
20
|
+
#include <chrono>
|
21
|
+
#include <cstring>
|
22
|
+
#include <memory>
|
18
23
|
#include <string>
|
19
24
|
#include <utility>
|
20
25
|
|
21
|
-
#include "absl/
|
26
|
+
#include "absl/cleanup/cleanup.h"
|
22
27
|
#include "absl/functional/any_invocable.h"
|
28
|
+
#include "absl/meta/type_traits.h"
|
29
|
+
#include "absl/status/status.h"
|
30
|
+
#include "absl/strings/str_cat.h"
|
23
31
|
|
24
32
|
#include <grpc/event_engine/event_engine.h>
|
33
|
+
#include <grpc/event_engine/memory_allocator.h>
|
34
|
+
#include <grpc/support/cpu.h>
|
25
35
|
#include <grpc/support/log.h>
|
26
36
|
|
27
37
|
#include "src/core/lib/debug/trace.h"
|
28
|
-
#include "src/core/lib/event_engine/
|
38
|
+
#include "src/core/lib/event_engine/poller.h"
|
29
39
|
#include "src/core/lib/event_engine/posix_engine/timer.h"
|
30
40
|
#include "src/core/lib/event_engine/trace.h"
|
31
41
|
#include "src/core/lib/event_engine/utils.h"
|
42
|
+
#include "src/core/lib/experiments/experiments.h"
|
43
|
+
#include "src/core/lib/gprpp/sync.h"
|
44
|
+
|
45
|
+
#ifdef GRPC_POSIX_SOCKET_TCP
|
46
|
+
#include <errno.h> // IWYU pragma: keep
|
47
|
+
#include <stdint.h> // IWYU pragma: keep
|
48
|
+
#include <sys/socket.h> // IWYU pragma: keep
|
49
|
+
|
50
|
+
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
|
51
|
+
#include "src/core/lib/event_engine/posix_engine/event_poller_posix_default.h"
|
52
|
+
#include "src/core/lib/event_engine/posix_engine/posix_endpoint.h"
|
53
|
+
#endif // GRPC_POSIX_SOCKET_TCP
|
54
|
+
|
55
|
+
// IWYU pragma: no_include <ratio>
|
56
|
+
|
57
|
+
using namespace std::chrono_literals;
|
32
58
|
|
33
59
|
namespace grpc_event_engine {
|
34
60
|
namespace experimental {
|
35
61
|
|
62
|
+
#ifdef GRPC_POSIX_SOCKET_TCP
|
63
|
+
using ::grpc_event_engine::posix_engine::EventHandle;
|
64
|
+
using ::grpc_event_engine::posix_engine::PosixEngineClosure;
|
65
|
+
using ::grpc_event_engine::posix_engine::PosixEventPoller;
|
66
|
+
using ::grpc_event_engine::posix_engine::PosixSocketWrapper;
|
67
|
+
using ::grpc_event_engine::posix_engine::PosixTcpOptions;
|
68
|
+
using ::grpc_event_engine::posix_engine::SockaddrToString;
|
69
|
+
using ::grpc_event_engine::posix_engine::TcpOptionsFromEndpointConfig;
|
70
|
+
|
71
|
+
void AsyncConnect::Start(EventEngine::Duration timeout) {
|
72
|
+
on_writable_ = PosixEngineClosure::ToPermanentClosure(
|
73
|
+
[this](absl::Status status) { OnWritable(std::move(status)); });
|
74
|
+
alarm_handle_ = engine_->RunAfter(timeout, [this]() {
|
75
|
+
OnTimeoutExpired(absl::DeadlineExceededError("connect() timed out"));
|
76
|
+
});
|
77
|
+
fd_->NotifyOnWrite(on_writable_);
|
78
|
+
}
|
79
|
+
|
80
|
+
AsyncConnect ::~AsyncConnect() { delete on_writable_; }
|
81
|
+
|
82
|
+
void AsyncConnect::OnTimeoutExpired(absl::Status status) {
|
83
|
+
bool done = false;
|
84
|
+
{
|
85
|
+
grpc_core::MutexLock lock(&mu_);
|
86
|
+
if (fd_ != nullptr) {
|
87
|
+
fd_->ShutdownHandle(std::move(status));
|
88
|
+
}
|
89
|
+
done = (--refs_ == 0);
|
90
|
+
}
|
91
|
+
if (done) {
|
92
|
+
delete this;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
void AsyncConnect::OnWritable(absl::Status status)
|
97
|
+
ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
98
|
+
int so_error = 0;
|
99
|
+
socklen_t so_error_size;
|
100
|
+
int err;
|
101
|
+
int done;
|
102
|
+
int consumed_refs = 1;
|
103
|
+
EventHandle* fd;
|
104
|
+
absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>> ep;
|
105
|
+
|
106
|
+
mu_.Lock();
|
107
|
+
GPR_ASSERT(fd_ != nullptr);
|
108
|
+
fd = std::exchange(fd_, nullptr);
|
109
|
+
bool connect_cancelled = connect_cancelled_;
|
110
|
+
if (fd->IsHandleShutdown() && status.ok()) {
|
111
|
+
if (!connect_cancelled) {
|
112
|
+
// status is OK and handle has been shutdown but the connect was not
|
113
|
+
// cancelled. This can happen if the timeout expired and the while the
|
114
|
+
// OnWritable just started executing.
|
115
|
+
status = absl::DeadlineExceededError("connect() timed out");
|
116
|
+
} else {
|
117
|
+
// This can happen if the connection was cancelled while the OnWritable
|
118
|
+
// just started executing.
|
119
|
+
status = absl::FailedPreconditionError("Connection cancelled");
|
120
|
+
}
|
121
|
+
}
|
122
|
+
mu_.Unlock();
|
123
|
+
|
124
|
+
if (engine_->Cancel(alarm_handle_)) {
|
125
|
+
++consumed_refs;
|
126
|
+
}
|
127
|
+
|
128
|
+
auto on_writable_finish = absl::MakeCleanup([&]() -> void {
|
129
|
+
mu_.AssertHeld();
|
130
|
+
if (!connect_cancelled) {
|
131
|
+
reinterpret_cast<PosixEventEngine*>(engine_.get())
|
132
|
+
->OnConnectFinishInternal(connection_handle_);
|
133
|
+
}
|
134
|
+
if (fd != nullptr) {
|
135
|
+
fd->OrphanHandle(nullptr, nullptr, "tcp_client_orphan");
|
136
|
+
fd = nullptr;
|
137
|
+
}
|
138
|
+
if (!status.ok()) {
|
139
|
+
ep = absl::CancelledError(
|
140
|
+
absl::StrCat("Failed to connect to remote host: ", resolved_addr_str_,
|
141
|
+
" with error: ", status.ToString()));
|
142
|
+
}
|
143
|
+
// Run the OnConnect callback asynchronously.
|
144
|
+
if (!connect_cancelled) {
|
145
|
+
executor_->Run(
|
146
|
+
[ep = std::move(ep), on_connect = std::move(on_connect_)]() mutable {
|
147
|
+
if (on_connect) {
|
148
|
+
on_connect(std::move(ep));
|
149
|
+
}
|
150
|
+
});
|
151
|
+
}
|
152
|
+
done = ((refs_ -= consumed_refs) == 0);
|
153
|
+
mu_.Unlock();
|
154
|
+
if (done) {
|
155
|
+
delete this;
|
156
|
+
}
|
157
|
+
});
|
158
|
+
|
159
|
+
mu_.Lock();
|
160
|
+
if (!status.ok() || connect_cancelled) {
|
161
|
+
return;
|
162
|
+
}
|
163
|
+
|
164
|
+
do {
|
165
|
+
so_error_size = sizeof(so_error);
|
166
|
+
err = getsockopt(fd->WrappedFd(), SOL_SOCKET, SO_ERROR, &so_error,
|
167
|
+
&so_error_size);
|
168
|
+
} while (err < 0 && errno == EINTR);
|
169
|
+
if (err < 0) {
|
170
|
+
status = absl::FailedPreconditionError(
|
171
|
+
absl::StrCat("getsockopt: ", std::strerror(errno)));
|
172
|
+
return;
|
173
|
+
}
|
174
|
+
|
175
|
+
switch (so_error) {
|
176
|
+
case 0:
|
177
|
+
ep = CreatePosixEndpoint(fd, nullptr, engine_, std::move(allocator_),
|
178
|
+
options_);
|
179
|
+
fd = nullptr;
|
180
|
+
break;
|
181
|
+
case ENOBUFS:
|
182
|
+
// We will get one of these errors if we have run out of
|
183
|
+
// memory in the kernel for the data structures allocated
|
184
|
+
// when you connect a socket. If this happens it is very
|
185
|
+
// likely that if we wait a little bit then try again the
|
186
|
+
// connection will work (since other programs or this
|
187
|
+
// program will close their network connections and free up
|
188
|
+
// memory). This does _not_ indicate that there is anything
|
189
|
+
// wrong with the server we are connecting to, this is a
|
190
|
+
// local problem.
|
191
|
+
|
192
|
+
// If you are looking at this code, then chances are that
|
193
|
+
// your program or another program on the same computer
|
194
|
+
// opened too many network connections. The "easy" fix:
|
195
|
+
// don't do that!
|
196
|
+
gpr_log(GPR_ERROR, "kernel out of buffers");
|
197
|
+
mu_.Unlock();
|
198
|
+
fd->NotifyOnWrite(on_writable_);
|
199
|
+
// Don't run the cleanup function for this case.
|
200
|
+
std::move(on_writable_finish).Cancel();
|
201
|
+
return;
|
202
|
+
case ECONNREFUSED:
|
203
|
+
// This error shouldn't happen for anything other than connect().
|
204
|
+
status = absl::FailedPreconditionError(
|
205
|
+
absl::StrCat("connect: ", std::strerror(so_error)));
|
206
|
+
break;
|
207
|
+
default:
|
208
|
+
// We don't really know which syscall triggered the problem here, so
|
209
|
+
// punt by reporting getsockopt().
|
210
|
+
status = absl::FailedPreconditionError(
|
211
|
+
absl::StrCat("getsockopt(SO_ERROR): ", std::strerror(so_error)));
|
212
|
+
break;
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
|
217
|
+
PosixSocketWrapper sock, OnConnectCallback on_connect, ResolvedAddress addr,
|
218
|
+
MemoryAllocator&& allocator, const PosixTcpOptions& options,
|
219
|
+
Duration timeout) {
|
220
|
+
int err;
|
221
|
+
int saved_errno;
|
222
|
+
do {
|
223
|
+
err = connect(sock.Fd(), addr.address(), addr.size());
|
224
|
+
} while (err < 0 && errno == EINTR);
|
225
|
+
saved_errno = errno;
|
226
|
+
|
227
|
+
auto addr_uri = SockaddrToString(&addr, true);
|
228
|
+
if (!addr_uri.ok()) {
|
229
|
+
Run([on_connect = std::move(on_connect),
|
230
|
+
ep = absl::FailedPreconditionError(absl::StrCat(
|
231
|
+
"connect failed: ", "invalid addr: ",
|
232
|
+
addr_uri.value()))]() mutable { on_connect(std::move(ep)); });
|
233
|
+
return {0, 0};
|
234
|
+
}
|
235
|
+
|
236
|
+
std::string name = absl::StrCat("tcp-client:", addr_uri.value());
|
237
|
+
PosixEventPoller* poller = poller_manager_->Poller();
|
238
|
+
EventHandle* handle =
|
239
|
+
poller->CreateHandle(sock.Fd(), name, poller->CanTrackErrors());
|
240
|
+
int64_t connection_id = 0;
|
241
|
+
if (saved_errno == EWOULDBLOCK || saved_errno == EINPROGRESS) {
|
242
|
+
// Connection is still in progress.
|
243
|
+
connection_id = last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
|
244
|
+
}
|
245
|
+
|
246
|
+
if (err >= 0) {
|
247
|
+
// Connection already succeded. Return 0 to discourage any cancellation
|
248
|
+
// attempts.
|
249
|
+
Run([on_connect = std::move(on_connect),
|
250
|
+
ep = CreatePosixEndpoint(handle, nullptr, shared_from_this(),
|
251
|
+
std::move(allocator), options)]() mutable {
|
252
|
+
on_connect(std::move(ep));
|
253
|
+
});
|
254
|
+
return {0, 0};
|
255
|
+
}
|
256
|
+
if (saved_errno != EWOULDBLOCK && saved_errno != EINPROGRESS) {
|
257
|
+
// Connection already failed. Return 0 to discourage any cancellation
|
258
|
+
// attempts.
|
259
|
+
handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
|
260
|
+
Run([on_connect = std::move(on_connect),
|
261
|
+
ep = absl::FailedPreconditionError(
|
262
|
+
absl::StrCat("connect failed: ", "addr: ", addr_uri.value(),
|
263
|
+
" error: ", std::strerror(saved_errno)))]() mutable {
|
264
|
+
on_connect(std::move(ep));
|
265
|
+
});
|
266
|
+
return {0, 0};
|
267
|
+
}
|
268
|
+
AsyncConnect* ac = new AsyncConnect(
|
269
|
+
std::move(on_connect), shared_from_this(), executor_.get(), handle,
|
270
|
+
std::move(allocator), options, addr_uri.value(), connection_id);
|
271
|
+
int shard_number = connection_id % connection_shards_.size();
|
272
|
+
struct ConnectionShard* shard = &connection_shards_[shard_number];
|
273
|
+
{
|
274
|
+
grpc_core::MutexLock lock(&shard->mu);
|
275
|
+
shard->pending_connections.insert_or_assign(connection_id, ac);
|
276
|
+
}
|
277
|
+
// Start asynchronous connect and return the connection id.
|
278
|
+
ac->Start(timeout);
|
279
|
+
return {static_cast<intptr_t>(connection_id), 0};
|
280
|
+
}
|
281
|
+
|
282
|
+
void PosixEventEngine::OnConnectFinishInternal(int connection_handle) {
|
283
|
+
int shard_number = connection_handle % connection_shards_.size();
|
284
|
+
struct ConnectionShard* shard = &connection_shards_[shard_number];
|
285
|
+
{
|
286
|
+
grpc_core::MutexLock lock(&shard->mu);
|
287
|
+
shard->pending_connections.erase(connection_handle);
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
291
|
+
PosixEnginePollerManager::PosixEnginePollerManager(
|
292
|
+
std::shared_ptr<ThreadPool> executor)
|
293
|
+
: poller_(grpc_event_engine::posix_engine::MakeDefaultPoller(this)),
|
294
|
+
executor_(std::move(executor)) {}
|
295
|
+
|
296
|
+
PosixEnginePollerManager::PosixEnginePollerManager(PosixEventPoller* poller)
|
297
|
+
: poller_(poller),
|
298
|
+
poller_state_(PollerState::kExternal),
|
299
|
+
executor_(nullptr) {
|
300
|
+
GPR_DEBUG_ASSERT(poller_ != nullptr);
|
301
|
+
}
|
302
|
+
|
303
|
+
void PosixEnginePollerManager::Run(
|
304
|
+
experimental::EventEngine::Closure* closure) {
|
305
|
+
if (executor_ != nullptr) {
|
306
|
+
executor_->Run(closure);
|
307
|
+
}
|
308
|
+
}
|
309
|
+
|
310
|
+
void PosixEnginePollerManager::Run(absl::AnyInvocable<void()> cb) {
|
311
|
+
if (executor_ != nullptr) {
|
312
|
+
executor_->Run(std::move(cb));
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
316
|
+
void PosixEnginePollerManager::TriggerShutdown() {
|
317
|
+
// If the poller is external, dont try to shut it down. Otherwise
|
318
|
+
// set poller state to PollerState::kShuttingDown.
|
319
|
+
if (poller_state_.exchange(PollerState::kShuttingDown) ==
|
320
|
+
PollerState::kExternal) {
|
321
|
+
poller_ = nullptr;
|
322
|
+
return;
|
323
|
+
}
|
324
|
+
poller_->Kick();
|
325
|
+
}
|
326
|
+
|
327
|
+
PosixEnginePollerManager::~PosixEnginePollerManager() {
|
328
|
+
if (poller_ != nullptr) {
|
329
|
+
poller_->Shutdown();
|
330
|
+
}
|
331
|
+
}
|
332
|
+
|
333
|
+
PosixEventEngine::PosixEventEngine(PosixEventPoller* poller)
|
334
|
+
: connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
|
335
|
+
executor_(std::make_shared<ThreadPool>()),
|
336
|
+
timer_manager_(executor_) {
|
337
|
+
poller_manager_ = std::make_shared<PosixEnginePollerManager>(poller);
|
338
|
+
}
|
339
|
+
|
340
|
+
PosixEventEngine::PosixEventEngine()
|
341
|
+
: connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
|
342
|
+
executor_(std::make_shared<ThreadPool>()),
|
343
|
+
timer_manager_(executor_) {
|
344
|
+
if (grpc_core::IsPosixEventEngineEnablePollingEnabled()) {
|
345
|
+
poller_manager_ = std::make_shared<PosixEnginePollerManager>(executor_);
|
346
|
+
if (poller_manager_->Poller() != nullptr) {
|
347
|
+
executor_->Run([poller_manager = poller_manager_]() {
|
348
|
+
PollerWorkInternal(poller_manager);
|
349
|
+
});
|
350
|
+
}
|
351
|
+
}
|
352
|
+
}
|
353
|
+
|
354
|
+
void PosixEventEngine::PollerWorkInternal(
|
355
|
+
std::shared_ptr<PosixEnginePollerManager> poller_manager) {
|
356
|
+
// TODO(vigneshbabu): The timeout specified here is arbitrary. For instance,
|
357
|
+
// this can be improved by setting the timeout to the next expiring timer.
|
358
|
+
PosixEventPoller* poller = poller_manager->Poller();
|
359
|
+
ThreadPool* executor = poller_manager->Executor();
|
360
|
+
auto result = poller->Work(24h, [executor, &poller_manager]() {
|
361
|
+
executor->Run([poller_manager]() mutable {
|
362
|
+
PollerWorkInternal(std::move(poller_manager));
|
363
|
+
});
|
364
|
+
});
|
365
|
+
if (result == Poller::WorkResult::kDeadlineExceeded) {
|
366
|
+
// The event engine is not shutting down but the next asynchronous
|
367
|
+
// PollerWorkInternal did not get scheduled. Schedule it now.
|
368
|
+
executor->Run([poller_manager = std::move(poller_manager)]() {
|
369
|
+
PollerWorkInternal(poller_manager);
|
370
|
+
});
|
371
|
+
} else if (result == Poller::WorkResult::kKicked &&
|
372
|
+
poller_manager->IsShuttingDown()) {
|
373
|
+
// The Poller Got Kicked and poller_state_ is set to
|
374
|
+
// PollerState::kShuttingDown. This can currently happen only from the
|
375
|
+
// EventEngine destructor. Sample the use_count of poller_manager. If the
|
376
|
+
// sampled use_count is > 1, there is one more instance of Work(...)
|
377
|
+
// which hasn't returned yet. Send another Kick to be safe to ensure the
|
378
|
+
// pending instance of Work(..) also breaks out. Its possible that the other
|
379
|
+
// instance of Work(..) had already broken out before this Kick is sent. In
|
380
|
+
// that case, the Kick is spurious but it shouldn't cause any side effects.
|
381
|
+
if (poller_manager.use_count() > 1) {
|
382
|
+
poller->Kick();
|
383
|
+
}
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
#endif // GRPC_POSIX_SOCKET_TCP
|
388
|
+
|
36
389
|
struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
|
37
390
|
absl::AnyInvocable<void()> cb;
|
38
391
|
posix_engine::Timer timer;
|
@@ -52,16 +405,26 @@ struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
|
|
52
405
|
};
|
53
406
|
|
54
407
|
PosixEventEngine::~PosixEventEngine() {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
408
|
+
{
|
409
|
+
grpc_core::MutexLock lock(&mu_);
|
410
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) {
|
411
|
+
for (auto handle : known_handles_) {
|
412
|
+
gpr_log(GPR_ERROR,
|
413
|
+
"(event_engine) PosixEventEngine:%p uncleared "
|
414
|
+
"TaskHandle at "
|
415
|
+
"shutdown:%s",
|
416
|
+
this, HandleToString(handle).c_str());
|
417
|
+
}
|
62
418
|
}
|
419
|
+
GPR_ASSERT(GPR_LIKELY(known_handles_.empty()));
|
420
|
+
}
|
421
|
+
timer_manager_.Shutdown();
|
422
|
+
#ifdef GRPC_POSIX_SOCKET_TCP
|
423
|
+
if (poller_manager_ != nullptr) {
|
424
|
+
poller_manager_->TriggerShutdown();
|
63
425
|
}
|
64
|
-
|
426
|
+
#endif // GRPC_POSIX_SOCKET_TCP
|
427
|
+
executor_->Quiesce();
|
65
428
|
}
|
66
429
|
|
67
430
|
bool PosixEventEngine::Cancel(EventEngine::TaskHandle handle) {
|
@@ -85,11 +448,11 @@ EventEngine::TaskHandle PosixEventEngine::RunAfter(
|
|
85
448
|
}
|
86
449
|
|
87
450
|
void PosixEventEngine::Run(absl::AnyInvocable<void()> closure) {
|
88
|
-
executor_
|
451
|
+
executor_->Run(std::move(closure));
|
89
452
|
}
|
90
453
|
|
91
454
|
void PosixEventEngine::Run(EventEngine::Closure* closure) {
|
92
|
-
executor_
|
455
|
+
executor_->Run(closure);
|
93
456
|
}
|
94
457
|
|
95
458
|
EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
|
@@ -118,15 +481,87 @@ bool PosixEventEngine::IsWorkerThread() {
|
|
118
481
|
GPR_ASSERT(false && "unimplemented");
|
119
482
|
}
|
120
483
|
|
121
|
-
bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle
|
122
|
-
|
484
|
+
bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle handle) {
|
485
|
+
#ifdef GRPC_POSIX_SOCKET_TCP
|
486
|
+
int connection_handle = handle.keys[0];
|
487
|
+
if (connection_handle <= 0) {
|
488
|
+
return false;
|
489
|
+
}
|
490
|
+
int shard_number = connection_handle % connection_shards_.size();
|
491
|
+
struct ConnectionShard* shard = &connection_shards_[shard_number];
|
492
|
+
AsyncConnect* ac = nullptr;
|
493
|
+
{
|
494
|
+
grpc_core::MutexLock lock(&shard->mu);
|
495
|
+
auto it = shard->pending_connections.find(connection_handle);
|
496
|
+
if (it != shard->pending_connections.end()) {
|
497
|
+
ac = it->second;
|
498
|
+
GPR_ASSERT(ac != nullptr);
|
499
|
+
// Trying to acquire ac->mu here would could cause a deadlock because
|
500
|
+
// the OnWritable method tries to acquire the two mutexes used
|
501
|
+
// here in the reverse order. But we dont need to acquire ac->mu before
|
502
|
+
// incrementing ac->refs here. This is because the OnWritable
|
503
|
+
// method decrements ac->refs only after deleting the connection handle
|
504
|
+
// from the corresponding hashmap. If the code enters here, it means
|
505
|
+
// that deletion hasn't happened yet. The deletion can only happen after
|
506
|
+
// the corresponding g_shard_mu is unlocked.
|
507
|
+
++ac->refs_;
|
508
|
+
// Remove connection from list of active connections.
|
509
|
+
shard->pending_connections.erase(it);
|
510
|
+
}
|
511
|
+
}
|
512
|
+
if (ac == nullptr) {
|
513
|
+
return false;
|
514
|
+
}
|
515
|
+
ac->mu_.Lock();
|
516
|
+
bool connection_cancel_success = (ac->fd_ != nullptr);
|
517
|
+
if (connection_cancel_success) {
|
518
|
+
// Connection is still pending. The OnWritable callback hasn't executed
|
519
|
+
// yet because ac->fd != nullptr.
|
520
|
+
ac->connect_cancelled_ = true;
|
521
|
+
// Shutdown the fd. This would cause OnWritable to run as soon as
|
522
|
+
// possible. We dont need to pass a custom error here because it wont be
|
523
|
+
// used since the on_connect_closure is not run if connect cancellation is
|
524
|
+
// successfull.
|
525
|
+
ac->fd_->ShutdownHandle(
|
526
|
+
absl::FailedPreconditionError("Connection cancelled"));
|
527
|
+
}
|
528
|
+
bool done = (--ac->refs_ == 0);
|
529
|
+
ac->mu_.Unlock();
|
530
|
+
if (done) {
|
531
|
+
delete ac;
|
532
|
+
}
|
533
|
+
return connection_cancel_success;
|
534
|
+
#else // GRPC_POSIX_SOCKET_TCP
|
535
|
+
GPR_ASSERT(false &&
|
536
|
+
"EventEngine::CancelConnect is not supported on this platform");
|
537
|
+
#endif // GRPC_POSIX_SOCKET_TCP
|
123
538
|
}
|
124
539
|
|
125
540
|
EventEngine::ConnectionHandle PosixEventEngine::Connect(
|
126
|
-
OnConnectCallback
|
127
|
-
const EndpointConfig&
|
128
|
-
Duration
|
129
|
-
|
541
|
+
OnConnectCallback on_connect, const ResolvedAddress& addr,
|
542
|
+
const EndpointConfig& args, MemoryAllocator memory_allocator,
|
543
|
+
Duration timeout) {
|
544
|
+
#ifdef GRPC_POSIX_SOCKET_TCP
|
545
|
+
if (!grpc_core::IsPosixEventEngineEnablePollingEnabled()) {
|
546
|
+
GPR_ASSERT(
|
547
|
+
false &&
|
548
|
+
"EventEngine::Connect is not supported because polling is not enabled");
|
549
|
+
}
|
550
|
+
GPR_ASSERT(poller_manager_ != nullptr);
|
551
|
+
PosixTcpOptions options = TcpOptionsFromEndpointConfig(args);
|
552
|
+
absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult> socket =
|
553
|
+
PosixSocketWrapper::CreateAndPrepareTcpClientSocket(options, addr);
|
554
|
+
if (!socket.ok()) {
|
555
|
+
Run([on_connect = std::move(on_connect),
|
556
|
+
status = socket.status()]() mutable { on_connect(status); });
|
557
|
+
return {0, 0};
|
558
|
+
}
|
559
|
+
return ConnectInternal((*socket).sock, std::move(on_connect),
|
560
|
+
(*socket).mapped_target_addr,
|
561
|
+
std::move(memory_allocator), options, timeout);
|
562
|
+
#else // GRPC_POSIX_SOCKET_TCP
|
563
|
+
GPR_ASSERT(false && "EventEngine::Connect is not supported on this platform");
|
564
|
+
#endif // GRPC_POSIX_SOCKET_TCP
|
130
565
|
}
|
131
566
|
|
132
567
|
absl::StatusOr<std::unique_ptr<EventEngine::Listener>>
|