grpc 1.50.0.pre1 → 1.51.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +131 -42
- data/include/grpc/event_engine/event_engine.h +10 -3
- data/include/grpc/event_engine/slice_buffer.h +17 -0
- data/include/grpc/grpc.h +0 -10
- data/include/grpc/impl/codegen/grpc_types.h +1 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
- data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
- data/src/core/ext/filters/client_channel/client_channel.h +3 -4
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
- data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
- data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
- data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
- data/src/core/ext/filters/client_channel/subchannel.h +2 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
- data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
- data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
- data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
- data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
- data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +15 -68
- data/src/core/ext/xds/xds_api.h +3 -7
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_client.cc +122 -90
- data/src/core/ext/xds/xds_client.h +7 -2
- data/src/core/ext/xds/xds_client_grpc.cc +5 -24
- data/src/core/ext/xds/xds_cluster.cc +291 -183
- data/src/core/ext/xds/xds_cluster.h +11 -15
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
- data/src/core/ext/xds/xds_common_types.cc +208 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +214 -129
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
- data/src/core/ext/xds/xds_http_filters.cc +60 -73
- data/src/core/ext/xds/xds_http_filters.h +67 -19
- data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
- data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +459 -417
- data/src/core/ext/xds/xds_listener.h +43 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
- data/src/core/ext/xds/xds_route_config.cc +94 -80
- data/src/core/ext/xds/xds_route_config.h +10 -10
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
- data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
- data/src/core/lib/address_utils/parse_address.cc +11 -10
- data/src/core/lib/channel/channel_args.h +16 -1
- data/src/core/lib/channel/channel_stack.cc +23 -20
- data/src/core/lib/channel/channel_stack.h +17 -4
- data/src/core/lib/channel/channel_stack_builder.cc +4 -7
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +4 -5
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +695 -35
- data/src/core/lib/channel/connected_channel.h +0 -4
- data/src/core/lib/channel/promise_based_filter.cc +1004 -140
- data/src/core/lib/channel/promise_based_filter.h +364 -87
- data/src/core/lib/compression/message_compress.cc +5 -5
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +22 -119
- data/src/core/lib/debug/stats.h +29 -35
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/thread_pool.cc +106 -25
- data/src/core/lib/event_engine/thread_pool.h +32 -9
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -2
- data/src/core/lib/experiments/experiments.h +8 -1
- data/src/core/lib/gpr/cpu_linux.cc +6 -2
- data/src/core/lib/gpr/log_linux.cc +3 -4
- data/src/core/lib/gpr/string.h +1 -1
- data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +3 -2
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
- data/src/core/lib/gprpp/thd_windows.cc +1 -2
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +13 -2
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/http/httpcli.cc +40 -44
- data/src/core/lib/http/httpcli.h +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +4 -6
- data/src/core/lib/http/parser.cc +54 -65
- data/src/core/lib/iomgr/buffer_list.cc +105 -116
- data/src/core/lib/iomgr/buffer_list.h +60 -44
- data/src/core/lib/iomgr/call_combiner.cc +11 -10
- data/src/core/lib/iomgr/call_combiner.h +3 -4
- data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
- data/src/core/lib/iomgr/closure.h +49 -5
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +27 -42
- data/src/core/lib/iomgr/error.h +22 -152
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
- data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
- data/src/core/lib/iomgr/exec_ctx.cc +3 -4
- data/src/core/lib/iomgr/exec_ctx.h +2 -3
- data/src/core/lib/iomgr/executor.cc +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
- data/src/core/lib/iomgr/load_file.cc +5 -9
- data/src/core/lib/iomgr/lockfree_event.cc +10 -10
- data/src/core/lib/iomgr/pollset_windows.cc +4 -4
- data/src/core/lib/iomgr/python_util.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +8 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -4
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
- data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
- data/src/core/lib/iomgr/tcp_posix.cc +92 -108
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
- data/src/core/lib/iomgr/tcp_windows.cc +27 -34
- data/src/core/lib/iomgr/timer.h +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +9 -15
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +7 -2
- data/src/core/lib/json/json_object_loader.h +22 -0
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/load_balancing/lb_policy.cc +1 -1
- data/src/core/lib/load_balancing/lb_policy.h +4 -0
- data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +38 -15
- data/src/core/lib/promise/arena_promise.h +80 -51
- data/src/core/lib/promise/context.h +13 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +58 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
- data/src/core/lib/promise/for_each.h +129 -0
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map_pipe.h +87 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +13 -0
- data/src/core/lib/promise/seq.h +3 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +341 -0
- data/src/core/lib/promise/try_seq.h +10 -13
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +1 -3
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/arena.cc +19 -0
- data/src/core/lib/resource_quota/arena.h +89 -0
- data/src/core/lib/resource_quota/memory_quota.cc +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/context/security_context.h +10 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
- data/src/core/lib/security/transport/security_handshaker.cc +53 -53
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/tsi_error.cc +6 -3
- data/src/core/lib/security/util/json_util.cc +4 -5
- data/src/core/lib/service_config/service_config.h +1 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +2 -2
- data/src/core/lib/slice/slice.cc +7 -1
- data/src/core/lib/slice/slice.h +19 -6
- data/src/core/lib/slice/slice_buffer.cc +13 -14
- data/src/core/lib/slice/slice_internal.h +13 -21
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/surface/byte_buffer.cc +3 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +1366 -239
- data/src/core/lib/surface/call.h +44 -0
- data/src/core/lib/surface/call_details.cc +3 -3
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +44 -49
- data/src/core/lib/surface/channel.h +9 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/channel_stack_type.cc +4 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.cc +38 -52
- data/src/core/lib/surface/init.cc +8 -39
- data/src/core/lib/surface/init_internally.h +8 -0
- data/src/core/lib/surface/lame_client.cc +10 -8
- data/src/core/lib/surface/server.cc +48 -70
- data/src/core/lib/surface/server.h +3 -4
- data/src/core/lib/surface/validate_metadata.cc +11 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +34 -28
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +14 -14
- data/src/core/lib/transport/handshaker.h +1 -1
- data/src/core/lib/transport/handshaker_factory.h +26 -0
- data/src/core/lib/transport/handshaker_registry.cc +8 -2
- data/src/core/lib/transport/handshaker_registry.h +3 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
- data/src/core/lib/transport/metadata_batch.h +17 -1
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/transport.cc +63 -17
- data/src/core/lib/transport/transport.h +64 -68
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +7 -6
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
- data/src/core/tsi/fake_transport_security.cc +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +57 -20
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_buffer_api.cc +0 -35
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,151 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include <memory>
|
18
|
+
#include <utility>
|
19
|
+
|
20
|
+
#include "absl/strings/str_cat.h"
|
21
|
+
#include "absl/strings/string_view.h"
|
22
|
+
|
23
|
+
#include <grpc/support/log.h> // IWYU pragma: keep
|
24
|
+
|
25
|
+
#include "src/core/lib/iomgr/port.h"
|
26
|
+
|
27
|
+
#ifdef GRPC_POSIX_WAKEUP_FD
|
28
|
+
#include <errno.h>
|
29
|
+
#include <fcntl.h>
|
30
|
+
#include <unistd.h>
|
31
|
+
|
32
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
|
33
|
+
#endif
|
34
|
+
|
35
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h"
|
36
|
+
#include "src/core/lib/gprpp/strerror.h"
|
37
|
+
|
38
|
+
namespace grpc_event_engine {
|
39
|
+
namespace posix_engine {
|
40
|
+
|
41
|
+
#ifdef GRPC_POSIX_WAKEUP_FD
|
42
|
+
|
43
|
+
namespace {
|
44
|
+
|
45
|
+
absl::Status SetSocketNonBlocking(int fd) {
|
46
|
+
int oldflags = fcntl(fd, F_GETFL, 0);
|
47
|
+
if (oldflags < 0) {
|
48
|
+
return absl::Status(absl::StatusCode::kInternal,
|
49
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
50
|
+
}
|
51
|
+
|
52
|
+
oldflags |= O_NONBLOCK;
|
53
|
+
|
54
|
+
if (fcntl(fd, F_SETFL, oldflags) != 0) {
|
55
|
+
return absl::Status(absl::StatusCode::kInternal,
|
56
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
57
|
+
}
|
58
|
+
|
59
|
+
return absl::OkStatus();
|
60
|
+
}
|
61
|
+
} // namespace
|
62
|
+
|
63
|
+
absl::Status PipeWakeupFd::Init() {
|
64
|
+
int pipefd[2];
|
65
|
+
int r = pipe(pipefd);
|
66
|
+
if (0 != r) {
|
67
|
+
return absl::Status(absl::StatusCode::kInternal,
|
68
|
+
absl::StrCat("pipe: ", grpc_core::StrError(errno)));
|
69
|
+
}
|
70
|
+
auto status = SetSocketNonBlocking(pipefd[0]);
|
71
|
+
if (!status.ok()) return status;
|
72
|
+
status = SetSocketNonBlocking(pipefd[1]);
|
73
|
+
if (!status.ok()) return status;
|
74
|
+
SetWakeupFds(pipefd[0], pipefd[1]);
|
75
|
+
return absl::OkStatus();
|
76
|
+
}
|
77
|
+
|
78
|
+
absl::Status PipeWakeupFd::ConsumeWakeup() {
|
79
|
+
char buf[128];
|
80
|
+
ssize_t r;
|
81
|
+
|
82
|
+
for (;;) {
|
83
|
+
r = read(ReadFd(), buf, sizeof(buf));
|
84
|
+
if (r > 0) continue;
|
85
|
+
if (r == 0) return absl::OkStatus();
|
86
|
+
switch (errno) {
|
87
|
+
case EAGAIN:
|
88
|
+
return absl::OkStatus();
|
89
|
+
case EINTR:
|
90
|
+
continue;
|
91
|
+
default:
|
92
|
+
return absl::Status(absl::StatusCode::kInternal,
|
93
|
+
absl::StrCat("read: ", grpc_core::StrError(errno)));
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
absl::Status PipeWakeupFd::Wakeup() {
|
99
|
+
char c = 0;
|
100
|
+
while (write(WriteFd(), &c, 1) != 1 && errno == EINTR) {
|
101
|
+
}
|
102
|
+
return absl::OkStatus();
|
103
|
+
}
|
104
|
+
|
105
|
+
PipeWakeupFd::~PipeWakeupFd() {
|
106
|
+
if (ReadFd() != 0) {
|
107
|
+
close(ReadFd());
|
108
|
+
}
|
109
|
+
if (WriteFd() != 0) {
|
110
|
+
close(WriteFd());
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
bool PipeWakeupFd::IsSupported() {
|
115
|
+
PipeWakeupFd pipe_wakeup_fd;
|
116
|
+
return pipe_wakeup_fd.Init().ok();
|
117
|
+
}
|
118
|
+
|
119
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> PipeWakeupFd::CreatePipeWakeupFd() {
|
120
|
+
static bool kIsPipeWakeupFdSupported = PipeWakeupFd::IsSupported();
|
121
|
+
if (kIsPipeWakeupFdSupported) {
|
122
|
+
auto pipe_wakeup_fd = std::make_unique<PipeWakeupFd>();
|
123
|
+
auto status = pipe_wakeup_fd->Init();
|
124
|
+
if (status.ok()) {
|
125
|
+
return std::unique_ptr<WakeupFd>(std::move(pipe_wakeup_fd));
|
126
|
+
}
|
127
|
+
return status;
|
128
|
+
}
|
129
|
+
return absl::NotFoundError("Pipe wakeup fd is not supported");
|
130
|
+
}
|
131
|
+
|
132
|
+
#else // GRPC_POSIX_WAKEUP_FD
|
133
|
+
|
134
|
+
absl::Status PipeWakeupFd::Init() { GPR_ASSERT(false && "unimplemented"); }
|
135
|
+
|
136
|
+
absl::Status PipeWakeupFd::ConsumeWakeup() {
|
137
|
+
GPR_ASSERT(false && "unimplemented");
|
138
|
+
}
|
139
|
+
|
140
|
+
absl::Status PipeWakeupFd::Wakeup() { GPR_ASSERT(false && "unimplemented"); }
|
141
|
+
|
142
|
+
bool PipeWakeupFd::IsSupported() { return false; }
|
143
|
+
|
144
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> PipeWakeupFd::CreatePipeWakeupFd() {
|
145
|
+
return absl::NotFoundError("Pipe wakeup fd is not supported");
|
146
|
+
}
|
147
|
+
|
148
|
+
#endif // GRPC_POSIX_WAKEUP_FD
|
149
|
+
|
150
|
+
} // namespace posix_engine
|
151
|
+
} // namespace grpc_event_engine
|
@@ -0,0 +1,45 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
#ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
|
15
|
+
#define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
|
16
|
+
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
#include <memory>
|
20
|
+
|
21
|
+
#include "absl/status/status.h"
|
22
|
+
#include "absl/status/statusor.h"
|
23
|
+
|
24
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
|
25
|
+
|
26
|
+
namespace grpc_event_engine {
|
27
|
+
namespace posix_engine {
|
28
|
+
|
29
|
+
class PipeWakeupFd : public WakeupFd {
|
30
|
+
public:
|
31
|
+
PipeWakeupFd() : WakeupFd() {}
|
32
|
+
~PipeWakeupFd() override;
|
33
|
+
absl::Status ConsumeWakeup() override;
|
34
|
+
absl::Status Wakeup() override;
|
35
|
+
static absl::StatusOr<std::unique_ptr<WakeupFd>> CreatePipeWakeupFd();
|
36
|
+
static bool IsSupported();
|
37
|
+
|
38
|
+
private:
|
39
|
+
absl::Status Init();
|
40
|
+
};
|
41
|
+
|
42
|
+
} // namespace posix_engine
|
43
|
+
} // namespace grpc_event_engine
|
44
|
+
|
45
|
+
#endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
|
@@ -0,0 +1,76 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
/*
|
16
|
+
* WakeupFd abstracts the concept of a file descriptor for the purpose of
|
17
|
+
* waking up a thread in select()/poll()/epoll_wait()/etc.
|
18
|
+
|
19
|
+
* The poll() family of system calls provide a way for a thread to block until
|
20
|
+
* there is activity on one (or more) of a set of file descriptors. An
|
21
|
+
* application may wish to wake up this thread to do non file related work. The
|
22
|
+
* typical way to do this is to add a pipe to the set of file descriptors, then
|
23
|
+
* write to the pipe to wake up the thread in poll().
|
24
|
+
*
|
25
|
+
* Linux has a lighter weight eventfd specifically designed for this purpose.
|
26
|
+
* WakeupFd abstracts the difference between the two.
|
27
|
+
*
|
28
|
+
* Setup:
|
29
|
+
* 1. Call CreateWakeupFd() to crete an initialized WakeupFd.
|
30
|
+
* 2. Add the result of WakeupFd::ReadFd() to the set of monitored file
|
31
|
+
* descriptors for the poll() style API you are using. Monitor the file
|
32
|
+
* descriptor for readability.
|
33
|
+
* 3. To tear down, call WakeupFd::Destroy(). This closes the underlying
|
34
|
+
* file descriptor.
|
35
|
+
*
|
36
|
+
* Usage:
|
37
|
+
* 1. To wake up a polling thread, call WakeupFd::Wakeup() on a wakeup_fd
|
38
|
+
* it is monitoring.
|
39
|
+
* 2. If the polling thread was awakened by a WakeupFd event, call
|
40
|
+
* WakeupFd::Consume() on it.
|
41
|
+
*/
|
42
|
+
#ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
|
43
|
+
#define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
|
44
|
+
|
45
|
+
#include <grpc/support/port_platform.h>
|
46
|
+
|
47
|
+
#include "absl/status/status.h"
|
48
|
+
|
49
|
+
namespace grpc_event_engine {
|
50
|
+
namespace posix_engine {
|
51
|
+
|
52
|
+
class WakeupFd {
|
53
|
+
public:
|
54
|
+
virtual absl::Status ConsumeWakeup() = 0;
|
55
|
+
virtual absl::Status Wakeup() = 0;
|
56
|
+
virtual ~WakeupFd() = default;
|
57
|
+
|
58
|
+
int ReadFd() { return read_fd_; }
|
59
|
+
int WriteFd() { return write_fd_; }
|
60
|
+
|
61
|
+
protected:
|
62
|
+
WakeupFd() : read_fd_(0), write_fd_(0) {}
|
63
|
+
void SetWakeupFds(int read_fd, int write_fd) {
|
64
|
+
read_fd_ = read_fd;
|
65
|
+
write_fd_ = write_fd;
|
66
|
+
}
|
67
|
+
|
68
|
+
private:
|
69
|
+
int read_fd_;
|
70
|
+
int write_fd_;
|
71
|
+
};
|
72
|
+
|
73
|
+
} // namespace posix_engine
|
74
|
+
} // namespace grpc_event_engine
|
75
|
+
|
76
|
+
#endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
|
@@ -0,0 +1,67 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
#include <grpc/support/port_platform.h>
|
15
|
+
|
16
|
+
#include <memory>
|
17
|
+
|
18
|
+
#include "absl/status/status.h"
|
19
|
+
#include "absl/status/statusor.h"
|
20
|
+
|
21
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h"
|
22
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h"
|
23
|
+
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
|
24
|
+
#include "src/core/lib/iomgr/port.h"
|
25
|
+
|
26
|
+
namespace grpc_event_engine {
|
27
|
+
namespace posix_engine {
|
28
|
+
|
29
|
+
#ifdef GRPC_POSIX_WAKEUP_FD
|
30
|
+
|
31
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> NotSupported() {
|
32
|
+
return absl::NotFoundError("Wakeup-fd is not supported on this system");
|
33
|
+
}
|
34
|
+
|
35
|
+
namespace {
|
36
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> (*g_wakeup_fd_fn)() =
|
37
|
+
[]() -> absl::StatusOr<std::unique_ptr<WakeupFd>> (*)() {
|
38
|
+
#ifndef GRPC_POSIX_NO_SPECIAL_WAKEUP_FD
|
39
|
+
if (EventFdWakeupFd::IsSupported()) {
|
40
|
+
return &EventFdWakeupFd::CreateEventFdWakeupFd;
|
41
|
+
}
|
42
|
+
#endif // GRPC_POSIX_NO_SPECIAL_WAKEUP_FD
|
43
|
+
if (PipeWakeupFd::IsSupported()) {
|
44
|
+
return &PipeWakeupFd::CreatePipeWakeupFd;
|
45
|
+
}
|
46
|
+
return NotSupported;
|
47
|
+
}();
|
48
|
+
} // namespace
|
49
|
+
|
50
|
+
bool SupportsWakeupFd() { return g_wakeup_fd_fn != NotSupported; }
|
51
|
+
|
52
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd() {
|
53
|
+
return g_wakeup_fd_fn();
|
54
|
+
}
|
55
|
+
|
56
|
+
#else /* GRPC_POSIX_WAKEUP_FD */
|
57
|
+
|
58
|
+
bool SupportsWakeupFd() { return false; }
|
59
|
+
|
60
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd() {
|
61
|
+
return absl::NotFoundError("Wakeup-fd is not supported on this system");
|
62
|
+
}
|
63
|
+
|
64
|
+
#endif /* GRPC_POSIX_WAKEUP_FD */
|
65
|
+
|
66
|
+
} // namespace posix_engine
|
67
|
+
} // namespace grpc_event_engine
|
@@ -0,0 +1,37 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_DEFAULT_H
|
16
|
+
#define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_DEFAULT_H
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
#include <memory>
|
20
|
+
|
21
|
+
#include "absl/status/statusor.h"
|
22
|
+
|
23
|
+
namespace grpc_event_engine {
|
24
|
+
namespace posix_engine {
|
25
|
+
|
26
|
+
class WakeupFd;
|
27
|
+
|
28
|
+
// Returns true if wakeup-fd is supported by the system.
|
29
|
+
bool SupportsWakeupFd();
|
30
|
+
|
31
|
+
// Create and return an initialized WakeupFd instance if supported.
|
32
|
+
absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd();
|
33
|
+
|
34
|
+
} // namespace posix_engine
|
35
|
+
} // namespace grpc_event_engine
|
36
|
+
|
37
|
+
#endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_DEFAULT_H
|
@@ -14,6 +14,8 @@
|
|
14
14
|
|
15
15
|
#include <grpc/support/port_platform.h>
|
16
16
|
|
17
|
+
#include "src/core/lib/slice/slice.h"
|
18
|
+
|
17
19
|
#include <stdint.h>
|
18
20
|
|
19
21
|
#include <string>
|
@@ -25,14 +27,13 @@
|
|
25
27
|
|
26
28
|
#include "src/core/lib/slice/slice_internal.h"
|
27
29
|
#include "src/core/lib/slice/slice_refcount.h"
|
28
|
-
#include "src/core/lib/slice/slice_refcount_base.h"
|
29
30
|
|
30
31
|
namespace grpc_event_engine {
|
31
32
|
namespace experimental {
|
32
33
|
|
33
34
|
namespace slice_detail {
|
34
35
|
|
35
|
-
uint32_t BaseSlice::Hash() const { return
|
36
|
+
uint32_t BaseSlice::Hash() const { return grpc_slice_hash(slice_); }
|
36
37
|
|
37
38
|
template <>
|
38
39
|
MutableSlice CopyConstructors<MutableSlice>::FromCopiedString(std::string s) {
|
@@ -51,7 +52,7 @@ MutableSlice::MutableSlice(const grpc_slice& slice)
|
|
51
52
|
GPR_DEBUG_ASSERT(slice.refcount == nullptr || slice.refcount->IsUnique());
|
52
53
|
}
|
53
54
|
|
54
|
-
MutableSlice::~MutableSlice() {
|
55
|
+
MutableSlice::~MutableSlice() { grpc_core::CSliceUnref(c_slice()); }
|
55
56
|
|
56
57
|
Slice Slice::TakeOwned() {
|
57
58
|
if (c_slice().refcount == nullptr) {
|
@@ -70,7 +71,7 @@ Slice Slice::AsOwned() const {
|
|
70
71
|
if (c_slice().refcount == grpc_slice_refcount::NoopRefcount()) {
|
71
72
|
return Slice(grpc_slice_copy(c_slice()));
|
72
73
|
}
|
73
|
-
return Slice(
|
74
|
+
return Slice(grpc_core::CSliceRef(c_slice()));
|
74
75
|
}
|
75
76
|
|
76
77
|
MutableSlice Slice::TakeMutable() {
|
@@ -84,9 +85,9 @@ MutableSlice Slice::TakeMutable() {
|
|
84
85
|
return MutableSlice(grpc_slice_copy(c_slice()));
|
85
86
|
}
|
86
87
|
|
87
|
-
Slice::~Slice() {
|
88
|
+
Slice::~Slice() { grpc_core::CSliceUnref(c_slice()); }
|
88
89
|
|
89
|
-
Slice Slice::Ref() const { return Slice(
|
90
|
+
Slice Slice::Ref() const { return Slice(grpc_core::CSliceRef(c_slice())); }
|
90
91
|
|
91
92
|
Slice Slice::FromRefcountAndBytes(grpc_slice_refcount* r, const uint8_t* begin,
|
92
93
|
const uint8_t* end) {
|
@@ -21,7 +21,7 @@
|
|
21
21
|
#include <grpc/slice.h>
|
22
22
|
#include <grpc/slice_buffer.h>
|
23
23
|
|
24
|
-
#include "src/core/lib/slice/
|
24
|
+
#include "src/core/lib/slice/slice.h"
|
25
25
|
|
26
26
|
namespace grpc_event_engine {
|
27
27
|
namespace experimental {
|
@@ -43,7 +43,7 @@ void SliceBuffer::Prepend(Slice slice) {
|
|
43
43
|
}
|
44
44
|
|
45
45
|
Slice SliceBuffer::RefSlice(size_t index) {
|
46
|
-
return Slice(
|
46
|
+
return Slice(grpc_core::CSliceRef(slice_buffer_.slices[index]));
|
47
47
|
}
|
48
48
|
|
49
49
|
} // namespace experimental
|
@@ -20,16 +20,18 @@
|
|
20
20
|
|
21
21
|
#include "src/core/lib/event_engine/thread_pool.h"
|
22
22
|
|
23
|
+
#include <atomic>
|
23
24
|
#include <memory>
|
24
25
|
#include <utility>
|
25
26
|
|
27
|
+
#include "absl/base/attributes.h"
|
26
28
|
#include "absl/time/clock.h"
|
27
29
|
#include "absl/time/time.h"
|
28
30
|
|
29
31
|
#include <grpc/support/log.h>
|
30
32
|
|
31
|
-
#include "src/core/lib/gpr/tls.h"
|
32
33
|
#include "src/core/lib/gprpp/thd.h"
|
34
|
+
#include "src/core/lib/gprpp/time.h"
|
33
35
|
|
34
36
|
namespace grpc_event_engine {
|
35
37
|
namespace experimental {
|
@@ -37,27 +39,63 @@ namespace experimental {
|
|
37
39
|
namespace {
|
38
40
|
// TODO(drfloob): Remove this, and replace it with the WorkQueue* for the
|
39
41
|
// current thread (with nullptr indicating not a threadpool thread).
|
40
|
-
|
42
|
+
thread_local bool g_threadpool_thread;
|
41
43
|
} // namespace
|
42
44
|
|
43
|
-
void ThreadPool::StartThread(StatePtr state,
|
45
|
+
void ThreadPool::StartThread(StatePtr state, StartThreadReason reason) {
|
44
46
|
state->thread_count.Add();
|
47
|
+
const auto now = grpc_core::Timestamp::Now();
|
48
|
+
switch (reason) {
|
49
|
+
case StartThreadReason::kNoWaitersWhenScheduling: {
|
50
|
+
auto time_since_last_start =
|
51
|
+
now - grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
|
52
|
+
state->last_started_thread.load(std::memory_order_relaxed));
|
53
|
+
if (time_since_last_start < grpc_core::Duration::Seconds(1)) {
|
54
|
+
state->thread_count.Remove();
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
ABSL_FALLTHROUGH_INTENDED;
|
59
|
+
case StartThreadReason::kNoWaitersWhenFinishedStarting:
|
60
|
+
if (state->currently_starting_one_thread.exchange(
|
61
|
+
true, std::memory_order_relaxed)) {
|
62
|
+
state->thread_count.Remove();
|
63
|
+
return;
|
64
|
+
}
|
65
|
+
state->last_started_thread.store(now.milliseconds_after_process_epoch(),
|
66
|
+
std::memory_order_relaxed);
|
67
|
+
break;
|
68
|
+
case StartThreadReason::kInitialPool:
|
69
|
+
break;
|
70
|
+
}
|
45
71
|
struct ThreadArg {
|
46
72
|
StatePtr state;
|
47
|
-
|
73
|
+
StartThreadReason reason;
|
48
74
|
};
|
49
75
|
grpc_core::Thread(
|
50
76
|
"event_engine",
|
51
77
|
[](void* arg) {
|
52
78
|
std::unique_ptr<ThreadArg> a(static_cast<ThreadArg*>(arg));
|
53
79
|
g_threadpool_thread = true;
|
54
|
-
|
55
|
-
|
56
|
-
|
80
|
+
switch (a->reason) {
|
81
|
+
case StartThreadReason::kInitialPool:
|
82
|
+
break;
|
83
|
+
case StartThreadReason::kNoWaitersWhenFinishedStarting:
|
84
|
+
a->state->queue.SleepIfRunning();
|
85
|
+
ABSL_FALLTHROUGH_INTENDED;
|
86
|
+
case StartThreadReason::kNoWaitersWhenScheduling:
|
87
|
+
// Release throttling variable
|
88
|
+
GPR_ASSERT(a->state->currently_starting_one_thread.exchange(
|
89
|
+
false, std::memory_order_relaxed));
|
90
|
+
if (a->state->queue.IsBacklogged()) {
|
91
|
+
StartThread(a->state,
|
92
|
+
StartThreadReason::kNoWaitersWhenFinishedStarting);
|
93
|
+
}
|
94
|
+
break;
|
57
95
|
}
|
58
96
|
ThreadFunc(a->state);
|
59
97
|
},
|
60
|
-
new ThreadArg{state,
|
98
|
+
new ThreadArg{state, reason}, nullptr,
|
61
99
|
grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
|
62
100
|
.Start();
|
63
101
|
}
|
@@ -74,10 +112,18 @@ bool ThreadPool::Queue::Step() {
|
|
74
112
|
while (state_ == State::kRunning && callbacks_.empty()) {
|
75
113
|
// If there are too many threads waiting, then quit this thread.
|
76
114
|
// TODO(ctiller): wait some time in this case to be sure.
|
77
|
-
if (threads_waiting_ >= reserve_threads_)
|
78
|
-
|
79
|
-
|
80
|
-
|
115
|
+
if (threads_waiting_ >= reserve_threads_) {
|
116
|
+
threads_waiting_++;
|
117
|
+
bool timeout = cv_.WaitWithTimeout(&mu_, absl::Seconds(30));
|
118
|
+
threads_waiting_--;
|
119
|
+
if (timeout && threads_waiting_ >= reserve_threads_) {
|
120
|
+
return false;
|
121
|
+
}
|
122
|
+
} else {
|
123
|
+
threads_waiting_++;
|
124
|
+
cv_.Wait(&mu_);
|
125
|
+
threads_waiting_--;
|
126
|
+
}
|
81
127
|
}
|
82
128
|
switch (state_) {
|
83
129
|
case State::kRunning:
|
@@ -95,14 +141,13 @@ bool ThreadPool::Queue::Step() {
|
|
95
141
|
return true;
|
96
142
|
}
|
97
143
|
|
98
|
-
ThreadPool::ThreadPool(
|
99
|
-
|
100
|
-
|
101
|
-
StartThread(state_, /*throttled=*/false);
|
144
|
+
ThreadPool::ThreadPool() {
|
145
|
+
for (unsigned i = 0; i < reserve_threads_; i++) {
|
146
|
+
StartThread(state_, StartThreadReason::kInitialPool);
|
102
147
|
}
|
103
148
|
}
|
104
149
|
|
105
|
-
ThreadPool
|
150
|
+
void ThreadPool::Quiesce() {
|
106
151
|
state_->queue.SetShutdown();
|
107
152
|
// Wait until all threads are exited.
|
108
153
|
// Note that if this is a threadpool thread then we won't exit this thread
|
@@ -110,17 +155,24 @@ ThreadPool::~ThreadPool() {
|
|
110
155
|
// thread running instead of zero.
|
111
156
|
state_->thread_count.BlockUntilThreadCount(g_threadpool_thread ? 1 : 0,
|
112
157
|
"shutting down");
|
158
|
+
quiesced_.store(true, std::memory_order_relaxed);
|
159
|
+
}
|
160
|
+
|
161
|
+
ThreadPool::~ThreadPool() {
|
162
|
+
GPR_ASSERT(quiesced_.load(std::memory_order_relaxed));
|
113
163
|
}
|
114
164
|
|
115
|
-
void ThreadPool::
|
165
|
+
void ThreadPool::Run(absl::AnyInvocable<void()> callback) {
|
166
|
+
GPR_DEBUG_ASSERT(quiesced_.load(std::memory_order_relaxed) == false);
|
116
167
|
if (state_->queue.Add(std::move(callback))) {
|
117
|
-
|
118
|
-
true, std::memory_order_relaxed)) {
|
119
|
-
StartThread(state_, /*throttled=*/true);
|
120
|
-
}
|
168
|
+
StartThread(state_, StartThreadReason::kNoWaitersWhenScheduling);
|
121
169
|
}
|
122
170
|
}
|
123
171
|
|
172
|
+
void ThreadPool::Run(EventEngine::Closure* closure) {
|
173
|
+
Run([closure]() { closure->Run(); });
|
174
|
+
}
|
175
|
+
|
124
176
|
bool ThreadPool::Queue::Add(absl::AnyInvocable<void()> callback) {
|
125
177
|
grpc_core::MutexLock lock(&mu_);
|
126
178
|
// Add works to the callbacks list
|
@@ -129,13 +181,42 @@ bool ThreadPool::Queue::Add(absl::AnyInvocable<void()> callback) {
|
|
129
181
|
switch (state_) {
|
130
182
|
case State::kRunning:
|
131
183
|
case State::kShutdown:
|
132
|
-
return
|
184
|
+
return callbacks_.size() > threads_waiting_;
|
133
185
|
case State::kForking:
|
134
186
|
return false;
|
135
187
|
}
|
136
188
|
GPR_UNREACHABLE_CODE(return false);
|
137
189
|
}
|
138
190
|
|
191
|
+
bool ThreadPool::Queue::IsBacklogged() {
|
192
|
+
grpc_core::MutexLock lock(&mu_);
|
193
|
+
switch (state_) {
|
194
|
+
case State::kRunning:
|
195
|
+
case State::kShutdown:
|
196
|
+
return callbacks_.size() > 1;
|
197
|
+
case State::kForking:
|
198
|
+
return false;
|
199
|
+
}
|
200
|
+
GPR_UNREACHABLE_CODE(return false);
|
201
|
+
}
|
202
|
+
|
203
|
+
void ThreadPool::Queue::SleepIfRunning() {
|
204
|
+
grpc_core::MutexLock lock(&mu_);
|
205
|
+
auto end = grpc_core::Duration::Seconds(1) + grpc_core::Timestamp::Now();
|
206
|
+
while (true) {
|
207
|
+
grpc_core::Timestamp now = grpc_core::Timestamp::Now();
|
208
|
+
if (now >= end) return;
|
209
|
+
switch (state_) {
|
210
|
+
case State::kRunning:
|
211
|
+
case State::kShutdown:
|
212
|
+
cv_.WaitWithTimeout(&mu_, absl::Milliseconds((end - now).millis()));
|
213
|
+
break;
|
214
|
+
case State::kForking:
|
215
|
+
return;
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
|
139
220
|
void ThreadPool::Queue::SetState(State state) {
|
140
221
|
grpc_core::MutexLock lock(&mu_);
|
141
222
|
if (state == State::kRunning) {
|
@@ -186,8 +267,8 @@ void ThreadPool::PostforkChild() { Postfork(); }
|
|
186
267
|
|
187
268
|
void ThreadPool::Postfork() {
|
188
269
|
state_->queue.Reset();
|
189
|
-
for (
|
190
|
-
StartThread(state_,
|
270
|
+
for (unsigned i = 0; i < reserve_threads_; i++) {
|
271
|
+
StartThread(state_, StartThreadReason::kInitialPool);
|
191
272
|
}
|
192
273
|
}
|
193
274
|
|