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
@@ -18,17 +18,12 @@
|
|
18
18
|
|
19
19
|
#include "src/core/ext/filters/client_channel/retry_service_config.h"
|
20
20
|
|
21
|
-
#include <stdio.h>
|
22
|
-
#include <string.h>
|
23
|
-
|
24
|
-
#include <algorithm>
|
25
21
|
#include <map>
|
26
22
|
#include <string>
|
27
23
|
#include <utility>
|
28
24
|
#include <vector>
|
29
25
|
|
30
|
-
#include "absl/
|
31
|
-
#include "absl/status/status.h"
|
26
|
+
#include "absl/strings/numbers.h"
|
32
27
|
#include "absl/strings/str_cat.h"
|
33
28
|
#include "absl/types/optional.h"
|
34
29
|
|
@@ -39,9 +34,7 @@
|
|
39
34
|
#include "src/core/lib/channel/channel_args.h"
|
40
35
|
#include "src/core/lib/channel/status_util.h"
|
41
36
|
#include "src/core/lib/config/core_configuration.h"
|
42
|
-
#include "src/core/lib/
|
43
|
-
#include "src/core/lib/iomgr/error.h"
|
44
|
-
#include "src/core/lib/json/json_util.h"
|
37
|
+
#include "src/core/lib/json/json_channel_args.h"
|
45
38
|
|
46
39
|
// As per the retry design, we do not allow more than 5 retry attempts.
|
47
40
|
#define MAX_MAX_RETRY_ATTEMPTS 5
|
@@ -49,275 +42,240 @@
|
|
49
42
|
namespace grpc_core {
|
50
43
|
namespace internal {
|
51
44
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
}
|
45
|
+
//
|
46
|
+
// RetryGlobalConfig
|
47
|
+
//
|
56
48
|
|
57
|
-
|
58
|
-
|
59
|
-
|
49
|
+
const JsonLoaderInterface* RetryGlobalConfig::JsonLoader(const JsonArgs&) {
|
50
|
+
// Note: Both fields require custom processing, so they're handled in
|
51
|
+
// JsonPostLoad() instead.
|
52
|
+
static const auto* loader = JsonObjectLoader<RetryGlobalConfig>().Finish();
|
53
|
+
return loader;
|
60
54
|
}
|
61
55
|
|
62
|
-
|
63
|
-
|
64
|
-
grpc_error_handle ParseRetryThrottling(const Json& json,
|
65
|
-
intptr_t* max_milli_tokens,
|
66
|
-
intptr_t* milli_token_ratio) {
|
67
|
-
if (json.type() != Json::Type::OBJECT) {
|
68
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
69
|
-
"field:retryThrottling error:Type should be object");
|
70
|
-
}
|
71
|
-
std::vector<grpc_error_handle> error_list;
|
56
|
+
void RetryGlobalConfig::JsonPostLoad(const Json& json, const JsonArgs& args,
|
57
|
+
ValidationErrors* errors) {
|
72
58
|
// Parse maxTokens.
|
73
|
-
auto
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
*max_milli_tokens =
|
83
|
-
gpr_parse_nonnegative_int(it->second.string_value().c_str()) * 1000;
|
84
|
-
if (*max_milli_tokens <= 0) {
|
85
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
86
|
-
"field:retryThrottling field:maxTokens error:should be "
|
87
|
-
"greater than zero"));
|
59
|
+
auto max_tokens = LoadJsonObjectField<uint32_t>(json.object_value(), args,
|
60
|
+
"maxTokens", errors);
|
61
|
+
if (max_tokens.has_value()) {
|
62
|
+
ValidationErrors::ScopedField field(errors, ".maxTokens");
|
63
|
+
if (*max_tokens == 0) {
|
64
|
+
errors->AddError("must be greater than 0");
|
65
|
+
} else {
|
66
|
+
// Multiply by 1000 to represent as milli-tokens.
|
67
|
+
max_milli_tokens_ = static_cast<uintptr_t>(*max_tokens) * 1000;
|
88
68
|
}
|
89
69
|
}
|
90
70
|
// Parse tokenRatio.
|
91
|
-
|
71
|
+
ValidationErrors::ScopedField field(errors, ".tokenRatio");
|
72
|
+
auto it = json.object_value().find("tokenRatio");
|
92
73
|
if (it == json.object_value().end()) {
|
93
|
-
|
94
|
-
|
95
|
-
}
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
74
|
+
errors->AddError("field not present");
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
if (it->second.type() != Json::Type::NUMBER &&
|
78
|
+
it->second.type() != Json::Type::STRING) {
|
79
|
+
errors->AddError("is not a number");
|
80
|
+
return;
|
81
|
+
}
|
82
|
+
absl::string_view buf = it->second.string_value();
|
83
|
+
uint32_t multiplier = 1;
|
84
|
+
uint32_t decimal_value = 0;
|
85
|
+
auto decimal_point = buf.find('.');
|
86
|
+
if (decimal_point != absl::string_view::npos) {
|
87
|
+
absl::string_view after_decimal = buf.substr(decimal_point + 1);
|
88
|
+
buf = buf.substr(0, decimal_point);
|
100
89
|
// We support up to 3 decimal digits.
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
whole_len = static_cast<size_t>(decimal_point - value);
|
108
|
-
multiplier = 1000;
|
109
|
-
size_t decimal_len = strlen(decimal_point + 1);
|
110
|
-
if (decimal_len > 3) decimal_len = 3;
|
111
|
-
if (!gpr_parse_bytes_to_uint32(decimal_point + 1, decimal_len,
|
112
|
-
&decimal_value)) {
|
113
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
114
|
-
"field:retryThrottling field:tokenRatio error:Failed "
|
115
|
-
"parsing"));
|
116
|
-
return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
|
117
|
-
}
|
118
|
-
uint32_t decimal_multiplier = 1;
|
119
|
-
for (size_t i = 0; i < (3 - decimal_len); ++i) {
|
120
|
-
decimal_multiplier *= 10;
|
121
|
-
}
|
122
|
-
decimal_value *= decimal_multiplier;
|
123
|
-
}
|
124
|
-
uint32_t whole_value;
|
125
|
-
if (!gpr_parse_bytes_to_uint32(value, whole_len, &whole_value)) {
|
126
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
127
|
-
"field:retryThrottling field:tokenRatio error:Failed "
|
128
|
-
"parsing"));
|
129
|
-
return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
|
90
|
+
multiplier = 1000;
|
91
|
+
if (after_decimal.length() > 3) after_decimal = after_decimal.substr(0, 3);
|
92
|
+
// Parse decimal value.
|
93
|
+
if (!absl::SimpleAtoi(after_decimal, &decimal_value)) {
|
94
|
+
errors->AddError("could not parse as a number");
|
95
|
+
return;
|
130
96
|
}
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
135
|
-
"field:retryThrottling field:tokenRatio error:value should "
|
136
|
-
"be greater than 0"));
|
97
|
+
uint32_t decimal_multiplier = 1;
|
98
|
+
for (size_t i = 0; i < (3 - after_decimal.length()); ++i) {
|
99
|
+
decimal_multiplier *= 10;
|
137
100
|
}
|
101
|
+
decimal_value *= decimal_multiplier;
|
102
|
+
}
|
103
|
+
uint32_t whole_value;
|
104
|
+
if (!absl::SimpleAtoi(buf, &whole_value)) {
|
105
|
+
errors->AddError("could not parse as a number");
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
milli_token_ratio_ =
|
109
|
+
static_cast<int>((whole_value * multiplier) + decimal_value);
|
110
|
+
if (milli_token_ratio_ <= 0) {
|
111
|
+
errors->AddError("must be greater than 0");
|
138
112
|
}
|
139
|
-
return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
|
140
113
|
}
|
141
114
|
|
142
|
-
|
115
|
+
//
|
116
|
+
// RetryMethodConfig
|
117
|
+
//
|
143
118
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
return status;
|
159
|
-
}
|
160
|
-
return absl::make_unique<RetryGlobalConfig>(max_milli_tokens,
|
161
|
-
milli_token_ratio);
|
119
|
+
const JsonLoaderInterface* RetryMethodConfig::JsonLoader(const JsonArgs&) {
|
120
|
+
static const auto* loader =
|
121
|
+
JsonObjectLoader<RetryMethodConfig>()
|
122
|
+
// Note: The "retryableStatusCodes" field requires custom parsing,
|
123
|
+
// so it's handled in JsonPostLoad() instead.
|
124
|
+
.Field("maxAttempts", &RetryMethodConfig::max_attempts_)
|
125
|
+
.Field("initialBackoff", &RetryMethodConfig::initial_backoff_)
|
126
|
+
.Field("maxBackoff", &RetryMethodConfig::max_backoff_)
|
127
|
+
.Field("backoffMultiplier", &RetryMethodConfig::backoff_multiplier_)
|
128
|
+
.OptionalField("perAttemptRecvTimeout",
|
129
|
+
&RetryMethodConfig::per_attempt_recv_timeout_,
|
130
|
+
GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING)
|
131
|
+
.Finish();
|
132
|
+
return loader;
|
162
133
|
}
|
163
134
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
"field:retryPolicy error:should be of type object");
|
174
|
-
}
|
175
|
-
std::vector<grpc_error_handle> error_list;
|
176
|
-
// Parse maxAttempts.
|
177
|
-
auto it = json.object_value().find("maxAttempts");
|
178
|
-
if (it == json.object_value().end()) {
|
179
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
180
|
-
"field:maxAttempts error:required field missing"));
|
181
|
-
} else {
|
182
|
-
if (it->second.type() != Json::Type::NUMBER) {
|
183
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
184
|
-
"field:maxAttempts error:should be of type number"));
|
185
|
-
} else {
|
186
|
-
*max_attempts =
|
187
|
-
gpr_parse_nonnegative_int(it->second.string_value().c_str());
|
188
|
-
if (*max_attempts <= 1) {
|
189
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
190
|
-
"field:maxAttempts error:should be at least 2"));
|
191
|
-
} else if (*max_attempts > MAX_MAX_RETRY_ATTEMPTS) {
|
135
|
+
void RetryMethodConfig::JsonPostLoad(const Json& json, const JsonArgs& args,
|
136
|
+
ValidationErrors* errors) {
|
137
|
+
// Validate maxAttempts.
|
138
|
+
{
|
139
|
+
ValidationErrors::ScopedField field(errors, ".maxAttempts");
|
140
|
+
if (!errors->FieldHasErrors()) {
|
141
|
+
if (max_attempts_ <= 1) {
|
142
|
+
errors->AddError("must be at least 2");
|
143
|
+
} else if (max_attempts_ > MAX_MAX_RETRY_ATTEMPTS) {
|
192
144
|
gpr_log(GPR_ERROR,
|
193
145
|
"service config: clamped retryPolicy.maxAttempts at %d",
|
194
146
|
MAX_MAX_RETRY_ATTEMPTS);
|
195
|
-
|
147
|
+
max_attempts_ = MAX_MAX_RETRY_ATTEMPTS;
|
196
148
|
}
|
197
149
|
}
|
198
150
|
}
|
199
|
-
//
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
151
|
+
// Validate initialBackoff.
|
152
|
+
{
|
153
|
+
ValidationErrors::ScopedField field(errors, ".initialBackoff");
|
154
|
+
if (!errors->FieldHasErrors() && initial_backoff_ == Duration::Zero()) {
|
155
|
+
errors->AddError("must be greater than 0");
|
156
|
+
}
|
205
157
|
}
|
206
|
-
//
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
158
|
+
// Validate maxBackoff.
|
159
|
+
{
|
160
|
+
ValidationErrors::ScopedField field(errors, ".maxBackoff");
|
161
|
+
if (!errors->FieldHasErrors() && max_backoff_ == Duration::Zero()) {
|
162
|
+
errors->AddError("must be greater than 0");
|
163
|
+
}
|
212
164
|
}
|
213
|
-
//
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
} else {
|
219
|
-
if (it->second.type() != Json::Type::NUMBER) {
|
220
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
221
|
-
"field:backoffMultiplier error:should be of type number"));
|
222
|
-
} else {
|
223
|
-
if (sscanf(it->second.string_value().c_str(), "%f", backoff_multiplier) !=
|
224
|
-
1) {
|
225
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
226
|
-
"field:backoffMultiplier error:failed to parse"));
|
227
|
-
} else if (*backoff_multiplier <= 0) {
|
228
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
229
|
-
"field:backoffMultiplier error:must be greater than 0"));
|
230
|
-
}
|
165
|
+
// Validate backoffMultiplier.
|
166
|
+
{
|
167
|
+
ValidationErrors::ScopedField field(errors, ".backoffMultiplier");
|
168
|
+
if (!errors->FieldHasErrors() && backoff_multiplier_ <= 0) {
|
169
|
+
errors->AddError("must be greater than 0");
|
231
170
|
}
|
232
171
|
}
|
233
172
|
// Parse retryableStatusCodes.
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
grpc_status_code status;
|
248
|
-
if (!grpc_status_code_from_string(element.string_value().c_str(),
|
249
|
-
&status)) {
|
250
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
251
|
-
"field:retryableStatusCodes error:failed to parse status code"));
|
252
|
-
continue;
|
253
|
-
}
|
254
|
-
retryable_status_codes->Add(status);
|
173
|
+
auto status_code_list = LoadJsonObjectField<std::vector<std::string>>(
|
174
|
+
json.object_value(), args, "retryableStatusCodes", errors,
|
175
|
+
/*required=*/false);
|
176
|
+
if (status_code_list.has_value()) {
|
177
|
+
for (size_t i = 0; i < status_code_list->size(); ++i) {
|
178
|
+
ValidationErrors::ScopedField field(
|
179
|
+
errors, absl::StrCat(".retryableStatusCodes[", i, "]"));
|
180
|
+
grpc_status_code status;
|
181
|
+
if (!grpc_status_code_from_string((*status_code_list)[i].c_str(),
|
182
|
+
&status)) {
|
183
|
+
errors->AddError("failed to parse status code");
|
184
|
+
} else {
|
185
|
+
retryable_status_codes_.Add(status);
|
255
186
|
}
|
256
187
|
}
|
257
188
|
}
|
258
|
-
//
|
259
|
-
if (args.
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
if
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
} else {
|
268
|
-
*per_attempt_recv_timeout = per_attempt_recv_timeout_value;
|
269
|
-
// TODO(roth): As part of implementing hedging, relax this check such
|
270
|
-
// that we allow a value of 0 if a hedging policy is specified.
|
271
|
-
if (per_attempt_recv_timeout_value == Duration::Zero()) {
|
272
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
273
|
-
"field:perAttemptRecvTimeout error:must be greater than 0"));
|
274
|
-
}
|
189
|
+
// Validate perAttemptRecvTimeout.
|
190
|
+
if (args.IsEnabled(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING)) {
|
191
|
+
if (per_attempt_recv_timeout_.has_value()) {
|
192
|
+
ValidationErrors::ScopedField field(errors, ".perAttemptRecvTimeout");
|
193
|
+
// TODO(roth): As part of implementing hedging, relax this check such
|
194
|
+
// that we allow a value of 0 if a hedging policy is specified.
|
195
|
+
if (!errors->FieldHasErrors() &&
|
196
|
+
*per_attempt_recv_timeout_ == Duration::Zero()) {
|
197
|
+
errors->AddError("must be greater than 0");
|
275
198
|
}
|
276
|
-
} else if (
|
199
|
+
} else if (retryable_status_codes_.Empty()) {
|
277
200
|
// If perAttemptRecvTimeout not present, retryableStatusCodes must be
|
278
201
|
// non-empty.
|
279
|
-
|
280
|
-
|
281
|
-
|
202
|
+
ValidationErrors::ScopedField field(errors, ".retryableStatusCodes");
|
203
|
+
if (!errors->FieldHasErrors()) {
|
204
|
+
errors->AddError(
|
205
|
+
"must be non-empty if perAttemptRecvTimeout not present");
|
206
|
+
}
|
282
207
|
}
|
283
|
-
} else {
|
208
|
+
} else if (retryable_status_codes_.Empty()) {
|
284
209
|
// Hedging not enabled, so the error message for
|
285
210
|
// retryableStatusCodes unset should be different.
|
286
|
-
|
287
|
-
|
288
|
-
|
211
|
+
ValidationErrors::ScopedField field(errors, ".retryableStatusCodes");
|
212
|
+
if (!errors->FieldHasErrors()) {
|
213
|
+
errors->AddError("must be non-empty");
|
289
214
|
}
|
290
215
|
}
|
291
|
-
return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list);
|
292
216
|
}
|
293
217
|
|
218
|
+
//
|
219
|
+
// RetryServiceConfigParser
|
220
|
+
//
|
221
|
+
|
222
|
+
size_t RetryServiceConfigParser::ParserIndex() {
|
223
|
+
return CoreConfiguration::Get().service_config_parser().GetParserIndex(
|
224
|
+
parser_name());
|
225
|
+
}
|
226
|
+
|
227
|
+
void RetryServiceConfigParser::Register(CoreConfiguration::Builder* builder) {
|
228
|
+
builder->service_config_parser()->RegisterParser(
|
229
|
+
std::make_unique<RetryServiceConfigParser>());
|
230
|
+
}
|
231
|
+
|
232
|
+
namespace {
|
233
|
+
|
234
|
+
struct GlobalConfig {
|
235
|
+
std::unique_ptr<RetryGlobalConfig> retry_throttling;
|
236
|
+
|
237
|
+
static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
|
238
|
+
static const auto* loader =
|
239
|
+
JsonObjectLoader<GlobalConfig>()
|
240
|
+
.OptionalField("retryThrottling", &GlobalConfig::retry_throttling)
|
241
|
+
.Finish();
|
242
|
+
return loader;
|
243
|
+
}
|
244
|
+
};
|
245
|
+
|
246
|
+
} // namespace
|
247
|
+
|
248
|
+
std::unique_ptr<ServiceConfigParser::ParsedConfig>
|
249
|
+
RetryServiceConfigParser::ParseGlobalParams(const ChannelArgs& /*args*/,
|
250
|
+
const Json& json,
|
251
|
+
ValidationErrors* errors) {
|
252
|
+
auto global_params = LoadFromJson<GlobalConfig>(json, JsonArgs(), errors);
|
253
|
+
return std::move(global_params.retry_throttling);
|
254
|
+
}
|
255
|
+
|
256
|
+
namespace {
|
257
|
+
|
258
|
+
struct MethodConfig {
|
259
|
+
std::unique_ptr<RetryMethodConfig> retry_policy;
|
260
|
+
|
261
|
+
static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
|
262
|
+
static const auto* loader =
|
263
|
+
JsonObjectLoader<MethodConfig>()
|
264
|
+
.OptionalField("retryPolicy", &MethodConfig::retry_policy)
|
265
|
+
.Finish();
|
266
|
+
return loader;
|
267
|
+
}
|
268
|
+
};
|
269
|
+
|
294
270
|
} // namespace
|
295
271
|
|
296
|
-
|
272
|
+
std::unique_ptr<ServiceConfigParser::ParsedConfig>
|
297
273
|
RetryServiceConfigParser::ParsePerMethodParams(const ChannelArgs& args,
|
298
|
-
const Json& json
|
299
|
-
|
300
|
-
auto
|
301
|
-
|
302
|
-
|
303
|
-
Duration initial_backoff;
|
304
|
-
Duration max_backoff;
|
305
|
-
float backoff_multiplier = 0;
|
306
|
-
StatusCodeSet retryable_status_codes;
|
307
|
-
absl::optional<Duration> per_attempt_recv_timeout;
|
308
|
-
grpc_error_handle error = ParseRetryPolicy(
|
309
|
-
args, it->second, &max_attempts, &initial_backoff, &max_backoff,
|
310
|
-
&backoff_multiplier, &retryable_status_codes, &per_attempt_recv_timeout);
|
311
|
-
if (!GRPC_ERROR_IS_NONE(error)) {
|
312
|
-
absl::Status status = absl::InvalidArgumentError(
|
313
|
-
absl::StrCat("error parsing retry method parameters: ",
|
314
|
-
grpc_error_std_string(error)));
|
315
|
-
GRPC_ERROR_UNREF(error);
|
316
|
-
return status;
|
317
|
-
}
|
318
|
-
return absl::make_unique<RetryMethodConfig>(
|
319
|
-
max_attempts, initial_backoff, max_backoff, backoff_multiplier,
|
320
|
-
retryable_status_codes, per_attempt_recv_timeout);
|
274
|
+
const Json& json,
|
275
|
+
ValidationErrors* errors) {
|
276
|
+
auto method_params =
|
277
|
+
LoadFromJson<MethodConfig>(json, JsonChannelArgs(args), errors);
|
278
|
+
return std::move(method_params.retry_policy);
|
321
279
|
}
|
322
280
|
|
323
281
|
} // namespace internal
|
@@ -24,7 +24,6 @@
|
|
24
24
|
|
25
25
|
#include <memory>
|
26
26
|
|
27
|
-
#include "absl/status/statusor.h"
|
28
27
|
#include "absl/strings/string_view.h"
|
29
28
|
#include "absl/types/optional.h"
|
30
29
|
|
@@ -32,7 +31,10 @@
|
|
32
31
|
#include "src/core/lib/channel/status_util.h"
|
33
32
|
#include "src/core/lib/config/core_configuration.h"
|
34
33
|
#include "src/core/lib/gprpp/time.h"
|
34
|
+
#include "src/core/lib/gprpp/validation_errors.h"
|
35
35
|
#include "src/core/lib/json/json.h"
|
36
|
+
#include "src/core/lib/json/json_args.h"
|
37
|
+
#include "src/core/lib/json/json_object_loader.h"
|
36
38
|
#include "src/core/lib/service_config/service_config_parser.h"
|
37
39
|
|
38
40
|
namespace grpc_core {
|
@@ -40,31 +42,20 @@ namespace internal {
|
|
40
42
|
|
41
43
|
class RetryGlobalConfig : public ServiceConfigParser::ParsedConfig {
|
42
44
|
public:
|
43
|
-
|
44
|
-
|
45
|
-
milli_token_ratio_(milli_token_ratio) {}
|
45
|
+
uintptr_t max_milli_tokens() const { return max_milli_tokens_; }
|
46
|
+
uintptr_t milli_token_ratio() const { return milli_token_ratio_; }
|
46
47
|
|
47
|
-
|
48
|
-
|
48
|
+
static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
|
49
|
+
void JsonPostLoad(const Json& json, const JsonArgs& args,
|
50
|
+
ValidationErrors* errors);
|
49
51
|
|
50
52
|
private:
|
51
|
-
|
52
|
-
|
53
|
+
uintptr_t max_milli_tokens_ = 0;
|
54
|
+
uintptr_t milli_token_ratio_ = 0;
|
53
55
|
};
|
54
56
|
|
55
57
|
class RetryMethodConfig : public ServiceConfigParser::ParsedConfig {
|
56
58
|
public:
|
57
|
-
RetryMethodConfig(int max_attempts, Duration initial_backoff,
|
58
|
-
Duration max_backoff, float backoff_multiplier,
|
59
|
-
StatusCodeSet retryable_status_codes,
|
60
|
-
absl::optional<Duration> per_attempt_recv_timeout)
|
61
|
-
: max_attempts_(max_attempts),
|
62
|
-
initial_backoff_(initial_backoff),
|
63
|
-
max_backoff_(max_backoff),
|
64
|
-
backoff_multiplier_(backoff_multiplier),
|
65
|
-
retryable_status_codes_(retryable_status_codes),
|
66
|
-
per_attempt_recv_timeout_(per_attempt_recv_timeout) {}
|
67
|
-
|
68
59
|
int max_attempts() const { return max_attempts_; }
|
69
60
|
Duration initial_backoff() const { return initial_backoff_; }
|
70
61
|
Duration max_backoff() const { return max_backoff_; }
|
@@ -76,6 +67,10 @@ class RetryMethodConfig : public ServiceConfigParser::ParsedConfig {
|
|
76
67
|
return per_attempt_recv_timeout_;
|
77
68
|
}
|
78
69
|
|
70
|
+
static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
|
71
|
+
void JsonPostLoad(const Json& json, const JsonArgs& args,
|
72
|
+
ValidationErrors* errors);
|
73
|
+
|
79
74
|
private:
|
80
75
|
int max_attempts_ = 0;
|
81
76
|
Duration initial_backoff_;
|
@@ -89,11 +84,13 @@ class RetryServiceConfigParser : public ServiceConfigParser::Parser {
|
|
89
84
|
public:
|
90
85
|
absl::string_view name() const override { return parser_name(); }
|
91
86
|
|
92
|
-
|
93
|
-
|
87
|
+
std::unique_ptr<ServiceConfigParser::ParsedConfig> ParseGlobalParams(
|
88
|
+
const ChannelArgs& /*args*/, const Json& json,
|
89
|
+
ValidationErrors* errors) override;
|
94
90
|
|
95
|
-
|
96
|
-
|
91
|
+
std::unique_ptr<ServiceConfigParser::ParsedConfig> ParsePerMethodParams(
|
92
|
+
const ChannelArgs& args, const Json& json,
|
93
|
+
ValidationErrors* errors) override;
|
97
94
|
|
98
95
|
static size_t ParserIndex();
|
99
96
|
static void Register(CoreConfiguration::Builder* builder);
|
@@ -34,22 +34,22 @@ namespace internal {
|
|
34
34
|
//
|
35
35
|
|
36
36
|
ServerRetryThrottleData::ServerRetryThrottleData(
|
37
|
-
|
37
|
+
uintptr_t max_milli_tokens, uintptr_t milli_token_ratio,
|
38
38
|
ServerRetryThrottleData* old_throttle_data)
|
39
39
|
: max_milli_tokens_(max_milli_tokens),
|
40
40
|
milli_token_ratio_(milli_token_ratio) {
|
41
|
-
|
41
|
+
uintptr_t initial_milli_tokens = max_milli_tokens;
|
42
42
|
// If there was a pre-existing entry for this server name, initialize
|
43
43
|
// the token count by scaling proportionately to the old data. This
|
44
44
|
// ensures that if we're already throttling retries on the old scale,
|
45
45
|
// we will start out doing the same thing on the new one.
|
46
46
|
if (old_throttle_data != nullptr) {
|
47
47
|
double token_fraction =
|
48
|
-
static_cast<
|
48
|
+
static_cast<uintptr_t>(
|
49
49
|
gpr_atm_acq_load(&old_throttle_data->milli_tokens_)) /
|
50
50
|
static_cast<double>(old_throttle_data->max_milli_tokens_);
|
51
51
|
initial_milli_tokens =
|
52
|
-
static_cast<
|
52
|
+
static_cast<uintptr_t>(token_fraction * max_milli_tokens);
|
53
53
|
}
|
54
54
|
gpr_atm_rel_store(&milli_tokens_, static_cast<gpr_atm>(initial_milli_tokens));
|
55
55
|
// If there was a pre-existing entry, mark it as stale and give it a
|
@@ -86,8 +86,8 @@ bool ServerRetryThrottleData::RecordFailure() {
|
|
86
86
|
ServerRetryThrottleData* throttle_data = this;
|
87
87
|
GetReplacementThrottleDataIfNeeded(&throttle_data);
|
88
88
|
// We decrement milli_tokens by 1000 (1 token) for each failure.
|
89
|
-
const
|
90
|
-
static_cast<
|
89
|
+
const uintptr_t new_value =
|
90
|
+
static_cast<uintptr_t>(gpr_atm_no_barrier_clamped_add(
|
91
91
|
&throttle_data->milli_tokens_, static_cast<gpr_atm>(-1000),
|
92
92
|
static_cast<gpr_atm>(0),
|
93
93
|
static_cast<gpr_atm>(throttle_data->max_milli_tokens_)));
|
@@ -118,8 +118,8 @@ ServerRetryThrottleMap* ServerRetryThrottleMap::Get() {
|
|
118
118
|
}
|
119
119
|
|
120
120
|
RefCountedPtr<ServerRetryThrottleData> ServerRetryThrottleMap::GetDataForServer(
|
121
|
-
const std::string& server_name,
|
122
|
-
|
121
|
+
const std::string& server_name, uintptr_t max_milli_tokens,
|
122
|
+
uintptr_t milli_token_ratio) {
|
123
123
|
MutexLock lock(&mu_);
|
124
124
|
auto it = map_.find(server_name);
|
125
125
|
ServerRetryThrottleData* throttle_data =
|