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,505 @@
|
|
1
|
+
// Copyright 2021 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_PROMISE_PIPE_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_PIPE_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <stdint.h>
|
21
|
+
|
22
|
+
#include <string>
|
23
|
+
#include <utility>
|
24
|
+
|
25
|
+
#include "absl/strings/str_cat.h"
|
26
|
+
#include "absl/types/optional.h"
|
27
|
+
#include "absl/types/variant.h"
|
28
|
+
|
29
|
+
#include <grpc/support/log.h>
|
30
|
+
|
31
|
+
#include "src/core/lib/debug/trace.h"
|
32
|
+
#include "src/core/lib/promise/activity.h"
|
33
|
+
#include "src/core/lib/promise/context.h"
|
34
|
+
#include "src/core/lib/promise/intra_activity_waiter.h"
|
35
|
+
#include "src/core/lib/promise/poll.h"
|
36
|
+
#include "src/core/lib/resource_quota/arena.h"
|
37
|
+
|
38
|
+
extern grpc_core::DebugOnlyTraceFlag grpc_trace_promise_pipe;
|
39
|
+
|
40
|
+
namespace grpc_core {
|
41
|
+
|
42
|
+
namespace pipe_detail {
|
43
|
+
template <typename T>
|
44
|
+
class Center;
|
45
|
+
}
|
46
|
+
|
47
|
+
template <typename T>
|
48
|
+
struct Pipe;
|
49
|
+
|
50
|
+
// Result of Pipe::Next - represents a received value.
|
51
|
+
// If has_value() is false, the pipe was closed by the time we polled for the
|
52
|
+
// next value. No value was received, nor will there ever be.
|
53
|
+
// This type is movable but not copyable.
|
54
|
+
// Once the final move is destroyed the pipe will ack the read and unblock the
|
55
|
+
// send.
|
56
|
+
template <typename T>
|
57
|
+
class NextResult final {
|
58
|
+
public:
|
59
|
+
explicit NextResult(pipe_detail::Center<T>* center) : center_(center) {}
|
60
|
+
~NextResult();
|
61
|
+
NextResult(const NextResult&) = delete;
|
62
|
+
NextResult& operator=(const NextResult&) = delete;
|
63
|
+
NextResult(NextResult&& other) noexcept
|
64
|
+
: center_(std::exchange(other.center_, nullptr)) {}
|
65
|
+
NextResult& operator=(NextResult&& other) noexcept {
|
66
|
+
center_ = std::exchange(other.center_, nullptr);
|
67
|
+
return *this;
|
68
|
+
}
|
69
|
+
|
70
|
+
using value_type = T;
|
71
|
+
|
72
|
+
void reset();
|
73
|
+
bool has_value() const;
|
74
|
+
const T& value() const {
|
75
|
+
GPR_ASSERT(has_value());
|
76
|
+
return **this;
|
77
|
+
}
|
78
|
+
T& value() {
|
79
|
+
GPR_ASSERT(has_value());
|
80
|
+
return **this;
|
81
|
+
}
|
82
|
+
const T& operator*() const;
|
83
|
+
T& operator*();
|
84
|
+
|
85
|
+
private:
|
86
|
+
pipe_detail::Center<T>* center_;
|
87
|
+
};
|
88
|
+
|
89
|
+
namespace pipe_detail {
|
90
|
+
|
91
|
+
template <typename T>
|
92
|
+
class Push;
|
93
|
+
template <typename T>
|
94
|
+
class Next;
|
95
|
+
|
96
|
+
// Center sits between a sender and a receiver to provide a one-deep buffer of
|
97
|
+
// Ts
|
98
|
+
template <typename T>
|
99
|
+
class Center {
|
100
|
+
public:
|
101
|
+
// Initialize with one send ref (held by PipeSender) and one recv ref (held by
|
102
|
+
// PipeReceiver)
|
103
|
+
Center() {
|
104
|
+
send_refs_ = 1;
|
105
|
+
recv_refs_ = 1;
|
106
|
+
value_state_ = ValueState::kEmpty;
|
107
|
+
}
|
108
|
+
|
109
|
+
// Add one ref to the send side of this object, and return this.
|
110
|
+
Center* RefSend() {
|
111
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
112
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("RefSend").c_str());
|
113
|
+
}
|
114
|
+
send_refs_++;
|
115
|
+
GPR_ASSERT(send_refs_ != 0);
|
116
|
+
return this;
|
117
|
+
}
|
118
|
+
|
119
|
+
// Add one ref to the recv side of this object, and return this.
|
120
|
+
Center* RefRecv() {
|
121
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
122
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("RefRecv").c_str());
|
123
|
+
}
|
124
|
+
recv_refs_++;
|
125
|
+
GPR_ASSERT(recv_refs_ != 0);
|
126
|
+
return this;
|
127
|
+
}
|
128
|
+
|
129
|
+
// Drop a send side ref
|
130
|
+
// If no send refs remain, wake due to send closure
|
131
|
+
// If no refs remain, destroy this object
|
132
|
+
void UnrefSend() {
|
133
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
134
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("UnrefSend").c_str());
|
135
|
+
}
|
136
|
+
GPR_DEBUG_ASSERT(send_refs_ > 0);
|
137
|
+
send_refs_--;
|
138
|
+
if (0 == send_refs_) {
|
139
|
+
on_full_.Wake();
|
140
|
+
on_empty_.Wake();
|
141
|
+
if (0 == recv_refs_) {
|
142
|
+
this->~Center();
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
// Drop a recv side ref
|
148
|
+
// If no recv refs remain, wake due to recv closure
|
149
|
+
// If no refs remain, destroy this object
|
150
|
+
void UnrefRecv() {
|
151
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
152
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("UnrefRecv").c_str());
|
153
|
+
}
|
154
|
+
GPR_DEBUG_ASSERT(recv_refs_ > 0);
|
155
|
+
recv_refs_--;
|
156
|
+
if (0 == recv_refs_) {
|
157
|
+
on_full_.Wake();
|
158
|
+
on_empty_.Wake();
|
159
|
+
if (0 == send_refs_) {
|
160
|
+
this->~Center();
|
161
|
+
} else if (value_state_ == ValueState::kReady) {
|
162
|
+
ResetValue();
|
163
|
+
}
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
// Try to push *value into the pipe.
|
168
|
+
// Return Pending if there is no space.
|
169
|
+
// Return true if the value was pushed.
|
170
|
+
// Return false if the recv end is closed.
|
171
|
+
Poll<bool> Push(T* value) {
|
172
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
173
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("Push").c_str());
|
174
|
+
}
|
175
|
+
GPR_DEBUG_ASSERT(send_refs_ != 0);
|
176
|
+
if (recv_refs_ == 0) return false;
|
177
|
+
if (value_state_ != ValueState::kEmpty) return on_empty_.pending();
|
178
|
+
value_state_ = ValueState::kReady;
|
179
|
+
value_ = std::move(*value);
|
180
|
+
on_full_.Wake();
|
181
|
+
return true;
|
182
|
+
}
|
183
|
+
|
184
|
+
Poll<bool> PollAck() {
|
185
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
186
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("PollAck").c_str());
|
187
|
+
}
|
188
|
+
GPR_DEBUG_ASSERT(send_refs_ != 0);
|
189
|
+
if (recv_refs_ == 0) return value_state_ == ValueState::kAcked;
|
190
|
+
if (value_state_ != ValueState::kAcked) return on_empty_.pending();
|
191
|
+
value_state_ = ValueState::kEmpty;
|
192
|
+
return true;
|
193
|
+
}
|
194
|
+
|
195
|
+
// Try to receive a value from the pipe.
|
196
|
+
// Return Pending if there is no value.
|
197
|
+
// Return the value if one was retrieved.
|
198
|
+
// Return nullopt if the send end is closed and no value had been pushed.
|
199
|
+
Poll<NextResult<T>> Next() {
|
200
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
201
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("Next").c_str());
|
202
|
+
}
|
203
|
+
GPR_DEBUG_ASSERT(recv_refs_ != 0);
|
204
|
+
if (value_state_ != ValueState::kReady) {
|
205
|
+
if (send_refs_ == 0) return NextResult<T>(nullptr);
|
206
|
+
return on_full_.pending();
|
207
|
+
}
|
208
|
+
return NextResult<T>(RefRecv());
|
209
|
+
}
|
210
|
+
|
211
|
+
void AckNext() {
|
212
|
+
if (grpc_trace_promise_pipe.enabled()) {
|
213
|
+
gpr_log(GPR_INFO, "%s", DebugOpString("AckNext").c_str());
|
214
|
+
}
|
215
|
+
GPR_DEBUG_ASSERT(value_state_ == ValueState::kReady);
|
216
|
+
value_state_ = ValueState::kAcked;
|
217
|
+
on_empty_.Wake();
|
218
|
+
UnrefRecv();
|
219
|
+
}
|
220
|
+
|
221
|
+
T& value() { return value_; }
|
222
|
+
const T& value() const { return value_; }
|
223
|
+
|
224
|
+
private:
|
225
|
+
std::string DebugTag() {
|
226
|
+
return absl::StrCat(Activity::current()->DebugTag(), "PIPE[0x",
|
227
|
+
reinterpret_cast<uintptr_t>(this), "]: ");
|
228
|
+
}
|
229
|
+
std::string DebugOpString(std::string op) {
|
230
|
+
return absl::StrCat(DebugTag(), op, " send_refs=", send_refs_,
|
231
|
+
" recv_refs=", recv_refs_,
|
232
|
+
" value_state=", ValueStateName(value_state_));
|
233
|
+
}
|
234
|
+
void ResetValue() {
|
235
|
+
// Fancy dance to move out of value in the off chance that we reclaim some
|
236
|
+
// memory earlier.
|
237
|
+
[](T) {}(std::move(value_));
|
238
|
+
value_state_ = ValueState::kEmpty;
|
239
|
+
}
|
240
|
+
// State of value_.
|
241
|
+
enum class ValueState : uint8_t {
|
242
|
+
// No value is set, it's possible to send.
|
243
|
+
kEmpty,
|
244
|
+
// Value has been pushed but not acked, it's possible to receive.
|
245
|
+
kReady,
|
246
|
+
// Value has been received and acked, we can unblock senders and transition
|
247
|
+
// to empty.
|
248
|
+
kAcked,
|
249
|
+
};
|
250
|
+
static const char* ValueStateName(ValueState state) {
|
251
|
+
switch (state) {
|
252
|
+
case ValueState::kEmpty:
|
253
|
+
return "kEmpty";
|
254
|
+
case ValueState::kReady:
|
255
|
+
return "kReady";
|
256
|
+
case ValueState::kAcked:
|
257
|
+
return "kAcked";
|
258
|
+
}
|
259
|
+
GPR_UNREACHABLE_CODE(return "unknown");
|
260
|
+
}
|
261
|
+
T value_;
|
262
|
+
// Number of sending objects.
|
263
|
+
// 0 => send is closed.
|
264
|
+
// 1 ref each for PipeSender and Push.
|
265
|
+
uint8_t send_refs_ : 2;
|
266
|
+
// Number of receiving objects.
|
267
|
+
// 0 => recv is closed.
|
268
|
+
// 1 ref each for PipeReceiver, Next, and NextResult.
|
269
|
+
uint8_t recv_refs_ : 2;
|
270
|
+
// Current state of the value.
|
271
|
+
ValueState value_state_ : 2;
|
272
|
+
IntraActivityWaiter on_empty_;
|
273
|
+
IntraActivityWaiter on_full_;
|
274
|
+
};
|
275
|
+
|
276
|
+
} // namespace pipe_detail
|
277
|
+
|
278
|
+
// Send end of a Pipe.
|
279
|
+
template <typename T>
|
280
|
+
class PipeSender {
|
281
|
+
public:
|
282
|
+
using PushType = pipe_detail::Push<T>;
|
283
|
+
|
284
|
+
PipeSender(const PipeSender&) = delete;
|
285
|
+
PipeSender& operator=(const PipeSender&) = delete;
|
286
|
+
|
287
|
+
PipeSender(PipeSender&& other) noexcept : center_(other.center_) {
|
288
|
+
other.center_ = nullptr;
|
289
|
+
}
|
290
|
+
PipeSender& operator=(PipeSender&& other) noexcept {
|
291
|
+
if (center_ != nullptr) center_->UnrefSend();
|
292
|
+
center_ = other.center_;
|
293
|
+
other.center_ = nullptr;
|
294
|
+
return *this;
|
295
|
+
}
|
296
|
+
|
297
|
+
~PipeSender() {
|
298
|
+
if (center_ != nullptr) center_->UnrefSend();
|
299
|
+
}
|
300
|
+
|
301
|
+
void Close() {
|
302
|
+
if (auto* center = std::exchange(center_, nullptr)) center->UnrefSend();
|
303
|
+
}
|
304
|
+
|
305
|
+
void Swap(PipeSender<T>* other) { std::swap(center_, other->center_); }
|
306
|
+
|
307
|
+
// Send a single message along the pipe.
|
308
|
+
// Returns a promise that will resolve to a bool - true if the message was
|
309
|
+
// sent, false if it could never be sent. Blocks the promise until the
|
310
|
+
// receiver is either closed or able to receive another message.
|
311
|
+
PushType Push(T value);
|
312
|
+
|
313
|
+
private:
|
314
|
+
friend struct Pipe<T>;
|
315
|
+
explicit PipeSender(pipe_detail::Center<T>* center) : center_(center) {}
|
316
|
+
pipe_detail::Center<T>* center_;
|
317
|
+
};
|
318
|
+
|
319
|
+
// Receive end of a Pipe.
|
320
|
+
template <typename T>
|
321
|
+
class PipeReceiver {
|
322
|
+
public:
|
323
|
+
using NextType = pipe_detail::Next<T>;
|
324
|
+
|
325
|
+
PipeReceiver(const PipeReceiver&) = delete;
|
326
|
+
PipeReceiver& operator=(const PipeReceiver&) = delete;
|
327
|
+
|
328
|
+
PipeReceiver(PipeReceiver&& other) noexcept : center_(other.center_) {
|
329
|
+
other.center_ = nullptr;
|
330
|
+
}
|
331
|
+
PipeReceiver& operator=(PipeReceiver&& other) noexcept {
|
332
|
+
if (center_ != nullptr) center_->UnrefRecv();
|
333
|
+
center_ = other.center_;
|
334
|
+
other.center_ = nullptr;
|
335
|
+
return *this;
|
336
|
+
}
|
337
|
+
~PipeReceiver() {
|
338
|
+
if (center_ != nullptr) center_->UnrefRecv();
|
339
|
+
}
|
340
|
+
|
341
|
+
void Swap(PipeReceiver<T>* other) { std::swap(center_, other->center_); }
|
342
|
+
|
343
|
+
// Receive a single message from the pipe.
|
344
|
+
// Returns a promise that will resolve to an optional<T> - with a value if a
|
345
|
+
// message was received, or no value if the other end of the pipe was closed.
|
346
|
+
// Blocks the promise until the receiver is either closed or a message is
|
347
|
+
// available.
|
348
|
+
NextType Next();
|
349
|
+
|
350
|
+
private:
|
351
|
+
friend struct Pipe<T>;
|
352
|
+
explicit PipeReceiver(pipe_detail::Center<T>* center) : center_(center) {}
|
353
|
+
pipe_detail::Center<T>* center_;
|
354
|
+
};
|
355
|
+
|
356
|
+
namespace pipe_detail {
|
357
|
+
|
358
|
+
// Implementation of PipeSender::Push promise.
|
359
|
+
template <typename T>
|
360
|
+
class Push {
|
361
|
+
public:
|
362
|
+
Push(const Push&) = delete;
|
363
|
+
Push& operator=(const Push&) = delete;
|
364
|
+
Push(Push&& other) noexcept
|
365
|
+
: center_(other.center_), push_(std::move(other.push_)) {
|
366
|
+
other.center_ = nullptr;
|
367
|
+
}
|
368
|
+
Push& operator=(Push&& other) noexcept {
|
369
|
+
if (center_ != nullptr) center_->UnrefSend();
|
370
|
+
center_ = other.center_;
|
371
|
+
other.center_ = nullptr;
|
372
|
+
push_ = std::move(other.push_);
|
373
|
+
return *this;
|
374
|
+
}
|
375
|
+
|
376
|
+
~Push() {
|
377
|
+
if (center_ != nullptr) center_->UnrefSend();
|
378
|
+
}
|
379
|
+
|
380
|
+
Poll<bool> operator()() {
|
381
|
+
if (push_.has_value()) {
|
382
|
+
auto r = center_->Push(&*push_);
|
383
|
+
if (auto* ok = absl::get_if<bool>(&r)) {
|
384
|
+
push_.reset();
|
385
|
+
if (!*ok) return false;
|
386
|
+
} else {
|
387
|
+
return Pending{};
|
388
|
+
}
|
389
|
+
}
|
390
|
+
GPR_DEBUG_ASSERT(!push_.has_value());
|
391
|
+
return center_->PollAck();
|
392
|
+
}
|
393
|
+
|
394
|
+
private:
|
395
|
+
friend class PipeSender<T>;
|
396
|
+
explicit Push(pipe_detail::Center<T>* center, T push)
|
397
|
+
: center_(center), push_(std::move(push)) {}
|
398
|
+
Center<T>* center_;
|
399
|
+
absl::optional<T> push_;
|
400
|
+
};
|
401
|
+
|
402
|
+
// Implementation of PipeReceiver::Next promise.
|
403
|
+
template <typename T>
|
404
|
+
class Next {
|
405
|
+
public:
|
406
|
+
Next(const Next&) = delete;
|
407
|
+
Next& operator=(const Next&) = delete;
|
408
|
+
Next(Next&& other) noexcept : center_(other.center_) {
|
409
|
+
other.center_ = nullptr;
|
410
|
+
}
|
411
|
+
Next& operator=(Next&& other) noexcept {
|
412
|
+
if (center_ != nullptr) center_->UnrefRecv();
|
413
|
+
center_ = other.center_;
|
414
|
+
other.center_ = nullptr;
|
415
|
+
return *this;
|
416
|
+
}
|
417
|
+
|
418
|
+
~Next() {
|
419
|
+
if (center_ != nullptr) center_->UnrefRecv();
|
420
|
+
}
|
421
|
+
|
422
|
+
Poll<NextResult<T>> operator()() {
|
423
|
+
auto r = center_->Next();
|
424
|
+
if (!absl::holds_alternative<Pending>(r)) {
|
425
|
+
std::exchange(center_, nullptr)->UnrefRecv();
|
426
|
+
}
|
427
|
+
return r;
|
428
|
+
}
|
429
|
+
|
430
|
+
private:
|
431
|
+
friend class PipeReceiver<T>;
|
432
|
+
explicit Next(pipe_detail::Center<T>* center) : center_(center) {}
|
433
|
+
Center<T>* center_;
|
434
|
+
};
|
435
|
+
|
436
|
+
} // namespace pipe_detail
|
437
|
+
|
438
|
+
template <typename T>
|
439
|
+
pipe_detail::Push<T> PipeSender<T>::Push(T value) {
|
440
|
+
return pipe_detail::Push<T>(center_->RefSend(), std::move(value));
|
441
|
+
}
|
442
|
+
|
443
|
+
template <typename T>
|
444
|
+
pipe_detail::Next<T> PipeReceiver<T>::Next() {
|
445
|
+
return pipe_detail::Next<T>(center_->RefRecv());
|
446
|
+
}
|
447
|
+
|
448
|
+
template <typename T>
|
449
|
+
bool NextResult<T>::has_value() const {
|
450
|
+
return center_ != nullptr;
|
451
|
+
}
|
452
|
+
|
453
|
+
template <typename T>
|
454
|
+
T& NextResult<T>::operator*() {
|
455
|
+
return center_->value();
|
456
|
+
}
|
457
|
+
|
458
|
+
template <typename T>
|
459
|
+
const T& NextResult<T>::operator*() const {
|
460
|
+
return center_->value();
|
461
|
+
}
|
462
|
+
|
463
|
+
template <typename T>
|
464
|
+
NextResult<T>::~NextResult() {
|
465
|
+
if (center_ != nullptr) center_->AckNext();
|
466
|
+
}
|
467
|
+
|
468
|
+
template <typename T>
|
469
|
+
void NextResult<T>::reset() {
|
470
|
+
if (auto* p = std::exchange(center_, nullptr)) p->AckNext();
|
471
|
+
}
|
472
|
+
|
473
|
+
// A Pipe is an intra-Activity communications channel that transmits T's from
|
474
|
+
// one end to the other.
|
475
|
+
// It is only safe to use a Pipe within the context of a single Activity.
|
476
|
+
// No synchronization is performed internally.
|
477
|
+
// The primary Pipe data structure is allocated from an arena, so the activity
|
478
|
+
// must have an arena as part of its context.
|
479
|
+
// By performing that allocation we can ensure stable pointer to shared data
|
480
|
+
// allowing PipeSender/PipeReceiver/Push/Next to be relatively simple in their
|
481
|
+
// implementation.
|
482
|
+
// This type has been optimized with the expectation that there are relatively
|
483
|
+
// few pipes per activity. If this assumption does not hold then a design
|
484
|
+
// allowing inline filtering of pipe contents (instead of connecting pipes with
|
485
|
+
// polling code) would likely be more appropriate.
|
486
|
+
template <typename T>
|
487
|
+
struct Pipe {
|
488
|
+
Pipe() : Pipe(GetContext<Arena>()) {}
|
489
|
+
explicit Pipe(Arena* arena) : Pipe(arena->New<pipe_detail::Center<T>>()) {}
|
490
|
+
Pipe(const Pipe&) = delete;
|
491
|
+
Pipe& operator=(const Pipe&) = delete;
|
492
|
+
Pipe(Pipe&&) noexcept = default;
|
493
|
+
Pipe& operator=(Pipe&&) noexcept = default;
|
494
|
+
|
495
|
+
PipeSender<T> sender;
|
496
|
+
PipeReceiver<T> receiver;
|
497
|
+
|
498
|
+
private:
|
499
|
+
explicit Pipe(pipe_detail::Center<T>* center)
|
500
|
+
: sender(center), receiver(center) {}
|
501
|
+
};
|
502
|
+
|
503
|
+
} // namespace grpc_core
|
504
|
+
|
505
|
+
#endif // GRPC_CORE_LIB_PROMISE_PIPE_H
|
data/src/core/lib/promise/poll.h
CHANGED
@@ -19,6 +19,8 @@
|
|
19
19
|
|
20
20
|
#include <stddef.h>
|
21
21
|
|
22
|
+
#include <string>
|
23
|
+
|
22
24
|
#include "absl/types/variant.h"
|
23
25
|
|
24
26
|
namespace grpc_core {
|
@@ -61,6 +63,17 @@ struct PollTraits<Poll<T>> {
|
|
61
63
|
static constexpr bool is_poll() { return true; }
|
62
64
|
};
|
63
65
|
|
66
|
+
// Convert a poll to a string
|
67
|
+
template <typename T, typename F>
|
68
|
+
std::string PollToString(
|
69
|
+
const Poll<T>& poll,
|
70
|
+
F t_to_string = [](const T& t) { return t.ToString(); }) {
|
71
|
+
if (absl::holds_alternative<Pending>(poll)) {
|
72
|
+
return "<<pending>>";
|
73
|
+
}
|
74
|
+
return t_to_string(absl::get<T>(poll));
|
75
|
+
}
|
76
|
+
|
64
77
|
} // namespace grpc_core
|
65
78
|
|
66
79
|
#endif // GRPC_CORE_LIB_PROMISE_POLL_H
|
data/src/core/lib/promise/seq.h
CHANGED
@@ -32,13 +32,11 @@ struct SeqTraits {
|
|
32
32
|
using UnwrappedType = T;
|
33
33
|
using WrappedType = T;
|
34
34
|
template <typename Next>
|
35
|
-
static auto CallFactory(Next* next, T&& value)
|
36
|
-
|
37
|
-
return next->Once(std::forward<T>(value));
|
35
|
+
static auto CallFactory(Next* next, T&& value) {
|
36
|
+
return next->Make(std::forward<T>(value));
|
38
37
|
}
|
39
38
|
template <typename F, typename Elem>
|
40
|
-
static auto CallSeqFactory(F& f, Elem&& elem, T&& value)
|
41
|
-
-> decltype(f(std::forward<Elem>(elem), std::forward<T>(value))) {
|
39
|
+
static auto CallSeqFactory(F& f, Elem&& elem, T&& value) {
|
42
40
|
return f(std::forward<Elem>(elem), std::forward<T>(value));
|
43
41
|
}
|
44
42
|
template <typename Result, typename PriorResult, typename RunNext>
|
@@ -20,15 +20,16 @@
|
|
20
20
|
|
21
21
|
#include <grpc/event_engine/event_engine.h>
|
22
22
|
|
23
|
-
#include "src/core/lib/event_engine/default_event_engine.h"
|
23
|
+
#include "src/core/lib/event_engine/default_event_engine.h" // IWYU pragma: keep
|
24
24
|
#include "src/core/lib/gprpp/time.h"
|
25
25
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
26
26
|
#include "src/core/lib/promise/activity.h"
|
27
|
+
#include "src/core/lib/promise/context.h"
|
27
28
|
#include "src/core/lib/promise/poll.h"
|
28
29
|
|
29
30
|
namespace grpc_core {
|
30
31
|
|
31
|
-
using ::grpc_event_engine::experimental::
|
32
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
32
33
|
|
33
34
|
Sleep::Sleep(Timestamp deadline) : deadline_(deadline) {}
|
34
35
|
|
@@ -53,7 +54,7 @@ Poll<absl::Status> Sleep::operator()() {
|
|
53
54
|
|
54
55
|
Sleep::ActiveClosure::ActiveClosure(Timestamp deadline)
|
55
56
|
: waker_(Activity::current()->MakeOwningWaker()),
|
56
|
-
timer_handle_(
|
57
|
+
timer_handle_(GetContext<EventEngine>()->RunAfter(
|
57
58
|
deadline - Timestamp::Now(), this)) {}
|
58
59
|
|
59
60
|
void Sleep::ActiveClosure::Run() {
|
@@ -71,7 +72,7 @@ void Sleep::ActiveClosure::Cancel() {
|
|
71
72
|
// If we cancel correctly then we must own both refs still and can simply
|
72
73
|
// delete without unreffing twice, otherwise try unreffing since this may be
|
73
74
|
// the last owned ref.
|
74
|
-
if (
|
75
|
+
if (HasRun() || GetContext<EventEngine>()->Cancel(timer_handle_) || Unref()) {
|
75
76
|
delete this;
|
76
77
|
}
|
77
78
|
}
|
@@ -72,8 +72,7 @@ class Sleep final {
|
|
72
72
|
Waker waker_;
|
73
73
|
// One ref dropped by Run(), the other by Cancel().
|
74
74
|
std::atomic<int> refs_{2};
|
75
|
-
|
76
|
-
timer_handle_;
|
75
|
+
grpc_event_engine::experimental::EventEngine::TaskHandle timer_handle_;
|
77
76
|
};
|
78
77
|
|
79
78
|
Timestamp deadline_;
|