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,341 @@
|
|
1
|
+
// Copyright 2022 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_TRY_CONCURRENTLY_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_TRY_CONCURRENTLY_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <stddef.h>
|
21
|
+
|
22
|
+
#include <cstdint>
|
23
|
+
#include <utility>
|
24
|
+
|
25
|
+
#include "absl/types/variant.h"
|
26
|
+
|
27
|
+
#include <grpc/support/log.h>
|
28
|
+
|
29
|
+
#include "src/core/lib/gprpp/construct_destruct.h"
|
30
|
+
#include "src/core/lib/promise/detail/promise_like.h"
|
31
|
+
#include "src/core/lib/promise/detail/status.h"
|
32
|
+
#include "src/core/lib/promise/poll.h"
|
33
|
+
|
34
|
+
namespace grpc_core {
|
35
|
+
|
36
|
+
namespace promise_detail {
|
37
|
+
|
38
|
+
template <typename Promise>
|
39
|
+
struct Necessary {
|
40
|
+
PromiseLike<Promise> promise;
|
41
|
+
static constexpr bool must_complete() { return true; }
|
42
|
+
};
|
43
|
+
|
44
|
+
template <typename Promise>
|
45
|
+
struct Helper {
|
46
|
+
PromiseLike<Promise> promise;
|
47
|
+
static constexpr bool must_complete() { return false; }
|
48
|
+
};
|
49
|
+
|
50
|
+
// A set of promises that can be polled concurrently.
|
51
|
+
// Fuses them when completed (that is, destroys the promise and records it
|
52
|
+
// completed).
|
53
|
+
// Relies on an external bit field to handle the recording: this saves a bunch
|
54
|
+
// of space, but means the implementation of this type is weird: it's really
|
55
|
+
// super tied to TryConcurrently and no attempt should be made to use this
|
56
|
+
// independently.
|
57
|
+
template <typename... Ts>
|
58
|
+
class FusedSet;
|
59
|
+
|
60
|
+
template <typename T, typename... Ts>
|
61
|
+
class FusedSet<T, Ts...> : public FusedSet<Ts...> {
|
62
|
+
public:
|
63
|
+
explicit FusedSet(T&& x, Ts&&... xs)
|
64
|
+
: FusedSet<Ts...>(std::forward<T>(xs)...) {
|
65
|
+
Construct(&wrapper_, std::forward<T>(x));
|
66
|
+
}
|
67
|
+
explicit FusedSet(T&& x, FusedSet<Ts...>&& xs)
|
68
|
+
: FusedSet<Ts...>(std::forward<FusedSet<Ts...>>(xs)) {
|
69
|
+
Construct(&wrapper_, std::forward<T>(x));
|
70
|
+
}
|
71
|
+
// Empty destructor: consumers must call Destroy() to ensure cleanup occurs
|
72
|
+
~FusedSet() {}
|
73
|
+
|
74
|
+
FusedSet(const FusedSet&) = delete;
|
75
|
+
FusedSet& operator=(const FusedSet&) = delete;
|
76
|
+
|
77
|
+
// Assumes all 'done_bits' for other are 0 and will be set to 1
|
78
|
+
FusedSet(FusedSet&& other) noexcept : FusedSet<Ts...>(std::move(other)) {
|
79
|
+
Construct(&wrapper_, std::move(other.wrapper_));
|
80
|
+
Destruct(&other.wrapper_);
|
81
|
+
}
|
82
|
+
|
83
|
+
static constexpr size_t Size() { return 1 + sizeof...(Ts); }
|
84
|
+
|
85
|
+
static constexpr uint8_t NecessaryBits() {
|
86
|
+
return (T::must_complete() ? 1 : 0) |
|
87
|
+
(FusedSet<Ts...>::NecessaryBits() << 1);
|
88
|
+
}
|
89
|
+
|
90
|
+
template <int kDoneBit>
|
91
|
+
void Destroy(uint8_t done_bits) {
|
92
|
+
if ((done_bits & (1 << kDoneBit)) == 0) {
|
93
|
+
Destruct(&wrapper_);
|
94
|
+
}
|
95
|
+
FusedSet<Ts...>::template Destroy<kDoneBit + 1>(done_bits);
|
96
|
+
}
|
97
|
+
|
98
|
+
template <typename Result, int kDoneBit>
|
99
|
+
Poll<Result> Run(uint8_t& done_bits) {
|
100
|
+
if ((done_bits & (1 << kDoneBit)) == 0) {
|
101
|
+
auto p = wrapper_.promise();
|
102
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
|
103
|
+
done_bits |= (1 << kDoneBit);
|
104
|
+
Destruct(&wrapper_);
|
105
|
+
if (!IsStatusOk(*status)) {
|
106
|
+
return StatusCast<Result>(std::move(*status));
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
return FusedSet<Ts...>::template Run<Result, kDoneBit + 1>(done_bits);
|
111
|
+
}
|
112
|
+
|
113
|
+
template <typename P>
|
114
|
+
FusedSet<P, T, Ts...> With(P x) {
|
115
|
+
return FusedSet<P, T, Ts...>(std::move(x), std::move(*this));
|
116
|
+
}
|
117
|
+
|
118
|
+
private:
|
119
|
+
union {
|
120
|
+
T wrapper_;
|
121
|
+
};
|
122
|
+
};
|
123
|
+
|
124
|
+
template <>
|
125
|
+
class FusedSet<> {
|
126
|
+
public:
|
127
|
+
static constexpr size_t Size() { return 0; }
|
128
|
+
static constexpr uint8_t NecessaryBits() { return 0; }
|
129
|
+
|
130
|
+
template <typename Result, int kDoneBit>
|
131
|
+
Poll<Result> Run(uint8_t) {
|
132
|
+
return Pending{};
|
133
|
+
}
|
134
|
+
template <int kDoneBit>
|
135
|
+
void Destroy(uint8_t) {}
|
136
|
+
|
137
|
+
template <typename P>
|
138
|
+
FusedSet<P> With(P x) {
|
139
|
+
return FusedSet<P>(std::move(x));
|
140
|
+
}
|
141
|
+
};
|
142
|
+
|
143
|
+
template <typename Main, typename PreMain, typename PostMain>
|
144
|
+
class TryConcurrently {
|
145
|
+
public:
|
146
|
+
TryConcurrently(Main main, PreMain pre_main, PostMain post_main)
|
147
|
+
: done_bits_(0),
|
148
|
+
pre_main_(std::move(pre_main)),
|
149
|
+
post_main_(std::move(post_main)) {
|
150
|
+
Construct(&main_, std::move(main));
|
151
|
+
}
|
152
|
+
|
153
|
+
TryConcurrently(const TryConcurrently&) = delete;
|
154
|
+
TryConcurrently& operator=(const TryConcurrently&) = delete;
|
155
|
+
TryConcurrently(TryConcurrently&& other) noexcept
|
156
|
+
: done_bits_(0),
|
157
|
+
pre_main_(std::move(other.pre_main_)),
|
158
|
+
post_main_(std::move(other.post_main_)) {
|
159
|
+
GPR_DEBUG_ASSERT(other.done_bits_ == 0);
|
160
|
+
other.done_bits_ = HelperBits();
|
161
|
+
Construct(&main_, std::move(other.main_));
|
162
|
+
}
|
163
|
+
TryConcurrently& operator=(TryConcurrently&& other) noexcept {
|
164
|
+
GPR_DEBUG_ASSERT(other.done_bits_ == 0);
|
165
|
+
done_bits_ = 0;
|
166
|
+
other.done_bits_ = HelperBits();
|
167
|
+
pre_main_ = std::move(other.pre_main_);
|
168
|
+
post_main_ = std::move(other.post_main_);
|
169
|
+
Construct(&main_, std::move(other.main_));
|
170
|
+
return *this;
|
171
|
+
}
|
172
|
+
|
173
|
+
~TryConcurrently() {
|
174
|
+
if (done_bits_ & 1) {
|
175
|
+
Destruct(&result_);
|
176
|
+
} else {
|
177
|
+
Destruct(&main_);
|
178
|
+
}
|
179
|
+
pre_main_.template Destroy<1>(done_bits_);
|
180
|
+
post_main_.template Destroy<1 + PreMain::Size()>(done_bits_);
|
181
|
+
}
|
182
|
+
|
183
|
+
using Result =
|
184
|
+
typename PollTraits<decltype(std::declval<PromiseLike<Main>>()())>::Type;
|
185
|
+
|
186
|
+
Poll<Result> operator()() {
|
187
|
+
auto r = pre_main_.template Run<Result, 1>(done_bits_);
|
188
|
+
if (auto* status = absl::get_if<Result>(&r)) {
|
189
|
+
GPR_DEBUG_ASSERT(!IsStatusOk(*status));
|
190
|
+
return std::move(*status);
|
191
|
+
}
|
192
|
+
if ((done_bits_ & 1) == 0) {
|
193
|
+
auto p = main_();
|
194
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
|
195
|
+
done_bits_ |= 1;
|
196
|
+
Destruct(&main_);
|
197
|
+
Construct(&result_, std::move(*status));
|
198
|
+
}
|
199
|
+
}
|
200
|
+
r = post_main_.template Run<Result, 1 + PreMain::Size()>(done_bits_);
|
201
|
+
if (auto* status = absl::get_if<Result>(&r)) {
|
202
|
+
GPR_DEBUG_ASSERT(!IsStatusOk(*status));
|
203
|
+
return std::move(*status);
|
204
|
+
}
|
205
|
+
if ((done_bits_ & NecessaryBits()) == NecessaryBits()) {
|
206
|
+
return std::move(result_);
|
207
|
+
}
|
208
|
+
return Pending{};
|
209
|
+
}
|
210
|
+
|
211
|
+
template <typename P>
|
212
|
+
auto NecessaryPush(P p);
|
213
|
+
template <typename P>
|
214
|
+
auto NecessaryPull(P p);
|
215
|
+
template <typename P>
|
216
|
+
auto Push(P p);
|
217
|
+
template <typename P>
|
218
|
+
auto Pull(P p);
|
219
|
+
|
220
|
+
private:
|
221
|
+
// Bitmask for done_bits_ specifying which promises must be completed prior to
|
222
|
+
// returning ok.
|
223
|
+
constexpr uint8_t NecessaryBits() {
|
224
|
+
return 1 | (PreMain::NecessaryBits() << 1) |
|
225
|
+
(PostMain::NecessaryBits() << (1 + PreMain::Size()));
|
226
|
+
}
|
227
|
+
// Bitmask for done_bits_ specifying what all of the promises being complete
|
228
|
+
// would look like.
|
229
|
+
constexpr uint8_t AllBits() {
|
230
|
+
return (1 << (1 + PreMain::Size() + PostMain::Size())) - 1;
|
231
|
+
}
|
232
|
+
// Bitmask of done_bits_ specifying which bits correspond to helper promises -
|
233
|
+
// that is all promises that are not the main one.
|
234
|
+
constexpr uint8_t HelperBits() { return AllBits() ^ 1; }
|
235
|
+
|
236
|
+
// done_bits signifies which operations have completed.
|
237
|
+
// Bit 0 is set if main_ has completed.
|
238
|
+
// The next higher bits correspond one per pre-main promise.
|
239
|
+
// The next higher bits correspond one per post-main promise.
|
240
|
+
// So, going from most significant bit to least significant:
|
241
|
+
// +--------------+-------------+--------+
|
242
|
+
// |post_main bits|pre_main bits|main bit|
|
243
|
+
// +--------------+-------------+--------+
|
244
|
+
uint8_t done_bits_;
|
245
|
+
PreMain pre_main_;
|
246
|
+
union {
|
247
|
+
PromiseLike<Main> main_;
|
248
|
+
Result result_;
|
249
|
+
};
|
250
|
+
PostMain post_main_;
|
251
|
+
};
|
252
|
+
|
253
|
+
template <typename Main, typename PreMain, typename PostMain>
|
254
|
+
auto MakeTryConcurrently(Main&& main, PreMain&& pre_main,
|
255
|
+
PostMain&& post_main) {
|
256
|
+
return TryConcurrently<Main, PreMain, PostMain>(
|
257
|
+
std::forward<Main>(main), std::forward<PreMain>(pre_main),
|
258
|
+
std::forward<PostMain>(post_main));
|
259
|
+
}
|
260
|
+
|
261
|
+
template <typename Main, typename PreMain, typename PostMain>
|
262
|
+
template <typename P>
|
263
|
+
auto TryConcurrently<Main, PreMain, PostMain>::NecessaryPush(P p) {
|
264
|
+
GPR_DEBUG_ASSERT(done_bits_ == 0);
|
265
|
+
done_bits_ = HelperBits();
|
266
|
+
return MakeTryConcurrently(std::move(main_),
|
267
|
+
pre_main_.With(Necessary<P>{std::move(p)}),
|
268
|
+
std::move(post_main_));
|
269
|
+
}
|
270
|
+
|
271
|
+
template <typename Main, typename PreMain, typename PostMain>
|
272
|
+
template <typename P>
|
273
|
+
auto TryConcurrently<Main, PreMain, PostMain>::NecessaryPull(P p) {
|
274
|
+
GPR_DEBUG_ASSERT(done_bits_ == 0);
|
275
|
+
done_bits_ = HelperBits();
|
276
|
+
return MakeTryConcurrently(std::move(main_), std::move(pre_main_),
|
277
|
+
post_main_.With(Necessary<P>{std::move(p)}));
|
278
|
+
}
|
279
|
+
|
280
|
+
template <typename Main, typename PreMain, typename PostMain>
|
281
|
+
template <typename P>
|
282
|
+
auto TryConcurrently<Main, PreMain, PostMain>::Push(P p) {
|
283
|
+
GPR_DEBUG_ASSERT(done_bits_ == 0);
|
284
|
+
done_bits_ = HelperBits();
|
285
|
+
return MakeTryConcurrently(std::move(main_),
|
286
|
+
pre_main_.With(Helper<P>{std::move(p)}),
|
287
|
+
std::move(post_main_));
|
288
|
+
}
|
289
|
+
|
290
|
+
template <typename Main, typename PreMain, typename PostMain>
|
291
|
+
template <typename P>
|
292
|
+
auto TryConcurrently<Main, PreMain, PostMain>::Pull(P p) {
|
293
|
+
GPR_DEBUG_ASSERT(done_bits_ == 0);
|
294
|
+
done_bits_ = HelperBits();
|
295
|
+
return MakeTryConcurrently(std::move(main_), std::move(pre_main_),
|
296
|
+
post_main_.With(Helper<P>{std::move(p)}));
|
297
|
+
}
|
298
|
+
|
299
|
+
} // namespace promise_detail
|
300
|
+
|
301
|
+
// TryConcurrently runs a set of promises concurrently.
|
302
|
+
// There is a structure to the promises:
|
303
|
+
// - A 'main' promise dominates the others - it must complete before the
|
304
|
+
// overall promise successfully completes. Its result is chosen in the event
|
305
|
+
// of successful completion.
|
306
|
+
// - A set of (optional) push and pull promises to aid main. Push promises are
|
307
|
+
// polled before main, pull promises are polled after. In this way we can
|
308
|
+
// avoid overall wakeup churn - sending a message will tend to push things
|
309
|
+
// down the promise tree as its polled, so that send should be in a push
|
310
|
+
// promise - then as the main promise is polled and it calls into things
|
311
|
+
// lower in the stack they'll already see things there (this reasoning holds
|
312
|
+
// for receiving things and the pull promises too!).
|
313
|
+
// - Each push and pull promise is either necessary or optional.
|
314
|
+
// Necessary promises must complete successfully before the overall promise
|
315
|
+
// completes. Optional promises will just be cancelled once the main promise
|
316
|
+
// completes and any necessary helpers.
|
317
|
+
// - If any of the promises fail, the overall promise fails immediately.
|
318
|
+
// API:
|
319
|
+
// This function, TryConcurrently, is used to create a TryConcurrently promise.
|
320
|
+
// It takes a single argument, being the main promise. That promise also has
|
321
|
+
// a set of methods for attaching push and pull promises. The act of attachment
|
322
|
+
// returns a new TryConcurrently promise with previous contained promises moved
|
323
|
+
// out.
|
324
|
+
// The methods exposed:
|
325
|
+
// - Push, NecessaryPush: attach a push promise (with the first variant being
|
326
|
+
// optional, the second necessary).
|
327
|
+
// - Pull, NecessaryPull: attach a pull promise, with variants as above.
|
328
|
+
// Example:
|
329
|
+
// TryConcurrently(call_next_filter(std::move(call_args)))
|
330
|
+
// .Push(send_messages_promise)
|
331
|
+
// .Pull(recv_messages_promise)
|
332
|
+
template <typename Main>
|
333
|
+
auto TryConcurrently(Main main) {
|
334
|
+
return promise_detail::MakeTryConcurrently(std::move(main),
|
335
|
+
promise_detail::FusedSet<>(),
|
336
|
+
promise_detail::FusedSet<>());
|
337
|
+
}
|
338
|
+
|
339
|
+
} // namespace grpc_core
|
340
|
+
|
341
|
+
#endif // GRPC_CORE_LIB_PROMISE_TRY_CONCURRENTLY_H
|
@@ -37,9 +37,8 @@ struct TrySeqTraitsWithSfinae {
|
|
37
37
|
using UnwrappedType = T;
|
38
38
|
using WrappedType = absl::StatusOr<T>;
|
39
39
|
template <typename Next>
|
40
|
-
static auto CallFactory(Next* next, T&& value)
|
41
|
-
|
42
|
-
return next->Once(std::forward<T>(value));
|
40
|
+
static auto CallFactory(Next* next, T&& value) {
|
41
|
+
return next->Make(std::forward<T>(value));
|
43
42
|
}
|
44
43
|
template <typename F, typename Elem>
|
45
44
|
static auto CallSeqFactory(F& f, Elem&& elem, T&& value)
|
@@ -57,9 +56,8 @@ struct TrySeqTraitsWithSfinae<absl::StatusOr<T>> {
|
|
57
56
|
using UnwrappedType = T;
|
58
57
|
using WrappedType = absl::StatusOr<T>;
|
59
58
|
template <typename Next>
|
60
|
-
static auto CallFactory(Next* next, absl::StatusOr<T>&& status)
|
61
|
-
|
62
|
-
return next->Once(std::move(*status));
|
59
|
+
static auto CallFactory(Next* next, absl::StatusOr<T>&& status) {
|
60
|
+
return next->Make(std::move(*status));
|
63
61
|
}
|
64
62
|
template <typename F, typename Elem>
|
65
63
|
static auto CallSeqFactory(F& f, Elem&& elem, absl::StatusOr<T> value)
|
@@ -69,7 +67,7 @@ struct TrySeqTraitsWithSfinae<absl::StatusOr<T>> {
|
|
69
67
|
template <typename Result, typename RunNext>
|
70
68
|
static Poll<Result> CheckResultAndRunNext(absl::StatusOr<T> prior,
|
71
69
|
RunNext run_next) {
|
72
|
-
if (!prior.ok()) return Result(prior.status());
|
70
|
+
if (!prior.ok()) return StatusCast<Result>(prior.status());
|
73
71
|
return run_next(std::move(prior));
|
74
72
|
}
|
75
73
|
};
|
@@ -84,8 +82,8 @@ struct TrySeqTraitsWithSfinae<
|
|
84
82
|
using UnwrappedType = void;
|
85
83
|
using WrappedType = T;
|
86
84
|
template <typename Next>
|
87
|
-
static auto CallFactory(Next* next, T&&)
|
88
|
-
return next->
|
85
|
+
static auto CallFactory(Next* next, T&&) {
|
86
|
+
return next->Make();
|
89
87
|
}
|
90
88
|
template <typename Result, typename RunNext>
|
91
89
|
static Poll<Result> CheckResultAndRunNext(T prior, RunNext run_next) {
|
@@ -98,14 +96,13 @@ struct TrySeqTraitsWithSfinae<absl::Status> {
|
|
98
96
|
using UnwrappedType = void;
|
99
97
|
using WrappedType = absl::Status;
|
100
98
|
template <typename Next>
|
101
|
-
static auto CallFactory(Next* next, absl::Status&&)
|
102
|
-
|
103
|
-
return next->Once();
|
99
|
+
static auto CallFactory(Next* next, absl::Status&&) {
|
100
|
+
return next->Make();
|
104
101
|
}
|
105
102
|
template <typename Result, typename RunNext>
|
106
103
|
static Poll<Result> CheckResultAndRunNext(absl::Status prior,
|
107
104
|
RunNext run_next) {
|
108
|
-
if (!prior.ok()) return Result(std::move(prior));
|
105
|
+
if (!prior.ok()) return StatusCast<Result>(std::move(prior));
|
109
106
|
return run_next(std::move(prior));
|
110
107
|
}
|
111
108
|
};
|
@@ -164,6 +164,7 @@ std::string ServerAddress::ToString() const {
|
|
164
164
|
}
|
165
165
|
if (!attributes_.empty()) {
|
166
166
|
std::vector<std::string> attrs;
|
167
|
+
attrs.reserve(attributes_.size());
|
167
168
|
for (const auto& p : attributes_) {
|
168
169
|
attrs.emplace_back(absl::StrCat(p.first, "=", p.second->ToString()));
|
169
170
|
}
|
@@ -29,8 +29,6 @@
|
|
29
29
|
#include <string>
|
30
30
|
#include <vector>
|
31
31
|
|
32
|
-
#include "absl/memory/memory.h"
|
33
|
-
|
34
32
|
#include "src/core/lib/channel/channel_args.h"
|
35
33
|
#include "src/core/lib/gpr/useful.h"
|
36
34
|
#include "src/core/lib/iomgr/resolved_address.h"
|
@@ -127,7 +125,7 @@ class ServerAddressWeightAttribute : public ServerAddress::AttributeInterface {
|
|
127
125
|
uint32_t weight() const { return weight_; }
|
128
126
|
|
129
127
|
std::unique_ptr<AttributeInterface> Copy() const override {
|
130
|
-
return
|
128
|
+
return std::make_unique<ServerAddressWeightAttribute>(weight_);
|
131
129
|
}
|
132
130
|
|
133
131
|
int Cmp(const AttributeInterface* other) const override {
|
@@ -28,7 +28,6 @@
|
|
28
28
|
#include <grpc/grpc.h>
|
29
29
|
|
30
30
|
#include "src/core/lib/channel/channel_args.h"
|
31
|
-
#include "src/core/lib/channel/channel_args_preconditioning.h"
|
32
31
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
33
32
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
34
33
|
#include "src/core/lib/resource_quota/memory_quota.h"
|
@@ -116,4 +116,23 @@ void Arena::ManagedNewObject::Link(std::atomic<ManagedNewObject*>* head) {
|
|
116
116
|
}
|
117
117
|
}
|
118
118
|
|
119
|
+
void* Arena::AllocPooled(size_t alloc_size, std::atomic<FreePoolNode*>* head) {
|
120
|
+
FreePoolNode* p = head->load(std::memory_order_acquire);
|
121
|
+
while (p != nullptr) {
|
122
|
+
if (head->compare_exchange_weak(p, p->next, std::memory_order_acq_rel,
|
123
|
+
std::memory_order_relaxed)) {
|
124
|
+
return p;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return Alloc(alloc_size);
|
128
|
+
}
|
129
|
+
|
130
|
+
void Arena::FreePooled(void* p, std::atomic<FreePoolNode*>* head) {
|
131
|
+
FreePoolNode* node = static_cast<FreePoolNode*>(p);
|
132
|
+
node->next = head->load(std::memory_order_acquire);
|
133
|
+
while (!head->compare_exchange_weak(
|
134
|
+
node->next, node, std::memory_order_acq_rel, std::memory_order_relaxed)) {
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
119
138
|
} // namespace grpc_core
|
@@ -31,8 +31,12 @@
|
|
31
31
|
|
32
32
|
#include <atomic>
|
33
33
|
#include <memory>
|
34
|
+
#include <new>
|
34
35
|
#include <utility>
|
35
36
|
|
37
|
+
#include "absl/meta/type_traits.h"
|
38
|
+
#include "absl/utility/utility.h"
|
39
|
+
|
36
40
|
#include <grpc/event_engine/memory_allocator.h>
|
37
41
|
|
38
42
|
#include "src/core/lib/gpr/alloc.h"
|
@@ -42,7 +46,46 @@
|
|
42
46
|
|
43
47
|
namespace grpc_core {
|
44
48
|
|
49
|
+
namespace arena_detail {
|
50
|
+
|
51
|
+
template <typename Void, size_t kIndex, size_t kObjectSize,
|
52
|
+
size_t... kBucketSize>
|
53
|
+
struct PoolIndexForSize;
|
54
|
+
|
55
|
+
template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
|
56
|
+
size_t... kBucketSizes>
|
57
|
+
struct PoolIndexForSize<
|
58
|
+
absl::enable_if_t<kObjectSize <= kSmallestRemainingBucket>, kIndex,
|
59
|
+
kObjectSize, kSmallestRemainingBucket, kBucketSizes...> {
|
60
|
+
static constexpr size_t kPool = kIndex;
|
61
|
+
static constexpr size_t kSize = kSmallestRemainingBucket;
|
62
|
+
};
|
63
|
+
|
64
|
+
template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
|
65
|
+
size_t... kBucketSizes>
|
66
|
+
struct PoolIndexForSize<
|
67
|
+
absl::enable_if_t<(kObjectSize > kSmallestRemainingBucket)>, kIndex,
|
68
|
+
kObjectSize, kSmallestRemainingBucket, kBucketSizes...>
|
69
|
+
: public PoolIndexForSize<void, kIndex + 1, kObjectSize, kBucketSizes...> {
|
70
|
+
};
|
71
|
+
|
72
|
+
template <size_t kObjectSize, size_t... kBucketSizes>
|
73
|
+
constexpr size_t PoolFromObjectSize(
|
74
|
+
absl::integer_sequence<size_t, kBucketSizes...>) {
|
75
|
+
return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kPool;
|
76
|
+
}
|
77
|
+
|
78
|
+
template <size_t kObjectSize, size_t... kBucketSizes>
|
79
|
+
constexpr size_t AllocationSizeFromObjectSize(
|
80
|
+
absl::integer_sequence<size_t, kBucketSizes...>) {
|
81
|
+
return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kSize;
|
82
|
+
}
|
83
|
+
|
84
|
+
} // namespace arena_detail
|
85
|
+
|
45
86
|
class Arena {
|
87
|
+
using PoolSizes = absl::integer_sequence<size_t, 256, 512, 768>;
|
88
|
+
|
46
89
|
public:
|
47
90
|
// Create an arena, with \a initial_size bytes in the first allocated buffer.
|
48
91
|
static Arena* Create(size_t initial_size, MemoryAllocator* memory_allocator);
|
@@ -88,6 +131,37 @@ class Arena {
|
|
88
131
|
return &p->t;
|
89
132
|
}
|
90
133
|
|
134
|
+
class PooledDeleter {
|
135
|
+
public:
|
136
|
+
explicit PooledDeleter(Arena* arena) : arena_(arena) {}
|
137
|
+
PooledDeleter() = default;
|
138
|
+
template <typename T>
|
139
|
+
void operator()(T* p) {
|
140
|
+
// TODO(ctiller): promise based filter hijacks ownership of some pointers
|
141
|
+
// to make them appear as PoolPtr without really transferring ownership,
|
142
|
+
// by setting the arena to nullptr.
|
143
|
+
// This is a transitional hack and should be removed once promise based
|
144
|
+
// filter is removed.
|
145
|
+
if (arena_ != nullptr) arena_->DeletePooled(p);
|
146
|
+
}
|
147
|
+
|
148
|
+
private:
|
149
|
+
Arena* arena_;
|
150
|
+
};
|
151
|
+
|
152
|
+
template <typename T>
|
153
|
+
using PoolPtr = std::unique_ptr<T, PooledDeleter>;
|
154
|
+
|
155
|
+
template <typename T, typename... Args>
|
156
|
+
PoolPtr<T> MakePooled(Args&&... args) {
|
157
|
+
return PoolPtr<T>(
|
158
|
+
new (AllocPooled(
|
159
|
+
arena_detail::AllocationSizeFromObjectSize<sizeof(T)>(PoolSizes()),
|
160
|
+
&pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())]))
|
161
|
+
T(std::forward<Args>(args)...),
|
162
|
+
PooledDeleter(this));
|
163
|
+
}
|
164
|
+
|
91
165
|
private:
|
92
166
|
struct Zone {
|
93
167
|
Zone* prev;
|
@@ -128,6 +202,20 @@ class Arena {
|
|
128
202
|
|
129
203
|
void* AllocZone(size_t size);
|
130
204
|
|
205
|
+
template <typename T>
|
206
|
+
void DeletePooled(T* p) {
|
207
|
+
p->~T();
|
208
|
+
FreePooled(
|
209
|
+
p, &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())]);
|
210
|
+
}
|
211
|
+
|
212
|
+
struct FreePoolNode {
|
213
|
+
FreePoolNode* next;
|
214
|
+
};
|
215
|
+
|
216
|
+
void* AllocPooled(size_t alloc_size, std::atomic<FreePoolNode*>* head);
|
217
|
+
static void FreePooled(void* p, std::atomic<FreePoolNode*>* head);
|
218
|
+
|
131
219
|
// Keep track of the total used size. We use this in our call sizing
|
132
220
|
// hysteresis.
|
133
221
|
std::atomic<size_t> total_used_{0};
|
@@ -140,6 +228,7 @@ class Arena {
|
|
140
228
|
// last zone; the zone list is reverse-walked during arena destruction only.
|
141
229
|
std::atomic<Zone*> last_zone_{nullptr};
|
142
230
|
std::atomic<ManagedNewObject*> managed_new_head_{nullptr};
|
231
|
+
std::atomic<FreePoolNode*> pools_[PoolSizes::size()]{};
|
143
232
|
// The backing memory quota
|
144
233
|
MemoryAllocator* const memory_allocator_;
|
145
234
|
};
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#include "src/core/lib/debug/trace.h"
|
29
29
|
#include "src/core/lib/gpr/useful.h"
|
30
30
|
#include "src/core/lib/gprpp/mpscq.h"
|
31
|
+
#include "src/core/lib/promise/detail/basic_seq.h"
|
31
32
|
#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
|
32
33
|
#include "src/core/lib/promise/loop.h"
|
33
34
|
#include "src/core/lib/promise/map.h"
|
@@ -20,8 +20,6 @@
|
|
20
20
|
#include <map>
|
21
21
|
#include <utility>
|
22
22
|
|
23
|
-
#include "absl/memory/memory.h"
|
24
|
-
|
25
23
|
namespace grpc_core {
|
26
24
|
|
27
25
|
GrpcAuthorizationEngine::GrpcAuthorizationEngine(Rbac policy)
|
@@ -29,7 +27,7 @@ GrpcAuthorizationEngine::GrpcAuthorizationEngine(Rbac policy)
|
|
29
27
|
for (auto& sub_policy : policy.policies) {
|
30
28
|
Policy policy;
|
31
29
|
policy.name = sub_policy.first;
|
32
|
-
policy.matcher =
|
30
|
+
policy.matcher = std::make_unique<PolicyAuthorizationMatcher>(
|
33
31
|
std::move(sub_policy.second));
|
34
32
|
policies_.push_back(std::move(policy));
|
35
33
|
}
|
@@ -17,6 +17,7 @@
|
|
17
17
|
#include "src/core/lib/security/authorization/grpc_server_authz_filter.h"
|
18
18
|
|
19
19
|
#include <functional>
|
20
|
+
#include <memory>
|
20
21
|
#include <string>
|
21
22
|
#include <utility>
|
22
23
|
|
@@ -107,8 +108,9 @@ bool GrpcServerAuthzFilter::IsAuthorized(
|
|
107
108
|
ArenaPromise<ServerMetadataHandle> GrpcServerAuthzFilter::MakeCallPromise(
|
108
109
|
CallArgs call_args, NextPromiseFactory next_promise_factory) {
|
109
110
|
if (!IsAuthorized(call_args.client_initial_metadata)) {
|
110
|
-
return ArenaPromise<ServerMetadataHandle>(
|
111
|
-
absl::PermissionDeniedError(
|
111
|
+
return ArenaPromise<ServerMetadataHandle>(
|
112
|
+
Immediate(ServerMetadataFromStatus(absl::PermissionDeniedError(
|
113
|
+
"Unauthorized RPC request rejected."))));
|
112
114
|
}
|
113
115
|
return next_promise_factory(std::move(call_args));
|
114
116
|
}
|