grpc 1.50.0-x86_64-linux → 1.51.0-x86_64-linux
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/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- 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 +55 -18
- 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
@@ -22,20 +22,25 @@
|
|
22
22
|
|
23
23
|
#include <string.h>
|
24
24
|
|
25
|
+
#include <memory>
|
25
26
|
#include <new>
|
26
27
|
|
28
|
+
#include "absl/status/status.h"
|
29
|
+
|
30
|
+
#include <grpc/event_engine/event_engine.h>
|
31
|
+
|
32
|
+
#include "src/core/lib/event_engine/default_event_engine.h"
|
27
33
|
#include "src/core/lib/gpr/alloc.h"
|
28
34
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
29
|
-
#include "src/core/lib/
|
30
|
-
#include "src/core/lib/
|
35
|
+
#include "src/core/lib/promise/context.h"
|
36
|
+
#include "src/core/lib/slice/slice.h"
|
31
37
|
#include "src/core/lib/transport/transport_impl.h"
|
32
38
|
|
33
39
|
grpc_core::DebugOnlyTraceFlag grpc_trace_stream_refcount(false,
|
34
40
|
"stream_refcount");
|
35
41
|
|
36
42
|
void grpc_stream_destroy(grpc_stream_refcount* refcount) {
|
37
|
-
if (
|
38
|
-
(grpc_core::ExecCtx::Get()->flags() &
|
43
|
+
if ((grpc_core::ExecCtx::Get()->flags() &
|
39
44
|
GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP)) {
|
40
45
|
/* Ick.
|
41
46
|
The thread we're running on MAY be owned (indirectly) by a call-stack.
|
@@ -44,10 +49,15 @@ void grpc_stream_destroy(grpc_stream_refcount* refcount) {
|
|
44
49
|
cope with.
|
45
50
|
Throw this over to the executor (on a core-owned thread) and process it
|
46
51
|
there. */
|
47
|
-
|
52
|
+
grpc_event_engine::experimental::GetDefaultEventEngine()->Run([refcount] {
|
53
|
+
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
54
|
+
grpc_core::ExecCtx exec_ctx;
|
55
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &refcount->destroy,
|
56
|
+
absl::OkStatus());
|
57
|
+
});
|
48
58
|
} else {
|
49
59
|
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &refcount->destroy,
|
50
|
-
|
60
|
+
absl::OkStatus());
|
51
61
|
}
|
52
62
|
}
|
53
63
|
|
@@ -162,28 +172,51 @@ void grpc_transport_stream_op_batch_queue_finish_with_failure(
|
|
162
172
|
grpc_transport_stream_op_batch* batch, grpc_error_handle error,
|
163
173
|
grpc_core::CallCombinerClosureList* closures) {
|
164
174
|
if (batch->cancel_stream) {
|
165
|
-
GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
|
166
175
|
}
|
167
176
|
// Construct a list of closures to execute.
|
168
177
|
if (batch->recv_initial_metadata) {
|
169
178
|
closures->Add(
|
170
179
|
batch->payload->recv_initial_metadata.recv_initial_metadata_ready,
|
171
|
-
|
180
|
+
error, "failing recv_initial_metadata_ready");
|
172
181
|
}
|
173
182
|
if (batch->recv_message) {
|
174
|
-
closures->Add(batch->payload->recv_message.recv_message_ready,
|
175
|
-
|
183
|
+
closures->Add(batch->payload->recv_message.recv_message_ready, error,
|
184
|
+
"failing recv_message_ready");
|
176
185
|
}
|
177
186
|
if (batch->recv_trailing_metadata) {
|
178
187
|
closures->Add(
|
179
188
|
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready,
|
180
|
-
|
189
|
+
error, "failing recv_trailing_metadata_ready");
|
190
|
+
}
|
191
|
+
if (batch->on_complete != nullptr) {
|
192
|
+
closures->Add(batch->on_complete, error, "failing on_complete");
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
void grpc_transport_stream_op_batch_finish_with_failure_from_transport(
|
197
|
+
grpc_transport_stream_op_batch* batch, grpc_error_handle error) {
|
198
|
+
if (batch->cancel_stream) {
|
199
|
+
}
|
200
|
+
// Construct a list of closures to execute.
|
201
|
+
if (batch->recv_initial_metadata) {
|
202
|
+
grpc_core::ExecCtx::Run(
|
203
|
+
DEBUG_LOCATION,
|
204
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready,
|
205
|
+
error);
|
206
|
+
}
|
207
|
+
if (batch->recv_message) {
|
208
|
+
grpc_core::ExecCtx::Run(
|
209
|
+
DEBUG_LOCATION, batch->payload->recv_message.recv_message_ready, error);
|
210
|
+
}
|
211
|
+
if (batch->recv_trailing_metadata) {
|
212
|
+
grpc_core::ExecCtx::Run(
|
213
|
+
DEBUG_LOCATION,
|
214
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready,
|
215
|
+
error);
|
181
216
|
}
|
182
217
|
if (batch->on_complete != nullptr) {
|
183
|
-
|
184
|
-
"failing on_complete");
|
218
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, batch->on_complete, error);
|
185
219
|
}
|
186
|
-
GRPC_ERROR_UNREF(error);
|
187
220
|
}
|
188
221
|
|
189
222
|
struct made_transport_op {
|
@@ -197,8 +230,7 @@ struct made_transport_op {
|
|
197
230
|
|
198
231
|
static void destroy_made_transport_op(void* arg, grpc_error_handle error) {
|
199
232
|
made_transport_op* op = static_cast<made_transport_op*>(arg);
|
200
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->inner_on_complete,
|
201
|
-
GRPC_ERROR_REF(error));
|
233
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->inner_on_complete, error);
|
202
234
|
delete op;
|
203
235
|
}
|
204
236
|
|
@@ -223,7 +255,7 @@ static void destroy_made_transport_stream_op(void* arg,
|
|
223
255
|
grpc_closure* c = op->inner_on_complete;
|
224
256
|
delete op;
|
225
257
|
if (c != nullptr) {
|
226
|
-
grpc_core::Closure::Run(DEBUG_LOCATION, c,
|
258
|
+
grpc_core::Closure::Run(DEBUG_LOCATION, c, error);
|
227
259
|
}
|
228
260
|
}
|
229
261
|
|
@@ -237,3 +269,17 @@ grpc_transport_stream_op_batch* grpc_make_transport_stream_op(
|
|
237
269
|
op->op.on_complete = &op->outer_on_complete;
|
238
270
|
return &op->op;
|
239
271
|
}
|
272
|
+
|
273
|
+
namespace grpc_core {
|
274
|
+
|
275
|
+
ServerMetadataHandle ServerMetadataFromStatus(const absl::Status& status) {
|
276
|
+
auto hdl =
|
277
|
+
GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
|
278
|
+
hdl->Set(GrpcStatusMetadata(), static_cast<grpc_status_code>(status.code()));
|
279
|
+
if (!status.ok()) {
|
280
|
+
hdl->Set(GrpcMessageMetadata(), Slice::FromCopiedString(status.message()));
|
281
|
+
}
|
282
|
+
return hdl;
|
283
|
+
}
|
284
|
+
|
285
|
+
} // namespace grpc_core
|
@@ -27,6 +27,7 @@
|
|
27
27
|
|
28
28
|
#include <functional>
|
29
29
|
#include <string>
|
30
|
+
#include <utility>
|
30
31
|
|
31
32
|
#include "absl/status/status.h"
|
32
33
|
#include "absl/strings/string_view.h"
|
@@ -50,17 +51,15 @@
|
|
50
51
|
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
51
52
|
#include "src/core/lib/iomgr/polling_entity.h"
|
52
53
|
#include "src/core/lib/promise/arena_promise.h"
|
53
|
-
#include "src/core/lib/promise/
|
54
|
+
#include "src/core/lib/promise/detail/status.h"
|
54
55
|
#include "src/core/lib/promise/latch.h"
|
56
|
+
#include "src/core/lib/promise/pipe.h"
|
55
57
|
#include "src/core/lib/resource_quota/arena.h"
|
56
|
-
#include "src/core/lib/slice/slice.h"
|
57
58
|
#include "src/core/lib/slice/slice_buffer.h"
|
58
59
|
#include "src/core/lib/transport/connectivity_state.h"
|
59
60
|
#include "src/core/lib/transport/metadata_batch.h"
|
60
61
|
#include "src/core/lib/transport/transport_fwd.h"
|
61
62
|
|
62
|
-
struct grpc_transport_stream_op_batch_payload;
|
63
|
-
|
64
63
|
/* Minimum and maximum protocol accepted versions. */
|
65
64
|
#define GRPC_PROTOCOL_VERSION_MAX_MAJOR 2
|
66
65
|
#define GRPC_PROTOCOL_VERSION_MAX_MINOR 1
|
@@ -81,63 +80,37 @@ struct grpc_transport_stream_op_batch_payload;
|
|
81
80
|
(GRPC_WRITE_INTERNAL_COMPRESS | GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED)
|
82
81
|
|
83
82
|
namespace grpc_core {
|
84
|
-
// TODO(ctiller): eliminate once MetadataHandle is constructable directly.
|
85
|
-
namespace promise_filter_detail {
|
86
|
-
class BaseCallData;
|
87
|
-
}
|
88
|
-
|
89
|
-
// Small unowned "handle" type to ensure one accessor at a time to metadata.
|
90
|
-
// The focus here is to get promises to use the syntax we'd like - we'll
|
91
|
-
// probably substitute some other smart pointer later.
|
92
|
-
template <typename T>
|
93
|
-
class MetadataHandle {
|
94
|
-
public:
|
95
|
-
MetadataHandle() = default;
|
96
|
-
|
97
|
-
MetadataHandle(const MetadataHandle&) = delete;
|
98
|
-
MetadataHandle& operator=(const MetadataHandle&) = delete;
|
99
|
-
|
100
|
-
MetadataHandle(MetadataHandle&& other) noexcept : handle_(other.handle_) {
|
101
|
-
other.handle_ = nullptr;
|
102
|
-
}
|
103
|
-
MetadataHandle& operator=(MetadataHandle&& other) noexcept {
|
104
|
-
handle_ = other.handle_;
|
105
|
-
other.handle_ = nullptr;
|
106
|
-
return *this;
|
107
|
-
}
|
108
83
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if (status.ok()) return;
|
114
|
-
handle_->Set(GrpcMessageMetadata(),
|
115
|
-
Slice::FromCopiedString(status.message()));
|
116
|
-
}
|
84
|
+
// Server metadata type
|
85
|
+
// TODO(ctiller): This should be a bespoke instance of MetadataMap<>
|
86
|
+
using ServerMetadata = grpc_metadata_batch;
|
87
|
+
using ServerMetadataHandle = Arena::PoolPtr<ServerMetadata>;
|
117
88
|
|
118
|
-
|
119
|
-
|
120
|
-
|
89
|
+
// Client initial metadata type
|
90
|
+
// TODO(ctiller): This should be a bespoke instance of MetadataMap<>
|
91
|
+
using ClientMetadata = grpc_metadata_batch;
|
92
|
+
using ClientMetadataHandle = Arena::PoolPtr<ClientMetadata>;
|
121
93
|
|
122
|
-
|
94
|
+
class Message {
|
95
|
+
public:
|
96
|
+
Message() = default;
|
97
|
+
~Message() = default;
|
98
|
+
Message(SliceBuffer payload, uint32_t flags)
|
99
|
+
: payload_(std::move(payload)), flags_(flags) {}
|
100
|
+
Message(const Message&) = delete;
|
101
|
+
Message& operator=(const Message&) = delete;
|
102
|
+
|
103
|
+
uint32_t flags() const { return flags_; }
|
104
|
+
uint32_t& mutable_flags() { return flags_; }
|
105
|
+
SliceBuffer* payload() { return &payload_; }
|
106
|
+
const SliceBuffer* payload() const { return &payload_; }
|
123
107
|
|
124
108
|
private:
|
125
|
-
|
126
|
-
|
127
|
-
explicit MetadataHandle(T* handle) : handle_(handle) {}
|
128
|
-
T* Unwrap() {
|
129
|
-
T* result = handle_;
|
130
|
-
handle_ = nullptr;
|
131
|
-
return result;
|
132
|
-
}
|
133
|
-
|
134
|
-
T* handle_ = nullptr;
|
109
|
+
SliceBuffer payload_;
|
110
|
+
uint32_t flags_ = 0;
|
135
111
|
};
|
136
112
|
|
137
|
-
|
138
|
-
// TODO(ctiller): This should be a bespoke instance of MetadataMap<>
|
139
|
-
using ServerMetadata = grpc_metadata_batch;
|
140
|
-
using ServerMetadataHandle = MetadataHandle<ServerMetadata>;
|
113
|
+
using MessageHandle = Arena::PoolPtr<Message>;
|
141
114
|
|
142
115
|
// Ok/not-ok check for trailing metadata, so that it can be used as result types
|
143
116
|
// for TrySeq.
|
@@ -146,18 +119,36 @@ inline bool IsStatusOk(const ServerMetadataHandle& m) {
|
|
146
119
|
GRPC_STATUS_OK;
|
147
120
|
}
|
148
121
|
|
149
|
-
|
150
|
-
// TODO(ctiller): This should be a bespoke instance of MetadataMap<>
|
151
|
-
using ClientMetadata = grpc_metadata_batch;
|
152
|
-
using ClientMetadataHandle = MetadataHandle<ClientMetadata>;
|
122
|
+
ServerMetadataHandle ServerMetadataFromStatus(const absl::Status& status);
|
153
123
|
|
154
|
-
|
155
|
-
|
156
|
-
|
124
|
+
template <>
|
125
|
+
struct StatusCastImpl<ServerMetadataHandle, absl::Status> {
|
126
|
+
static ServerMetadataHandle Cast(const absl::Status& m) {
|
127
|
+
return ServerMetadataFromStatus(m);
|
128
|
+
}
|
129
|
+
};
|
130
|
+
|
131
|
+
template <>
|
132
|
+
struct StatusCastImpl<ServerMetadataHandle, const absl::Status&> {
|
133
|
+
static ServerMetadataHandle Cast(const absl::Status& m) {
|
134
|
+
return ServerMetadataFromStatus(m);
|
135
|
+
}
|
136
|
+
};
|
157
137
|
|
158
138
|
struct CallArgs {
|
139
|
+
// Initial metadata from the client to the server.
|
140
|
+
// During promise setup this can be manipulated by filters (and then
|
141
|
+
// passed on to the next filter).
|
159
142
|
ClientMetadataHandle client_initial_metadata;
|
143
|
+
// Initial metadata from the server to the client.
|
144
|
+
// Set once when it's available.
|
145
|
+
// During promise setup filters can substitute their own latch for this
|
146
|
+
// and consequently intercept the sent value and mutate/observe it.
|
160
147
|
Latch<ServerMetadata*>* server_initial_metadata;
|
148
|
+
// Messages travelling from the application to the transport.
|
149
|
+
PipeReceiver<MessageHandle>* outgoing_messages;
|
150
|
+
// Messages travelling from the transport to the application.
|
151
|
+
PipeSender<MessageHandle>* incoming_messages;
|
161
152
|
};
|
162
153
|
|
163
154
|
using NextPromiseFactory =
|
@@ -422,10 +413,11 @@ struct grpc_transport_stream_op_batch_payload {
|
|
422
413
|
|
423
414
|
/** Forcefully close this stream.
|
424
415
|
The HTTP2 semantics should be:
|
425
|
-
- server side: if cancel_error has
|
426
|
-
|
427
|
-
|
428
|
-
|
416
|
+
- server side: if cancel_error has
|
417
|
+
grpc_core::StatusIntProperty::kRpcStatus, and trailing metadata has not
|
418
|
+
been sent, send trailing metadata with status and message from cancel_error
|
419
|
+
(use grpc_error_get_status) followed by a RST_STREAM with
|
420
|
+
error=GRPC_CHTTP2_NO_ERROR to force a full close
|
429
421
|
- at all other times: use grpc_error_get_status to get a status code, and
|
430
422
|
convert to a HTTP2 error code using
|
431
423
|
grpc_chttp2_grpc_status_to_http2_error. Send a RST_STREAM with this
|
@@ -433,7 +425,7 @@ struct grpc_transport_stream_op_batch_payload {
|
|
433
425
|
struct {
|
434
426
|
// Error contract: the transport that gets this op must cause cancel_error
|
435
427
|
// to be unref'ed after processing it
|
436
|
-
grpc_error_handle cancel_error
|
428
|
+
grpc_error_handle cancel_error;
|
437
429
|
} cancel_stream;
|
438
430
|
|
439
431
|
/* Indexes correspond to grpc_context_index enum values */
|
@@ -453,11 +445,11 @@ typedef struct grpc_transport_op {
|
|
453
445
|
/** should the transport be disconnected
|
454
446
|
* Error contract: the transport that gets this op must cause
|
455
447
|
* disconnect_with_error to be unref'ed after processing it */
|
456
|
-
grpc_error_handle disconnect_with_error
|
448
|
+
grpc_error_handle disconnect_with_error;
|
457
449
|
/** what should the goaway contain?
|
458
450
|
* Error contract: the transport that gets this op must cause
|
459
451
|
* goaway_error to be unref'ed after processing it */
|
460
|
-
grpc_error_handle goaway_error
|
452
|
+
grpc_error_handle goaway_error;
|
461
453
|
/** set the callback for accepting new streams;
|
462
454
|
this is a permanent callback, unlike the other one-shot closures.
|
463
455
|
If true, the callback is set to set_accept_stream_fn, with its
|
@@ -538,6 +530,10 @@ void grpc_transport_stream_op_batch_finish_with_failure(
|
|
538
530
|
void grpc_transport_stream_op_batch_queue_finish_with_failure(
|
539
531
|
grpc_transport_stream_op_batch* batch, grpc_error_handle error,
|
540
532
|
grpc_core::CallCombinerClosureList* closures);
|
533
|
+
// Fail a batch from within the transport (i.e. without the activity lock/call
|
534
|
+
// combiner taken).
|
535
|
+
void grpc_transport_stream_op_batch_finish_with_failure_from_transport(
|
536
|
+
grpc_transport_stream_op_batch* batch, grpc_error_handle error);
|
541
537
|
|
542
538
|
std::string grpc_transport_stream_op_batch_string(
|
543
539
|
grpc_transport_stream_op_batch* op);
|
@@ -56,7 +56,7 @@ typedef struct grpc_transport_vtable {
|
|
56
56
|
There is an on-going migration to move all filters to providing this, and
|
57
57
|
then to drop perform_stream_op. */
|
58
58
|
grpc_core::ArenaPromise<grpc_core::ServerMetadataHandle> (*make_call_promise)(
|
59
|
-
grpc_transport* self, grpc_core::
|
59
|
+
grpc_transport* self, grpc_core::CallArgs call_args);
|
60
60
|
|
61
61
|
/* implementation of grpc_transport_set_pollset */
|
62
62
|
void (*set_pollset)(grpc_transport* self, grpc_stream* stream,
|
@@ -32,6 +32,7 @@
|
|
32
32
|
#include "src/core/lib/channel/channel_fwd.h"
|
33
33
|
#include "src/core/lib/channel/channel_stack.h"
|
34
34
|
#include "src/core/lib/gprpp/orphanable.h"
|
35
|
+
#include "src/core/lib/gprpp/status_helper.h"
|
35
36
|
#include "src/core/lib/iomgr/error.h"
|
36
37
|
#include "src/core/lib/slice/slice_buffer.h"
|
37
38
|
#include "src/core/lib/transport/connectivity_state.h"
|
@@ -86,7 +87,7 @@ std::string grpc_transport_stream_op_batch_string(
|
|
86
87
|
if (op->cancel_stream) {
|
87
88
|
out.push_back(absl::StrCat(
|
88
89
|
" CANCEL:",
|
89
|
-
|
90
|
+
grpc_core::StatusToString(op->payload->cancel_stream.cancel_error)));
|
90
91
|
}
|
91
92
|
|
92
93
|
return absl::StrJoin(out, "");
|
@@ -107,14 +108,14 @@ std::string grpc_transport_op_string(grpc_transport_op* op) {
|
|
107
108
|
op->stop_connectivity_watch));
|
108
109
|
}
|
109
110
|
|
110
|
-
if (!
|
111
|
+
if (!op->disconnect_with_error.ok()) {
|
111
112
|
out.push_back(absl::StrCat(
|
112
|
-
" DISCONNECT:",
|
113
|
+
" DISCONNECT:", grpc_core::StatusToString(op->disconnect_with_error)));
|
113
114
|
}
|
114
115
|
|
115
|
-
if (!
|
116
|
-
out.push_back(
|
117
|
-
|
116
|
+
if (!op->goaway_error.ok()) {
|
117
|
+
out.push_back(absl::StrCat(" SEND_GOAWAY:",
|
118
|
+
grpc_core::StatusToString(op->goaway_error)));
|
118
119
|
}
|
119
120
|
|
120
121
|
if (op->set_accept_stream) {
|
@@ -25,16 +25,11 @@
|
|
25
25
|
#include "src/core/lib/transport/http_connect_handshaker.h"
|
26
26
|
#include "src/core/lib/transport/tcp_connect_handshaker.h"
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
void
|
31
|
-
|
32
|
-
|
33
|
-
void grpc_register_built_in_plugins(void) {
|
34
|
-
grpc_register_plugin(grpc_resolver_dns_ares_init,
|
35
|
-
grpc_resolver_dns_ares_shutdown);
|
36
|
-
grpc_register_extra_plugins();
|
37
|
-
}
|
28
|
+
namespace grpc_event_engine {
|
29
|
+
namespace experimental {
|
30
|
+
extern void RegisterEventEngineChannelArgPreconditioning(grpc_core::CoreConfiguration::Builder* builder);
|
31
|
+
} // namespace experimental
|
32
|
+
} // namespace grpc_event_engine
|
38
33
|
|
39
34
|
namespace grpc_core {
|
40
35
|
|
@@ -74,6 +69,7 @@ extern void RegisterBinderResolver(CoreConfiguration::Builder* builder);
|
|
74
69
|
#endif
|
75
70
|
|
76
71
|
void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
|
72
|
+
grpc_event_engine::experimental::RegisterEventEngineChannelArgPreconditioning(builder);
|
77
73
|
// The order of the handshaker registration is crucial here.
|
78
74
|
// We want TCP connect handshaker to be registered last so that it is added to
|
79
75
|
// the start of the handshaker list.
|
@@ -21,20 +21,6 @@
|
|
21
21
|
#include "src/core/lib/config/core_configuration.h"
|
22
22
|
#include "src/core/lib/surface/builtins.h"
|
23
23
|
|
24
|
-
#ifndef GRPC_NO_XDS
|
25
|
-
namespace grpc_core {
|
26
|
-
void XdsClientGlobalInit();
|
27
|
-
void XdsClientGlobalShutdown();
|
28
|
-
} // namespace grpc_core
|
29
|
-
#endif
|
30
|
-
|
31
|
-
void grpc_register_extra_plugins() {
|
32
|
-
#ifndef GRPC_NO_XDS
|
33
|
-
grpc_register_plugin(grpc_core::XdsClientGlobalInit,
|
34
|
-
grpc_core::XdsClientGlobalShutdown);
|
35
|
-
#endif
|
36
|
-
}
|
37
|
-
|
38
24
|
namespace grpc_core {
|
39
25
|
#ifndef GRPC_NO_XDS
|
40
26
|
extern void RbacFilterRegister(CoreConfiguration::Builder* builder);
|
@@ -49,6 +35,7 @@ extern void RegisterXdsClusterImplLbPolicy(CoreConfiguration::Builder* builder);
|
|
49
35
|
extern void RegisterCdsLbPolicy(CoreConfiguration::Builder* builder);
|
50
36
|
extern void RegisterXdsClusterResolverLbPolicy(
|
51
37
|
CoreConfiguration::Builder* builder);
|
38
|
+
extern void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder);
|
52
39
|
extern void RegisterFileWatcherCertificateProvider(
|
53
40
|
CoreConfiguration::Builder* builder);
|
54
41
|
#endif
|
@@ -67,6 +54,7 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
|
|
67
54
|
RegisterXdsClusterImplLbPolicy(builder);
|
68
55
|
RegisterCdsLbPolicy(builder);
|
69
56
|
RegisterXdsClusterResolverLbPolicy(builder);
|
57
|
+
RegisterXdsWrrLocalityLbPolicy(builder);
|
70
58
|
RegisterFileWatcherCertificateProvider(builder);
|
71
59
|
#endif
|
72
60
|
}
|
@@ -135,11 +135,11 @@ static void alts_grpc_handshaker_client_unref(
|
|
135
135
|
client->send_buffer = nullptr;
|
136
136
|
client->recv_buffer = nullptr;
|
137
137
|
grpc_metadata_array_destroy(&client->recv_initial_metadata);
|
138
|
-
|
139
|
-
|
138
|
+
grpc_core::CSliceUnref(client->recv_bytes);
|
139
|
+
grpc_core::CSliceUnref(client->target_name);
|
140
140
|
grpc_alts_credentials_options_destroy(client->options);
|
141
141
|
gpr_free(client->buffer);
|
142
|
-
|
142
|
+
grpc_core::CSliceUnref(client->handshake_status_details);
|
143
143
|
delete client;
|
144
144
|
}
|
145
145
|
}
|
@@ -468,7 +468,7 @@ static void on_status_received(void* arg, grpc_error_handle error) {
|
|
468
468
|
"alts_grpc_handshaker_client:%p on_status_received "
|
469
469
|
"status:%d details:|%s| error:|%s|",
|
470
470
|
client, client->handshake_status_code, status_details,
|
471
|
-
|
471
|
+
grpc_core::StatusToString(error).c_str());
|
472
472
|
gpr_free(status_details);
|
473
473
|
}
|
474
474
|
maybe_complete_tsi_next(client, true /* receive_status_finished */,
|
@@ -488,7 +488,7 @@ static grpc_byte_buffer* get_serialized_handshaker_req(
|
|
488
488
|
}
|
489
489
|
grpc_slice slice = grpc_slice_from_copied_buffer(buf, buf_length);
|
490
490
|
grpc_byte_buffer* byte_buffer = grpc_raw_byte_buffer_create(&slice, 1);
|
491
|
-
|
491
|
+
grpc_core::CSliceUnref(slice);
|
492
492
|
return byte_buffer;
|
493
493
|
}
|
494
494
|
|
@@ -639,8 +639,8 @@ static tsi_result handshaker_client_next(alts_handshaker_client* c,
|
|
639
639
|
}
|
640
640
|
alts_grpc_handshaker_client* client =
|
641
641
|
reinterpret_cast<alts_grpc_handshaker_client*>(c);
|
642
|
-
|
643
|
-
client->recv_bytes =
|
642
|
+
grpc_core::CSliceUnref(client->recv_bytes);
|
643
|
+
client->recv_bytes = grpc_core::CSliceRef(*bytes_received);
|
644
644
|
grpc_byte_buffer* buffer = get_serialized_next(bytes_received);
|
645
645
|
if (buffer == nullptr) {
|
646
646
|
gpr_log(GPR_ERROR, "get_serialized_next() failed");
|
@@ -692,7 +692,7 @@ static void handshaker_client_destruct(alts_handshaker_client* c) {
|
|
692
692
|
DEBUG_LOCATION,
|
693
693
|
GRPC_CLOSURE_CREATE(handshaker_call_unref, client->call,
|
694
694
|
grpc_schedule_on_exec_ctx),
|
695
|
-
|
695
|
+
absl::OkStatus());
|
696
696
|
}
|
697
697
|
}
|
698
698
|
}
|
@@ -741,7 +741,7 @@ alts_handshaker_client* alts_grpc_handshaker_client_create(
|
|
741
741
|
channel, nullptr, GRPC_PROPAGATE_DEFAULTS, interested_parties,
|
742
742
|
grpc_slice_from_static_string(ALTS_SERVICE_METHOD), &slice,
|
743
743
|
grpc_core::Timestamp::InfFuture(), nullptr);
|
744
|
-
|
744
|
+
grpc_core::CSliceUnref(slice);
|
745
745
|
GRPC_CLOSURE_INIT(&client->on_handshaker_service_resp_recv, grpc_cb, client,
|
746
746
|
grpc_schedule_on_exec_ctx);
|
747
747
|
GRPC_CLOSURE_INIT(&client->on_status_received, on_status_received, client,
|
@@ -789,7 +789,7 @@ void alts_handshaker_client_set_recv_bytes_for_testing(
|
|
789
789
|
GPR_ASSERT(c != nullptr);
|
790
790
|
alts_grpc_handshaker_client* client =
|
791
791
|
reinterpret_cast<alts_grpc_handshaker_client*>(c);
|
792
|
-
client->recv_bytes =
|
792
|
+
client->recv_bytes = CSliceRef(*recv_bytes);
|
793
793
|
}
|
794
794
|
|
795
795
|
void alts_handshaker_client_set_fields_for_testing(
|
@@ -249,8 +249,8 @@ static void handshaker_result_destroy(tsi_handshaker_result* self) {
|
|
249
249
|
gpr_free(result->peer_identity);
|
250
250
|
gpr_free(result->key_data);
|
251
251
|
gpr_free(result->unused_bytes);
|
252
|
-
|
253
|
-
|
252
|
+
grpc_core::CSliceUnref(result->rpc_versions);
|
253
|
+
grpc_core::CSliceUnref(result->serialized_context);
|
254
254
|
gpr_free(result);
|
255
255
|
}
|
256
256
|
|
@@ -391,10 +391,10 @@ static void on_handshaker_service_resp_recv(void* arg,
|
|
391
391
|
return;
|
392
392
|
}
|
393
393
|
bool success = true;
|
394
|
-
if (!
|
394
|
+
if (!error.ok()) {
|
395
395
|
gpr_log(GPR_INFO,
|
396
396
|
"ALTS handshaker on_handshaker_service_resp_recv error: %s",
|
397
|
-
|
397
|
+
grpc_core::StatusToString(error).c_str());
|
398
398
|
success = false;
|
399
399
|
}
|
400
400
|
alts_handshaker_client_handle_response(client, success);
|
@@ -407,7 +407,7 @@ static void on_handshaker_service_resp_recv_dedicated(
|
|
407
407
|
alts_shared_resource_dedicated* resource =
|
408
408
|
grpc_alts_get_shared_resource_dedicated();
|
409
409
|
grpc_cq_end_op(
|
410
|
-
resource->cq, arg,
|
410
|
+
resource->cq, arg, absl::OkStatus(),
|
411
411
|
[](void* /*done_arg*/, grpc_cq_completion* /*storage*/) {}, nullptr,
|
412
412
|
&resource->storage);
|
413
413
|
}
|
@@ -481,7 +481,7 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next(
|
|
481
481
|
} else {
|
482
482
|
ok = alts_handshaker_client_next(handshaker->client, &slice);
|
483
483
|
}
|
484
|
-
|
484
|
+
grpc_core::CSliceUnref(slice);
|
485
485
|
return ok;
|
486
486
|
}
|
487
487
|
|
@@ -563,7 +563,7 @@ static tsi_result handshaker_next(
|
|
563
563
|
// stack. Doing so avoids potential lock cycles between g_init_mu and other
|
564
564
|
// mutexes within core that might be held on the current call stack
|
565
565
|
// (note that g_init_mu gets acquired during channel creation).
|
566
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &args->closure,
|
566
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &args->closure, absl::OkStatus());
|
567
567
|
} else {
|
568
568
|
tsi_result ok = alts_tsi_handshaker_continue_handshaker_next(
|
569
569
|
handshaker, received_bytes, received_bytes_size, cb, user_data, error);
|
@@ -612,7 +612,7 @@ static void handshaker_destroy(tsi_handshaker* self) {
|
|
612
612
|
alts_tsi_handshaker* handshaker =
|
613
613
|
reinterpret_cast<alts_tsi_handshaker*>(self);
|
614
614
|
alts_handshaker_client_destroy(handshaker->client);
|
615
|
-
|
615
|
+
grpc_core::CSliceUnref(handshaker->target_name);
|
616
616
|
grpc_alts_credentials_options_destroy(handshaker->options);
|
617
617
|
if (handshaker->channel != nullptr) {
|
618
618
|
grpc_channel_destroy_internal(handshaker->channel);
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
#include <grpc/byte_buffer_reader.h>
|
24
24
|
|
25
|
+
#include "src/core/lib/slice/slice.h"
|
25
26
|
#include "src/core/lib/slice/slice_internal.h"
|
26
27
|
|
27
28
|
tsi_result alts_tsi_utils_convert_to_tsi_result(grpc_status_code code) {
|
@@ -54,7 +55,7 @@ grpc_gcp_HandshakerResp* alts_tsi_utils_deserialize_response(
|
|
54
55
|
buf_size);
|
55
56
|
grpc_gcp_HandshakerResp* resp = grpc_gcp_HandshakerResp_parse(
|
56
57
|
reinterpret_cast<char*>(buf), buf_size, arena);
|
57
|
-
|
58
|
+
grpc_core::CSliceUnref(slice);
|
58
59
|
grpc_byte_buffer_reader_destroy(&bbr);
|
59
60
|
if (resp == nullptr) {
|
60
61
|
gpr_log(GPR_ERROR, "grpc_gcp_handshaker_resp_decode() failed");
|
data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
#include <grpc/support/alloc.h>
|
26
26
|
#include <grpc/support/log.h>
|
27
27
|
|
28
|
+
#include "src/core/lib/slice/slice.h"
|
28
29
|
#include "src/core/lib/slice/slice_internal.h"
|
29
30
|
#include "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h"
|
30
31
|
#include "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h"
|
@@ -71,7 +72,7 @@ static tsi_result alts_grpc_integrity_only_extra_copy_protect(
|
|
71
72
|
return TSI_INTERNAL_ERROR;
|
72
73
|
}
|
73
74
|
grpc_slice_buffer_add(protected_slices, protected_slice);
|
74
|
-
|
75
|
+
grpc_slice_buffer_reset_and_unref(unprotected_slices);
|
75
76
|
return TSI_OK;
|
76
77
|
}
|
77
78
|
|
@@ -138,14 +139,13 @@ static tsi_result alts_grpc_integrity_only_unprotect(
|
|
138
139
|
alts_grpc_integrity_only_record_protocol* integrity_only_record_protocol =
|
139
140
|
reinterpret_cast<alts_grpc_integrity_only_record_protocol*>(rp);
|
140
141
|
/* Strips frame header from protected slices. */
|
141
|
-
|
142
|
+
grpc_slice_buffer_reset_and_unref(&rp->header_sb);
|
142
143
|
grpc_slice_buffer_move_first(protected_slices, rp->header_length,
|
143
144
|
&rp->header_sb);
|
144
145
|
GPR_ASSERT(rp->header_sb.length == rp->header_length);
|
145
146
|
iovec_t header_iovec = alts_grpc_record_protocol_get_header_iovec(rp);
|
146
147
|
/* Moves protected slices data to data_sb and leaves the remaining tag. */
|
147
|
-
|
148
|
-
&integrity_only_record_protocol->data_sb);
|
148
|
+
grpc_slice_buffer_reset_and_unref(&integrity_only_record_protocol->data_sb);
|
149
149
|
grpc_slice_buffer_move_first(protected_slices,
|
150
150
|
protected_slices->length - rp->tag_length,
|
151
151
|
&integrity_only_record_protocol->data_sb);
|
@@ -173,8 +173,8 @@ static tsi_result alts_grpc_integrity_only_unprotect(
|
|
173
173
|
gpr_free(error_details);
|
174
174
|
return TSI_INTERNAL_ERROR;
|
175
175
|
}
|
176
|
-
|
177
|
-
|
176
|
+
grpc_slice_buffer_reset_and_unref(&rp->header_sb);
|
177
|
+
grpc_slice_buffer_reset_and_unref(protected_slices);
|
178
178
|
grpc_slice_buffer_move_into(&integrity_only_record_protocol->data_sb,
|
179
179
|
unprotected_slices);
|
180
180
|
return TSI_OK;
|
@@ -186,7 +186,7 @@ static void alts_grpc_integrity_only_destruct(alts_grpc_record_protocol* rp) {
|
|
186
186
|
}
|
187
187
|
alts_grpc_integrity_only_record_protocol* integrity_only_rp =
|
188
188
|
reinterpret_cast<alts_grpc_integrity_only_record_protocol*>(rp);
|
189
|
-
|
189
|
+
grpc_slice_buffer_destroy(&integrity_only_rp->data_sb);
|
190
190
|
gpr_free(integrity_only_rp->tag_buf);
|
191
191
|
}
|
192
192
|
|