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
@@ -20,11 +20,9 @@
|
|
20
20
|
|
21
21
|
#include "src/core/lib/event_engine/posix_engine/timer_manager.h"
|
22
22
|
|
23
|
-
#include <algorithm>
|
24
23
|
#include <memory>
|
25
24
|
#include <utility>
|
26
25
|
|
27
|
-
#include "absl/memory/memory.h"
|
28
26
|
#include "absl/time/time.h"
|
29
27
|
#include "absl/types/optional.h"
|
30
28
|
|
@@ -33,79 +31,19 @@
|
|
33
31
|
#include <grpc/support/time.h>
|
34
32
|
|
35
33
|
#include "src/core/lib/debug/trace.h"
|
36
|
-
#include "src/core/lib/gpr/tls.h"
|
37
34
|
#include "src/core/lib/gprpp/thd.h"
|
38
35
|
|
39
|
-
static
|
36
|
+
static thread_local bool g_timer_thread;
|
40
37
|
|
41
38
|
namespace grpc_event_engine {
|
42
39
|
namespace posix_engine {
|
43
40
|
|
44
41
|
grpc_core::DebugOnlyTraceFlag grpc_event_engine_timer_trace(false, "timer");
|
45
42
|
|
46
|
-
namespace {
|
47
|
-
class ThreadCollector {
|
48
|
-
public:
|
49
|
-
ThreadCollector() = default;
|
50
|
-
~ThreadCollector();
|
51
|
-
|
52
|
-
void Collect(std::vector<grpc_core::Thread> threads) {
|
53
|
-
GPR_ASSERT(threads_.empty());
|
54
|
-
threads_ = std::move(threads);
|
55
|
-
}
|
56
|
-
|
57
|
-
private:
|
58
|
-
std::vector<grpc_core::Thread> threads_;
|
59
|
-
};
|
60
|
-
|
61
|
-
ThreadCollector::~ThreadCollector() {
|
62
|
-
for (auto& t : threads_) t.Join();
|
63
|
-
}
|
64
|
-
} // namespace
|
65
|
-
|
66
|
-
void TimerManager::StartThread() {
|
67
|
-
++waiter_count_;
|
68
|
-
++thread_count_;
|
69
|
-
auto* thread = new RunThreadArgs();
|
70
|
-
thread->self = this;
|
71
|
-
thread->thread = grpc_core::Thread(
|
72
|
-
"timer_manager", &TimerManager::RunThread, thread, nullptr,
|
73
|
-
grpc_core::Thread::Options().set_tracked(false));
|
74
|
-
thread->thread.Start();
|
75
|
-
}
|
76
|
-
|
77
43
|
void TimerManager::RunSomeTimers(
|
78
44
|
std::vector<experimental::EventEngine::Closure*> timers) {
|
79
|
-
// if there's something to execute...
|
80
|
-
ThreadCollector collector;
|
81
|
-
{
|
82
|
-
grpc_core::MutexLock lock(&mu_);
|
83
|
-
if (shutdown_ || forking_) return;
|
84
|
-
// remove a waiter from the pool, and start another thread if necessary
|
85
|
-
--waiter_count_;
|
86
|
-
if (waiter_count_ == 0) {
|
87
|
-
// The number of timer threads is always increasing until all the threads
|
88
|
-
// are stopped, with the exception that all threads are shut down on fork
|
89
|
-
// events. In rare cases, if a large number of timers fire simultaneously,
|
90
|
-
// we may end up using a large number of threads.
|
91
|
-
// TODO(ctiller): We could avoid this by exiting threads in WaitUntil().
|
92
|
-
StartThread();
|
93
|
-
} else {
|
94
|
-
// if there's no thread waiting with a timeout, kick an existing untimed
|
95
|
-
// waiter so that the next deadline is not missed
|
96
|
-
if (!has_timed_waiter_) {
|
97
|
-
cv_wait_.Signal();
|
98
|
-
}
|
99
|
-
}
|
100
|
-
}
|
101
45
|
for (auto* timer : timers) {
|
102
|
-
|
103
|
-
}
|
104
|
-
{
|
105
|
-
grpc_core::MutexLock lock(&mu_);
|
106
|
-
collector.Collect(std::move(completed_threads_));
|
107
|
-
// get ready to wait again
|
108
|
-
++waiter_count_;
|
46
|
+
thread_pool_->Run(timer);
|
109
47
|
}
|
110
48
|
}
|
111
49
|
|
@@ -114,64 +52,18 @@ void TimerManager::RunSomeTimers(
|
|
114
52
|
// shutdown)
|
115
53
|
bool TimerManager::WaitUntil(grpc_core::Timestamp next) {
|
116
54
|
grpc_core::MutexLock lock(&mu_);
|
117
|
-
|
118
55
|
if (shutdown_) return false;
|
119
|
-
if (forking_) return false;
|
120
|
-
|
121
|
-
// TODO(ctiller): if there are too many waiting threads, this would be a good
|
122
|
-
// place to exit the current thread.
|
123
|
-
|
124
56
|
// If kicked_ is true at this point, it means there was a kick from the timer
|
125
57
|
// system that the timer-manager threads here missed. We cannot trust 'next'
|
126
58
|
// here any longer (since there might be an earlier deadline). So if kicked_
|
127
59
|
// is true at this point, we should quickly exit this and get the next
|
128
60
|
// deadline from the timer system
|
129
|
-
|
130
61
|
if (!kicked_) {
|
131
|
-
// if there's no timed waiter, we should become one: that waiter waits
|
132
|
-
// only until the next timer should expire. All other timers wait forever
|
133
|
-
//
|
134
|
-
// 'timed_waiter_generation_' is a global generation counter. The idea here
|
135
|
-
// is that the thread becoming a timed-waiter increments and stores this
|
136
|
-
// global counter locally in 'my_timed_waiter_generation' before going to
|
137
|
-
// sleep. After waking up, if my_timed_waiter_generation ==
|
138
|
-
// timed_waiter_generation_, it can be sure that it was the timed_waiter
|
139
|
-
// thread (and that no other thread took over while this was asleep)
|
140
|
-
//
|
141
|
-
// Initialize my_timed_waiter_generation to some value that is NOT equal to
|
142
|
-
// timed_waiter_generation_
|
143
|
-
uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1;
|
144
|
-
|
145
|
-
/* If there's no timed waiter, we should become one: that waiter waits only
|
146
|
-
until the next timer should expire. All other timer threads wait forever
|
147
|
-
unless their 'next' is earlier than the current timed-waiter's deadline
|
148
|
-
(in which case the thread with earlier 'next' takes over as the new timed
|
149
|
-
waiter) */
|
150
|
-
if (next != grpc_core::Timestamp::InfFuture()) {
|
151
|
-
if (!has_timed_waiter_ || (next < timed_waiter_deadline_)) {
|
152
|
-
my_timed_waiter_generation = ++timed_waiter_generation_;
|
153
|
-
has_timed_waiter_ = true;
|
154
|
-
timed_waiter_deadline_ = next;
|
155
|
-
} else { // timed_waiter_ == true && next >= timed_waiter_deadline_
|
156
|
-
next = grpc_core::Timestamp::InfFuture();
|
157
|
-
}
|
158
|
-
}
|
159
|
-
|
160
62
|
cv_wait_.WaitWithTimeout(&mu_,
|
161
63
|
absl::Milliseconds((next - host_.Now()).millis()));
|
162
|
-
|
163
|
-
// if this was the timed waiter, then we need to check timers, and flag
|
164
|
-
// that there's now no timed waiter... we'll look for a replacement if
|
165
|
-
// there's work to do after checking timers (code above)
|
166
|
-
if (my_timed_waiter_generation == timed_waiter_generation_) {
|
167
|
-
++wakeups_;
|
168
|
-
has_timed_waiter_ = false;
|
169
|
-
timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
|
170
|
-
}
|
64
|
+
++wakeups_;
|
171
65
|
}
|
172
|
-
|
173
66
|
kicked_ = false;
|
174
|
-
|
175
67
|
return true;
|
176
68
|
}
|
177
69
|
|
@@ -180,55 +72,37 @@ void TimerManager::MainLoop() {
|
|
180
72
|
grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
|
181
73
|
absl::optional<std::vector<experimental::EventEngine::Closure*>>
|
182
74
|
check_result = timer_list_->TimerCheck(&next);
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
} else {
|
189
|
-
/* This case only happens under contention, meaning more than one timer
|
190
|
-
manager thread checked timers concurrently.
|
191
|
-
|
192
|
-
If that happens, we're guaranteed that some other thread has just
|
193
|
-
checked timers, and this will avalanche into some other thread seeing
|
194
|
-
empty timers and doing a timed sleep.
|
195
|
-
|
196
|
-
Consequently, we can just sleep forever here and be happy at some
|
197
|
-
saved wakeup cycles. */
|
198
|
-
next = grpc_core::Timestamp::InfFuture();
|
75
|
+
GPR_ASSERT(check_result.has_value() &&
|
76
|
+
"ERROR: More than one MainLoop is running.");
|
77
|
+
if (!check_result->empty()) {
|
78
|
+
RunSomeTimers(std::move(*check_result));
|
79
|
+
continue;
|
199
80
|
}
|
200
|
-
if (!WaitUntil(next))
|
81
|
+
if (!WaitUntil(next)) break;
|
201
82
|
}
|
83
|
+
main_loop_exit_signal_->Notify();
|
202
84
|
}
|
203
85
|
|
204
|
-
|
205
|
-
g_timer_thread = true;
|
206
|
-
std::unique_ptr<RunThreadArgs> thread(static_cast<RunThreadArgs*>(arg));
|
207
|
-
if (grpc_event_engine_timer_trace.enabled()) {
|
208
|
-
gpr_log(GPR_DEBUG, "TimerManager::%p starting thread::%p", thread->self,
|
209
|
-
&thread->thread);
|
210
|
-
}
|
211
|
-
thread->self->Run(std::move(thread->thread));
|
212
|
-
if (grpc_event_engine_timer_trace.enabled()) {
|
213
|
-
gpr_log(GPR_DEBUG, "TimerManager::%p thread::%p finished", thread->self,
|
214
|
-
&thread->thread);
|
215
|
-
}
|
216
|
-
}
|
86
|
+
bool TimerManager::IsTimerManagerThread() { return g_timer_thread; }
|
217
87
|
|
218
|
-
void TimerManager::
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
88
|
+
void TimerManager::StartMainLoopThread() {
|
89
|
+
main_thread_ = grpc_core::Thread(
|
90
|
+
"timer_manager",
|
91
|
+
[](void* arg) {
|
92
|
+
auto self = static_cast<TimerManager*>(arg);
|
93
|
+
self->MainLoop();
|
94
|
+
},
|
95
|
+
this, nullptr,
|
96
|
+
grpc_core::Thread::Options().set_tracked(false).set_joinable(false));
|
97
|
+
main_thread_.Start();
|
224
98
|
}
|
225
99
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
timer_list_ =
|
230
|
-
|
231
|
-
|
100
|
+
TimerManager::TimerManager(
|
101
|
+
std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool)
|
102
|
+
: host_(this), thread_pool_(std::move(thread_pool)) {
|
103
|
+
timer_list_ = std::make_unique<TimerList>(&host_);
|
104
|
+
main_loop_exit_signal_.emplace();
|
105
|
+
StartMainLoopThread();
|
232
106
|
}
|
233
107
|
|
234
108
|
grpc_core::Timestamp TimerManager::Host::Now() {
|
@@ -238,6 +112,15 @@ grpc_core::Timestamp TimerManager::Host::Now() {
|
|
238
112
|
|
239
113
|
void TimerManager::TimerInit(Timer* timer, grpc_core::Timestamp deadline,
|
240
114
|
experimental::EventEngine::Closure* closure) {
|
115
|
+
if (grpc_event_engine_timer_trace.enabled()) {
|
116
|
+
grpc_core::MutexLock lock(&mu_);
|
117
|
+
if (shutdown_) {
|
118
|
+
gpr_log(GPR_ERROR,
|
119
|
+
"WARNING: TimerManager::%p: scheduling Closure::%p after "
|
120
|
+
"TimerManager has been shut down.",
|
121
|
+
this, closure);
|
122
|
+
}
|
123
|
+
}
|
241
124
|
timer_list_->TimerInit(timer, deadline, closure);
|
242
125
|
}
|
243
126
|
|
@@ -245,67 +128,47 @@ bool TimerManager::TimerCancel(Timer* timer) {
|
|
245
128
|
return timer_list_->TimerCancel(timer);
|
246
129
|
}
|
247
130
|
|
248
|
-
TimerManager
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
ThreadCollector collector;
|
253
|
-
grpc_core::MutexLock lock(&mu_);
|
254
|
-
shutdown_ = true;
|
255
|
-
cv_wait_.SignalAll();
|
256
|
-
while (thread_count_ > 0) {
|
257
|
-
cv_threadcount_.Wait(&mu_);
|
131
|
+
void TimerManager::Shutdown() {
|
132
|
+
{
|
133
|
+
grpc_core::MutexLock lock(&mu_);
|
134
|
+
if (shutdown_) return;
|
258
135
|
if (grpc_event_engine_timer_trace.enabled()) {
|
259
|
-
gpr_log(GPR_DEBUG, "TimerManager::%p
|
260
|
-
this, thread_count_);
|
136
|
+
gpr_log(GPR_DEBUG, "TimerManager::%p shutting down", this);
|
261
137
|
}
|
138
|
+
shutdown_ = true;
|
139
|
+
// Wait on the main loop to exit.
|
140
|
+
cv_wait_.Signal();
|
262
141
|
}
|
263
|
-
|
142
|
+
main_loop_exit_signal_->WaitForNotification();
|
264
143
|
if (grpc_event_engine_timer_trace.enabled()) {
|
265
144
|
gpr_log(GPR_DEBUG, "TimerManager::%p shutdown complete", this);
|
266
145
|
}
|
267
146
|
}
|
268
147
|
|
148
|
+
TimerManager::~TimerManager() { Shutdown(); }
|
149
|
+
|
269
150
|
void TimerManager::Host::Kick() { timer_manager_->Kick(); }
|
270
151
|
|
271
152
|
void TimerManager::Kick() {
|
272
153
|
grpc_core::MutexLock lock(&mu_);
|
273
|
-
has_timed_waiter_ = false;
|
274
|
-
timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
|
275
|
-
++timed_waiter_generation_;
|
276
154
|
kicked_ = true;
|
277
155
|
cv_wait_.Signal();
|
278
156
|
}
|
279
157
|
|
280
|
-
void TimerManager::
|
281
|
-
ThreadCollector collector;
|
282
|
-
grpc_core::MutexLock lock(&mu_);
|
283
|
-
forking_ = true;
|
284
|
-
prefork_thread_count_ = thread_count_;
|
285
|
-
cv_wait_.SignalAll();
|
286
|
-
while (thread_count_ > 0) {
|
287
|
-
cv_threadcount_.Wait(&mu_);
|
288
|
-
}
|
289
|
-
collector.Collect(std::move(completed_threads_));
|
290
|
-
}
|
291
|
-
|
292
|
-
void TimerManager::PostforkParent() {
|
158
|
+
void TimerManager::RestartPostFork() {
|
293
159
|
grpc_core::MutexLock lock(&mu_);
|
294
|
-
|
295
|
-
|
160
|
+
GPR_ASSERT(GPR_LIKELY(shutdown_));
|
161
|
+
if (grpc_event_engine_timer_trace.enabled()) {
|
162
|
+
gpr_log(GPR_DEBUG, "TimerManager::%p restarting after shutdown", this);
|
296
163
|
}
|
297
|
-
|
298
|
-
|
164
|
+
shutdown_ = false;
|
165
|
+
main_loop_exit_signal_.emplace();
|
166
|
+
StartMainLoopThread();
|
299
167
|
}
|
300
168
|
|
301
|
-
void TimerManager::
|
302
|
-
|
303
|
-
|
304
|
-
StartThread();
|
305
|
-
}
|
306
|
-
prefork_thread_count_ = 0;
|
307
|
-
forking_ = false;
|
308
|
-
}
|
169
|
+
void TimerManager::PrepareFork() { Shutdown(); }
|
170
|
+
void TimerManager::PostforkParent() { RestartPostFork(); }
|
171
|
+
void TimerManager::PostforkChild() { RestartPostFork(); }
|
309
172
|
|
310
173
|
} // namespace posix_engine
|
311
174
|
} // namespace grpc_event_engine
|
@@ -21,18 +21,20 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
-
#include <stddef.h>
|
25
24
|
#include <stdint.h>
|
26
25
|
|
27
26
|
#include <memory>
|
28
27
|
#include <vector>
|
29
28
|
|
30
29
|
#include "absl/base/thread_annotations.h"
|
30
|
+
#include "absl/types/optional.h"
|
31
31
|
|
32
32
|
#include <grpc/event_engine/event_engine.h>
|
33
33
|
|
34
34
|
#include "src/core/lib/event_engine/forkable.h"
|
35
35
|
#include "src/core/lib/event_engine/posix_engine/timer.h"
|
36
|
+
#include "src/core/lib/event_engine/thread_pool.h"
|
37
|
+
#include "src/core/lib/gprpp/notification.h"
|
36
38
|
#include "src/core/lib/gprpp/sync.h"
|
37
39
|
#include "src/core/lib/gprpp/thd.h"
|
38
40
|
#include "src/core/lib/gprpp/time.h"
|
@@ -46,7 +48,8 @@ namespace posix_engine {
|
|
46
48
|
// thread_pool.{h,cc}.
|
47
49
|
class TimerManager final : public grpc_event_engine::experimental::Forkable {
|
48
50
|
public:
|
49
|
-
TimerManager(
|
51
|
+
explicit TimerManager(
|
52
|
+
std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool);
|
50
53
|
~TimerManager() override;
|
51
54
|
|
52
55
|
grpc_core::Timestamp Now() { return host_.Now(); }
|
@@ -55,19 +58,16 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
|
|
55
58
|
experimental::EventEngine::Closure* closure);
|
56
59
|
bool TimerCancel(Timer* timer);
|
57
60
|
|
58
|
-
|
61
|
+
static bool IsTimerManagerThread();
|
62
|
+
|
63
|
+
// Called on destruction, prefork, and manually when needed.
|
64
|
+
void Shutdown();
|
65
|
+
|
59
66
|
void PrepareFork() override;
|
60
67
|
void PostforkParent() override;
|
61
68
|
void PostforkChild() override;
|
62
69
|
|
63
|
-
static bool IsTimerManagerThread();
|
64
|
-
|
65
70
|
private:
|
66
|
-
struct RunThreadArgs {
|
67
|
-
TimerManager* self;
|
68
|
-
grpc_core::Thread thread;
|
69
|
-
};
|
70
|
-
|
71
71
|
class Host final : public TimerListHost {
|
72
72
|
public:
|
73
73
|
explicit Host(TimerManager* timer_manager)
|
@@ -80,60 +80,32 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
|
|
80
80
|
TimerManager* const timer_manager_;
|
81
81
|
};
|
82
82
|
|
83
|
-
void
|
84
|
-
|
85
|
-
void Run(grpc_core::Thread thread);
|
83
|
+
void StartMainLoopThread();
|
84
|
+
void RestartPostFork();
|
86
85
|
void MainLoop();
|
87
86
|
void RunSomeTimers(std::vector<experimental::EventEngine::Closure*> timers);
|
88
87
|
bool WaitUntil(grpc_core::Timestamp next);
|
89
88
|
void Kick();
|
90
89
|
|
91
90
|
grpc_core::Mutex mu_;
|
92
|
-
// Condvar associated with
|
93
|
-
// Threads
|
94
|
-
//
|
95
|
-
|
96
|
-
//
|
97
|
-
// Threads wait on this until either a timeout is reached or another thread is
|
98
|
-
// needed to wait for a timeout.
|
99
|
-
// On shutdown we SignalAll against this to wake up all threads and have them
|
100
|
-
// finish.
|
101
|
-
// On kick we Signal against this to wake up at least one thread (but not
|
102
|
-
// all)! Similarly when we note that no thread is watching timers.
|
103
|
-
//
|
104
|
-
// This is a different condvar than cv_threadcount_!
|
105
|
-
// If this were the same:
|
106
|
-
// - thread exits would require a SignalAll to ensure that the specific thread
|
107
|
-
// we want to wake is woken up.
|
108
|
-
// - kicks would need to signal all threads to avoid having the kick absorbed
|
109
|
-
// by a shutdown thread and cause a deadlock, leading to thundering herd
|
110
|
-
// problems in the common case.
|
91
|
+
// Condvar associated with the main thread waiting to wakeup and work.
|
92
|
+
// Threads wait on this until either a timeout is reached or the timer manager
|
93
|
+
// is kicked. On shutdown we Signal against this to wake up all threads and
|
94
|
+
// have them finish. On kick we Signal against this to wake up the main
|
95
|
+
// thread.
|
111
96
|
grpc_core::CondVar cv_wait_;
|
112
97
|
Host host_;
|
113
|
-
// number of threads in the system
|
114
|
-
size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0;
|
115
|
-
// number of threads sitting around waiting
|
116
|
-
size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0;
|
117
|
-
// Threads waiting to be joined
|
118
|
-
std::vector<grpc_core::Thread> completed_threads_ ABSL_GUARDED_BY(mu_);
|
119
|
-
// is there a thread waiting until the next timer should fire?
|
120
|
-
bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false;
|
121
98
|
// are we shutting down?
|
122
99
|
bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
|
123
|
-
// are we forking?
|
124
|
-
bool forking_ ABSL_GUARDED_BY(mu_) = false;
|
125
100
|
// are we shutting down?
|
126
101
|
bool kicked_ ABSL_GUARDED_BY(mu_) = false;
|
127
|
-
// the deadline of the current timed waiter thread (only relevant if
|
128
|
-
// has_timed_waiter_ is true)
|
129
|
-
grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_);
|
130
|
-
// generation counter to track which thread is waiting for the next timer
|
131
|
-
uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0;
|
132
102
|
// number of timer wakeups
|
133
|
-
uint64_t wakeups_ ABSL_GUARDED_BY(mu_) =
|
103
|
+
uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = false;
|
134
104
|
// actual timer implementation
|
135
105
|
std::unique_ptr<TimerList> timer_list_;
|
136
|
-
|
106
|
+
grpc_core::Thread main_thread_;
|
107
|
+
std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool_;
|
108
|
+
absl::optional<grpc_core::Notification> main_loop_exit_signal_;
|
137
109
|
};
|
138
110
|
|
139
111
|
} // namespace posix_engine
|