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
@@ -0,0 +1,618 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
#include <grpc/support/port_platform.h>
|
15
|
+
|
16
|
+
#include "src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h"
|
17
|
+
|
18
|
+
#include <stdint.h>
|
19
|
+
|
20
|
+
#include <atomic>
|
21
|
+
#include <memory>
|
22
|
+
|
23
|
+
#include "absl/status/status.h"
|
24
|
+
#include "absl/status/statusor.h"
|
25
|
+
|
26
|
+
#include <grpc/event_engine/event_engine.h>
|
27
|
+
#include <grpc/support/log.h>
|
28
|
+
#include <grpc/support/sync.h>
|
29
|
+
|
30
|
+
#include "src/core/lib/event_engine/poller.h"
|
31
|
+
#include "src/core/lib/event_engine/time_util.h"
|
32
|
+
#include "src/core/lib/iomgr/port.h"
|
33
|
+
|
34
|
+
// This polling engine is only relevant on linux kernels supporting epoll
|
35
|
+
// epoll_create() or epoll_create1()
|
36
|
+
#ifdef GRPC_LINUX_EPOLL
|
37
|
+
#include <errno.h>
|
38
|
+
#include <limits.h>
|
39
|
+
#include <sys/epoll.h>
|
40
|
+
#include <sys/socket.h>
|
41
|
+
#include <unistd.h>
|
42
|
+
|
43
|
+
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
|
44
|
+
#include "src/core/lib/event_engine/posix_engine/lockfree_event.h"
|
45
|
+
#include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
|
46
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
|
47
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h"
|
48
|
+
#include "src/core/lib/gprpp/fork.h"
|
49
|
+
#include "src/core/lib/gprpp/strerror.h"
|
50
|
+
#include "src/core/lib/gprpp/sync.h"
|
51
|
+
|
52
|
+
using ::grpc_event_engine::posix_engine::LockfreeEvent;
|
53
|
+
using ::grpc_event_engine::posix_engine::WakeupFd;
|
54
|
+
|
55
|
+
#define MAX_EPOLL_EVENTS_HANDLED_PER_ITERATION 1
|
56
|
+
|
57
|
+
namespace grpc_event_engine {
|
58
|
+
namespace posix_engine {
|
59
|
+
|
60
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
61
|
+
using ::grpc_event_engine::experimental::Poller;
|
62
|
+
using ::grpc_event_engine::posix_engine::LockfreeEvent;
|
63
|
+
using ::grpc_event_engine::posix_engine::WakeupFd;
|
64
|
+
|
65
|
+
class Epoll1EventHandle : public EventHandle {
|
66
|
+
public:
|
67
|
+
Epoll1EventHandle(int fd, Epoll1Poller* poller)
|
68
|
+
: fd_(fd),
|
69
|
+
list_(this),
|
70
|
+
poller_(poller),
|
71
|
+
read_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
|
72
|
+
write_closure_(std::make_unique<LockfreeEvent>(poller->GetScheduler())),
|
73
|
+
error_closure_(
|
74
|
+
std::make_unique<LockfreeEvent>(poller->GetScheduler())) {
|
75
|
+
read_closure_->InitEvent();
|
76
|
+
write_closure_->InitEvent();
|
77
|
+
error_closure_->InitEvent();
|
78
|
+
pending_read_.store(false, std::memory_order_relaxed);
|
79
|
+
pending_write_.store(false, std::memory_order_relaxed);
|
80
|
+
pending_error_.store(false, std::memory_order_relaxed);
|
81
|
+
}
|
82
|
+
void ReInit(int fd) {
|
83
|
+
fd_ = fd;
|
84
|
+
read_closure_->InitEvent();
|
85
|
+
write_closure_->InitEvent();
|
86
|
+
error_closure_->InitEvent();
|
87
|
+
pending_read_.store(false, std::memory_order_relaxed);
|
88
|
+
pending_write_.store(false, std::memory_order_relaxed);
|
89
|
+
pending_error_.store(false, std::memory_order_relaxed);
|
90
|
+
}
|
91
|
+
Epoll1Poller* Poller() override { return poller_; }
|
92
|
+
bool SetPendingActions(bool pending_read, bool pending_write,
|
93
|
+
bool pending_error) {
|
94
|
+
// Another thread may be executing ExecutePendingActions() at this point
|
95
|
+
// This is possible for instance, if one instantiation of Work(..) sets
|
96
|
+
// an fd to be readable while the next instantiation of Work(...) may
|
97
|
+
// set the fd to be writable. While the second instantiation is running,
|
98
|
+
// ExecutePendingActions() of the first instantiation may execute in
|
99
|
+
// parallel and read the pending_<***>_ variables. So we need to use
|
100
|
+
// atomics to manipulate pending_<***>_ variables.
|
101
|
+
|
102
|
+
if (pending_read) {
|
103
|
+
pending_read_.store(true, std::memory_order_release);
|
104
|
+
}
|
105
|
+
|
106
|
+
if (pending_write) {
|
107
|
+
pending_write_.store(true, std::memory_order_release);
|
108
|
+
}
|
109
|
+
|
110
|
+
if (pending_error) {
|
111
|
+
pending_error_.store(true, std::memory_order_release);
|
112
|
+
}
|
113
|
+
|
114
|
+
return pending_read || pending_write || pending_error;
|
115
|
+
}
|
116
|
+
int WrappedFd() override { return fd_; }
|
117
|
+
void OrphanHandle(PosixEngineClosure* on_done, int* release_fd,
|
118
|
+
absl::string_view reason) override;
|
119
|
+
void ShutdownHandle(absl::Status why) override;
|
120
|
+
void NotifyOnRead(PosixEngineClosure* on_read) override;
|
121
|
+
void NotifyOnWrite(PosixEngineClosure* on_write) override;
|
122
|
+
void NotifyOnError(PosixEngineClosure* on_error) override;
|
123
|
+
void SetReadable() override;
|
124
|
+
void SetWritable() override;
|
125
|
+
void SetHasError() override;
|
126
|
+
bool IsHandleShutdown() override;
|
127
|
+
inline void ExecutePendingActions() {
|
128
|
+
// These may execute in Parallel with ShutdownHandle. Thats not an issue
|
129
|
+
// because the lockfree event implementation should be able to handle it.
|
130
|
+
if (pending_read_.exchange(false, std::memory_order_acq_rel)) {
|
131
|
+
read_closure_->SetReady();
|
132
|
+
}
|
133
|
+
if (pending_write_.exchange(false, std::memory_order_acq_rel)) {
|
134
|
+
write_closure_->SetReady();
|
135
|
+
}
|
136
|
+
if (pending_error_.exchange(false, std::memory_order_acq_rel)) {
|
137
|
+
error_closure_->SetReady();
|
138
|
+
}
|
139
|
+
}
|
140
|
+
grpc_core::Mutex* mu() { return &mu_; }
|
141
|
+
LockfreeEvent* ReadClosure() { return read_closure_.get(); }
|
142
|
+
LockfreeEvent* WriteClosure() { return write_closure_.get(); }
|
143
|
+
LockfreeEvent* ErrorClosure() { return error_closure_.get(); }
|
144
|
+
Epoll1Poller::HandlesList& ForkFdListPos() { return list_; }
|
145
|
+
~Epoll1EventHandle() override = default;
|
146
|
+
|
147
|
+
private:
|
148
|
+
void HandleShutdownInternal(absl::Status why, bool releasing_fd);
|
149
|
+
// See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
|
150
|
+
// required.
|
151
|
+
grpc_core::Mutex mu_;
|
152
|
+
int fd_;
|
153
|
+
// See Epoll1Poller::SetPendingActions for explanation on why pending_<***>_
|
154
|
+
// need to be atomic.
|
155
|
+
std::atomic<bool> pending_read_{false};
|
156
|
+
std::atomic<bool> pending_write_{false};
|
157
|
+
std::atomic<bool> pending_error_{false};
|
158
|
+
Epoll1Poller::HandlesList list_;
|
159
|
+
Epoll1Poller* poller_;
|
160
|
+
std::unique_ptr<LockfreeEvent> read_closure_;
|
161
|
+
std::unique_ptr<LockfreeEvent> write_closure_;
|
162
|
+
std::unique_ptr<LockfreeEvent> error_closure_;
|
163
|
+
};
|
164
|
+
|
165
|
+
namespace {
|
166
|
+
|
167
|
+
int EpollCreateAndCloexec() {
|
168
|
+
#ifdef GRPC_LINUX_EPOLL_CREATE1
|
169
|
+
int fd = epoll_create1(EPOLL_CLOEXEC);
|
170
|
+
if (fd < 0) {
|
171
|
+
gpr_log(GPR_ERROR, "epoll_create1 unavailable");
|
172
|
+
}
|
173
|
+
#else
|
174
|
+
int fd = epoll_create(MAX_EPOLL_EVENTS);
|
175
|
+
if (fd < 0) {
|
176
|
+
gpr_log(GPR_ERROR, "epoll_create unavailable");
|
177
|
+
} else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
|
178
|
+
gpr_log(GPR_ERROR, "fcntl following epoll_create failed");
|
179
|
+
return -1;
|
180
|
+
}
|
181
|
+
#endif
|
182
|
+
return fd;
|
183
|
+
}
|
184
|
+
|
185
|
+
// Only used when GRPC_ENABLE_FORK_SUPPORT=1
|
186
|
+
std::list<Epoll1Poller*> fork_poller_list;
|
187
|
+
|
188
|
+
// Only used when GRPC_ENABLE_FORK_SUPPORT=1
|
189
|
+
Epoll1EventHandle* fork_fd_list_head = nullptr;
|
190
|
+
gpr_mu fork_fd_list_mu;
|
191
|
+
|
192
|
+
void ForkFdListAddHandle(Epoll1EventHandle* handle) {
|
193
|
+
if (grpc_core::Fork::Enabled()) {
|
194
|
+
gpr_mu_lock(&fork_fd_list_mu);
|
195
|
+
handle->ForkFdListPos().next = fork_fd_list_head;
|
196
|
+
handle->ForkFdListPos().prev = nullptr;
|
197
|
+
if (fork_fd_list_head != nullptr) {
|
198
|
+
fork_fd_list_head->ForkFdListPos().prev = handle;
|
199
|
+
}
|
200
|
+
fork_fd_list_head = handle;
|
201
|
+
gpr_mu_unlock(&fork_fd_list_mu);
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
void ForkFdListRemoveHandle(Epoll1EventHandle* handle) {
|
206
|
+
if (grpc_core::Fork::Enabled()) {
|
207
|
+
gpr_mu_lock(&fork_fd_list_mu);
|
208
|
+
if (fork_fd_list_head == handle) {
|
209
|
+
fork_fd_list_head = handle->ForkFdListPos().next;
|
210
|
+
}
|
211
|
+
if (handle->ForkFdListPos().prev != nullptr) {
|
212
|
+
handle->ForkFdListPos().prev->ForkFdListPos().next =
|
213
|
+
handle->ForkFdListPos().next;
|
214
|
+
}
|
215
|
+
if (handle->ForkFdListPos().next != nullptr) {
|
216
|
+
handle->ForkFdListPos().next->ForkFdListPos().prev =
|
217
|
+
handle->ForkFdListPos().prev;
|
218
|
+
}
|
219
|
+
gpr_mu_unlock(&fork_fd_list_mu);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
void ForkPollerListAddPoller(Epoll1Poller* poller) {
|
224
|
+
if (grpc_core::Fork::Enabled()) {
|
225
|
+
gpr_mu_lock(&fork_fd_list_mu);
|
226
|
+
fork_poller_list.push_back(poller);
|
227
|
+
gpr_mu_unlock(&fork_fd_list_mu);
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
void ForkPollerListRemovePoller(Epoll1Poller* poller) {
|
232
|
+
if (grpc_core::Fork::Enabled()) {
|
233
|
+
gpr_mu_lock(&fork_fd_list_mu);
|
234
|
+
fork_poller_list.remove(poller);
|
235
|
+
gpr_mu_unlock(&fork_fd_list_mu);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
bool InitEpoll1PollerLinux();
|
240
|
+
|
241
|
+
// Called by the child process's post-fork handler to close open fds,
|
242
|
+
// including the global epoll fd of each poller. This allows gRPC to shutdown in
|
243
|
+
// the child process without interfering with connections or RPCs ongoing in the
|
244
|
+
// parent.
|
245
|
+
void ResetEventManagerOnFork() {
|
246
|
+
// Delete all pending Epoll1EventHandles.
|
247
|
+
gpr_mu_lock(&fork_fd_list_mu);
|
248
|
+
while (fork_fd_list_head != nullptr) {
|
249
|
+
close(fork_fd_list_head->WrappedFd());
|
250
|
+
Epoll1EventHandle* next = fork_fd_list_head->ForkFdListPos().next;
|
251
|
+
delete fork_fd_list_head;
|
252
|
+
fork_fd_list_head = next;
|
253
|
+
}
|
254
|
+
// Delete all registered pollers. This also closes all open epoll_sets
|
255
|
+
while (!fork_poller_list.empty()) {
|
256
|
+
Epoll1Poller* poller = fork_poller_list.front();
|
257
|
+
fork_poller_list.pop_front();
|
258
|
+
delete poller;
|
259
|
+
}
|
260
|
+
gpr_mu_unlock(&fork_fd_list_mu);
|
261
|
+
if (grpc_core::Fork::Enabled()) {
|
262
|
+
gpr_mu_destroy(&fork_fd_list_mu);
|
263
|
+
grpc_core::Fork::SetResetChildPollingEngineFunc(nullptr);
|
264
|
+
}
|
265
|
+
InitEpoll1PollerLinux();
|
266
|
+
}
|
267
|
+
|
268
|
+
// It is possible that GLIBC has epoll but the underlying kernel doesn't.
|
269
|
+
// Create epoll_fd to make sure epoll support is available
|
270
|
+
bool InitEpoll1PollerLinux() {
|
271
|
+
if (!grpc_event_engine::posix_engine::SupportsWakeupFd()) {
|
272
|
+
return false;
|
273
|
+
}
|
274
|
+
int fd = EpollCreateAndCloexec();
|
275
|
+
if (fd <= 0) {
|
276
|
+
return false;
|
277
|
+
}
|
278
|
+
if (grpc_core::Fork::Enabled()) {
|
279
|
+
gpr_mu_init(&fork_fd_list_mu);
|
280
|
+
grpc_core::Fork::SetResetChildPollingEngineFunc(ResetEventManagerOnFork);
|
281
|
+
}
|
282
|
+
close(fd);
|
283
|
+
return true;
|
284
|
+
}
|
285
|
+
|
286
|
+
} // namespace
|
287
|
+
|
288
|
+
void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
|
289
|
+
int* release_fd,
|
290
|
+
absl::string_view reason) {
|
291
|
+
bool is_release_fd = (release_fd != nullptr);
|
292
|
+
if (!read_closure_->IsShutdown()) {
|
293
|
+
HandleShutdownInternal(absl::Status(absl::StatusCode::kUnknown, reason),
|
294
|
+
is_release_fd);
|
295
|
+
}
|
296
|
+
|
297
|
+
// If release_fd is not NULL, we should be relinquishing control of the file
|
298
|
+
// descriptor fd->fd (but we still own the grpc_fd structure).
|
299
|
+
if (is_release_fd) {
|
300
|
+
*release_fd = fd_;
|
301
|
+
} else {
|
302
|
+
close(fd_);
|
303
|
+
}
|
304
|
+
|
305
|
+
ForkFdListRemoveHandle(this);
|
306
|
+
{
|
307
|
+
// See Epoll1Poller::ShutdownHandle for explanation on why a mutex is
|
308
|
+
// required here.
|
309
|
+
grpc_core::MutexLock lock(&mu_);
|
310
|
+
read_closure_->DestroyEvent();
|
311
|
+
write_closure_->DestroyEvent();
|
312
|
+
error_closure_->DestroyEvent();
|
313
|
+
}
|
314
|
+
pending_read_.store(false, std::memory_order_release);
|
315
|
+
pending_write_.store(false, std::memory_order_release);
|
316
|
+
pending_error_.store(false, std::memory_order_release);
|
317
|
+
{
|
318
|
+
grpc_core::MutexLock lock(&poller_->mu_);
|
319
|
+
poller_->free_epoll1_handles_list_.push_back(this);
|
320
|
+
}
|
321
|
+
if (on_done != nullptr) {
|
322
|
+
on_done->SetStatus(absl::OkStatus());
|
323
|
+
poller_->GetScheduler()->Run(on_done);
|
324
|
+
}
|
325
|
+
}
|
326
|
+
|
327
|
+
// if 'releasing_fd' is true, it means that we are going to detach the internal
|
328
|
+
// fd from grpc_fd structure (i.e which means we should not be calling
|
329
|
+
// shutdown() syscall on that fd)
|
330
|
+
void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
|
331
|
+
bool releasing_fd) {
|
332
|
+
if (read_closure_->SetShutdown(why)) {
|
333
|
+
if (!releasing_fd) {
|
334
|
+
shutdown(fd_, SHUT_RDWR);
|
335
|
+
} else {
|
336
|
+
epoll_event phony_event;
|
337
|
+
if (epoll_ctl(poller_->g_epoll_set_.epfd, EPOLL_CTL_DEL, fd_,
|
338
|
+
&phony_event) != 0) {
|
339
|
+
gpr_log(GPR_ERROR, "epoll_ctl failed: %s",
|
340
|
+
grpc_core::StrError(errno).c_str());
|
341
|
+
}
|
342
|
+
}
|
343
|
+
write_closure_->SetShutdown(why);
|
344
|
+
write_closure_->SetShutdown(why);
|
345
|
+
}
|
346
|
+
}
|
347
|
+
|
348
|
+
Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
|
349
|
+
: scheduler_(scheduler), was_kicked_(false) {
|
350
|
+
g_epoll_set_.epfd = EpollCreateAndCloexec();
|
351
|
+
wakeup_fd_ = *CreateWakeupFd();
|
352
|
+
GPR_ASSERT(wakeup_fd_ != nullptr);
|
353
|
+
GPR_ASSERT(g_epoll_set_.epfd >= 0);
|
354
|
+
gpr_log(GPR_INFO, "grpc epoll fd: %d", g_epoll_set_.epfd);
|
355
|
+
struct epoll_event ev;
|
356
|
+
ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLET);
|
357
|
+
ev.data.ptr = wakeup_fd_.get();
|
358
|
+
GPR_ASSERT(epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, wakeup_fd_->ReadFd(),
|
359
|
+
&ev) == 0);
|
360
|
+
g_epoll_set_.num_events = 0;
|
361
|
+
g_epoll_set_.cursor = 0;
|
362
|
+
ForkPollerListAddPoller(this);
|
363
|
+
}
|
364
|
+
|
365
|
+
void Epoll1Poller::Shutdown() {
|
366
|
+
ForkPollerListRemovePoller(this);
|
367
|
+
delete this;
|
368
|
+
}
|
369
|
+
|
370
|
+
Epoll1Poller::~Epoll1Poller() {
|
371
|
+
if (g_epoll_set_.epfd >= 0) {
|
372
|
+
close(g_epoll_set_.epfd);
|
373
|
+
g_epoll_set_.epfd = -1;
|
374
|
+
}
|
375
|
+
{
|
376
|
+
grpc_core::MutexLock lock(&mu_);
|
377
|
+
while (!free_epoll1_handles_list_.empty()) {
|
378
|
+
Epoll1EventHandle* handle = reinterpret_cast<Epoll1EventHandle*>(
|
379
|
+
free_epoll1_handles_list_.front());
|
380
|
+
free_epoll1_handles_list_.pop_front();
|
381
|
+
delete handle;
|
382
|
+
}
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view /*name*/,
|
387
|
+
bool track_err) {
|
388
|
+
Epoll1EventHandle* new_handle = nullptr;
|
389
|
+
{
|
390
|
+
grpc_core::MutexLock lock(&mu_);
|
391
|
+
if (free_epoll1_handles_list_.empty()) {
|
392
|
+
new_handle = new Epoll1EventHandle(fd, this);
|
393
|
+
} else {
|
394
|
+
new_handle = reinterpret_cast<Epoll1EventHandle*>(
|
395
|
+
free_epoll1_handles_list_.front());
|
396
|
+
free_epoll1_handles_list_.pop_front();
|
397
|
+
new_handle->ReInit(fd);
|
398
|
+
}
|
399
|
+
}
|
400
|
+
ForkFdListAddHandle(new_handle);
|
401
|
+
struct epoll_event ev;
|
402
|
+
ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLOUT | EPOLLET);
|
403
|
+
// Use the least significant bit of ev.data.ptr to store track_err. We expect
|
404
|
+
// the addresses to be word aligned. We need to store track_err to avoid
|
405
|
+
// synchronization issues when accessing it after receiving an event.
|
406
|
+
// Accessing fd would be a data race there because the fd might have been
|
407
|
+
// returned to the free list at that point.
|
408
|
+
ev.data.ptr = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(new_handle) |
|
409
|
+
(track_err ? 1 : 0));
|
410
|
+
if (epoll_ctl(g_epoll_set_.epfd, EPOLL_CTL_ADD, fd, &ev) != 0) {
|
411
|
+
gpr_log(GPR_ERROR, "epoll_ctl failed: %s",
|
412
|
+
grpc_core::StrError(errno).c_str());
|
413
|
+
}
|
414
|
+
|
415
|
+
return new_handle;
|
416
|
+
}
|
417
|
+
|
418
|
+
// Process the epoll events found by DoEpollWait() function.
|
419
|
+
// - g_epoll_set.cursor points to the index of the first event to be processed
|
420
|
+
// - This function then processes up-to max_epoll_events_to_handle and
|
421
|
+
// updates the g_epoll_set.cursor.
|
422
|
+
// It returns true, it there was a Kick that forced invocation of this
|
423
|
+
// function. It also returns the list of closures to run to take action
|
424
|
+
// on file descriptors that became readable/writable.
|
425
|
+
bool Epoll1Poller::ProcessEpollEvents(int max_epoll_events_to_handle,
|
426
|
+
Events& pending_events) {
|
427
|
+
int64_t num_events = g_epoll_set_.num_events;
|
428
|
+
int64_t cursor = g_epoll_set_.cursor;
|
429
|
+
bool was_kicked = false;
|
430
|
+
for (int idx = 0; (idx < max_epoll_events_to_handle) && cursor != num_events;
|
431
|
+
idx++) {
|
432
|
+
int64_t c = cursor++;
|
433
|
+
struct epoll_event* ev = &g_epoll_set_.events[c];
|
434
|
+
void* data_ptr = ev->data.ptr;
|
435
|
+
if (data_ptr == wakeup_fd_.get()) {
|
436
|
+
GPR_ASSERT(wakeup_fd_->ConsumeWakeup().ok());
|
437
|
+
was_kicked = true;
|
438
|
+
} else {
|
439
|
+
Epoll1EventHandle* handle = reinterpret_cast<Epoll1EventHandle*>(
|
440
|
+
reinterpret_cast<intptr_t>(data_ptr) & ~static_cast<intptr_t>(1));
|
441
|
+
bool track_err =
|
442
|
+
reinterpret_cast<intptr_t>(data_ptr) & static_cast<intptr_t>(1);
|
443
|
+
bool cancel = (ev->events & EPOLLHUP) != 0;
|
444
|
+
bool error = (ev->events & EPOLLERR) != 0;
|
445
|
+
bool read_ev = (ev->events & (EPOLLIN | EPOLLPRI)) != 0;
|
446
|
+
bool write_ev = (ev->events & EPOLLOUT) != 0;
|
447
|
+
bool err_fallback = error && !track_err;
|
448
|
+
if (handle->SetPendingActions(read_ev || cancel || err_fallback,
|
449
|
+
write_ev || cancel || err_fallback,
|
450
|
+
error && !err_fallback)) {
|
451
|
+
pending_events.push_back(handle);
|
452
|
+
}
|
453
|
+
}
|
454
|
+
}
|
455
|
+
g_epoll_set_.cursor = cursor;
|
456
|
+
return was_kicked;
|
457
|
+
}
|
458
|
+
|
459
|
+
// Do epoll_wait and store the events in g_epoll_set.events field. This does
|
460
|
+
// not "process" any of the events yet; that is done in ProcessEpollEvents().
|
461
|
+
// See ProcessEpollEvents() function for more details. It returns the number
|
462
|
+
// of events generated by epoll_wait.
|
463
|
+
int Epoll1Poller::DoEpollWait(EventEngine::Duration timeout) {
|
464
|
+
int r;
|
465
|
+
do {
|
466
|
+
r = epoll_wait(g_epoll_set_.epfd, g_epoll_set_.events, MAX_EPOLL_EVENTS,
|
467
|
+
static_cast<int>(
|
468
|
+
grpc_event_engine::experimental::Milliseconds(timeout)));
|
469
|
+
} while (r < 0 && errno == EINTR);
|
470
|
+
if (r < 0) {
|
471
|
+
gpr_log(GPR_ERROR,
|
472
|
+
"(event_engine) Epoll1Poller:%p encountered epoll_wait error: %s",
|
473
|
+
this, grpc_core::StrError(errno).c_str());
|
474
|
+
GPR_ASSERT(false);
|
475
|
+
}
|
476
|
+
g_epoll_set_.num_events = r;
|
477
|
+
g_epoll_set_.cursor = 0;
|
478
|
+
return r;
|
479
|
+
}
|
480
|
+
|
481
|
+
// Might be called multiple times
|
482
|
+
void Epoll1EventHandle::ShutdownHandle(absl::Status why) {
|
483
|
+
// A mutex is required here because, the SetShutdown method of the
|
484
|
+
// lockfree event may schedule a closure if it is already ready and that
|
485
|
+
// closure may call OrphanHandle. Execution of ShutdownHandle and OrphanHandle
|
486
|
+
// in parallel is not safe because some of the lockfree event types e.g, read,
|
487
|
+
// write, error may-not have called SetShutdown when DestroyEvent gets
|
488
|
+
// called in the OrphanHandle method.
|
489
|
+
grpc_core::MutexLock lock(&mu_);
|
490
|
+
HandleShutdownInternal(why, false);
|
491
|
+
}
|
492
|
+
|
493
|
+
bool Epoll1EventHandle::IsHandleShutdown() {
|
494
|
+
return read_closure_->IsShutdown();
|
495
|
+
}
|
496
|
+
|
497
|
+
void Epoll1EventHandle::NotifyOnRead(PosixEngineClosure* on_read) {
|
498
|
+
read_closure_->NotifyOn(on_read);
|
499
|
+
}
|
500
|
+
|
501
|
+
void Epoll1EventHandle::NotifyOnWrite(PosixEngineClosure* on_write) {
|
502
|
+
write_closure_->NotifyOn(on_write);
|
503
|
+
}
|
504
|
+
|
505
|
+
void Epoll1EventHandle::NotifyOnError(PosixEngineClosure* on_error) {
|
506
|
+
error_closure_->NotifyOn(on_error);
|
507
|
+
}
|
508
|
+
|
509
|
+
void Epoll1EventHandle::SetReadable() { read_closure_->SetReady(); }
|
510
|
+
|
511
|
+
void Epoll1EventHandle::SetWritable() { write_closure_->SetReady(); }
|
512
|
+
|
513
|
+
void Epoll1EventHandle::SetHasError() { error_closure_->SetReady(); }
|
514
|
+
|
515
|
+
// Polls the registered Fds for events until timeout is reached or there is a
|
516
|
+
// Kick(). If there is a Kick(), it collects and processes any previously
|
517
|
+
// un-processed events. If there are no un-processed events, it returns
|
518
|
+
// Poller::WorkResult::Kicked{}
|
519
|
+
Poller::WorkResult Epoll1Poller::Work(
|
520
|
+
EventEngine::Duration timeout,
|
521
|
+
absl::FunctionRef<void()> schedule_poll_again) {
|
522
|
+
Events pending_events;
|
523
|
+
bool was_kicked_ext = false;
|
524
|
+
if (g_epoll_set_.cursor == g_epoll_set_.num_events) {
|
525
|
+
if (DoEpollWait(timeout) == 0) {
|
526
|
+
return Poller::WorkResult::kDeadlineExceeded;
|
527
|
+
}
|
528
|
+
}
|
529
|
+
{
|
530
|
+
grpc_core::MutexLock lock(&mu_);
|
531
|
+
// If was_kicked_ is true, collect all pending events in this iteration.
|
532
|
+
if (ProcessEpollEvents(
|
533
|
+
was_kicked_ ? INT_MAX : MAX_EPOLL_EVENTS_HANDLED_PER_ITERATION,
|
534
|
+
pending_events)) {
|
535
|
+
was_kicked_ = false;
|
536
|
+
was_kicked_ext = true;
|
537
|
+
}
|
538
|
+
if (pending_events.empty()) {
|
539
|
+
return Poller::WorkResult::kKicked;
|
540
|
+
}
|
541
|
+
}
|
542
|
+
// Run the provided callback.
|
543
|
+
schedule_poll_again();
|
544
|
+
// Process all pending events inline.
|
545
|
+
for (auto& it : pending_events) {
|
546
|
+
it->ExecutePendingActions();
|
547
|
+
}
|
548
|
+
return was_kicked_ext ? Poller::WorkResult::kKicked : Poller::WorkResult::kOk;
|
549
|
+
}
|
550
|
+
|
551
|
+
void Epoll1Poller::Kick() {
|
552
|
+
grpc_core::MutexLock lock(&mu_);
|
553
|
+
if (was_kicked_) {
|
554
|
+
return;
|
555
|
+
}
|
556
|
+
was_kicked_ = true;
|
557
|
+
GPR_ASSERT(wakeup_fd_->Wakeup().ok());
|
558
|
+
}
|
559
|
+
|
560
|
+
Epoll1Poller* MakeEpoll1Poller(Scheduler* scheduler) {
|
561
|
+
static bool kEpoll1PollerSupported = InitEpoll1PollerLinux();
|
562
|
+
if (kEpoll1PollerSupported) {
|
563
|
+
return new Epoll1Poller(scheduler);
|
564
|
+
}
|
565
|
+
return nullptr;
|
566
|
+
}
|
567
|
+
|
568
|
+
} // namespace posix_engine
|
569
|
+
} // namespace grpc_event_engine
|
570
|
+
|
571
|
+
#else /* defined(GRPC_LINUX_EPOLL) */
|
572
|
+
#if defined(GRPC_POSIX_SOCKET_EV_EPOLL1)
|
573
|
+
|
574
|
+
namespace grpc_event_engine {
|
575
|
+
namespace posix_engine {
|
576
|
+
|
577
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
578
|
+
using ::grpc_event_engine::experimental::Poller;
|
579
|
+
|
580
|
+
Epoll1Poller::Epoll1Poller(Scheduler* /* engine */) {
|
581
|
+
GPR_ASSERT(false && "unimplemented");
|
582
|
+
}
|
583
|
+
|
584
|
+
void Epoll1Poller::Shutdown() { GPR_ASSERT(false && "unimplemented"); }
|
585
|
+
|
586
|
+
Epoll1Poller::~Epoll1Poller() { GPR_ASSERT(false && "unimplemented"); }
|
587
|
+
|
588
|
+
EventHandle* Epoll1Poller::CreateHandle(int /*fd*/, absl::string_view /*name*/,
|
589
|
+
bool /*track_err*/) {
|
590
|
+
GPR_ASSERT(false && "unimplemented");
|
591
|
+
}
|
592
|
+
|
593
|
+
bool Epoll1Poller::ProcessEpollEvents(int /*max_epoll_events_to_handle*/,
|
594
|
+
Events& /*pending_events*/) {
|
595
|
+
GPR_ASSERT(false && "unimplemented");
|
596
|
+
}
|
597
|
+
|
598
|
+
int Epoll1Poller::DoEpollWait(EventEngine::Duration /*timeout*/) {
|
599
|
+
GPR_ASSERT(false && "unimplemented");
|
600
|
+
}
|
601
|
+
|
602
|
+
Poller::WorkResult Epoll1Poller::Work(
|
603
|
+
EventEngine::Duration /*timeout*/,
|
604
|
+
absl::FunctionRef<void()> /*schedule_poll_again*/) {
|
605
|
+
GPR_ASSERT(false && "unimplemented");
|
606
|
+
}
|
607
|
+
|
608
|
+
void Epoll1Poller::Kick() { GPR_ASSERT(false && "unimplemented"); }
|
609
|
+
|
610
|
+
// If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
|
611
|
+
// nullptr.
|
612
|
+
Epoll1Poller* MakeEpoll1Poller(Scheduler* /*scheduler*/) { return nullptr; }
|
613
|
+
|
614
|
+
} // namespace posix_engine
|
615
|
+
} // namespace grpc_event_engine
|
616
|
+
|
617
|
+
#endif /* defined(GRPC_POSIX_SOCKET_EV_EPOLL1) */
|
618
|
+
#endif /* !defined(GRPC_LINUX_EPOLL) */
|