diff --git a/BUILD b/BUILD index a68ce63a1c4..363d9524a97 100644 --- a/BUILD +++ b/BUILD @@ -2726,6 +2726,7 @@ grpc_cc_library( external_deps = ["absl/strings"], deps = [ "gpr", + "iomgr_port", "posix_event_engine_event_poller", "posix_event_engine_poller_posix_epoll1", "posix_event_engine_poller_posix_poll", @@ -2873,12 +2874,17 @@ grpc_cc_library( ], deps = [ "event_engine_base_hdrs", + "event_engine_poller", "event_engine_thread_pool", "event_engine_trace", "event_engine_utils", + "experiments", "gpr", "grpc_trace", "init_internally", + "iomgr_port", + "posix_event_engine_event_poller", + "posix_event_engine_poller_posix_default", "posix_event_engine_timer", "posix_event_engine_timer_manager", "//src/core:event_engine_common", diff --git a/CMakeLists.txt b/CMakeLists.txt index d9ca6fdfd19..874fe03dd12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1070,7 +1070,9 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx posix_endpoint_test) endif() - add_dependencies(buildtests_cxx posix_event_engine_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx posix_event_engine_test) + endif() add_dependencies(buildtests_cxx promise_factory_test) add_dependencies(buildtests_cxx promise_map_test) add_dependencies(buildtests_cxx promise_test) @@ -2106,10 +2108,18 @@ add_library(grpc src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/forkable.cc src/core/lib/event_engine/memory_allocator.cc + src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc + src/core/lib/event_engine/posix_engine/ev_poll_posix.cc + src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc + src/core/lib/event_engine/posix_engine/internal_errqueue.cc + src/core/lib/event_engine/posix_engine/lockfree_event.cc src/core/lib/event_engine/posix_engine/posix_engine.cc src/core/lib/event_engine/posix_engine/timer.cc src/core/lib/event_engine/posix_engine/timer_heap.cc src/core/lib/event_engine/posix_engine/timer_manager.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc src/core/lib/event_engine/resolved_address.cc src/core/lib/event_engine/slice.cc src/core/lib/event_engine/slice_buffer.cc @@ -2715,10 +2725,18 @@ add_library(grpc_unsecure src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/forkable.cc src/core/lib/event_engine/memory_allocator.cc + src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc + src/core/lib/event_engine/posix_engine/ev_poll_posix.cc + src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc + src/core/lib/event_engine/posix_engine/internal_errqueue.cc + src/core/lib/event_engine/posix_engine/lockfree_event.cc src/core/lib/event_engine/posix_engine/posix_engine.cc src/core/lib/event_engine/posix_engine/timer.cc src/core/lib/event_engine/posix_engine/timer_heap.cc src/core/lib/event_engine/posix_engine/timer_manager.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc + src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc src/core/lib/event_engine/resolved_address.cc src/core/lib/event_engine/slice.cc src/core/lib/event_engine/slice_buffer.cc @@ -9482,14 +9500,6 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(event_poller_posix_test - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc - src/core/lib/event_engine/posix_engine/internal_errqueue.cc - src/core/lib/event_engine/posix_engine/lockfree_event.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc test/core/event_engine/posix/event_poller_posix_test.cc test/core/event_engine/posix/posix_engine_test_utils.cc third_party/googletest/googletest/src/gtest-all.cc @@ -13094,7 +13104,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(lock_free_event_test - src/core/lib/event_engine/posix_engine/lockfree_event.cc test/core/event_engine/posix/lock_free_event_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc @@ -14622,17 +14631,9 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(posix_endpoint_test - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc - src/core/lib/event_engine/posix_engine/internal_errqueue.cc - src/core/lib/event_engine/posix_engine/lockfree_event.cc src/core/lib/event_engine/posix_engine/posix_endpoint.cc src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc src/core/lib/event_engine/posix_engine/traced_buffer_list.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc src/core/lib/gprpp/load_file.cc src/core/lib/iomgr/socket_mutator.cc test/core/event_engine/posix/posix_endpoint_test.cc @@ -14673,42 +14674,44 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) endif() endif() if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) -add_executable(posix_event_engine_test - test/core/event_engine/test_suite/event_engine_test.cc - test/core/event_engine/test_suite/event_engine_test_utils.cc - test/core/event_engine/test_suite/posix_event_engine_test.cc - test/core/event_engine/test_suite/timer_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) + add_executable(posix_event_engine_test + test/core/event_engine/test_suite/event_engine_test.cc + test/core/event_engine/test_suite/event_engine_test_utils.cc + test/core/event_engine/test_suite/posix_event_engine_test.cc + test/core/event_engine/test_suite/timer_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) -target_include_directories(posix_event_engine_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_RE2_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_XXHASH_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) + target_include_directories(posix_event_engine_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) -target_link_libraries(posix_event_engine_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util -) + target_link_libraries(posix_event_engine_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + ) +endif() endif() if(gRPC_BUILD_TESTS) @@ -19128,7 +19131,6 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(traced_buffer_list_test - src/core/lib/event_engine/posix_engine/internal_errqueue.cc src/core/lib/event_engine/posix_engine/traced_buffer_list.cc test/core/event_engine/posix/traced_buffer_list_test.cc third_party/googletest/googletest/src/gtest-all.cc @@ -19668,8 +19670,6 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(wakeup_fd_posix_test - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc test/core/event_engine/posix/wakeup_fd_posix_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc diff --git a/Makefile b/Makefile index 382fed06890..7cc622bd4b1 100644 --- a/Makefile +++ b/Makefile @@ -1394,10 +1394,18 @@ LIBGRPC_SRC = \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/memory_allocator.cc \ + src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ + src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ + src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ + src/core/lib/event_engine/posix_engine/internal_errqueue.cc \ + src/core/lib/event_engine/posix_engine/lockfree_event.cc \ src/core/lib/event_engine/posix_engine/posix_engine.cc \ src/core/lib/event_engine/posix_engine/timer.cc \ src/core/lib/event_engine/posix_engine/timer_heap.cc \ src/core/lib/event_engine/posix_engine/timer_manager.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ src/core/lib/event_engine/slice_buffer.cc \ @@ -1866,10 +1874,18 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/memory_allocator.cc \ + src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ + src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ + src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ + src/core/lib/event_engine/posix_engine/internal_errqueue.cc \ + src/core/lib/event_engine/posix_engine/lockfree_event.cc \ src/core/lib/event_engine/posix_engine/posix_engine.cc \ src/core/lib/event_engine/posix_engine/timer.cc \ src/core/lib/event_engine/posix_engine/timer_heap.cc \ src/core/lib/event_engine/posix_engine/timer_manager.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ src/core/lib/event_engine/slice_buffer.cc \ diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index 30906fc81b5..502869db84e 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -24,6 +24,9 @@ EXPERIMENTS = { "endpoint_test": [ "tcp_read_chunks", ], + "event_engine_client_test": [ + "posix_event_engine_enable_polling", + ], "flow_control_test": [ "tcp_read_chunks", ], diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 60cfe105a38..90805131fb9 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -732,16 +732,28 @@ libs: - src/core/lib/debug/stats_data.h - src/core/lib/debug/trace.h - src/core/lib/event_engine/channel_args_endpoint_config.h + - src/core/lib/event_engine/common_closures.h - src/core/lib/event_engine/default_event_engine.h - src/core/lib/event_engine/default_event_engine_factory.h - src/core/lib/event_engine/executor/executor.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/handle_containers.h - src/core/lib/event_engine/poller.h + - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h + - src/core/lib/event_engine/posix_engine/ev_poll_posix.h + - src/core/lib/event_engine/posix_engine/event_poller.h + - src/core/lib/event_engine/posix_engine/event_poller_posix_default.h + - src/core/lib/event_engine/posix_engine/internal_errqueue.h + - src/core/lib/event_engine/posix_engine/lockfree_event.h - src/core/lib/event_engine/posix_engine/posix_engine.h + - src/core/lib/event_engine/posix_engine/posix_engine_closure.h - src/core/lib/event_engine/posix_engine/timer.h - src/core/lib/event_engine/posix_engine/timer_heap.h - src/core/lib/event_engine/posix_engine/timer_manager.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h - src/core/lib/event_engine/socket_notifier.h - src/core/lib/event_engine/thread_pool.h - src/core/lib/event_engine/time_util.h @@ -1452,10 +1464,18 @@ libs: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc + - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc + - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc + - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc + - src/core/lib/event_engine/posix_engine/internal_errqueue.cc + - src/core/lib/event_engine/posix_engine/lockfree_event.cc - src/core/lib/event_engine/posix_engine/posix_engine.cc - src/core/lib/event_engine/posix_engine/timer.cc - src/core/lib/event_engine/posix_engine/timer_heap.cc - src/core/lib/event_engine/posix_engine/timer_manager.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc - src/core/lib/event_engine/resolved_address.cc - src/core/lib/event_engine/slice.cc - src/core/lib/event_engine/slice_buffer.cc @@ -1935,16 +1955,28 @@ libs: - src/core/lib/debug/stats_data.h - src/core/lib/debug/trace.h - src/core/lib/event_engine/channel_args_endpoint_config.h + - src/core/lib/event_engine/common_closures.h - src/core/lib/event_engine/default_event_engine.h - src/core/lib/event_engine/default_event_engine_factory.h - src/core/lib/event_engine/executor/executor.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/handle_containers.h - src/core/lib/event_engine/poller.h + - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h + - src/core/lib/event_engine/posix_engine/ev_poll_posix.h + - src/core/lib/event_engine/posix_engine/event_poller.h + - src/core/lib/event_engine/posix_engine/event_poller_posix_default.h + - src/core/lib/event_engine/posix_engine/internal_errqueue.h + - src/core/lib/event_engine/posix_engine/lockfree_event.h - src/core/lib/event_engine/posix_engine/posix_engine.h + - src/core/lib/event_engine/posix_engine/posix_engine_closure.h - src/core/lib/event_engine/posix_engine/timer.h - src/core/lib/event_engine/posix_engine/timer_heap.h - src/core/lib/event_engine/posix_engine/timer_manager.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h - src/core/lib/event_engine/socket_notifier.h - src/core/lib/event_engine/thread_pool.h - src/core/lib/event_engine/time_util.h @@ -2295,10 +2327,18 @@ libs: - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/forkable.cc - src/core/lib/event_engine/memory_allocator.cc + - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc + - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc + - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc + - src/core/lib/event_engine/posix_engine/internal_errqueue.cc + - src/core/lib/event_engine/posix_engine/lockfree_event.cc - src/core/lib/event_engine/posix_engine/posix_engine.cc - src/core/lib/event_engine/posix_engine/timer.cc - src/core/lib/event_engine/posix_engine/timer_heap.cc - src/core/lib/event_engine/posix_engine/timer_manager.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc + - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc - src/core/lib/event_engine/resolved_address.cc - src/core/lib/event_engine/slice.cc - src/core/lib/event_engine/slice_buffer.cc @@ -5742,28 +5782,8 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/common_closures.h - - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h - - src/core/lib/event_engine/posix_engine/ev_poll_posix.h - - src/core/lib/event_engine/posix_engine/event_poller.h - - src/core/lib/event_engine/posix_engine/event_poller_posix_default.h - - src/core/lib/event_engine/posix_engine/internal_errqueue.h - - src/core/lib/event_engine/posix_engine/lockfree_event.h - - src/core/lib/event_engine/posix_engine/posix_engine_closure.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h - test/core/event_engine/posix/posix_engine_test_utils.h src: - - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc - - src/core/lib/event_engine/posix_engine/internal_errqueue.cc - - src/core/lib/event_engine/posix_engine/lockfree_event.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc - test/core/event_engine/posix/event_poller_posix_test.cc - test/core/event_engine/posix/posix_engine_test_utils.cc deps: @@ -7341,7 +7361,6 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/common_closures.h - test/core/event_engine/windows/create_sockpair.h src: - test/core/event_engine/windows/create_sockpair.cc @@ -7565,12 +7584,8 @@ targets: gtest: true build: test language: c++ - headers: - - src/core/lib/event_engine/posix_engine/event_poller.h - - src/core/lib/event_engine/posix_engine/lockfree_event.h - - src/core/lib/event_engine/posix_engine/posix_engine_closure.h + headers: [] src: - - src/core/lib/event_engine/posix_engine/lockfree_event.cc - test/core/event_engine/posix/lock_free_event_test.cc deps: - grpc_test_util @@ -8272,21 +8287,9 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/common_closures.h - - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h - - src/core/lib/event_engine/posix_engine/ev_poll_posix.h - - src/core/lib/event_engine/posix_engine/event_poller.h - - src/core/lib/event_engine/posix_engine/event_poller_posix_default.h - - src/core/lib/event_engine/posix_engine/internal_errqueue.h - - src/core/lib/event_engine/posix_engine/lockfree_event.h - src/core/lib/event_engine/posix_engine/posix_endpoint.h - - src/core/lib/event_engine/posix_engine/posix_engine_closure.h - src/core/lib/event_engine/posix_engine/tcp_socket_utils.h - src/core/lib/event_engine/posix_engine/traced_buffer_list.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h - src/core/lib/gprpp/load_file.h - src/core/lib/iomgr/socket_mutator.h - test/core/event_engine/posix/posix_engine_test_utils.h @@ -8294,17 +8297,9 @@ targets: - test/core/event_engine/test_suite/event_engine_test_utils.h - test/core/event_engine/test_suite/oracle_event_engine_posix.h src: - - src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc - - src/core/lib/event_engine/posix_engine/ev_poll_posix.cc - - src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc - - src/core/lib/event_engine/posix_engine/internal_errqueue.cc - - src/core/lib/event_engine/posix_engine/lockfree_event.cc - src/core/lib/event_engine/posix_engine/posix_endpoint.cc - src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc - src/core/lib/event_engine/posix_engine/traced_buffer_list.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc - src/core/lib/gprpp/load_file.cc - src/core/lib/iomgr/socket_mutator.cc - test/core/event_engine/posix/posix_endpoint_test.cc @@ -8332,6 +8327,10 @@ targets: - test/core/event_engine/test_suite/timer_test.cc deps: - grpc_test_util + platforms: + - linux + - posix + - mac uses_polling: false - name: promise_factory_test gtest: true @@ -10238,8 +10237,7 @@ targets: gtest: true build: test language: c++ - headers: - - src/core/lib/event_engine/common_closures.h + headers: [] src: - test/core/event_engine/posix/timer_manager_test.cc deps: @@ -10333,10 +10331,8 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/posix_engine/internal_errqueue.h - src/core/lib/event_engine/posix_engine/traced_buffer_list.h src: - - src/core/lib/event_engine/posix_engine/internal_errqueue.cc - src/core/lib/event_engine/posix_engine/traced_buffer_list.cc - test/core/event_engine/posix/traced_buffer_list_test.cc deps: @@ -10596,13 +10592,8 @@ targets: gtest: true build: test language: c++ - headers: - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h - - src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h + headers: [] src: - - src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc - - src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc - test/core/event_engine/posix/wakeup_fd_posix_test.cc deps: - grpc_test_util @@ -10615,7 +10606,6 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/common_closures.h - test/core/event_engine/windows/create_sockpair.h src: - test/core/event_engine/windows/create_sockpair.cc @@ -10861,7 +10851,6 @@ targets: build: test language: c++ headers: - - src/core/lib/event_engine/common_closures.h - src/core/lib/event_engine/work_queue.h src: - src/core/lib/event_engine/work_queue.cc diff --git a/config.m4 b/config.m4 index c784acf33f4..7f12b605ede 100644 --- a/config.m4 +++ b/config.m4 @@ -476,10 +476,18 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/memory_allocator.cc \ + src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ + src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ + src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ + src/core/lib/event_engine/posix_engine/internal_errqueue.cc \ + src/core/lib/event_engine/posix_engine/lockfree_event.cc \ src/core/lib/event_engine/posix_engine/posix_engine.cc \ src/core/lib/event_engine/posix_engine/timer.cc \ src/core/lib/event_engine/posix_engine/timer_heap.cc \ src/core/lib/event_engine/posix_engine/timer_manager.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc \ + src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ src/core/lib/event_engine/slice_buffer.cc \ diff --git a/config.w32 b/config.w32 index c5f3fa8056f..ba89250f7b0 100644 --- a/config.w32 +++ b/config.w32 @@ -442,10 +442,18 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\event_engine\\default_event_engine_factory.cc " + "src\\core\\lib\\event_engine\\forkable.cc " + "src\\core\\lib\\event_engine\\memory_allocator.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\ev_epoll1_linux.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\ev_poll_posix.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\event_poller_posix_default.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\internal_errqueue.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\lockfree_event.cc " + "src\\core\\lib\\event_engine\\posix_engine\\posix_engine.cc " + "src\\core\\lib\\event_engine\\posix_engine\\timer.cc " + "src\\core\\lib\\event_engine\\posix_engine\\timer_heap.cc " + "src\\core\\lib\\event_engine\\posix_engine\\timer_manager.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\wakeup_fd_eventfd.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\wakeup_fd_pipe.cc " + + "src\\core\\lib\\event_engine\\posix_engine\\wakeup_fd_posix_default.cc " + "src\\core\\lib\\event_engine\\resolved_address.cc " + "src\\core\\lib\\event_engine\\slice.cc " + "src\\core\\lib\\event_engine\\slice_buffer.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index ff7e8e3ba9f..0eea4068f75 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -683,16 +683,28 @@ Pod::Spec.new do |s| 'src/core/lib/debug/stats_data.h', 'src/core/lib/debug/trace.h', 'src/core/lib/event_engine/channel_args_endpoint_config.h', + 'src/core/lib/event_engine/common_closures.h', 'src/core/lib/event_engine/default_event_engine.h', 'src/core/lib/event_engine/default_event_engine_factory.h', 'src/core/lib/event_engine/executor/executor.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/handle_containers.h', 'src/core/lib/event_engine/poller.h', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.h', + 'src/core/lib/event_engine/posix_engine/event_poller.h', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.h', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.h', + 'src/core/lib/event_engine/posix_engine/lockfree_event.h', 'src/core/lib/event_engine/posix_engine/posix_engine.h', + 'src/core/lib/event_engine/posix_engine/posix_engine_closure.h', 'src/core/lib/event_engine/posix_engine/timer.h', 'src/core/lib/event_engine/posix_engine/timer_heap.h', 'src/core/lib/event_engine/posix_engine/timer_manager.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h', 'src/core/lib/event_engine/socket_notifier.h', 'src/core/lib/event_engine/thread_pool.h', 'src/core/lib/event_engine/time_util.h', @@ -1548,16 +1560,28 @@ Pod::Spec.new do |s| 'src/core/lib/debug/stats_data.h', 'src/core/lib/debug/trace.h', 'src/core/lib/event_engine/channel_args_endpoint_config.h', + 'src/core/lib/event_engine/common_closures.h', 'src/core/lib/event_engine/default_event_engine.h', 'src/core/lib/event_engine/default_event_engine_factory.h', 'src/core/lib/event_engine/executor/executor.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/handle_containers.h', 'src/core/lib/event_engine/poller.h', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.h', + 'src/core/lib/event_engine/posix_engine/event_poller.h', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.h', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.h', + 'src/core/lib/event_engine/posix_engine/lockfree_event.h', 'src/core/lib/event_engine/posix_engine/posix_engine.h', + 'src/core/lib/event_engine/posix_engine/posix_engine_closure.h', 'src/core/lib/event_engine/posix_engine/timer.h', 'src/core/lib/event_engine/posix_engine/timer_heap.h', 'src/core/lib/event_engine/posix_engine/timer_manager.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h', 'src/core/lib/event_engine/socket_notifier.h', 'src/core/lib/event_engine/thread_pool.h', 'src/core/lib/event_engine/time_util.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 99abfdb9e50..c4e0f0ec73d 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1052,6 +1052,7 @@ Pod::Spec.new do |s| 'src/core/lib/debug/trace.h', 'src/core/lib/event_engine/channel_args_endpoint_config.cc', 'src/core/lib/event_engine/channel_args_endpoint_config.h', + 'src/core/lib/event_engine/common_closures.h', 'src/core/lib/event_engine/default_event_engine.cc', 'src/core/lib/event_engine/default_event_engine.h', 'src/core/lib/event_engine/default_event_engine_factory.cc', @@ -1062,14 +1063,33 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/handle_containers.h', 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/poller.h', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.h', + 'src/core/lib/event_engine/posix_engine/event_poller.h', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.h', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.cc', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.h', + 'src/core/lib/event_engine/posix_engine/lockfree_event.cc', + 'src/core/lib/event_engine/posix_engine/lockfree_event.h', 'src/core/lib/event_engine/posix_engine/posix_engine.cc', 'src/core/lib/event_engine/posix_engine/posix_engine.h', + 'src/core/lib/event_engine/posix_engine/posix_engine_closure.h', 'src/core/lib/event_engine/posix_engine/timer.cc', 'src/core/lib/event_engine/posix_engine/timer.h', 'src/core/lib/event_engine/posix_engine/timer_heap.cc', 'src/core/lib/event_engine/posix_engine/timer_heap.h', 'src/core/lib/event_engine/posix_engine/timer_manager.cc', 'src/core/lib/event_engine/posix_engine/timer_manager.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', 'src/core/lib/event_engine/slice_buffer.cc', @@ -2178,16 +2198,28 @@ Pod::Spec.new do |s| 'src/core/lib/debug/stats_data.h', 'src/core/lib/debug/trace.h', 'src/core/lib/event_engine/channel_args_endpoint_config.h', + 'src/core/lib/event_engine/common_closures.h', 'src/core/lib/event_engine/default_event_engine.h', 'src/core/lib/event_engine/default_event_engine_factory.h', 'src/core/lib/event_engine/executor/executor.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/handle_containers.h', 'src/core/lib/event_engine/poller.h', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.h', + 'src/core/lib/event_engine/posix_engine/event_poller.h', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.h', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.h', + 'src/core/lib/event_engine/posix_engine/lockfree_event.h', 'src/core/lib/event_engine/posix_engine/posix_engine.h', + 'src/core/lib/event_engine/posix_engine/posix_engine_closure.h', 'src/core/lib/event_engine/posix_engine/timer.h', 'src/core/lib/event_engine/posix_engine/timer_heap.h', 'src/core/lib/event_engine/posix_engine/timer_manager.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h', 'src/core/lib/event_engine/socket_notifier.h', 'src/core/lib/event_engine/thread_pool.h', 'src/core/lib/event_engine/time_util.h', diff --git a/grpc.gemspec b/grpc.gemspec index e7bf8d300d0..e7a90e90daf 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -963,6 +963,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/debug/trace.h ) s.files += %w( src/core/lib/event_engine/channel_args_endpoint_config.cc ) s.files += %w( src/core/lib/event_engine/channel_args_endpoint_config.h ) + s.files += %w( src/core/lib/event_engine/common_closures.h ) s.files += %w( src/core/lib/event_engine/default_event_engine.cc ) s.files += %w( src/core/lib/event_engine/default_event_engine.h ) s.files += %w( src/core/lib/event_engine/default_event_engine_factory.cc ) @@ -973,14 +974,33 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/event_engine/handle_containers.h ) s.files += %w( src/core/lib/event_engine/memory_allocator.cc ) s.files += %w( src/core/lib/event_engine/poller.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/ev_poll_posix.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/ev_poll_posix.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/event_poller.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/event_poller_posix_default.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/internal_errqueue.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/internal_errqueue.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/lockfree_event.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/lockfree_event.h ) s.files += %w( src/core/lib/event_engine/posix_engine/posix_engine.cc ) s.files += %w( src/core/lib/event_engine/posix_engine/posix_engine.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/posix_engine_closure.h ) s.files += %w( src/core/lib/event_engine/posix_engine/timer.cc ) s.files += %w( src/core/lib/event_engine/posix_engine/timer.h ) s.files += %w( src/core/lib/event_engine/posix_engine/timer_heap.cc ) s.files += %w( src/core/lib/event_engine/posix_engine/timer_heap.h ) s.files += %w( src/core/lib/event_engine/posix_engine/timer_manager.cc ) s.files += %w( src/core/lib/event_engine/posix_engine/timer_manager.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc ) + s.files += %w( src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h ) s.files += %w( src/core/lib/event_engine/resolved_address.cc ) s.files += %w( src/core/lib/event_engine/slice.cc ) s.files += %w( src/core/lib/event_engine/slice_buffer.cc ) diff --git a/grpc.gyp b/grpc.gyp index 25a3d43571e..4825c701b58 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -808,10 +808,18 @@ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/forkable.cc', 'src/core/lib/event_engine/memory_allocator.cc', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.cc', + 'src/core/lib/event_engine/posix_engine/lockfree_event.cc', 'src/core/lib/event_engine/posix_engine/posix_engine.cc', 'src/core/lib/event_engine/posix_engine/timer.cc', 'src/core/lib/event_engine/posix_engine/timer_heap.cc', 'src/core/lib/event_engine/posix_engine/timer_manager.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', 'src/core/lib/event_engine/slice_buffer.cc', @@ -1259,10 +1267,18 @@ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/forkable.cc', 'src/core/lib/event_engine/memory_allocator.cc', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.cc', + 'src/core/lib/event_engine/posix_engine/lockfree_event.cc', 'src/core/lib/event_engine/posix_engine/posix_engine.cc', 'src/core/lib/event_engine/posix_engine/timer.cc', 'src/core/lib/event_engine/posix_engine/timer_heap.cc', 'src/core/lib/event_engine/posix_engine/timer_manager.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', 'src/core/lib/event_engine/slice_buffer.cc', diff --git a/package.xml b/package.xml index 18e5846bb4b..09d9606b75e 100644 --- a/package.xml +++ b/package.xml @@ -945,6 +945,7 @@ + @@ -955,14 +956,33 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc index 91888572fc0..c1ba73bf456 100644 --- a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +++ b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc @@ -556,7 +556,7 @@ void Epoll1Poller::Kick() { GPR_ASSERT(wakeup_fd_->Wakeup().ok()); } -Epoll1Poller* GetEpoll1Poller(Scheduler* scheduler) { +Epoll1Poller* MakeEpoll1Poller(Scheduler* scheduler) { static bool kEpoll1PollerSupported = InitEpoll1PollerLinux(); if (kEpoll1PollerSupported) { return new Epoll1Poller(scheduler); @@ -608,7 +608,7 @@ void Epoll1Poller::Kick() { GPR_ASSERT(false && "unimplemented"); } // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return // nullptr. -Epoll1Poller* GetEpoll1Poller(Scheduler* /*scheduler*/) { return nullptr; } +Epoll1Poller* MakeEpoll1Poller(Scheduler* /*scheduler*/) { return nullptr; } } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h index 6a33b8a117a..ef06a40e6c0 100644 --- a/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +++ b/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h @@ -58,7 +58,13 @@ class Epoll1Poller : public PosixEventPoller { void Kick() override; Scheduler* GetScheduler() { return scheduler_; } void Shutdown() override; - bool CanTrackErrors() const override { return KernelSupportsErrqueue(); } + bool CanTrackErrors() const override { +#ifdef GRPC_POSIX_SOCKET_TCP + return KernelSupportsErrqueue(); +#else + return false; +#endif + } ~Epoll1Poller() override; private: @@ -115,7 +121,7 @@ class Epoll1Poller : public PosixEventPoller { // Return an instance of a epoll1 based poller tied to the specified event // engine. -Epoll1Poller* GetEpoll1Poller(Scheduler* scheduler); +Epoll1Poller* MakeEpoll1Poller(Scheduler* scheduler); } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc b/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc index 6725ba1bf73..fcac4b68e8f 100644 --- a/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +++ b/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc @@ -706,7 +706,14 @@ Poller::WorkResult PollPoller::Work( } mu_.Unlock(); - if (!use_phony_poll_ || timeout_ms == 0) { + if (!use_phony_poll_ || timeout_ms == 0 || pfd_count == 1) { + // If use_phony_poll is true and pfd_count == 1, it implies only the + // wakeup_fd is present. Allow the call to get blocked in this case as + // well instead of crashing. This is because the poller::Work is called + // right after an event enging is constructed. Even if phony poll is + // expected to be used, we dont want to check for it until some actual + // event handles are registered. Otherwise the event engine construction + // may crash. r = poll(pfds, pfd_count, timeout_ms); } else { gpr_log(GPR_ERROR, @@ -829,7 +836,7 @@ void PollPoller::Shutdown() { Unref(); } -PollPoller* GetPollPoller(Scheduler* scheduler, bool use_phony_poll) { +PollPoller* MakePollPoller(Scheduler* scheduler, bool use_phony_poll) { static bool kPollPollerSupported = InitPollPollerPosix(); if (kPollPollerSupported) { return new PollPoller(scheduler, use_phony_poll); @@ -871,7 +878,8 @@ void PollPoller::Kick() { GPR_ASSERT(false && "unimplemented"); } // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return // nullptr. -PollPoller* GetPollPoller(Scheduler* /*scheduler*/, bool /* use_phony_poll */) { +PollPoller* MakePollPoller(Scheduler* /*scheduler*/, + bool /* use_phony_poll */) { return nullptr; } diff --git a/src/core/lib/event_engine/posix_engine/ev_poll_posix.h b/src/core/lib/event_engine/posix_engine/ev_poll_posix.h index b1797d38b6f..04d1a248c75 100644 --- a/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +++ b/src/core/lib/event_engine/posix_engine/ev_poll_posix.h @@ -89,7 +89,7 @@ class PollPoller : public PosixEventPoller { // It use_phony_poll is true, it implies that the poller is declared // non-polling and any attempt to schedule a blocking poll will result in a // crash failure. -PollPoller* GetPollPoller(Scheduler* scheduler, bool use_phony_poll); +PollPoller* MakePollPoller(Scheduler* scheduler, bool use_phony_poll); } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc b/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc index b8fa7d5d9bd..9fc545488e3 100644 --- a/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +++ b/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc @@ -22,12 +22,16 @@ #include "src/core/lib/event_engine/posix_engine/event_poller.h" #include "src/core/lib/gprpp/global_config.h" #include "src/core/lib/gprpp/memory.h" +#include "src/core/lib/iomgr/port.h" +#ifdef GRPC_POSIX_SOCKET_TCP GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy); +#endif namespace grpc_event_engine { namespace posix_engine { +#ifdef GRPC_POSIX_SOCKET_TCP namespace { bool PollStrategyMatches(absl::string_view strategy, absl::string_view want) { @@ -36,7 +40,7 @@ bool PollStrategyMatches(absl::string_view strategy, absl::string_view want) { } // namespace -PosixEventPoller* GetDefaultPoller(Scheduler* scheduler) { +PosixEventPoller* MakeDefaultPoller(Scheduler* scheduler) { static const char* poll_strategy = GPR_GLOBAL_CONFIG_GET(grpc_poll_strategy).release(); PosixEventPoller* poller = nullptr; @@ -44,19 +48,27 @@ PosixEventPoller* GetDefaultPoller(Scheduler* scheduler) { for (auto it = strings.begin(); it != strings.end() && poller == nullptr; it++) { if (PollStrategyMatches(*it, "epoll1")) { - poller = GetEpoll1Poller(scheduler); + poller = MakeEpoll1Poller(scheduler); } if (poller == nullptr && PollStrategyMatches(*it, "poll")) { // If epoll1 fails and if poll strategy matches "poll", use Poll poller - poller = GetPollPoller(scheduler, /*use_phony_poll=*/false); + poller = MakePollPoller(scheduler, /*use_phony_poll=*/false); } else if (poller == nullptr && PollStrategyMatches(*it, "none")) { // If epoll1 fails and if poll strategy matches "none", use phony poll // poller. - poller = GetPollPoller(scheduler, /*use_phony_poll=*/true); + poller = MakePollPoller(scheduler, /*use_phony_poll=*/true); } } return poller; } +#else // GRPC_POSIX_SOCKET_TCP + +PosixEventPoller* MakeDefaultPoller(Scheduler* /*scheduler*/) { + return nullptr; +} + +#endif // GRPC_POSIX_SOCKET_TCP + } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h b/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h index 59563bd76c9..f292e362444 100644 --- a/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +++ b/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h @@ -25,7 +25,7 @@ class Scheduler; // Return an instance of an event poller which is tied to the specified // scheduler. -PosixEventPoller* GetDefaultPoller(Scheduler* scheduler); +PosixEventPoller* MakeDefaultPoller(Scheduler* scheduler); } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/posix_endpoint.cc b/src/core/lib/event_engine/posix_engine/posix_endpoint.cc index e4e77f7f464..c43bba2f5ef 100644 --- a/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +++ b/src/core/lib/event_engine/posix_engine/posix_endpoint.cc @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - #include #include "src/core/lib/event_engine/posix_engine/posix_endpoint.h" @@ -33,7 +32,6 @@ #include "absl/strings/str_cat.h" #include "absl/types/optional.h" -#include #include #include #include @@ -92,8 +90,8 @@ namespace posix_engine { namespace { -using ::grpc_event_engine::experimental::EndpointConfig; using ::grpc_event_engine::experimental::EventEngine; +using ::grpc_event_engine::experimental::MemoryAllocator; using ::grpc_event_engine::experimental::Slice; using ::grpc_event_engine::experimental::SliceBuffer; @@ -1167,6 +1165,7 @@ PosixEndpointImpl ::~PosixEndpointImpl() { PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle, PosixEngineClosure* on_done, std::shared_ptr engine, + MemoryAllocator&& /*allocator*/, const PosixTcpOptions& options) : sock_(PosixSocketWrapper(handle->WrappedFd())), on_done_(on_done), @@ -1249,10 +1248,11 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle, std::unique_ptr CreatePosixEndpoint( EventHandle* handle, PosixEngineClosure* on_shutdown, - std::shared_ptr engine, const EndpointConfig& config) { + std::shared_ptr engine, MemoryAllocator&& allocator, + const PosixTcpOptions& options) { GPR_DEBUG_ASSERT(handle != nullptr); return std::make_unique(handle, on_shutdown, std::move(engine), - config); + std::move(allocator), options); } } // namespace posix_engine @@ -1268,7 +1268,8 @@ using ::grpc_event_engine::experimental::EventEngine; std::unique_ptr CreatePosixEndpoint( EventHandle* /*handle*/, PosixEngineClosure* /*on_shutdown*/, - std::shared_ptr /*engine*/, const EndpointConfig& /*config*/) { + std::shared_ptr /*engine*/, + const PosixTcpOptions& /*options*/) { GPR_ASSERT(false && "Cannot create PosixEndpoint on this platform"); } diff --git a/src/core/lib/event_engine/posix_engine/posix_endpoint.h b/src/core/lib/event_engine/posix_engine/posix_endpoint.h index b3b5e8512ef..dd993805e98 100644 --- a/src/core/lib/event_engine/posix_engine/posix_endpoint.h +++ b/src/core/lib/event_engine/posix_engine/posix_endpoint.h @@ -32,7 +32,6 @@ #include "absl/meta/type_traits.h" #include "absl/status/status.h" -#include #include #include #include @@ -467,6 +466,7 @@ class PosixEndpointImpl : public grpc_core::RefCounted { PosixEndpointImpl( EventHandle* handle, PosixEngineClosure* on_done, std::shared_ptr engine, + grpc_event_engine::experimental::MemoryAllocator&& allocator, const PosixTcpOptions& options); ~PosixEndpointImpl() override; void Read( @@ -592,9 +592,10 @@ class PosixEndpoint PosixEndpoint( EventHandle* handle, PosixEngineClosure* on_shutdown, std::shared_ptr engine, - const grpc_event_engine::experimental::EndpointConfig& config) + grpc_event_engine::experimental::MemoryAllocator&& allocator, + const PosixTcpOptions& options) : impl_(new PosixEndpointImpl(handle, on_shutdown, std::move(engine), - TcpOptionsFromEndpointConfig(config))) {} + std::move(allocator), options)) {} void Read( absl::AnyInvocable on_read, @@ -672,8 +673,9 @@ class PosixEndpoint // of the EventHandle is transferred to the endpoint. std::unique_ptr CreatePosixEndpoint( EventHandle* handle, PosixEngineClosure* on_shutdown, - std::shared_ptr engine, - const grpc_event_engine::experimental::EndpointConfig& config); + std::shared_ptr engine, + grpc_event_engine::experimental::MemoryAllocator&& allocator, + const PosixTcpOptions& options); } // namespace posix_engine } // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/posix_engine/posix_engine.cc b/src/core/lib/event_engine/posix_engine/posix_engine.cc index cded900a0fa..96a51feb20e 100644 --- a/src/core/lib/event_engine/posix_engine/posix_engine.cc +++ b/src/core/lib/event_engine/posix_engine/posix_engine.cc @@ -15,23 +15,133 @@ #include "src/core/lib/event_engine/posix_engine/posix_engine.h" +#include +#include #include #include #include "absl/container/flat_hash_set.h" #include "absl/functional/any_invocable.h" +#include "absl/status/status.h" #include +#include #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/event_engine/poller.h" #include "src/core/lib/event_engine/posix_engine/timer.h" #include "src/core/lib/event_engine/trace.h" #include "src/core/lib/event_engine/utils.h" +#include "src/core/lib/experiments/experiments.h" +#include "src/core/lib/gprpp/sync.h" + +#ifdef GRPC_POSIX_SOCKET_TCP +#include "src/core/lib/event_engine/posix_engine/event_poller_posix_default.h" +#endif // GRPC_POSIX_SOCKET_TCP + +using namespace std::chrono_literals; namespace grpc_event_engine { namespace experimental { +#ifdef GRPC_POSIX_SOCKET_TCP +using grpc_event_engine::posix_engine::PosixEventPoller; + +PosixEnginePollerManager::PosixEnginePollerManager( + std::shared_ptr executor) + : poller_(grpc_event_engine::posix_engine::MakeDefaultPoller(this)), + executor_(std::move(executor)) {} + +PosixEnginePollerManager::PosixEnginePollerManager(PosixEventPoller* poller) + : poller_(poller), + poller_state_(PollerState::kExternal), + executor_(nullptr) { + GPR_DEBUG_ASSERT(poller_ != nullptr); +} + +void PosixEnginePollerManager::Run( + experimental::EventEngine::Closure* closure) { + if (executor_ != nullptr) { + executor_->Run(closure); + } +} + +void PosixEnginePollerManager::Run(absl::AnyInvocable cb) { + if (executor_ != nullptr) { + executor_->Run(std::move(cb)); + } +} + +void PosixEnginePollerManager::TriggerShutdown() { + // If the poller is external, dont try to shut it down. Otherwise + // set poller state to PollerState::kShuttingDown. + if (poller_state_.exchange(PollerState::kShuttingDown) == + PollerState::kExternal) { + poller_ = nullptr; + return; + } + poller_->Kick(); +} + +PosixEnginePollerManager::~PosixEnginePollerManager() { + if (poller_ != nullptr) { + poller_->Shutdown(); + } +} + +PosixEventEngine::PosixEventEngine(PosixEventPoller* poller) + : executor_(std::make_shared()) { + poller_manager_ = std::make_shared(poller); +} + +PosixEventEngine::PosixEventEngine() + : executor_(std::make_shared()) { + if (grpc_core::IsPosixEventEngineEnablePollingEnabled()) { + poller_manager_ = std::make_shared(executor_); + if (poller_manager_->Poller() != nullptr) { + executor_->Run([poller_manager = poller_manager_]() { + PollerWorkInternal(poller_manager); + }); + } + } +} + +void PosixEventEngine::PollerWorkInternal( + std::shared_ptr poller_manager) { + // TODO(vigneshbabu): The timeout specified here is arbitrary. For instance, + // this can be improved by setting the timeout to the next expiring timer. + PosixEventPoller* poller = poller_manager->Poller(); + ThreadPool* executor = poller_manager->Executor(); + auto result = poller->Work(24h, [executor, &poller_manager]() { + executor->Run([poller_manager]() mutable { + PollerWorkInternal(std::move(poller_manager)); + }); + }); + if (result == Poller::WorkResult::kDeadlineExceeded) { + // The event engine is not shutting down but the next asynchronous + // PollerWorkInternal did not get scheduled. Schedule it now. + executor->Run([poller_manager = std::move(poller_manager)]() { + PollerWorkInternal(poller_manager); + }); + } else if (result == Poller::WorkResult::kKicked && + poller_manager->IsShuttingDown()) { + // The Poller Got Kicked and poller_state_ is set to + // PollerState::kShuttingDown. This can currently happen only from the + // EventEngine destructor. Sample the use_count of poller_manager. If the + // sampled use_count is > 1, there is one more instance of Work(...) + // which hasn't returned yet. Send another Kick to be safe to ensure the + // pending instance of Work(..) also breaks out. Its possible that the other + // instance of Work(..) had already broken out before this Kick is sent. In + // that case, the Kick is spurious but it shouldn't cause any side effects. + if (poller_manager.use_count() > 1) { + poller->Kick(); + } + } +} + +#endif // GRPC_POSIX_SOCKET_TCP + struct PosixEventEngine::ClosureData final : public EventEngine::Closure { absl::AnyInvocable cb; posix_engine::Timer timer; @@ -51,17 +161,25 @@ struct PosixEventEngine::ClosureData final : public EventEngine::Closure { }; PosixEventEngine::~PosixEventEngine() { - grpc_core::MutexLock lock(&mu_); - if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) { - for (auto handle : known_handles_) { - gpr_log(GPR_ERROR, - "(event_engine) PosixEventEngine:%p uncleared TaskHandle at " - "shutdown:%s", - this, HandleToString(handle).c_str()); + { + grpc_core::MutexLock lock(&mu_); + if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) { + for (auto handle : known_handles_) { + gpr_log(GPR_ERROR, + "(event_engine) PosixEventEngine:%p uncleared " + "TaskHandle at " + "shutdown:%s", + this, HandleToString(handle).c_str()); + } } + GPR_ASSERT(GPR_LIKELY(known_handles_.empty())); + } +#ifdef GRPC_POSIX_SOCKET_TCP + if (poller_manager_ != nullptr) { + poller_manager_->TriggerShutdown(); } - GPR_ASSERT(GPR_LIKELY(known_handles_.empty())); - executor_.Quiesce(); +#endif // GRPC_POSIX_SOCKET_TCP + executor_->Quiesce(); } bool PosixEventEngine::Cancel(EventEngine::TaskHandle handle) { @@ -85,11 +203,11 @@ EventEngine::TaskHandle PosixEventEngine::RunAfter( } void PosixEventEngine::Run(absl::AnyInvocable closure) { - executor_.Run(std::move(closure)); + executor_->Run(std::move(closure)); } void PosixEventEngine::Run(EventEngine::Closure* closure) { - executor_.Run(closure); + executor_->Run(closure); } EventEngine::TaskHandle PosixEventEngine::RunAfterInternal( @@ -125,7 +243,7 @@ bool PosixEventEngine::CancelConnect(EventEngine::ConnectionHandle /*handle*/) { EventEngine::ConnectionHandle PosixEventEngine::Connect( OnConnectCallback /*on_connect*/, const ResolvedAddress& /*addr*/, const EndpointConfig& /*args*/, MemoryAllocator /*memory_allocator*/, - Duration /*deadline*/) { + Duration /*timeout*/) { GPR_ASSERT(false && "unimplemented"); } diff --git a/src/core/lib/event_engine/posix_engine/posix_engine.h b/src/core/lib/event_engine/posix_engine/posix_engine.h index 344d5465f6f..8e648179a61 100644 --- a/src/core/lib/event_engine/posix_engine/posix_engine.h +++ b/src/core/lib/event_engine/posix_engine/posix_engine.h @@ -29,17 +29,52 @@ #include #include #include -#include #include "src/core/lib/event_engine/handle_containers.h" +#include "src/core/lib/event_engine/posix_engine/event_poller.h" #include "src/core/lib/event_engine/posix_engine/timer_manager.h" #include "src/core/lib/event_engine/thread_pool.h" #include "src/core/lib/gprpp/sync.h" +#include "src/core/lib/iomgr/port.h" #include "src/core/lib/surface/init_internally.h" namespace grpc_event_engine { namespace experimental { +#ifdef GRPC_POSIX_SOCKET_TCP +// A helper class to manager lifetime of the poller associated with the +// posix event engine. +class PosixEnginePollerManager + : public grpc_event_engine::posix_engine::Scheduler { + public: + explicit PosixEnginePollerManager(std::shared_ptr executor); + explicit PosixEnginePollerManager( + grpc_event_engine::posix_engine::PosixEventPoller* poller); + grpc_event_engine::posix_engine::PosixEventPoller* Poller() { + return poller_; + } + + ThreadPool* Executor() { return executor_.get(); } + + void Run(experimental::EventEngine::Closure* closure) override; + void Run(absl::AnyInvocable) override; + + bool IsShuttingDown() { + return poller_state_.load(std::memory_order_acquire) == + PollerState::kShuttingDown; + } + void TriggerShutdown(); + + ~PosixEnginePollerManager() override; + + private: + enum class PollerState { kExternal, kOk, kShuttingDown }; + grpc_event_engine::posix_engine::PosixEventPoller* poller_ = nullptr; + std::atomic poller_state_{PollerState::kOk}; + std::shared_ptr executor_; +}; +#endif // GRPC_POSIX_SOCKET_TCP + // An iomgr-based Posix EventEngine implementation. // All methods require an ExecCtx to already exist on the thread's stack. // TODO(ctiller): KeepsGrpcInitialized is an interim measure to ensure that @@ -47,22 +82,6 @@ namespace experimental { class PosixEventEngine final : public EventEngine, public grpc_core::KeepsGrpcInitialized { public: - class PosixEndpoint : public EventEngine::Endpoint { - public: - ~PosixEndpoint() override; - void Read(absl::AnyInvocable on_read, - SliceBuffer* buffer, const ReadArgs* args) override; - void Write(absl::AnyInvocable on_writable, - SliceBuffer* data, const WriteArgs* args) override; - const ResolvedAddress& GetPeerAddress() const override; - const ResolvedAddress& GetLocalAddress() const override; - }; - class PosixListener : public EventEngine::Listener { - public: - ~PosixListener() override; - absl::StatusOr Bind(const ResolvedAddress& addr) override; - absl::Status Start() override; - }; class PosixDNSResolver : public EventEngine::DNSResolver { public: ~PosixDNSResolver() override; @@ -79,7 +98,17 @@ class PosixEventEngine final : public EventEngine, bool CancelLookup(LookupTaskHandle handle) override; }; +#ifdef GRPC_POSIX_SOCKET_TCP + // Constructs an event engine which does not own the poller. Do not call this + // constructor directly. Instead use the MakeTestOnlyPosixEventEngine static + // method. Its expected to be used only in tests. + explicit PosixEventEngine( + grpc_event_engine::posix_engine::PosixEventPoller* poller); + PosixEventEngine(); +#else // GRPC_POSIX_SOCKET_TCP PosixEventEngine() = default; +#endif // GRPC_POSIX_SOCKET_TCP + ~PosixEventEngine() override; absl::StatusOr> CreateListener( @@ -106,16 +135,36 @@ class PosixEventEngine final : public EventEngine, absl::AnyInvocable closure) override; bool Cancel(TaskHandle handle) override; +#ifdef GRPC_POSIX_SOCKET_TCP + // The posix event engine returned by this method would not own the poller + // and would not be in-charge of driving the poller by calling its Work(..) + // method. Instead its upto the test to drive the poller. The returned posix + // event engine will also not attempt to shutdown the poller since it does not + // own it. + static std::shared_ptr MakeTestOnlyPosixEventEngine( + grpc_event_engine::posix_engine::PosixEventPoller* test_only_poller) { + return std::make_shared(test_only_poller); + } +#endif // GRPC_POSIX_SOCKET_TCP + private: struct ClosureData; EventEngine::TaskHandle RunAfterInternal(Duration when, absl::AnyInvocable cb); +#ifdef GRPC_POSIX_SOCKET_TCP + static void PollerWorkInternal( + std::shared_ptr poller_manager); +#endif // GRPC_POSIX_SOCKET_TCP + grpc_core::Mutex mu_; TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_); std::atomic aba_token_{0}; posix_engine::TimerManager timer_manager_; - ThreadPool executor_; + std::shared_ptr executor_; +#ifdef GRPC_POSIX_SOCKET_TCP + std::shared_ptr poller_manager_; +#endif // GRPC_POSIX_SOCKET_TCP }; } // namespace experimental diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index 852e430760d..86cd52de0b6 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -51,6 +51,8 @@ const char* const description_monitoring_experiment = const char* const description_promise_based_client_call = "If set, use the new gRPC promise based call code when it's appropriate " "(ie when all filters in a stack are promise based)"; +const char* const description_posix_event_engine_enable_polling = + "If set, enables polling on the default posix event engine."; #ifdef NDEBUG const bool kDefaultForDebugOnly = false; #else @@ -77,6 +79,8 @@ const ExperimentMetadata g_experiment_metadata[] = { {"event_engine_client", description_event_engine_client, false}, {"monitoring_experiment", description_monitoring_experiment, true}, {"promise_based_client_call", description_promise_based_client_call, false}, + {"posix_event_engine_enable_polling", + description_posix_event_engine_enable_polling, kDefaultForDebugOnly}, }; } // namespace grpc_core diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 6a0d44b2c92..6c8949003b1 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -45,6 +45,9 @@ inline bool IsMonitoringExperimentEnabled() { return IsExperimentEnabled(10); } inline bool IsPromiseBasedClientCallEnabled() { return IsExperimentEnabled(11); } +inline bool IsPosixEventEngineEnablePollingEnabled() { + return IsExperimentEnabled(12); +} struct ExperimentMetadata { const char* name; @@ -52,7 +55,7 @@ struct ExperimentMetadata { bool default_value; }; -constexpr const size_t kNumExperiments = 12; +constexpr const size_t kNumExperiments = 13; extern const ExperimentMetadata g_experiment_metadata[kNumExperiments]; } // namespace grpc_core diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index b7be9ec39f7..ad959e4a727 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -127,3 +127,10 @@ expiry: 2023/01/01 owner: ctiller@google.com test_tags: ["core_end2end_test", "lame_client_test"] +- name: posix_event_engine_enable_polling + description: + If set, enables polling on the default posix event engine. + default: debug + expiry: 2023/01/01 + owner: vigneshbabu@google.com + test_tags: ["event_engine_client_test"] diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index a5f321c7687..b5fd68e4b87 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -451,10 +451,18 @@ CORE_SOURCE_FILES = [ 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/forkable.cc', 'src/core/lib/event_engine/memory_allocator.cc', + 'src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc', + 'src/core/lib/event_engine/posix_engine/ev_poll_posix.cc', + 'src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc', + 'src/core/lib/event_engine/posix_engine/internal_errqueue.cc', + 'src/core/lib/event_engine/posix_engine/lockfree_event.cc', 'src/core/lib/event_engine/posix_engine/posix_engine.cc', 'src/core/lib/event_engine/posix_engine/timer.cc', 'src/core/lib/event_engine/posix_engine/timer_heap.cc', 'src/core/lib/event_engine/posix_engine/timer_manager.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc', + 'src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', 'src/core/lib/event_engine/slice_buffer.cc', diff --git a/test/core/event_engine/posix/event_poller_posix_test.cc b/test/core/event_engine/posix/event_poller_posix_test.cc index 74a667c4fe5..242d21f3efa 100644 --- a/test/core/event_engine/posix/event_poller_posix_test.cc +++ b/test/core/event_engine/posix/event_poller_posix_test.cc @@ -69,6 +69,7 @@ GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy); +using ::grpc_event_engine::experimental::PosixEventEngine; using ::grpc_event_engine::posix_engine::PosixEventPoller; static gpr_mu g_mu; @@ -387,7 +388,10 @@ class EventPollerTest : public ::testing::Test { std::make_unique( engine_.get()); EXPECT_NE(scheduler_, nullptr); - g_event_poller = GetDefaultPoller(scheduler_.get()); + g_event_poller = MakeDefaultPoller(scheduler_.get()); + engine_ = PosixEventEngine::MakeTestOnlyPosixEventEngine(g_event_poller); + EXPECT_NE(engine_, nullptr); + scheduler_->ChangeCurrentEventEngine(engine_.get()); if (g_event_poller != nullptr) { gpr_log(GPR_INFO, "Using poller: %s", g_event_poller->Name().c_str()); } @@ -403,7 +407,7 @@ class EventPollerTest : public ::testing::Test { TestScheduler* Scheduler() { return scheduler_.get(); } private: - std::unique_ptr engine_; + std::shared_ptr engine_; std::unique_ptr scheduler_; }; diff --git a/test/core/event_engine/posix/posix_endpoint_test.cc b/test/core/event_engine/posix/posix_endpoint_test.cc index 607ca8121dc..0e4401210fc 100644 --- a/test/core/event_engine/posix/posix_endpoint_test.cc +++ b/test/core/event_engine/posix/posix_endpoint_test.cc @@ -126,15 +126,20 @@ std::list CreateConnectedEndpoints( server_signal->WaitForNotification(); EXPECT_NE(server_endpoint, nullptr); ++g_num_active_connections; + PosixTcpOptions options = TcpOptionsFromEndpointConfig(config); connections.push_back(Connection{ - CreatePosixEndpoint(handle, - PosixEngineClosure::TestOnlyToClosure( - [&poller](absl::Status /*status*/) { - if (--g_num_active_connections == 0) { - poller.Kick(); - } - }), - posix_ee, config), + CreatePosixEndpoint( + handle, + PosixEngineClosure::TestOnlyToClosure( + [&poller](absl::Status /*status*/) { + if (--g_num_active_connections == 0) { + poller.Kick(); + } + }), + posix_ee, + options.resource_quota->memory_quota()->CreateMemoryAllocator( + "test"), + options), std::move(server_endpoint)}); delete server_signal; server_signal = new grpc_core::Notification(); @@ -196,12 +201,14 @@ class Worker : public grpc_core::DualRefCounted { class PosixEndpointTest : public ::testing::TestWithParam { void SetUp() override { oracle_ee_ = std::make_shared(); - posix_ee_ = std::make_shared(); scheduler_ = std::make_unique( posix_ee_.get()); EXPECT_NE(scheduler_, nullptr); - poller_ = GetDefaultPoller(scheduler_.get()); + poller_ = MakeDefaultPoller(scheduler_.get()); + posix_ee_ = PosixEventEngine::MakeTestOnlyPosixEventEngine(poller_); + EXPECT_NE(posix_ee_, nullptr); + scheduler_->ChangeCurrentEventEngine(posix_ee_.get()); if (poller_ != nullptr) { gpr_log(GPR_INFO, "Using poller: %s", poller_->Name().c_str()); } diff --git a/test/core/event_engine/posix/posix_engine_test_utils.h b/test/core/event_engine/posix/posix_engine_test_utils.h index da630daf93c..54390cd3f8a 100644 --- a/test/core/event_engine/posix/posix_engine_test_utils.h +++ b/test/core/event_engine/posix/posix_engine_test_utils.h @@ -27,13 +27,25 @@ class TestScheduler : public Scheduler { public: explicit TestScheduler(grpc_event_engine::experimental::EventEngine* engine) : engine_(engine) {} - void Run( - grpc_event_engine::experimental::EventEngine::Closure* closure) override { - engine_->Run(closure); + TestScheduler() : engine_(nullptr){}; + void ChangeCurrentEventEngine( + grpc_event_engine::experimental::EventEngine* engine) { + engine_ = engine; + } + void Run(experimental::EventEngine::Closure* closure) override { + if (engine_ != nullptr) { + engine_->Run(closure); + } else { + closure->Run(); + } } void Run(absl::AnyInvocable cb) override { - engine_->Run(std::move(cb)); + if (engine_ != nullptr) { + engine_->Run(std::move(cb)); + } else { + cb(); + } } private: diff --git a/test/core/event_engine/test_suite/BUILD b/test/core/event_engine/test_suite/BUILD index 408d82d87ae..b8e980de753 100644 --- a/test/core/event_engine/test_suite/BUILD +++ b/test/core/event_engine/test_suite/BUILD @@ -77,6 +77,9 @@ grpc_cc_library( grpc_cc_test( name = "posix_event_engine_test", srcs = ["posix_event_engine_test.cc"], + tags = [ + "no_windows", + ], uses_polling = False, deps = [ "//:posix_event_engine", diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 6feeb8ff774..c565e559f45 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -60,6 +60,7 @@ grpc_cc_test( srcs = ["bm_event_engine_run.cc"], args = ["--benchmark_min_time=0.1"], external_deps = [ + "absl/debugging:leak_check", "benchmark", ], tags = [ diff --git a/test/cpp/microbenchmarks/bm_event_engine_run.cc b/test/cpp/microbenchmarks/bm_event_engine_run.cc index 23891898ebc..cbe8eaac61d 100644 --- a/test/cpp/microbenchmarks/bm_event_engine_run.cc +++ b/test/cpp/microbenchmarks/bm_event_engine_run.cc @@ -15,9 +15,13 @@ #include #include #include +#include #include +#include "absl/debugging/leak_check.h" +#include "absl/functional/any_invocable.h" + #include #include @@ -95,15 +99,20 @@ void BM_EventEngine_RunClosure(benchmark::State& state) { int cb_count = state.range(0); grpc_core::Notification* signal = new grpc_core::Notification(); std::atomic_int count{0}; - AnyInvocableClosure closure([signal_holder = &signal, cb_count, &count]() { - if (++count == cb_count) { - (*signal_holder)->Notify(); - } - }); + // Ignore leaks from this closure. For simplicty, this closure is not deleted + // because the closure may still be executing after the event engine is + // destroyed. This is because the default posix event engine's thread pool may + // get destroyed separately from the event engine. + AnyInvocableClosure* closure = absl::IgnoreLeak( + new AnyInvocableClosure([signal_holder = &signal, cb_count, &count]() { + if (++count == cb_count) { + (*signal_holder)->Notify(); + } + })); auto engine = GetDefaultEventEngine(); for (auto _ : state) { for (int i = 0; i < cb_count; i++) { - engine->Run(&closure); + engine->Run(closure); } signal->WaitForNotification(); state.PauseTiming(); diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 11cdf439294..d31ecd6dde7 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1948,6 +1948,7 @@ src/core/lib/debug/trace.cc \ src/core/lib/debug/trace.h \ src/core/lib/event_engine/channel_args_endpoint_config.cc \ src/core/lib/event_engine/channel_args_endpoint_config.h \ +src/core/lib/event_engine/common_closures.h \ src/core/lib/event_engine/default_event_engine.cc \ src/core/lib/event_engine/default_event_engine.h \ src/core/lib/event_engine/default_event_engine_factory.cc \ @@ -1958,14 +1959,33 @@ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/handle_containers.h \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/poller.h \ +src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ +src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h \ +src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ +src/core/lib/event_engine/posix_engine/ev_poll_posix.h \ +src/core/lib/event_engine/posix_engine/event_poller.h \ +src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ +src/core/lib/event_engine/posix_engine/event_poller_posix_default.h \ +src/core/lib/event_engine/posix_engine/internal_errqueue.cc \ +src/core/lib/event_engine/posix_engine/internal_errqueue.h \ +src/core/lib/event_engine/posix_engine/lockfree_event.cc \ +src/core/lib/event_engine/posix_engine/lockfree_event.h \ src/core/lib/event_engine/posix_engine/posix_engine.cc \ src/core/lib/event_engine/posix_engine/posix_engine.h \ +src/core/lib/event_engine/posix_engine/posix_engine_closure.h \ src/core/lib/event_engine/posix_engine/timer.cc \ src/core/lib/event_engine/posix_engine/timer.h \ src/core/lib/event_engine/posix_engine/timer_heap.cc \ src/core/lib/event_engine/posix_engine/timer_heap.h \ src/core/lib/event_engine/posix_engine/timer_manager.cc \ src/core/lib/event_engine/posix_engine/timer_manager.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ src/core/lib/event_engine/slice_buffer.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 154dbd16c7a..0878596f609 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1736,6 +1736,7 @@ src/core/lib/debug/trace.cc \ src/core/lib/debug/trace.h \ src/core/lib/event_engine/channel_args_endpoint_config.cc \ src/core/lib/event_engine/channel_args_endpoint_config.h \ +src/core/lib/event_engine/common_closures.h \ src/core/lib/event_engine/default_event_engine.cc \ src/core/lib/event_engine/default_event_engine.h \ src/core/lib/event_engine/default_event_engine_factory.cc \ @@ -1746,14 +1747,33 @@ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/handle_containers.h \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/poller.h \ +src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc \ +src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h \ +src/core/lib/event_engine/posix_engine/ev_poll_posix.cc \ +src/core/lib/event_engine/posix_engine/ev_poll_posix.h \ +src/core/lib/event_engine/posix_engine/event_poller.h \ +src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc \ +src/core/lib/event_engine/posix_engine/event_poller_posix_default.h \ +src/core/lib/event_engine/posix_engine/internal_errqueue.cc \ +src/core/lib/event_engine/posix_engine/internal_errqueue.h \ +src/core/lib/event_engine/posix_engine/lockfree_event.cc \ +src/core/lib/event_engine/posix_engine/lockfree_event.h \ src/core/lib/event_engine/posix_engine/posix_engine.cc \ src/core/lib/event_engine/posix_engine/posix_engine.h \ +src/core/lib/event_engine/posix_engine/posix_engine_closure.h \ src/core/lib/event_engine/posix_engine/timer.cc \ src/core/lib/event_engine/posix_engine/timer.h \ src/core/lib/event_engine/posix_engine/timer_heap.cc \ src/core/lib/event_engine/posix_engine/timer_heap.h \ src/core/lib/event_engine/posix_engine/timer_manager.cc \ src/core/lib/event_engine/posix_engine/timer_manager.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc \ +src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ src/core/lib/event_engine/slice_buffer.cc \ diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index ffb437b14f3..ed23fb8d39d 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5315,8 +5315,7 @@ "ci_platforms": [ "linux", "mac", - "posix", - "windows" + "posix" ], "cpu_cost": 1.0, "exclude_configs": [], @@ -5328,8 +5327,7 @@ "platforms": [ "linux", "mac", - "posix", - "windows" + "posix" ], "uses_polling": false },