grpc 1.50.0.pre1 → 1.52.0.pre2
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 +206 -49
- data/include/grpc/byte_buffer.h +76 -1
- data/include/grpc/byte_buffer_reader.h +19 -1
- data/include/grpc/compression.h +2 -2
- data/include/grpc/event_engine/event_engine.h +27 -6
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
- data/include/grpc/event_engine/internal/slice_cast.h +67 -0
- data/include/grpc/event_engine/memory_allocator.h +1 -1
- data/include/grpc/event_engine/slice.h +24 -4
- data/include/grpc/event_engine/slice_buffer.h +31 -2
- data/include/grpc/fork.h +25 -1
- data/include/grpc/grpc.h +3 -13
- data/include/grpc/grpc_posix.h +1 -1
- data/include/grpc/impl/codegen/atm.h +3 -71
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
- data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
- data/include/grpc/impl/codegen/atm_windows.h +3 -106
- data/include/grpc/impl/codegen/byte_buffer.h +4 -78
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
- data/include/grpc/impl/codegen/compression_types.h +3 -82
- data/include/grpc/impl/codegen/connectivity_state.h +3 -20
- data/include/grpc/impl/codegen/fork.h +4 -25
- data/include/grpc/impl/codegen/gpr_types.h +2 -34
- data/include/grpc/impl/codegen/grpc_types.h +3 -791
- data/include/grpc/impl/codegen/log.h +3 -86
- data/include/grpc/impl/codegen/port_platform.h +3 -758
- data/include/grpc/impl/codegen/propagation_bits.h +3 -28
- data/include/grpc/impl/codegen/slice.h +3 -106
- data/include/grpc/impl/codegen/status.h +4 -131
- data/include/grpc/impl/codegen/sync.h +3 -42
- data/include/grpc/impl/codegen/sync_abseil.h +3 -12
- data/include/grpc/impl/codegen/sync_custom.h +3 -14
- data/include/grpc/impl/codegen/sync_generic.h +3 -25
- data/include/grpc/impl/codegen/sync_posix.h +3 -28
- data/include/grpc/impl/codegen/sync_windows.h +3 -16
- data/include/grpc/impl/compression_types.h +109 -0
- data/include/grpc/impl/connectivity_state.h +47 -0
- data/include/grpc/impl/grpc_types.h +824 -0
- data/include/grpc/impl/propagation_bits.h +54 -0
- data/include/grpc/impl/slice_type.h +112 -0
- data/include/grpc/load_reporting.h +1 -1
- data/include/grpc/module.modulemap +5 -1
- data/include/grpc/slice.h +1 -1
- data/include/grpc/status.h +131 -1
- data/include/grpc/support/atm.h +70 -1
- data/include/grpc/support/atm_gcc_atomic.h +59 -1
- data/include/grpc/support/atm_gcc_sync.h +58 -1
- data/include/grpc/support/atm_windows.h +105 -1
- data/include/grpc/support/log.h +87 -1
- data/include/grpc/support/log_windows.h +1 -1
- data/include/grpc/support/port_platform.h +767 -1
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +35 -2
- data/include/grpc/support/sync_abseil.h +11 -1
- data/include/grpc/support/sync_custom.h +13 -1
- data/include/grpc/support/sync_generic.h +24 -1
- data/include/grpc/support/sync_posix.h +27 -1
- data/include/grpc/support/sync_windows.h +15 -1
- data/include/grpc/support/time.h +25 -2
- data/src/core/ext/filters/census/grpc_context.cc +17 -18
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
- data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
- data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
- data/src/core/ext/filters/client_channel/client_channel.h +10 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
- 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/config_selector.h +16 -20
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
- data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
- data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
- 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_balancer_addresses.h +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
- 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 +212 -223
- 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 +11 -22
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
- 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 +22 -28
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
- 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 +122 -119
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
- data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
- data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
- data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
- data/src/core/ext/filters/client_channel/subchannel.h +17 -40
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
- data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
- 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 +36 -37
- data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
- data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
- data/src/core/ext/filters/http/client_authority_filter.h +18 -18
- data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
- data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
- data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
- data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
- 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 +6 -8
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
- data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
- data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
- data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
- data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
- data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
- data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
- data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
- data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
- data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
- data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
- data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
- data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
- data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
- data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
- data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
- 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 +20 -95
- data/src/core/ext/xds/xds_api.h +5 -8
- 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_certificate_provider.h +1 -1
- data/src/core/ext/xds/xds_channel_args.h +1 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
- data/src/core/ext/xds/xds_client.cc +134 -94
- data/src/core/ext/xds/xds_client.h +13 -5
- data/src/core/ext/xds/xds_client_grpc.cc +31 -24
- data/src/core/ext/xds/xds_client_grpc.h +1 -1
- data/src/core/ext/xds/xds_client_stats.cc +17 -17
- data/src/core/ext/xds/xds_client_stats.h +18 -18
- data/src/core/ext/xds/xds_cluster.cc +359 -203
- data/src/core/ext/xds/xds_cluster.h +52 -35
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
- data/src/core/ext/xds/xds_common_types.cc +209 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +221 -130
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_health_status.cc +80 -0
- data/src/core/ext/xds/xds_health_status.h +82 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
- data/src/core/ext/xds/xds_http_filters.cc +65 -73
- data/src/core/ext/xds/xds_http_filters.h +68 -20
- data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +447 -419
- data/src/core/ext/xds/xds_listener.h +45 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
- data/src/core/ext/xds/xds_route_config.cc +514 -528
- data/src/core/ext/xds/xds_route_config.h +39 -28
- 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 -106
- data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
- data/src/core/ext/xds/xds_transport_grpc.h +1 -1
- data/src/core/lib/address_utils/parse_address.cc +30 -29
- data/src/core/lib/address_utils/parse_address.h +32 -32
- data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
- data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
- data/src/core/lib/avl/avl.h +4 -4
- data/src/core/lib/backoff/backoff.cc +17 -17
- data/src/core/lib/backoff/backoff.h +18 -18
- data/src/core/lib/channel/call_tracer.h +10 -1
- data/src/core/lib/channel/channel_args.cc +19 -20
- data/src/core/lib/channel/channel_args.h +59 -43
- data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
- data/src/core/lib/channel/channel_stack.cc +62 -58
- data/src/core/lib/channel/channel_stack.h +144 -131
- data/src/core/lib/channel/channel_stack_builder.cc +21 -24
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +21 -22
- data/src/core/lib/channel/channel_trace.h +19 -19
- data/src/core/lib/channel/channelz.cc +18 -19
- data/src/core/lib/channel/channelz.h +26 -26
- data/src/core/lib/channel/channelz_registry.cc +17 -17
- data/src/core/lib/channel/channelz_registry.h +18 -18
- data/src/core/lib/channel/connected_channel.cc +732 -63
- data/src/core/lib/channel/connected_channel.h +18 -22
- data/src/core/lib/channel/context.h +18 -18
- data/src/core/lib/channel/promise_based_filter.cc +1137 -150
- data/src/core/lib/channel/promise_based_filter.h +374 -88
- data/src/core/lib/channel/status_util.cc +35 -17
- data/src/core/lib/channel/status_util.h +26 -19
- data/src/core/lib/compression/compression.cc +19 -19
- data/src/core/lib/compression/compression_internal.cc +41 -48
- data/src/core/lib/compression/compression_internal.h +22 -22
- data/src/core/lib/compression/message_compress.cc +26 -26
- data/src/core/lib/compression/message_compress.h +25 -25
- data/src/core/lib/config/core_configuration.h +1 -1
- 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 +39 -136
- data/src/core/lib/debug/stats.h +46 -52
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/debug/trace.cc +18 -18
- data/src/core/lib/debug/trace.h +19 -19
- 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/executor/executor.h +1 -1
- data/src/core/lib/event_engine/forkable.h +1 -1
- 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 +614 -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 +900 -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} +11 -14
- 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 +265 -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 +1308 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
- 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/posix_engine_listener.cc +236 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
- data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
- data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
- data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -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 +150 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
- 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/socket_notifier.h +1 -1
- data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
- data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
- data/src/core/lib/event_engine/thread_pool.cc +125 -43
- data/src/core/lib/event_engine/thread_pool.h +49 -26
- data/src/core/lib/event_engine/time_util.h +1 -1
- data/src/core/lib/event_engine/windows/iocp.cc +13 -12
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
- data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
- 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 -13
- data/src/core/lib/experiments/experiments.h +8 -6
- data/src/core/lib/gpr/alloc.cc +19 -17
- data/src/core/lib/gpr/alloc.h +18 -18
- data/src/core/lib/gpr/atm.cc +17 -17
- data/src/core/lib/gpr/cpu_iphone.cc +24 -24
- data/src/core/lib/gpr/cpu_linux.cc +28 -23
- data/src/core/lib/gpr/cpu_posix.cc +23 -22
- data/src/core/lib/gpr/cpu_windows.cc +20 -18
- data/src/core/lib/gpr/log.cc +27 -19
- data/src/core/lib/gpr/log_android.cc +22 -20
- data/src/core/lib/gpr/log_linux.cc +24 -24
- data/src/core/lib/gpr/log_posix.cc +20 -19
- data/src/core/lib/gpr/log_windows.cc +25 -24
- data/src/core/lib/gpr/spinlock.h +18 -18
- data/src/core/lib/gpr/string.cc +25 -24
- data/src/core/lib/gpr/string.h +58 -58
- data/src/core/lib/gpr/string_posix.cc +24 -24
- data/src/core/lib/gpr/string_util_windows.cc +22 -22
- data/src/core/lib/gpr/string_windows.cc +24 -24
- data/src/core/lib/gpr/sync.cc +25 -25
- data/src/core/lib/gpr/sync_abseil.cc +22 -20
- data/src/core/lib/gpr/sync_posix.cc +23 -21
- data/src/core/lib/gpr/sync_windows.cc +29 -27
- data/src/core/lib/gpr/time.cc +23 -21
- data/src/core/lib/gpr/time_posix.cc +35 -30
- data/src/core/lib/gpr/time_precise.cc +22 -22
- data/src/core/lib/gpr/time_precise.h +18 -19
- data/src/core/lib/gpr/time_windows.cc +25 -22
- data/src/core/lib/gpr/tmpfile.h +22 -22
- data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
- data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
- data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
- data/src/core/lib/gpr/useful.h +40 -27
- data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
- data/src/core/lib/gprpp/atomic_utils.h +18 -18
- data/src/core/lib/gprpp/bitset.h +24 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
- data/src/core/lib/gprpp/crash.h +34 -0
- data/src/core/lib/gprpp/debug_location.h +18 -18
- data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
- data/src/core/lib/gprpp/env.h +20 -20
- data/src/core/lib/gprpp/env_linux.cc +21 -21
- data/src/core/lib/gprpp/env_posix.cc +18 -18
- data/src/core/lib/gprpp/env_windows.cc +18 -18
- data/src/core/lib/gprpp/examine_stack.cc +17 -17
- data/src/core/lib/gprpp/examine_stack.h +18 -18
- data/src/core/lib/gprpp/fork.cc +21 -22
- data/src/core/lib/gprpp/fork.h +22 -22
- data/src/core/lib/gprpp/global_config.h +18 -18
- data/src/core/lib/gprpp/global_config_custom.h +18 -18
- data/src/core/lib/gprpp/global_config_env.cc +17 -17
- data/src/core/lib/gprpp/global_config_env.h +23 -23
- data/src/core/lib/gprpp/global_config_generic.h +18 -18
- data/src/core/lib/gprpp/host_port.cc +26 -26
- data/src/core/lib/gprpp/host_port.h +29 -28
- 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/manual_constructor.h +18 -17
- data/src/core/lib/gprpp/memory.h +18 -18
- data/src/core/lib/gprpp/mpscq.cc +17 -17
- data/src/core/lib/gprpp/mpscq.h +18 -18
- data/src/core/lib/gprpp/no_destruct.h +1 -0
- data/src/core/lib/gprpp/orphanable.h +18 -18
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/ref_counted.h +18 -18
- data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +4 -2
- data/src/core/lib/gprpp/status_helper.cc +4 -3
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/lib/gprpp/strerror.h +29 -0
- data/src/core/lib/gprpp/sync.h +20 -20
- data/src/core/lib/gprpp/table.h +1 -0
- data/src/core/lib/gprpp/thd.h +19 -19
- data/src/core/lib/gprpp/thd_posix.cc +30 -31
- data/src/core/lib/gprpp/thd_windows.cc +26 -26
- data/src/core/lib/gprpp/time.cc +16 -11
- data/src/core/lib/gprpp/time.h +13 -3
- data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
- data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
- data/src/core/lib/gprpp/time_util.h +1 -1
- data/src/core/lib/gprpp/unique_type_name.h +18 -18
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/handshaker/proxy_mapper.h +18 -18
- data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
- data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
- data/src/core/lib/http/format_request.cc +18 -18
- data/src/core/lib/http/format_request.h +18 -18
- data/src/core/lib/http/httpcli.cc +57 -61
- data/src/core/lib/http/httpcli.h +26 -26
- data/src/core/lib/http/httpcli_security_connector.cc +22 -25
- data/src/core/lib/http/parser.cc +76 -87
- data/src/core/lib/http/parser.h +32 -32
- data/src/core/lib/iomgr/block_annotate.h +21 -21
- data/src/core/lib/iomgr/buffer_list.cc +156 -136
- data/src/core/lib/iomgr/buffer_list.h +120 -98
- data/src/core/lib/iomgr/call_combiner.cc +29 -27
- data/src/core/lib/iomgr/call_combiner.h +21 -22
- data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
- data/src/core/lib/iomgr/cfstream_handle.h +22 -22
- data/src/core/lib/iomgr/closure.h +90 -45
- data/src/core/lib/iomgr/combiner.cc +20 -19
- data/src/core/lib/iomgr/combiner.h +18 -18
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
- data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
- data/src/core/lib/iomgr/endpoint.cc +17 -17
- data/src/core/lib/iomgr/endpoint.h +46 -46
- data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
- data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
- data/src/core/lib/iomgr/endpoint_pair.h +18 -18
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
- data/src/core/lib/iomgr/error.cc +49 -61
- data/src/core/lib/iomgr/error.h +42 -173
- data/src/core/lib/iomgr/error_cfstream.cc +18 -18
- data/src/core/lib/iomgr/error_cfstream.h +19 -19
- data/src/core/lib/iomgr/ev_apple.cc +21 -21
- data/src/core/lib/iomgr/ev_apple.h +17 -17
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
- data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
- data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
- data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
- data/src/core/lib/iomgr/ev_posix.cc +36 -28
- data/src/core/lib/iomgr/ev_posix.h +85 -81
- data/src/core/lib/iomgr/ev_windows.cc +18 -18
- data/src/core/lib/iomgr/exec_ctx.cc +34 -34
- data/src/core/lib/iomgr/exec_ctx.h +141 -141
- data/src/core/lib/iomgr/executor.cc +21 -21
- data/src/core/lib/iomgr/executor.h +24 -24
- data/src/core/lib/iomgr/fork_posix.cc +24 -22
- data/src/core/lib/iomgr/fork_windows.cc +21 -21
- data/src/core/lib/iomgr/gethostname.h +18 -18
- data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
- data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
- data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
- data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
- data/src/core/lib/iomgr/internal_errqueue.h +80 -80
- data/src/core/lib/iomgr/iocp_windows.cc +22 -21
- data/src/core/lib/iomgr/iocp_windows.h +18 -18
- data/src/core/lib/iomgr/iomgr.cc +19 -18
- data/src/core/lib/iomgr/iomgr.h +32 -32
- data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
- data/src/core/lib/iomgr/iomgr_internal.h +25 -25
- data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
- data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
- data/src/core/lib/iomgr/load_file.cc +24 -27
- data/src/core/lib/iomgr/load_file.h +20 -20
- data/src/core/lib/iomgr/lockfree_event.cc +114 -114
- data/src/core/lib/iomgr/lockfree_event.h +19 -19
- data/src/core/lib/iomgr/nameser.h +84 -84
- data/src/core/lib/iomgr/polling_entity.cc +25 -21
- data/src/core/lib/iomgr/polling_entity.h +27 -27
- data/src/core/lib/iomgr/pollset.cc +17 -17
- data/src/core/lib/iomgr/pollset.h +51 -51
- data/src/core/lib/iomgr/pollset_set.cc +17 -17
- data/src/core/lib/iomgr/pollset_set.h +22 -22
- data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
- data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
- data/src/core/lib/iomgr/pollset_windows.cc +30 -29
- data/src/core/lib/iomgr/pollset_windows.h +22 -22
- data/src/core/lib/iomgr/port.h +29 -29
- data/src/core/lib/iomgr/python_util.h +20 -20
- data/src/core/lib/iomgr/resolve_address.cc +26 -20
- data/src/core/lib/iomgr/resolve_address.h +21 -22
- data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/resolved_address.h +1 -1
- data/src/core/lib/iomgr/sockaddr.h +21 -21
- data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
- data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
- data/src/core/lib/iomgr/socket_mutator.cc +19 -18
- data/src/core/lib/iomgr/socket_mutator.h +37 -37
- data/src/core/lib/iomgr/socket_utils.h +24 -24
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
- data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
- data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
- data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
- data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
- data/src/core/lib/iomgr/socket_windows.cc +37 -36
- data/src/core/lib/iomgr/socket_windows.h +56 -56
- data/src/core/lib/iomgr/systemd_utils.cc +116 -0
- data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
- data/src/core/lib/iomgr/tcp_client.cc +17 -17
- data/src/core/lib/iomgr/tcp_client.h +26 -26
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
- data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
- data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
- data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
- data/src/core/lib/iomgr/tcp_posix.cc +223 -237
- data/src/core/lib/iomgr/tcp_posix.h +27 -27
- data/src/core/lib/iomgr/tcp_server.cc +30 -22
- data/src/core/lib/iomgr/tcp_server.h +68 -62
- data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
- data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
- data/src/core/lib/iomgr/tcp_windows.cc +109 -93
- data/src/core/lib/iomgr/tcp_windows.h +29 -29
- data/src/core/lib/iomgr/timer.cc +17 -17
- data/src/core/lib/iomgr/timer.h +65 -65
- data/src/core/lib/iomgr/timer_generic.cc +115 -122
- data/src/core/lib/iomgr/timer_generic.h +19 -19
- data/src/core/lib/iomgr/timer_heap.cc +25 -25
- data/src/core/lib/iomgr/timer_heap.h +19 -19
- data/src/core/lib/iomgr/timer_manager.cc +30 -29
- data/src/core/lib/iomgr/timer_manager.h +25 -25
- data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
- data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +17 -2
- data/src/core/lib/json/json_object_loader.h +37 -1
- data/src/core/lib/json/json_reader.cc +28 -28
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/json/json_writer.cc +56 -56
- data/src/core/lib/load_balancing/lb_policy.cc +18 -18
- data/src/core/lib/load_balancing/lb_policy.h +7 -4
- data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
- data/src/core/lib/matchers/matchers.cc +6 -5
- data/src/core/lib/matchers/matchers.h +1 -1
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +58 -27
- data/src/core/lib/promise/arena_promise.h +82 -52
- data/src/core/lib/promise/context.h +14 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +59 -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 +20 -12
- data/src/core/lib/promise/for_each.h +155 -0
- data/src/core/lib/promise/latch.h +13 -19
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map.h +1 -0
- data/src/core/lib/promise/map_pipe.h +88 -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 +19 -0
- data/src/core/lib/promise/seq.h +4 -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 +342 -0
- data/src/core/lib/promise/try_seq.h +11 -13
- data/src/core/lib/resolver/resolver.cc +17 -17
- data/src/core/lib/resolver/server_address.cc +18 -17
- data/src/core/lib/resolver/server_address.h +19 -21
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/api.h +1 -1
- data/src/core/lib/resource_quota/arena.cc +36 -17
- data/src/core/lib/resource_quota/arena.h +107 -18
- data/src/core/lib/resource_quota/memory_quota.cc +140 -43
- data/src/core/lib/resource_quota/memory_quota.h +85 -23
- data/src/core/lib/resource_quota/resource_quota.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
- 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/authorization/rbac_policy.h +1 -1
- data/src/core/lib/security/context/security_context.cc +22 -23
- data/src/core/lib/security/context/security_context.h +40 -30
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
- data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
- data/src/core/lib/security/credentials/call_creds_util.h +1 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
- data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
- data/src/core/lib/security/credentials/credentials.cc +19 -18
- data/src/core/lib/security/credentials/credentials.h +34 -33
- 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 +20 -19
- data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
- data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
- data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
- data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
- data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
- data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
- 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 +30 -43
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
- data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
- 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 +3 -8
- data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
- data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
- data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
- data/src/core/lib/security/security_connector/security_connector.cc +17 -17
- data/src/core/lib/security/security_connector/security_connector.h +32 -33
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
- data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
- data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
- data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
- data/src/core/lib/security/transport/auth_filters.h +18 -18
- data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
- data/src/core/lib/security/transport/secure_endpoint.h +22 -22
- data/src/core/lib/security/transport/security_handshaker.cc +70 -70
- data/src/core/lib/security/transport/security_handshaker.h +19 -19
- data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
- data/src/core/lib/security/transport/tsi_error.cc +23 -20
- data/src/core/lib/security/transport/tsi_error.h +18 -18
- data/src/core/lib/security/util/json_util.cc +21 -22
- data/src/core/lib/security/util/json_util.h +18 -18
- data/src/core/lib/service_config/service_config.h +2 -2
- data/src/core/lib/service_config/service_config_call_data.h +7 -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 +26 -26
- data/src/core/lib/slice/b64.h +29 -29
- data/src/core/lib/slice/percent_encoding.cc +17 -17
- data/src/core/lib/slice/percent_encoding.h +24 -24
- data/src/core/lib/slice/slice.cc +44 -38
- data/src/core/lib/slice/slice.h +57 -11
- data/src/core/lib/slice/slice_buffer.cc +63 -59
- data/src/core/lib/slice/slice_buffer.h +27 -2
- data/src/core/lib/slice/slice_internal.h +31 -39
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/slice/slice_string_helpers.cc +17 -17
- data/src/core/lib/slice/slice_string_helpers.h +19 -19
- data/src/core/lib/surface/api_trace.cc +17 -17
- data/src/core/lib/surface/api_trace.h +22 -22
- data/src/core/lib/surface/byte_buffer.cc +22 -23
- data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
- data/src/core/lib/surface/call.cc +1521 -335
- data/src/core/lib/surface/call.h +86 -39
- data/src/core/lib/surface/call_details.cc +20 -21
- data/src/core/lib/surface/call_log_batch.cc +18 -18
- data/src/core/lib/surface/call_test_only.h +30 -30
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
- data/src/core/lib/surface/channel.cc +62 -67
- data/src/core/lib/surface/channel.h +40 -32
- data/src/core/lib/surface/channel_init.cc +17 -17
- data/src/core/lib/surface/channel_init.h +18 -18
- data/src/core/lib/surface/channel_ping.cc +19 -19
- data/src/core/lib/surface/channel_stack_type.cc +21 -17
- data/src/core/lib/surface/channel_stack_type.h +20 -18
- data/src/core/lib/surface/completion_queue.cc +173 -191
- data/src/core/lib/surface/completion_queue.h +32 -32
- data/src/core/lib/surface/completion_queue_factory.cc +28 -28
- data/src/core/lib/surface/completion_queue_factory.h +20 -20
- data/src/core/lib/surface/event_string.cc +17 -17
- data/src/core/lib/surface/event_string.h +20 -20
- data/src/core/lib/surface/init.cc +29 -58
- data/src/core/lib/surface/init.h +18 -18
- data/src/core/lib/surface/init_internally.cc +1 -0
- data/src/core/lib/surface/init_internally.h +9 -0
- data/src/core/lib/surface/lame_client.cc +28 -26
- data/src/core/lib/surface/lame_client.h +19 -19
- data/src/core/lib/surface/metadata_array.cc +17 -18
- data/src/core/lib/surface/server.cc +61 -83
- data/src/core/lib/surface/server.h +5 -7
- data/src/core/lib/surface/validate_metadata.cc +28 -29
- data/src/core/lib/surface/validate_metadata.h +18 -18
- data/src/core/lib/surface/version.cc +21 -21
- data/src/core/lib/transport/bdp_estimator.cc +17 -17
- data/src/core/lib/transport/bdp_estimator.h +18 -19
- data/src/core/lib/transport/connectivity_state.cc +19 -19
- data/src/core/lib/transport/connectivity_state.h +19 -19
- data/src/core/lib/transport/error_utils.cc +51 -45
- data/src/core/lib/transport/error_utils.h +21 -21
- data/src/core/lib/transport/handshaker.cc +49 -46
- data/src/core/lib/transport/handshaker.h +43 -38
- data/src/core/lib/transport/handshaker_factory.h +44 -18
- data/src/core/lib/transport/handshaker_registry.cc +25 -19
- data/src/core/lib/transport/handshaker_registry.h +21 -22
- data/src/core/lib/transport/http2_errors.h +20 -20
- data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
- data/src/core/lib/transport/http_connect_handshaker.h +18 -18
- data/src/core/lib/transport/metadata_batch.cc +4 -1
- data/src/core/lib/transport/metadata_batch.h +46 -20
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/parsed_metadata.h +1 -0
- data/src/core/lib/transport/pid_controller.cc +20 -20
- data/src/core/lib/transport/pid_controller.h +24 -24
- data/src/core/lib/transport/status_conversion.cc +22 -22
- data/src/core/lib/transport/status_conversion.h +20 -20
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
- data/src/core/lib/transport/timeout_encoding.cc +22 -22
- data/src/core/lib/transport/timeout_encoding.h +18 -18
- data/src/core/lib/transport/transport.cc +88 -41
- data/src/core/lib/transport/transport.h +193 -195
- data/src/core/lib/transport/transport_impl.h +42 -42
- data/src/core/lib/transport/transport_op_string.cc +26 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
- data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
- data/src/core/tsi/alts/crypt/gsec.cc +26 -26
- data/src/core/tsi/alts/crypt/gsec.h +334 -334
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
- data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
- data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
- data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
- data/src/core/tsi/fake_transport_security.cc +80 -79
- data/src/core/tsi/fake_transport_security.h +30 -30
- data/src/core/tsi/local_transport_security.cc +34 -33
- data/src/core/tsi/local_transport_security.h +31 -31
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
- data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
- data/src/core/tsi/ssl_transport_security.cc +139 -323
- data/src/core/tsi/ssl_transport_security.h +201 -200
- data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
- data/src/core/tsi/ssl_transport_security_utils.h +147 -0
- data/src/core/tsi/ssl_types.h +25 -25
- data/src/core/tsi/transport_security.cc +26 -26
- data/src/core/tsi/transport_security.h +45 -45
- data/src/core/tsi/transport_security_grpc.cc +20 -20
- data/src/core/tsi/transport_security_grpc.h +39 -39
- data/src/core/tsi/transport_security_interface.h +330 -330
- data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
- data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +0 -1
- data/src/ruby/ext/grpc/ext-export.gcc +1 -2
- data/src/ruby/ext/grpc/extconf.rb +47 -2
- data/src/ruby/ext/grpc/rb_call.c +1 -0
- data/src/ruby/ext/grpc/rb_channel.c +1 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +1 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
- data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/client_server_spec.rb +20 -8
- 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/re2/re2/bitstate.cc +3 -3
- data/third_party/re2/re2/dfa.cc +13 -13
- data/third_party/re2/re2/nfa.cc +4 -4
- data/third_party/re2/re2/onepass.cc +2 -2
- data/third_party/re2/re2/prefilter_tree.cc +27 -59
- data/third_party/re2/re2/prefilter_tree.h +3 -2
- data/third_party/re2/re2/prog.cc +11 -2
- data/third_party/re2/re2/prog.h +17 -5
- data/third_party/re2/re2/re2.cc +6 -11
- data/third_party/re2/re2/re2.h +1 -1
- data/third_party/re2/re2/regexp.cc +1 -2
- data/third_party/re2/re2/stringpiece.h +10 -7
- data/third_party/re2/re2/unicode_casefold.cc +25 -11
- data/third_party/re2/re2/unicode_groups.cc +319 -151
- data/third_party/re2/re2/walker-inl.h +3 -2
- data/third_party/re2/util/mutex.h +4 -4
- 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 +146 -40
- data/include/grpc/impl/codegen/gpr_slice.h +0 -71
- 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/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
- 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_refcount_base.h +0 -60
@@ -28,7 +28,6 @@
|
|
28
28
|
#include <utility>
|
29
29
|
#include <vector>
|
30
30
|
|
31
|
-
#include "absl/memory/memory.h"
|
32
31
|
#include "absl/status/status.h"
|
33
32
|
#include "absl/status/statusor.h"
|
34
33
|
#include "absl/strings/str_cat.h"
|
@@ -58,33 +57,25 @@
|
|
58
57
|
#include <grpc/support/log.h>
|
59
58
|
|
60
59
|
#include "src/core/ext/xds/upb_utils.h"
|
61
|
-
#include "src/core/ext/xds/xds_bootstrap.h"
|
62
60
|
#include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
|
63
61
|
#include "src/core/ext/xds/xds_common_types.h"
|
64
62
|
#include "src/core/ext/xds/xds_http_filters.h"
|
65
63
|
#include "src/core/ext/xds/xds_resource_type.h"
|
66
|
-
#include "src/core/ext/xds/xds_resource_type_impl.h"
|
67
64
|
#include "src/core/ext/xds/xds_routing.h"
|
68
65
|
#include "src/core/lib/channel/status_util.h"
|
66
|
+
#include "src/core/lib/config/core_configuration.h"
|
69
67
|
#include "src/core/lib/debug/trace.h"
|
70
68
|
#include "src/core/lib/gpr/string.h"
|
71
69
|
#include "src/core/lib/gprpp/env.h"
|
72
70
|
#include "src/core/lib/gprpp/match.h"
|
71
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
73
72
|
#include "src/core/lib/gprpp/time.h"
|
74
|
-
#include "src/core/lib/
|
73
|
+
#include "src/core/lib/json/json.h"
|
74
|
+
#include "src/core/lib/load_balancing/lb_policy_registry.h"
|
75
75
|
#include "src/core/lib/matchers/matchers.h"
|
76
76
|
|
77
77
|
namespace grpc_core {
|
78
78
|
|
79
|
-
// TODO(yashykt): Remove once RBAC is no longer experimental
|
80
|
-
bool XdsRbacEnabled() {
|
81
|
-
auto value = GetEnv("GRPC_XDS_EXPERIMENTAL_RBAC");
|
82
|
-
if (!value.has_value()) return false;
|
83
|
-
bool parsed_value;
|
84
|
-
bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
|
85
|
-
return parse_succeeded && parsed_value;
|
86
|
-
}
|
87
|
-
|
88
79
|
// TODO(donnadionne): Remove once RLS is no longer experimental
|
89
80
|
bool XdsRlsEnabled() {
|
90
81
|
auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB");
|
@@ -134,85 +125,77 @@ std::string XdsRouteConfigResource::Route::Matchers::ToString() const {
|
|
134
125
|
}
|
135
126
|
|
136
127
|
//
|
137
|
-
// XdsRouteConfigResource::Route::RouteAction::HashPolicy
|
128
|
+
// XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header
|
138
129
|
//
|
139
130
|
|
140
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy::
|
141
|
-
const
|
142
|
-
:
|
143
|
-
header_name(other.header_name),
|
131
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::Header(
|
132
|
+
const Header& other)
|
133
|
+
: header_name(other.header_name),
|
144
134
|
regex_substitution(other.regex_substitution) {
|
145
135
|
if (other.regex != nullptr) {
|
146
136
|
regex =
|
147
|
-
|
137
|
+
std::make_unique<RE2>(other.regex->pattern(), other.regex->options());
|
148
138
|
}
|
149
139
|
}
|
150
140
|
|
151
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy&
|
152
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy::operator=(
|
153
|
-
const
|
154
|
-
type = other.type;
|
141
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header&
|
142
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator=(
|
143
|
+
const Header& other) {
|
155
144
|
header_name = other.header_name;
|
156
145
|
if (other.regex != nullptr) {
|
157
146
|
regex =
|
158
|
-
|
147
|
+
std::make_unique<RE2>(other.regex->pattern(), other.regex->options());
|
159
148
|
}
|
160
149
|
regex_substitution = other.regex_substitution;
|
161
150
|
return *this;
|
162
151
|
}
|
163
152
|
|
164
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy::
|
165
|
-
|
166
|
-
:
|
167
|
-
header_name(std::move(other.header_name)),
|
153
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::Header(
|
154
|
+
Header&& other) noexcept
|
155
|
+
: header_name(std::move(other.header_name)),
|
168
156
|
regex(std::move(other.regex)),
|
169
157
|
regex_substitution(std::move(other.regex_substitution)) {}
|
170
158
|
|
171
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy&
|
172
|
-
XdsRouteConfigResource::Route::RouteAction::HashPolicy::operator=(
|
173
|
-
|
174
|
-
type = other.type;
|
159
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header&
|
160
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator=(
|
161
|
+
Header&& other) noexcept {
|
175
162
|
header_name = std::move(other.header_name);
|
176
163
|
regex = std::move(other.regex);
|
177
164
|
regex_substitution = std::move(other.regex_substitution);
|
178
165
|
return *this;
|
179
166
|
}
|
180
167
|
|
181
|
-
bool XdsRouteConfigResource::Route::RouteAction::HashPolicy::
|
182
|
-
|
183
|
-
if (
|
184
|
-
if (
|
185
|
-
if (regex
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
return header_name == other.header_name &&
|
190
|
-
regex->pattern() == other.regex->pattern() &&
|
191
|
-
regex_substitution == other.regex_substitution;
|
192
|
-
}
|
168
|
+
bool XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator==(
|
169
|
+
const Header& other) const {
|
170
|
+
if (header_name != other.header_name) return false;
|
171
|
+
if (regex == nullptr) {
|
172
|
+
if (other.regex != nullptr) return false;
|
173
|
+
} else {
|
174
|
+
if (other.regex == nullptr) return false;
|
175
|
+
if (regex->pattern() != other.regex->pattern()) return false;
|
193
176
|
}
|
194
|
-
return
|
177
|
+
return regex_substitution == other.regex_substitution;
|
195
178
|
}
|
196
179
|
|
180
|
+
std::string
|
181
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::ToString()
|
182
|
+
const {
|
183
|
+
return absl::StrCat("Header ", header_name, "/",
|
184
|
+
(regex == nullptr) ? "" : regex->pattern(), "/",
|
185
|
+
regex_substitution);
|
186
|
+
}
|
187
|
+
|
188
|
+
//
|
189
|
+
// XdsRouteConfigResource::Route::RouteAction::HashPolicy
|
190
|
+
//
|
191
|
+
|
197
192
|
std::string XdsRouteConfigResource::Route::RouteAction::HashPolicy::ToString()
|
198
193
|
const {
|
199
|
-
std::
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
case Type::CHANNEL_ID:
|
205
|
-
contents.push_back("type=CHANNEL_ID");
|
206
|
-
break;
|
207
|
-
}
|
208
|
-
contents.push_back(
|
209
|
-
absl::StrFormat("terminal=%s", terminal ? "true" : "false"));
|
210
|
-
if (type == Type::HEADER) {
|
211
|
-
contents.push_back(absl::StrFormat(
|
212
|
-
"Header %s:/%s/%s", header_name,
|
213
|
-
(regex == nullptr) ? "" : regex->pattern(), regex_substitution));
|
214
|
-
}
|
215
|
-
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
194
|
+
std::string type = Match(
|
195
|
+
policy, [](const Header& header) { return header.ToString(); },
|
196
|
+
[](const ChannelId&) -> std::string { return "ChannelId"; });
|
197
|
+
return absl::StrCat("{", type, ", terminal=", terminal ? "true" : "false",
|
198
|
+
"}");
|
216
199
|
}
|
217
200
|
|
218
201
|
//
|
@@ -243,6 +226,7 @@ XdsRouteConfigResource::Route::RouteAction::ClusterWeight::ToString() const {
|
|
243
226
|
|
244
227
|
std::string XdsRouteConfigResource::Route::RouteAction::ToString() const {
|
245
228
|
std::vector<std::string> contents;
|
229
|
+
contents.reserve(hash_policies.size());
|
246
230
|
for (const HashPolicy& hash_policy : hash_policies) {
|
247
231
|
contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
|
248
232
|
}
|
@@ -339,65 +323,84 @@ std::string XdsRouteConfigResource::ToString() const {
|
|
339
323
|
|
340
324
|
namespace {
|
341
325
|
|
342
|
-
|
343
|
-
ClusterSpecifierPluginParse(
|
326
|
+
XdsRouteConfigResource::ClusterSpecifierPluginMap ClusterSpecifierPluginParse(
|
344
327
|
const XdsResourceType::DecodeContext& context,
|
345
|
-
const envoy_config_route_v3_RouteConfiguration* route_config
|
328
|
+
const envoy_config_route_v3_RouteConfiguration* route_config,
|
329
|
+
ValidationErrors* errors) {
|
346
330
|
XdsRouteConfigResource::ClusterSpecifierPluginMap
|
347
331
|
cluster_specifier_plugin_map;
|
332
|
+
const auto& cluster_specifier_plugin_registry =
|
333
|
+
static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
|
334
|
+
.cluster_specifier_plugin_registry();
|
348
335
|
size_t num_cluster_specifier_plugins;
|
349
336
|
const envoy_config_route_v3_ClusterSpecifierPlugin* const*
|
350
337
|
cluster_specifier_plugin =
|
351
338
|
envoy_config_route_v3_RouteConfiguration_cluster_specifier_plugins(
|
352
339
|
route_config, &num_cluster_specifier_plugins);
|
353
340
|
for (size_t i = 0; i < num_cluster_specifier_plugins; ++i) {
|
354
|
-
|
341
|
+
bool is_optional = envoy_config_route_v3_ClusterSpecifierPlugin_is_optional(
|
342
|
+
cluster_specifier_plugin[i]);
|
343
|
+
ValidationErrors::ScopedField field(
|
344
|
+
errors, absl::StrCat(".cluster_specifier_plugins[", i, "].extension"));
|
345
|
+
const envoy_config_core_v3_TypedExtensionConfig* typed_extension_config =
|
355
346
|
envoy_config_route_v3_ClusterSpecifierPlugin_extension(
|
356
347
|
cluster_specifier_plugin[i]);
|
357
348
|
std::string name = UpbStringToStdString(
|
358
|
-
envoy_config_core_v3_TypedExtensionConfig_name(
|
349
|
+
envoy_config_core_v3_TypedExtensionConfig_name(typed_extension_config));
|
359
350
|
if (cluster_specifier_plugin_map.find(name) !=
|
360
351
|
cluster_specifier_plugin_map.end()) {
|
361
|
-
|
362
|
-
|
352
|
+
ValidationErrors::ScopedField field(errors, ".name");
|
353
|
+
errors->AddError(absl::StrCat("duplicate name \"", name, "\""));
|
354
|
+
} else {
|
355
|
+
// Add a sentinel entry in case we encounter an error later, just so we
|
356
|
+
// don't generate duplicate errors for each route that uses this plugin.
|
357
|
+
cluster_specifier_plugin_map[name] = "<sentinel>";
|
363
358
|
}
|
359
|
+
ValidationErrors::ScopedField field2(errors, ".typed_config");
|
364
360
|
const google_protobuf_Any* any =
|
365
|
-
envoy_config_core_v3_TypedExtensionConfig_typed_config(
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
}
|
370
|
-
auto plugin_type = ExtractExtensionTypeName(context, any);
|
371
|
-
if (!plugin_type.ok()) return plugin_type.status();
|
372
|
-
bool is_optional = envoy_config_route_v3_ClusterSpecifierPlugin_is_optional(
|
373
|
-
cluster_specifier_plugin[i]);
|
361
|
+
envoy_config_core_v3_TypedExtensionConfig_typed_config(
|
362
|
+
typed_extension_config);
|
363
|
+
auto extension = ExtractXdsExtension(context, any, errors);
|
364
|
+
if (!extension.has_value()) continue;
|
374
365
|
const XdsClusterSpecifierPluginImpl* cluster_specifier_plugin_impl =
|
375
|
-
|
376
|
-
std::string lb_policy_config;
|
366
|
+
cluster_specifier_plugin_registry.GetPluginForType(extension->type);
|
377
367
|
if (cluster_specifier_plugin_impl == nullptr) {
|
378
|
-
if (
|
379
|
-
|
380
|
-
|
368
|
+
if (is_optional) {
|
369
|
+
// Empty string indicates an optional plugin.
|
370
|
+
// This is used later when validating routes, and since we will skip
|
371
|
+
// any routes that refer to this plugin, we won't wind up including
|
372
|
+
// this plugin in the resource that we return to the watcher.
|
373
|
+
cluster_specifier_plugin_map[std::move(name)] = "";
|
374
|
+
} else {
|
375
|
+
// Not optional, report error.
|
376
|
+
errors->AddError("unsupported ClusterSpecifierPlugin type");
|
381
377
|
}
|
382
|
-
|
378
|
+
continue;
|
379
|
+
}
|
380
|
+
const size_t original_error_size = errors->size();
|
381
|
+
Json lb_policy_config =
|
382
|
+
cluster_specifier_plugin_impl->GenerateLoadBalancingPolicyConfig(
|
383
|
+
std::move(*extension), context.arena, context.symtab, errors);
|
384
|
+
if (errors->size() != original_error_size) continue;
|
385
|
+
auto config =
|
386
|
+
CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
|
387
|
+
lb_policy_config);
|
388
|
+
if (!config.ok()) {
|
389
|
+
errors->AddError(absl::StrCat(
|
390
|
+
"ClusterSpecifierPlugin returned invalid LB policy config: ",
|
391
|
+
config.status().message()));
|
383
392
|
} else {
|
384
|
-
|
385
|
-
cluster_specifier_plugin_impl->GenerateLoadBalancingPolicyConfig(
|
386
|
-
google_protobuf_Any_value(any), context.arena, context.symtab);
|
387
|
-
if (!config.ok()) return config.status();
|
388
|
-
lb_policy_config = std::move(*config);
|
393
|
+
cluster_specifier_plugin_map[std::move(name)] = lb_policy_config.Dump();
|
389
394
|
}
|
390
|
-
cluster_specifier_plugin_map[std::move(name)] = std::move(lb_policy_config);
|
391
395
|
}
|
392
396
|
return cluster_specifier_plugin_map;
|
393
397
|
}
|
394
398
|
|
395
|
-
absl::
|
396
|
-
|
397
|
-
|
399
|
+
absl::optional<StringMatcher> RoutePathMatchParse(
|
400
|
+
const envoy_config_route_v3_RouteMatch* match, ValidationErrors* errors) {
|
401
|
+
bool case_sensitive = true;
|
398
402
|
auto* case_sensitive_ptr =
|
399
403
|
envoy_config_route_v3_RouteMatch_case_sensitive(match);
|
400
|
-
bool case_sensitive = true;
|
401
404
|
if (case_sensitive_ptr != nullptr) {
|
402
405
|
case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
|
403
406
|
}
|
@@ -406,25 +409,18 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
|
406
409
|
if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
|
407
410
|
absl::string_view prefix =
|
408
411
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
|
409
|
-
//
|
412
|
+
// For any prefix that cannot match a path of the form "/service/method",
|
413
|
+
// ignore the route.
|
410
414
|
if (!prefix.empty()) {
|
411
|
-
//
|
412
|
-
if (prefix[0] != '/')
|
413
|
-
// Prefix which does not start with a / will never match anything, so
|
414
|
-
// ignore this route.
|
415
|
-
*ignore_route = true;
|
416
|
-
return absl::OkStatus();
|
417
|
-
}
|
415
|
+
// Does not start with a slash.
|
416
|
+
if (prefix[0] != '/') return absl::nullopt;
|
418
417
|
std::vector<absl::string_view> prefix_elements =
|
419
418
|
absl::StrSplit(prefix.substr(1), absl::MaxSplits('/', 2));
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
// Prefix contains empty string between the 2 slashes
|
426
|
-
*ignore_route = true;
|
427
|
-
return absl::OkStatus();
|
419
|
+
// More than 2 slashes.
|
420
|
+
if (prefix_elements.size() > 2) return absl::nullopt;
|
421
|
+
// Two consecutive slashes.
|
422
|
+
if (prefix_elements.size() == 2 && prefix_elements[0].empty()) {
|
423
|
+
return absl::nullopt;
|
428
424
|
}
|
429
425
|
}
|
430
426
|
type = StringMatcher::Type::kPrefix;
|
@@ -432,35 +428,19 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
|
432
428
|
} else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
|
433
429
|
absl::string_view path =
|
434
430
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
if (path[0] != '/') {
|
441
|
-
// Path which does not start with a / will never match anything, so
|
442
|
-
// ignore this route.
|
443
|
-
*ignore_route = true;
|
444
|
-
return absl::OkStatus();
|
445
|
-
}
|
431
|
+
// For any path not of the form "/service/method", ignore the route.
|
432
|
+
// Empty path.
|
433
|
+
if (path.empty()) return absl::nullopt;
|
434
|
+
// Does not start with a slash.
|
435
|
+
if (path[0] != '/') return absl::nullopt;
|
446
436
|
std::vector<absl::string_view> path_elements =
|
447
437
|
absl::StrSplit(path.substr(1), absl::MaxSplits('/', 2));
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
// Path contains empty service name will never match anything, so ignore
|
455
|
-
// this route.
|
456
|
-
*ignore_route = true;
|
457
|
-
return absl::OkStatus();
|
458
|
-
} else if (path_elements[1].empty()) {
|
459
|
-
// Path contains empty method name will never match anything, so ignore
|
460
|
-
// this route.
|
461
|
-
*ignore_route = true;
|
462
|
-
return absl::OkStatus();
|
463
|
-
}
|
438
|
+
// Number of slashes does not equal 2.
|
439
|
+
if (path_elements.size() != 2) return absl::nullopt;
|
440
|
+
// Empty service name.
|
441
|
+
if (path_elements[0].empty()) return absl::nullopt;
|
442
|
+
// Empty method name.
|
443
|
+
if (path_elements[1].empty()) return absl::nullopt;
|
464
444
|
type = StringMatcher::Type::kExact;
|
465
445
|
match_string = std::string(path);
|
466
446
|
} else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
|
@@ -471,27 +451,30 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
|
471
451
|
match_string = UpbStringToStdString(
|
472
452
|
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
|
473
453
|
} else {
|
474
|
-
|
475
|
-
|
454
|
+
errors->AddError("invalid path specifier");
|
455
|
+
return absl::nullopt;
|
476
456
|
}
|
477
457
|
absl::StatusOr<StringMatcher> string_matcher =
|
478
458
|
StringMatcher::Create(type, match_string, case_sensitive);
|
479
459
|
if (!string_matcher.ok()) {
|
480
|
-
|
481
|
-
|
460
|
+
errors->AddError(absl::StrCat("error creating path matcher: ",
|
461
|
+
string_matcher.status().message()));
|
462
|
+
return absl::nullopt;
|
482
463
|
}
|
483
|
-
|
484
|
-
return absl::OkStatus();
|
464
|
+
return std::move(*string_matcher);
|
485
465
|
}
|
486
466
|
|
487
|
-
|
488
|
-
|
489
|
-
|
467
|
+
void RouteHeaderMatchersParse(const envoy_config_route_v3_RouteMatch* match,
|
468
|
+
XdsRouteConfigResource::Route* route,
|
469
|
+
ValidationErrors* errors) {
|
490
470
|
size_t size;
|
491
471
|
const envoy_config_route_v3_HeaderMatcher* const* headers =
|
492
472
|
envoy_config_route_v3_RouteMatch_headers(match, &size);
|
493
473
|
for (size_t i = 0; i < size; ++i) {
|
474
|
+
ValidationErrors::ScopedField field(errors,
|
475
|
+
absl::StrCat(".headers[", i, "]"));
|
494
476
|
const envoy_config_route_v3_HeaderMatcher* header = headers[i];
|
477
|
+
GPR_ASSERT(header != nullptr);
|
495
478
|
const std::string name =
|
496
479
|
UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
|
497
480
|
HeaderMatcher::Type type;
|
@@ -503,6 +486,18 @@ absl::Status RouteHeaderMatchersParse(
|
|
503
486
|
type = HeaderMatcher::Type::kExact;
|
504
487
|
match_string = UpbStringToStdString(
|
505
488
|
envoy_config_route_v3_HeaderMatcher_exact_match(header));
|
489
|
+
} else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
|
490
|
+
type = HeaderMatcher::Type::kPrefix;
|
491
|
+
match_string = UpbStringToStdString(
|
492
|
+
envoy_config_route_v3_HeaderMatcher_prefix_match(header));
|
493
|
+
} else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
|
494
|
+
type = HeaderMatcher::Type::kSuffix;
|
495
|
+
match_string = UpbStringToStdString(
|
496
|
+
envoy_config_route_v3_HeaderMatcher_suffix_match(header));
|
497
|
+
} else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
|
498
|
+
type = HeaderMatcher::Type::kContains;
|
499
|
+
match_string = UpbStringToStdString(
|
500
|
+
envoy_config_route_v3_HeaderMatcher_contains_match(header));
|
506
501
|
} else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
|
507
502
|
header)) {
|
508
503
|
const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
|
@@ -520,21 +515,9 @@ absl::Status RouteHeaderMatchersParse(
|
|
520
515
|
} else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
|
521
516
|
type = HeaderMatcher::Type::kPresent;
|
522
517
|
present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
|
523
|
-
} else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
|
524
|
-
type = HeaderMatcher::Type::kPrefix;
|
525
|
-
match_string = UpbStringToStdString(
|
526
|
-
envoy_config_route_v3_HeaderMatcher_prefix_match(header));
|
527
|
-
} else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
|
528
|
-
type = HeaderMatcher::Type::kSuffix;
|
529
|
-
match_string = UpbStringToStdString(
|
530
|
-
envoy_config_route_v3_HeaderMatcher_suffix_match(header));
|
531
|
-
} else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
|
532
|
-
type = HeaderMatcher::Type::kContains;
|
533
|
-
match_string = UpbStringToStdString(
|
534
|
-
envoy_config_route_v3_HeaderMatcher_contains_match(header));
|
535
518
|
} else {
|
536
|
-
|
537
|
-
|
519
|
+
errors->AddError("invalid header matcher");
|
520
|
+
continue;
|
538
521
|
}
|
539
522
|
bool invert_match =
|
540
523
|
envoy_config_route_v3_HeaderMatcher_invert_match(header);
|
@@ -542,18 +525,17 @@ absl::Status RouteHeaderMatchersParse(
|
|
542
525
|
HeaderMatcher::Create(name, type, match_string, range_start, range_end,
|
543
526
|
present_match, invert_match);
|
544
527
|
if (!header_matcher.ok()) {
|
545
|
-
|
546
|
-
|
528
|
+
errors->AddError(absl::StrCat("cannot create header matcher: ",
|
529
|
+
header_matcher.status().message()));
|
530
|
+
} else {
|
531
|
+
route->matchers.header_matchers.emplace_back(std::move(*header_matcher));
|
547
532
|
}
|
548
|
-
route->matchers.header_matchers.emplace_back(
|
549
|
-
std::move(header_matcher.value()));
|
550
533
|
}
|
551
|
-
return absl::OkStatus();
|
552
534
|
}
|
553
535
|
|
554
|
-
|
555
|
-
|
556
|
-
|
536
|
+
void RouteRuntimeFractionParse(const envoy_config_route_v3_RouteMatch* match,
|
537
|
+
XdsRouteConfigResource::Route* route,
|
538
|
+
ValidationErrors* errors) {
|
557
539
|
const envoy_config_core_v3_RuntimeFractionalPercent* runtime_fraction =
|
558
540
|
envoy_config_route_v3_RouteMatch_runtime_fraction(match);
|
559
541
|
if (runtime_fraction != nullptr) {
|
@@ -562,9 +544,8 @@ absl::Status RouteRuntimeFractionParse(
|
|
562
544
|
runtime_fraction);
|
563
545
|
if (fraction != nullptr) {
|
564
546
|
uint32_t numerator = envoy_type_v3_FractionalPercent_numerator(fraction);
|
565
|
-
const
|
566
|
-
|
567
|
-
envoy_type_v3_FractionalPercent_denominator(fraction));
|
547
|
+
const uint32_t denominator =
|
548
|
+
envoy_type_v3_FractionalPercent_denominator(fraction);
|
568
549
|
// Normalize to million.
|
569
550
|
switch (denominator) {
|
570
551
|
case envoy_type_v3_FractionalPercent_HUNDRED:
|
@@ -575,100 +556,98 @@ absl::Status RouteRuntimeFractionParse(
|
|
575
556
|
break;
|
576
557
|
case envoy_type_v3_FractionalPercent_MILLION:
|
577
558
|
break;
|
578
|
-
default:
|
579
|
-
|
559
|
+
default: {
|
560
|
+
ValidationErrors::ScopedField field(
|
561
|
+
errors, ".runtime_fraction.default_value.denominator");
|
562
|
+
errors->AddError("unknown denominator type");
|
563
|
+
return;
|
564
|
+
}
|
580
565
|
}
|
581
566
|
route->matchers.fraction_per_million = numerator;
|
582
567
|
}
|
583
568
|
}
|
584
|
-
return GRPC_ERROR_NONE;
|
585
569
|
}
|
586
570
|
|
587
571
|
template <typename ParentType, typename EntryType>
|
588
|
-
|
589
|
-
ParseTypedPerFilterConfig(
|
572
|
+
XdsRouteConfigResource::TypedPerFilterConfig ParseTypedPerFilterConfig(
|
590
573
|
const XdsResourceType::DecodeContext& context, const ParentType* parent,
|
591
574
|
const EntryType* (*entry_func)(const ParentType*, size_t*),
|
592
575
|
upb_StringView (*key_func)(const EntryType*),
|
593
|
-
const google_protobuf_Any* (*value_func)(const EntryType*)
|
576
|
+
const google_protobuf_Any* (*value_func)(const EntryType*),
|
577
|
+
ValidationErrors* errors) {
|
594
578
|
XdsRouteConfigResource::TypedPerFilterConfig typed_per_filter_config;
|
595
579
|
size_t filter_it = kUpb_Map_Begin;
|
596
580
|
while (true) {
|
597
581
|
const auto* filter_entry = entry_func(parent, &filter_it);
|
598
582
|
if (filter_entry == nullptr) break;
|
599
583
|
absl::string_view key = UpbStringToAbsl(key_func(filter_entry));
|
600
|
-
|
601
|
-
|
602
|
-
}
|
584
|
+
ValidationErrors::ScopedField field(errors, absl::StrCat("[", key, "]"));
|
585
|
+
if (key.empty()) errors->AddError("filter name must be non-empty");
|
603
586
|
const google_protobuf_Any* any = value_func(filter_entry);
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
return absl::InvalidArgumentError(
|
609
|
-
absl::StrCat("no filter config specified for filter name ", key));
|
610
|
-
}
|
587
|
+
auto extension = ExtractXdsExtension(context, any, errors);
|
588
|
+
if (!extension.has_value()) continue;
|
589
|
+
auto* extension_to_use = &*extension;
|
590
|
+
absl::optional<XdsExtension> nested_extension;
|
611
591
|
bool is_optional = false;
|
612
|
-
if (
|
613
|
-
|
614
|
-
|
592
|
+
if (extension->type == "envoy.config.route.v3.FilterConfig") {
|
593
|
+
absl::string_view* serialized_config =
|
594
|
+
absl::get_if<absl::string_view>(&extension->value);
|
595
|
+
if (serialized_config == nullptr) {
|
596
|
+
errors->AddError("could not parse FilterConfig");
|
597
|
+
continue;
|
598
|
+
}
|
615
599
|
const auto* filter_config = envoy_config_route_v3_FilterConfig_parse(
|
616
|
-
|
600
|
+
serialized_config->data(), serialized_config->size(), context.arena);
|
617
601
|
if (filter_config == nullptr) {
|
618
|
-
|
619
|
-
|
602
|
+
errors->AddError("could not parse FilterConfig");
|
603
|
+
continue;
|
620
604
|
}
|
621
605
|
is_optional =
|
622
606
|
envoy_config_route_v3_FilterConfig_is_optional(filter_config);
|
623
607
|
any = envoy_config_route_v3_FilterConfig_config(filter_config);
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
}
|
608
|
+
extension->validation_fields.emplace_back(errors, ".config");
|
609
|
+
nested_extension = ExtractXdsExtension(context, any, errors);
|
610
|
+
if (!nested_extension.has_value()) continue;
|
611
|
+
extension_to_use = &*nested_extension;
|
629
612
|
}
|
630
|
-
auto
|
631
|
-
|
613
|
+
const auto& http_filter_registry =
|
614
|
+
static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
|
615
|
+
.http_filter_registry();
|
632
616
|
const XdsHttpFilterImpl* filter_impl =
|
633
|
-
|
617
|
+
http_filter_registry.GetFilterForType(extension_to_use->type);
|
634
618
|
if (filter_impl == nullptr) {
|
635
|
-
if (is_optional)
|
636
|
-
|
637
|
-
absl::StrCat("no filter registered for config type ", type->type));
|
619
|
+
if (!is_optional) errors->AddError("unsupported filter type");
|
620
|
+
continue;
|
638
621
|
}
|
639
|
-
absl::
|
622
|
+
absl::optional<XdsHttpFilterImpl::FilterConfig> filter_config =
|
640
623
|
filter_impl->GenerateFilterConfigOverride(
|
641
|
-
|
642
|
-
if (
|
643
|
-
|
644
|
-
absl::StrCat("filter config for type ", type->type,
|
645
|
-
" failed to parse: ", filter_config.status().message()));
|
624
|
+
context, std::move(*extension_to_use), errors);
|
625
|
+
if (filter_config.has_value()) {
|
626
|
+
typed_per_filter_config[std::string(key)] = std::move(*filter_config);
|
646
627
|
}
|
647
|
-
typed_per_filter_config[std::string(key)] = std::move(*filter_config);
|
648
628
|
}
|
649
629
|
return typed_per_filter_config;
|
650
630
|
}
|
651
631
|
|
652
|
-
|
632
|
+
XdsRouteConfigResource::RetryPolicy RetryPolicyParse(
|
653
633
|
const XdsResourceType::DecodeContext& context,
|
654
|
-
const envoy_config_route_v3_RetryPolicy*
|
655
|
-
|
656
|
-
|
657
|
-
XdsRouteConfigResource::RetryPolicy retry_to_return;
|
634
|
+
const envoy_config_route_v3_RetryPolicy* retry_policy_proto,
|
635
|
+
ValidationErrors* errors) {
|
636
|
+
XdsRouteConfigResource::RetryPolicy retry_policy;
|
658
637
|
auto retry_on = UpbStringToStdString(
|
659
|
-
envoy_config_route_v3_RetryPolicy_retry_on(
|
638
|
+
envoy_config_route_v3_RetryPolicy_retry_on(retry_policy_proto));
|
660
639
|
std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
|
661
640
|
for (const auto& code : codes) {
|
662
641
|
if (code == "cancelled") {
|
663
|
-
|
642
|
+
retry_policy.retry_on.Add(GRPC_STATUS_CANCELLED);
|
664
643
|
} else if (code == "deadline-exceeded") {
|
665
|
-
|
644
|
+
retry_policy.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
|
666
645
|
} else if (code == "internal") {
|
667
|
-
|
646
|
+
retry_policy.retry_on.Add(GRPC_STATUS_INTERNAL);
|
668
647
|
} else if (code == "resource-exhausted") {
|
669
|
-
|
648
|
+
retry_policy.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
|
670
649
|
} else if (code == "unavailable") {
|
671
|
-
|
650
|
+
retry_policy.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
|
672
651
|
} else {
|
673
652
|
if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
|
674
653
|
gpr_log(GPR_INFO, "Unsupported retry_on policy %s.",
|
@@ -677,187 +656,90 @@ absl::Status RetryPolicyParse(
|
|
677
656
|
}
|
678
657
|
}
|
679
658
|
const google_protobuf_UInt32Value* num_retries =
|
680
|
-
envoy_config_route_v3_RetryPolicy_num_retries(
|
659
|
+
envoy_config_route_v3_RetryPolicy_num_retries(retry_policy_proto);
|
681
660
|
if (num_retries != nullptr) {
|
682
661
|
uint32_t num_retries_value = google_protobuf_UInt32Value_value(num_retries);
|
683
662
|
if (num_retries_value == 0) {
|
684
|
-
errors.
|
685
|
-
|
663
|
+
ValidationErrors::ScopedField field(errors, ".num_retries");
|
664
|
+
errors->AddError("must be greater than 0");
|
686
665
|
} else {
|
687
|
-
|
666
|
+
retry_policy.num_retries = num_retries_value;
|
688
667
|
}
|
689
668
|
} else {
|
690
|
-
|
669
|
+
retry_policy.num_retries = 1;
|
691
670
|
}
|
692
671
|
const envoy_config_route_v3_RetryPolicy_RetryBackOff* backoff =
|
693
|
-
envoy_config_route_v3_RetryPolicy_retry_back_off(
|
672
|
+
envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy_proto);
|
694
673
|
if (backoff != nullptr) {
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
674
|
+
ValidationErrors::ScopedField field(errors, ".retry_back_off");
|
675
|
+
{
|
676
|
+
ValidationErrors::ScopedField field(errors, ".base_interval");
|
677
|
+
const google_protobuf_Duration* base_interval =
|
678
|
+
envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
|
679
|
+
if (base_interval == nullptr) {
|
680
|
+
errors->AddError("field not present");
|
681
|
+
} else {
|
682
|
+
retry_policy.retry_back_off.base_interval =
|
683
|
+
ParseDuration(base_interval, errors);
|
684
|
+
}
|
703
685
|
}
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
max
|
709
|
-
|
710
|
-
|
711
|
-
|
686
|
+
{
|
687
|
+
ValidationErrors::ScopedField field(errors, ".max_interval");
|
688
|
+
const google_protobuf_Duration* max_interval =
|
689
|
+
envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
|
690
|
+
Duration max;
|
691
|
+
if (max_interval != nullptr) {
|
692
|
+
max = ParseDuration(max_interval, errors);
|
693
|
+
} else {
|
694
|
+
// if max interval is not set, it is 10x the base.
|
695
|
+
max = 10 * retry_policy.retry_back_off.base_interval;
|
696
|
+
}
|
697
|
+
retry_policy.retry_back_off.max_interval = max;
|
712
698
|
}
|
713
|
-
retry_to_return.retry_back_off.max_interval = max;
|
714
699
|
} else {
|
715
|
-
|
716
|
-
|
700
|
+
retry_policy.retry_back_off.base_interval = Duration::Milliseconds(25);
|
701
|
+
retry_policy.retry_back_off.max_interval = Duration::Milliseconds(250);
|
717
702
|
}
|
718
|
-
|
719
|
-
if (!errors.empty()) {
|
720
|
-
return absl::InvalidArgumentError(absl::StrCat(
|
721
|
-
"Errors parsing retry policy: [", absl::StrJoin(errors, "; "), "]"));
|
722
|
-
}
|
723
|
-
*retry = retry_to_return;
|
724
|
-
return absl::OkStatus();
|
703
|
+
return retry_policy;
|
725
704
|
}
|
726
705
|
|
727
|
-
absl::
|
706
|
+
absl::optional<XdsRouteConfigResource::Route::RouteAction> RouteActionParse(
|
728
707
|
const XdsResourceType::DecodeContext& context,
|
729
|
-
const
|
708
|
+
const envoy_config_route_v3_RouteAction* route_action_proto,
|
730
709
|
const std::map<std::string /*cluster_specifier_plugin_name*/,
|
731
710
|
std::string /*LB policy config*/>&
|
732
711
|
cluster_specifier_plugin_map,
|
733
|
-
|
734
|
-
XdsRouteConfigResource::Route::RouteAction
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
if (
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
std::vector<XdsRouteConfigResource::Route::RouteAction::ClusterWeight>
|
750
|
-
action_weighted_clusters;
|
751
|
-
const envoy_config_route_v3_WeightedCluster* weighted_cluster =
|
752
|
-
envoy_config_route_v3_RouteAction_weighted_clusters(route_action);
|
753
|
-
uint32_t total_weight = 100;
|
754
|
-
const google_protobuf_UInt32Value* weight =
|
755
|
-
envoy_config_route_v3_WeightedCluster_total_weight(weighted_cluster);
|
756
|
-
if (weight != nullptr) {
|
757
|
-
total_weight = google_protobuf_UInt32Value_value(weight);
|
758
|
-
}
|
759
|
-
size_t clusters_size;
|
760
|
-
const envoy_config_route_v3_WeightedCluster_ClusterWeight* const* clusters =
|
761
|
-
envoy_config_route_v3_WeightedCluster_clusters(weighted_cluster,
|
762
|
-
&clusters_size);
|
763
|
-
uint32_t sum_of_weights = 0;
|
764
|
-
for (size_t j = 0; j < clusters_size; ++j) {
|
765
|
-
const envoy_config_route_v3_WeightedCluster_ClusterWeight*
|
766
|
-
cluster_weight = clusters[j];
|
767
|
-
XdsRouteConfigResource::Route::RouteAction::ClusterWeight cluster;
|
768
|
-
cluster.name = UpbStringToStdString(
|
769
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
|
770
|
-
cluster_weight));
|
771
|
-
if (cluster.name.empty()) {
|
772
|
-
return absl::InvalidArgumentError(
|
773
|
-
"RouteAction weighted_cluster cluster contains empty cluster "
|
774
|
-
"name.");
|
775
|
-
}
|
776
|
-
const google_protobuf_UInt32Value* weight =
|
777
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
|
778
|
-
cluster_weight);
|
779
|
-
if (weight == nullptr) {
|
780
|
-
return absl::InvalidArgumentError(
|
781
|
-
"RouteAction weighted_cluster cluster missing weight");
|
782
|
-
}
|
783
|
-
cluster.weight = google_protobuf_UInt32Value_value(weight);
|
784
|
-
if (cluster.weight == 0) continue;
|
785
|
-
sum_of_weights += cluster.weight;
|
786
|
-
if (context.server.ShouldUseV3()) {
|
787
|
-
auto typed_per_filter_config = ParseTypedPerFilterConfig<
|
788
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight,
|
789
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
|
790
|
-
context, cluster_weight,
|
791
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next,
|
792
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_key,
|
793
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_value);
|
794
|
-
if (!typed_per_filter_config.ok()) {
|
795
|
-
return typed_per_filter_config.status();
|
796
|
-
}
|
797
|
-
cluster.typed_per_filter_config = std::move(*typed_per_filter_config);
|
798
|
-
}
|
799
|
-
action_weighted_clusters.emplace_back(std::move(cluster));
|
800
|
-
}
|
801
|
-
if (total_weight != sum_of_weights) {
|
802
|
-
return absl::InvalidArgumentError(
|
803
|
-
"RouteAction weighted_cluster has incorrect total weight");
|
804
|
-
}
|
805
|
-
if (action_weighted_clusters.empty()) {
|
806
|
-
return absl::InvalidArgumentError(
|
807
|
-
"RouteAction weighted_cluster has no valid clusters specified.");
|
808
|
-
}
|
809
|
-
route.action = std::move(action_weighted_clusters);
|
810
|
-
} else if (XdsRlsEnabled() &&
|
811
|
-
envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin(
|
812
|
-
route_action)) {
|
813
|
-
std::string plugin_name = UpbStringToStdString(
|
814
|
-
envoy_config_route_v3_RouteAction_cluster_specifier_plugin(
|
815
|
-
route_action));
|
816
|
-
if (plugin_name.empty()) {
|
817
|
-
return absl::InvalidArgumentError(
|
818
|
-
"RouteAction cluster contains empty cluster specifier plugin name.");
|
819
|
-
}
|
820
|
-
auto it = cluster_specifier_plugin_map.find(plugin_name);
|
821
|
-
if (it == cluster_specifier_plugin_map.end()) {
|
822
|
-
return absl::InvalidArgumentError(
|
823
|
-
absl::StrCat("RouteAction cluster contains cluster specifier plugin "
|
824
|
-
"name not configured: ",
|
825
|
-
plugin_name));
|
826
|
-
}
|
827
|
-
if (it->second.empty()) *ignore_route = true;
|
828
|
-
route.action =
|
829
|
-
XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName{
|
830
|
-
std::move(plugin_name)};
|
831
|
-
} else {
|
832
|
-
// No cluster or weighted_clusters or plugin found in RouteAction, ignore
|
833
|
-
// this route.
|
834
|
-
*ignore_route = true;
|
835
|
-
}
|
836
|
-
if (!*ignore_route) {
|
837
|
-
const envoy_config_route_v3_RouteAction_MaxStreamDuration*
|
838
|
-
max_stream_duration =
|
839
|
-
envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
|
840
|
-
if (max_stream_duration != nullptr) {
|
841
|
-
const google_protobuf_Duration* duration =
|
842
|
-
envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
|
712
|
+
ValidationErrors* errors) {
|
713
|
+
XdsRouteConfigResource::Route::RouteAction route_action;
|
714
|
+
// grpc_timeout_header_max or max_stream_duration
|
715
|
+
const auto* max_stream_duration =
|
716
|
+
envoy_config_route_v3_RouteAction_max_stream_duration(route_action_proto);
|
717
|
+
if (max_stream_duration != nullptr) {
|
718
|
+
ValidationErrors::ScopedField field(errors, ".max_stream_duration");
|
719
|
+
const google_protobuf_Duration* duration =
|
720
|
+
envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
|
721
|
+
max_stream_duration);
|
722
|
+
if (duration != nullptr) {
|
723
|
+
ValidationErrors::ScopedField field(errors, ".grpc_timeout_header_max");
|
724
|
+
route_action.max_stream_duration = ParseDuration(duration, errors);
|
725
|
+
} else {
|
726
|
+
duration =
|
727
|
+
envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
|
843
728
|
max_stream_duration);
|
844
|
-
if (duration == nullptr) {
|
845
|
-
duration =
|
846
|
-
envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
|
847
|
-
max_stream_duration);
|
848
|
-
}
|
849
729
|
if (duration != nullptr) {
|
850
|
-
|
730
|
+
ValidationErrors::ScopedField field(errors, ".max_stream_duration");
|
731
|
+
route_action.max_stream_duration = ParseDuration(duration, errors);
|
851
732
|
}
|
852
733
|
}
|
853
734
|
}
|
854
|
-
//
|
735
|
+
// hash_policy
|
855
736
|
size_t size = 0;
|
856
737
|
const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
|
857
|
-
envoy_config_route_v3_RouteAction_hash_policy(
|
738
|
+
envoy_config_route_v3_RouteAction_hash_policy(route_action_proto, &size);
|
858
739
|
for (size_t i = 0; i < size; ++i) {
|
859
|
-
|
860
|
-
|
740
|
+
ValidationErrors::ScopedField field(errors,
|
741
|
+
absl::StrCat(".hash_policy[", i, "]"));
|
742
|
+
const auto* hash_policy = hash_policies[i];
|
861
743
|
XdsRouteConfigResource::Route::RouteAction::HashPolicy policy;
|
862
744
|
policy.terminal =
|
863
745
|
envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
|
@@ -866,94 +748,260 @@ absl::StatusOr<XdsRouteConfigResource::Route::RouteAction> RouteActionParse(
|
|
866
748
|
filter_state;
|
867
749
|
if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
|
868
750
|
hash_policy)) != nullptr) {
|
869
|
-
|
870
|
-
|
871
|
-
|
751
|
+
// header
|
752
|
+
ValidationErrors::ScopedField field(errors, ".header");
|
753
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header
|
754
|
+
header_policy;
|
755
|
+
header_policy.header_name = UpbStringToStdString(
|
872
756
|
envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
|
873
757
|
header));
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
758
|
+
if (header_policy.header_name.empty()) {
|
759
|
+
ValidationErrors::ScopedField field(errors, ".header_name");
|
760
|
+
errors->AddError("must be non-empty");
|
761
|
+
}
|
762
|
+
// regex_rewrite
|
763
|
+
const auto* regex_rewrite =
|
764
|
+
envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
|
765
|
+
header);
|
878
766
|
if (regex_rewrite != nullptr) {
|
879
|
-
|
767
|
+
ValidationErrors::ScopedField field(errors, ".regex_rewrite.pattern");
|
768
|
+
const auto* pattern =
|
880
769
|
envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
|
881
770
|
regex_rewrite);
|
882
|
-
if (
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
771
|
+
if (pattern == nullptr) {
|
772
|
+
errors->AddError("field not present");
|
773
|
+
continue;
|
774
|
+
}
|
775
|
+
ValidationErrors::ScopedField field2(errors, ".regex");
|
776
|
+
std::string regex = UpbStringToStdString(
|
777
|
+
envoy_type_matcher_v3_RegexMatcher_regex(pattern));
|
778
|
+
if (regex.empty()) {
|
779
|
+
errors->AddError("field not present");
|
888
780
|
continue;
|
889
781
|
}
|
890
782
|
RE2::Options options;
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
if (!policy.regex->ok()) {
|
896
|
-
gpr_log(
|
897
|
-
GPR_DEBUG,
|
898
|
-
"RouteAction HashPolicy contains policy specifier Header with "
|
899
|
-
"RegexMatchAndSubstitution but RegexMatcher pattern does not "
|
900
|
-
"compile");
|
783
|
+
header_policy.regex = std::make_unique<RE2>(regex, options);
|
784
|
+
if (!header_policy.regex->ok()) {
|
785
|
+
errors->AddError(absl::StrCat("errors compiling regex: ",
|
786
|
+
header_policy.regex->error()));
|
901
787
|
continue;
|
902
788
|
}
|
903
|
-
|
789
|
+
header_policy.regex_substitution = UpbStringToStdString(
|
904
790
|
envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
|
905
791
|
regex_rewrite));
|
906
792
|
}
|
793
|
+
policy.policy = std::move(header_policy);
|
907
794
|
} else if ((filter_state =
|
908
795
|
envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
|
909
796
|
hash_policy)) != nullptr) {
|
797
|
+
// filter_state
|
910
798
|
std::string key = UpbStringToStdString(
|
911
799
|
envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
|
912
800
|
filter_state));
|
913
|
-
if (key
|
914
|
-
|
915
|
-
|
916
|
-
} else {
|
917
|
-
gpr_log(GPR_DEBUG,
|
918
|
-
"RouteAction HashPolicy contains policy specifier "
|
919
|
-
"FilterState but "
|
920
|
-
"key is not io.grpc.channel_id.");
|
921
|
-
continue;
|
922
|
-
}
|
801
|
+
if (key != "io.grpc.channel_id") continue;
|
802
|
+
policy.policy =
|
803
|
+
XdsRouteConfigResource::Route::RouteAction::HashPolicy::ChannelId();
|
923
804
|
} else {
|
924
|
-
|
925
|
-
"RouteAction HashPolicy contains unsupported policy specifier.");
|
805
|
+
// Unsupported hash policy type, ignore it.
|
926
806
|
continue;
|
927
807
|
}
|
928
|
-
|
808
|
+
route_action.hash_policies.emplace_back(std::move(policy));
|
929
809
|
}
|
930
810
|
// Get retry policy
|
931
811
|
const envoy_config_route_v3_RetryPolicy* retry_policy =
|
932
|
-
envoy_config_route_v3_RouteAction_retry_policy(
|
812
|
+
envoy_config_route_v3_RouteAction_retry_policy(route_action_proto);
|
933
813
|
if (retry_policy != nullptr) {
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
814
|
+
ValidationErrors::ScopedField field(errors, ".retry_policy");
|
815
|
+
route_action.retry_policy = RetryPolicyParse(context, retry_policy, errors);
|
816
|
+
}
|
817
|
+
// Parse cluster specifier, which is one of several options.
|
818
|
+
if (envoy_config_route_v3_RouteAction_has_cluster(route_action_proto)) {
|
819
|
+
// Cluster name.
|
820
|
+
std::string cluster_name = UpbStringToStdString(
|
821
|
+
envoy_config_route_v3_RouteAction_cluster(route_action_proto));
|
822
|
+
if (cluster_name.empty()) {
|
823
|
+
ValidationErrors::ScopedField field(errors, ".cluster");
|
824
|
+
errors->AddError("must be non-empty");
|
825
|
+
}
|
826
|
+
route_action.action =
|
827
|
+
XdsRouteConfigResource::Route::RouteAction::ClusterName{
|
828
|
+
std::move(cluster_name)};
|
829
|
+
} else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
|
830
|
+
route_action_proto)) {
|
831
|
+
// WeightedClusters.
|
832
|
+
ValidationErrors::ScopedField field(errors, ".weighted_clusters");
|
833
|
+
const envoy_config_route_v3_WeightedCluster* weighted_clusters_proto =
|
834
|
+
envoy_config_route_v3_RouteAction_weighted_clusters(route_action_proto);
|
835
|
+
GPR_ASSERT(weighted_clusters_proto != nullptr);
|
836
|
+
std::vector<XdsRouteConfigResource::Route::RouteAction::ClusterWeight>
|
837
|
+
action_weighted_clusters;
|
838
|
+
size_t clusters_size;
|
839
|
+
const envoy_config_route_v3_WeightedCluster_ClusterWeight* const* clusters =
|
840
|
+
envoy_config_route_v3_WeightedCluster_clusters(weighted_clusters_proto,
|
841
|
+
&clusters_size);
|
842
|
+
for (size_t i = 0; i < clusters_size; ++i) {
|
843
|
+
ValidationErrors::ScopedField field(errors,
|
844
|
+
absl::StrCat(".clusters[", i, "]"));
|
845
|
+
const auto* cluster_proto = clusters[i];
|
846
|
+
XdsRouteConfigResource::Route::RouteAction::ClusterWeight cluster;
|
847
|
+
// typed_per_filter_config
|
848
|
+
{
|
849
|
+
ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
|
850
|
+
cluster.typed_per_filter_config = ParseTypedPerFilterConfig<
|
851
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight,
|
852
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
|
853
|
+
context, cluster_proto,
|
854
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next,
|
855
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_key,
|
856
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_value,
|
857
|
+
errors);
|
858
|
+
}
|
859
|
+
// name
|
860
|
+
cluster.name = UpbStringToStdString(
|
861
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
|
862
|
+
cluster_proto));
|
863
|
+
if (cluster.name.empty()) {
|
864
|
+
ValidationErrors::ScopedField field(errors, ".name");
|
865
|
+
errors->AddError("must be non-empty");
|
866
|
+
}
|
867
|
+
// weight
|
868
|
+
const google_protobuf_UInt32Value* weight_proto =
|
869
|
+
envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
|
870
|
+
cluster_proto);
|
871
|
+
if (weight_proto == nullptr) {
|
872
|
+
ValidationErrors::ScopedField field(errors, ".weight");
|
873
|
+
errors->AddError("field not present");
|
874
|
+
} else {
|
875
|
+
cluster.weight = google_protobuf_UInt32Value_value(weight_proto);
|
876
|
+
if (cluster.weight == 0) continue;
|
877
|
+
}
|
878
|
+
// Add entry to WeightedClusters.
|
879
|
+
action_weighted_clusters.emplace_back(std::move(cluster));
|
880
|
+
}
|
881
|
+
if (action_weighted_clusters.empty()) {
|
882
|
+
errors->AddError("no valid clusters specified");
|
883
|
+
}
|
884
|
+
route_action.action = std::move(action_weighted_clusters);
|
885
|
+
} else if (XdsRlsEnabled() &&
|
886
|
+
envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin(
|
887
|
+
route_action_proto)) {
|
888
|
+
// ClusterSpecifierPlugin
|
889
|
+
ValidationErrors::ScopedField field(errors, ".cluster_specifier_plugin");
|
890
|
+
std::string plugin_name = UpbStringToStdString(
|
891
|
+
envoy_config_route_v3_RouteAction_cluster_specifier_plugin(
|
892
|
+
route_action_proto));
|
893
|
+
if (plugin_name.empty()) {
|
894
|
+
errors->AddError("must be non-empty");
|
895
|
+
return absl::nullopt;
|
896
|
+
}
|
897
|
+
auto it = cluster_specifier_plugin_map.find(plugin_name);
|
898
|
+
if (it == cluster_specifier_plugin_map.end()) {
|
899
|
+
errors->AddError(absl::StrCat("unknown cluster specifier plugin name \"",
|
900
|
+
plugin_name, "\""));
|
901
|
+
} else {
|
902
|
+
// If the cluster specifier config is empty, that means that the
|
903
|
+
// plugin was unsupported but optional. In that case, skip this route.
|
904
|
+
if (it->second.empty()) return absl::nullopt;
|
905
|
+
}
|
906
|
+
route_action.action =
|
907
|
+
XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName{
|
908
|
+
std::move(plugin_name)};
|
909
|
+
} else {
|
910
|
+
// Not a supported cluster specifier, so ignore this route.
|
911
|
+
return absl::nullopt;
|
912
|
+
}
|
913
|
+
return route_action;
|
914
|
+
}
|
915
|
+
|
916
|
+
absl::optional<XdsRouteConfigResource::Route> ParseRoute(
|
917
|
+
const XdsResourceType::DecodeContext& context,
|
918
|
+
const envoy_config_route_v3_Route* route_proto,
|
919
|
+
const absl::optional<XdsRouteConfigResource::RetryPolicy>&
|
920
|
+
virtual_host_retry_policy,
|
921
|
+
const XdsRouteConfigResource::ClusterSpecifierPluginMap&
|
922
|
+
cluster_specifier_plugin_map,
|
923
|
+
std::set<absl::string_view>* cluster_specifier_plugins_not_seen,
|
924
|
+
ValidationErrors* errors) {
|
925
|
+
XdsRouteConfigResource::Route route;
|
926
|
+
// Parse route match.
|
927
|
+
{
|
928
|
+
ValidationErrors::ScopedField field(errors, ".match");
|
929
|
+
const auto* match = envoy_config_route_v3_Route_match(route_proto);
|
930
|
+
if (match == nullptr) {
|
931
|
+
errors->AddError("field not present");
|
932
|
+
return absl::nullopt;
|
933
|
+
}
|
934
|
+
// Skip routes with query_parameters set.
|
935
|
+
size_t query_parameters_size;
|
936
|
+
static_cast<void>(envoy_config_route_v3_RouteMatch_query_parameters(
|
937
|
+
match, &query_parameters_size));
|
938
|
+
if (query_parameters_size > 0) return absl::nullopt;
|
939
|
+
// Parse matchers.
|
940
|
+
auto path_matcher = RoutePathMatchParse(match, errors);
|
941
|
+
if (!path_matcher.has_value()) return absl::nullopt;
|
942
|
+
route.matchers.path_matcher = std::move(*path_matcher);
|
943
|
+
RouteHeaderMatchersParse(match, &route, errors);
|
944
|
+
RouteRuntimeFractionParse(match, &route, errors);
|
945
|
+
}
|
946
|
+
// Parse route action.
|
947
|
+
const envoy_config_route_v3_RouteAction* route_action_proto =
|
948
|
+
envoy_config_route_v3_Route_route(route_proto);
|
949
|
+
if (route_action_proto != nullptr) {
|
950
|
+
ValidationErrors::ScopedField field(errors, ".route");
|
951
|
+
auto route_action = RouteActionParse(context, route_action_proto,
|
952
|
+
cluster_specifier_plugin_map, errors);
|
953
|
+
if (!route_action.has_value()) return absl::nullopt;
|
954
|
+
// If the route does not have a retry policy but the vhost does,
|
955
|
+
// use the vhost retry policy for this route.
|
956
|
+
if (!route_action->retry_policy.has_value()) {
|
957
|
+
route_action->retry_policy = virtual_host_retry_policy;
|
958
|
+
}
|
959
|
+
// Mark off plugins used in route action.
|
960
|
+
auto* cluster_specifier_action = absl::get_if<
|
961
|
+
XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName>(
|
962
|
+
&route_action->action);
|
963
|
+
if (cluster_specifier_action != nullptr) {
|
964
|
+
cluster_specifier_plugins_not_seen->erase(
|
965
|
+
cluster_specifier_action->cluster_specifier_plugin_name);
|
966
|
+
}
|
967
|
+
route.action = std::move(*route_action);
|
968
|
+
} else if (envoy_config_route_v3_Route_has_non_forwarding_action(
|
969
|
+
route_proto)) {
|
970
|
+
route.action = XdsRouteConfigResource::Route::NonForwardingAction();
|
971
|
+
} else {
|
972
|
+
// Leave route.action initialized to UnknownAction (its default).
|
973
|
+
}
|
974
|
+
// Parse typed_per_filter_config.
|
975
|
+
{
|
976
|
+
ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
|
977
|
+
route.typed_per_filter_config = ParseTypedPerFilterConfig<
|
978
|
+
envoy_config_route_v3_Route,
|
979
|
+
envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
|
980
|
+
context, route_proto,
|
981
|
+
envoy_config_route_v3_Route_typed_per_filter_config_next,
|
982
|
+
envoy_config_route_v3_Route_TypedPerFilterConfigEntry_key,
|
983
|
+
envoy_config_route_v3_Route_TypedPerFilterConfigEntry_value, errors);
|
938
984
|
}
|
939
985
|
return route;
|
940
986
|
}
|
941
987
|
|
942
988
|
} // namespace
|
943
989
|
|
944
|
-
|
990
|
+
XdsRouteConfigResource XdsRouteConfigResource::Parse(
|
945
991
|
const XdsResourceType::DecodeContext& context,
|
946
|
-
const envoy_config_route_v3_RouteConfiguration* route_config
|
992
|
+
const envoy_config_route_v3_RouteConfiguration* route_config,
|
993
|
+
ValidationErrors* errors) {
|
947
994
|
XdsRouteConfigResource rds_update;
|
948
|
-
// Get the cluster spcifier
|
995
|
+
// Get the cluster spcifier plugin map.
|
949
996
|
if (XdsRlsEnabled()) {
|
950
|
-
auto cluster_specifier_plugin_map =
|
951
|
-
ClusterSpecifierPluginParse(context, route_config);
|
952
|
-
if (!cluster_specifier_plugin_map.ok()) {
|
953
|
-
return cluster_specifier_plugin_map.status();
|
954
|
-
}
|
955
997
|
rds_update.cluster_specifier_plugin_map =
|
956
|
-
|
998
|
+
ClusterSpecifierPluginParse(context, route_config, errors);
|
999
|
+
}
|
1000
|
+
// Build a set of configured cluster_specifier_plugin names to make sure
|
1001
|
+
// each is actually referenced by a route action.
|
1002
|
+
std::set<absl::string_view> cluster_specifier_plugins_not_seen;
|
1003
|
+
for (auto& plugin : rds_update.cluster_specifier_plugin_map) {
|
1004
|
+
cluster_specifier_plugins_not_seen.emplace(plugin.first);
|
957
1005
|
}
|
958
1006
|
// Get the virtual hosts.
|
959
1007
|
size_t num_virtual_hosts;
|
@@ -961,6 +1009,8 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
|
|
961
1009
|
envoy_config_route_v3_RouteConfiguration_virtual_hosts(
|
962
1010
|
route_config, &num_virtual_hosts);
|
963
1011
|
for (size_t i = 0; i < num_virtual_hosts; ++i) {
|
1012
|
+
ValidationErrors::ScopedField field(
|
1013
|
+
errors, absl::StrCat(".virtual_hosts[", i, "]"));
|
964
1014
|
rds_update.virtual_hosts.emplace_back();
|
965
1015
|
XdsRouteConfigResource::VirtualHost& vhost =
|
966
1016
|
rds_update.virtual_hosts.back();
|
@@ -971,27 +1021,28 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
|
|
971
1021
|
for (size_t j = 0; j < domain_size; ++j) {
|
972
1022
|
std::string domain_pattern = UpbStringToStdString(domains[j]);
|
973
1023
|
if (!XdsRouting::IsValidDomainPattern(domain_pattern)) {
|
974
|
-
|
975
|
-
|
1024
|
+
ValidationErrors::ScopedField field(errors,
|
1025
|
+
absl::StrCat(".domains[", j, "]"));
|
1026
|
+
errors->AddError(
|
1027
|
+
absl::StrCat("invalid domain pattern \"", domain_pattern, "\""));
|
976
1028
|
}
|
977
1029
|
vhost.domains.emplace_back(std::move(domain_pattern));
|
978
1030
|
}
|
979
1031
|
if (vhost.domains.empty()) {
|
980
|
-
|
1032
|
+
ValidationErrors::ScopedField field(errors, ".domains");
|
1033
|
+
errors->AddError("must be non-empty");
|
981
1034
|
}
|
982
1035
|
// Parse typed_per_filter_config.
|
983
|
-
|
984
|
-
|
1036
|
+
{
|
1037
|
+
ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
|
1038
|
+
vhost.typed_per_filter_config = ParseTypedPerFilterConfig<
|
985
1039
|
envoy_config_route_v3_VirtualHost,
|
986
1040
|
envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry>(
|
987
1041
|
context, virtual_hosts[i],
|
988
1042
|
envoy_config_route_v3_VirtualHost_typed_per_filter_config_next,
|
989
1043
|
envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_key,
|
990
|
-
envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_value
|
991
|
-
|
992
|
-
return typed_per_filter_config.status();
|
993
|
-
}
|
994
|
-
vhost.typed_per_filter_config = std::move(*typed_per_filter_config);
|
1044
|
+
envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_value,
|
1045
|
+
errors);
|
995
1046
|
}
|
996
1047
|
// Parse retry policy.
|
997
1048
|
absl::optional<XdsRouteConfigResource::RetryPolicy>
|
@@ -999,94 +1050,28 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
|
|
999
1050
|
const envoy_config_route_v3_RetryPolicy* retry_policy =
|
1000
1051
|
envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
|
1001
1052
|
if (retry_policy != nullptr) {
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1053
|
+
ValidationErrors::ScopedField field(errors, ".retry_policy");
|
1054
|
+
virtual_host_retry_policy =
|
1055
|
+
RetryPolicyParse(context, retry_policy, errors);
|
1005
1056
|
}
|
1006
1057
|
// Parse routes.
|
1058
|
+
ValidationErrors::ScopedField field2(errors, ".routes");
|
1007
1059
|
size_t num_routes;
|
1008
1060
|
const envoy_config_route_v3_Route* const* routes =
|
1009
1061
|
envoy_config_route_v3_VirtualHost_routes(virtual_hosts[i], &num_routes);
|
1010
|
-
if (num_routes < 1) {
|
1011
|
-
return absl::InvalidArgumentError("No route found in the virtual host.");
|
1012
|
-
}
|
1013
|
-
// Build a set of cluster_specifier_plugin configured to make sure each is
|
1014
|
-
// actually referenced by a route action.
|
1015
|
-
std::set<absl::string_view> cluster_specifier_plugins;
|
1016
|
-
for (auto& plugin : rds_update.cluster_specifier_plugin_map) {
|
1017
|
-
cluster_specifier_plugins.emplace(plugin.first);
|
1018
|
-
}
|
1019
|
-
// Loop over the whole list of routes
|
1020
1062
|
for (size_t j = 0; j < num_routes; ++j) {
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
size_t query_parameters_size;
|
1027
|
-
static_cast<void>(envoy_config_route_v3_RouteMatch_query_parameters(
|
1028
|
-
match, &query_parameters_size));
|
1029
|
-
if (query_parameters_size > 0) {
|
1030
|
-
continue;
|
1031
|
-
}
|
1032
|
-
XdsRouteConfigResource::Route route;
|
1033
|
-
bool ignore_route = false;
|
1034
|
-
absl::Status status = RoutePathMatchParse(match, &route, &ignore_route);
|
1035
|
-
if (!status.ok()) return status;
|
1036
|
-
if (ignore_route) continue;
|
1037
|
-
status = RouteHeaderMatchersParse(match, &route);
|
1038
|
-
if (!status.ok()) return status;
|
1039
|
-
status = RouteRuntimeFractionParse(match, &route);
|
1040
|
-
if (!status.ok()) return status;
|
1041
|
-
if (envoy_config_route_v3_Route_has_route(routes[j])) {
|
1042
|
-
route.action.emplace<XdsRouteConfigResource::Route::RouteAction>();
|
1043
|
-
auto route_action = RouteActionParse(
|
1044
|
-
context, routes[j], rds_update.cluster_specifier_plugin_map,
|
1045
|
-
&ignore_route);
|
1046
|
-
if (!route_action.ok()) return route_action.status();
|
1047
|
-
if (ignore_route) continue;
|
1048
|
-
if (route_action->retry_policy == absl::nullopt &&
|
1049
|
-
retry_policy != nullptr) {
|
1050
|
-
route_action->retry_policy = virtual_host_retry_policy;
|
1051
|
-
}
|
1052
|
-
// Mark off plugins used in route action.
|
1053
|
-
auto* cluster_specifier_action =
|
1054
|
-
absl::get_if<XdsRouteConfigResource::Route::RouteAction::
|
1055
|
-
ClusterSpecifierPluginName>(&route_action->action);
|
1056
|
-
if (cluster_specifier_action != nullptr) {
|
1057
|
-
cluster_specifier_plugins.erase(
|
1058
|
-
cluster_specifier_action->cluster_specifier_plugin_name);
|
1059
|
-
}
|
1060
|
-
route.action = std::move(*route_action);
|
1061
|
-
} else if (envoy_config_route_v3_Route_has_non_forwarding_action(
|
1062
|
-
routes[j])) {
|
1063
|
-
route.action
|
1064
|
-
.emplace<XdsRouteConfigResource::Route::NonForwardingAction>();
|
1065
|
-
}
|
1066
|
-
if (context.server.ShouldUseV3()) {
|
1067
|
-
auto typed_per_filter_config = ParseTypedPerFilterConfig<
|
1068
|
-
envoy_config_route_v3_Route,
|
1069
|
-
envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
|
1070
|
-
context, routes[j],
|
1071
|
-
envoy_config_route_v3_Route_typed_per_filter_config_next,
|
1072
|
-
envoy_config_route_v3_Route_TypedPerFilterConfigEntry_key,
|
1073
|
-
envoy_config_route_v3_Route_TypedPerFilterConfigEntry_value);
|
1074
|
-
if (!typed_per_filter_config.ok()) {
|
1075
|
-
return typed_per_filter_config.status();
|
1076
|
-
}
|
1077
|
-
route.typed_per_filter_config = std::move(*typed_per_filter_config);
|
1078
|
-
}
|
1079
|
-
vhost.routes.emplace_back(std::move(route));
|
1080
|
-
}
|
1081
|
-
if (vhost.routes.empty()) {
|
1082
|
-
return absl::InvalidArgumentError("No valid routes specified.");
|
1083
|
-
}
|
1084
|
-
// For plugins not used in route action, delete from the update to prevent
|
1085
|
-
// further use.
|
1086
|
-
for (auto& unused_plugin : cluster_specifier_plugins) {
|
1087
|
-
rds_update.cluster_specifier_plugin_map.erase(std::string(unused_plugin));
|
1063
|
+
ValidationErrors::ScopedField field(errors, absl::StrCat("[", j, "]"));
|
1064
|
+
auto route = ParseRoute(context, routes[j], virtual_host_retry_policy,
|
1065
|
+
rds_update.cluster_specifier_plugin_map,
|
1066
|
+
&cluster_specifier_plugins_not_seen, errors);
|
1067
|
+
if (route.has_value()) vhost.routes.emplace_back(std::move(*route));
|
1088
1068
|
}
|
1089
1069
|
}
|
1070
|
+
// For cluster specifier plugins that were not used in any route action,
|
1071
|
+
// delete them from the update, since they will never be used.
|
1072
|
+
for (auto& unused_plugin : cluster_specifier_plugins_not_seen) {
|
1073
|
+
rds_update.cluster_specifier_plugin_map.erase(std::string(unused_plugin));
|
1074
|
+
}
|
1090
1075
|
return rds_update;
|
1091
1076
|
}
|
1092
1077
|
|
@@ -1114,7 +1099,7 @@ void MaybeLogRouteConfiguration(
|
|
1114
1099
|
|
1115
1100
|
XdsResourceType::DecodeResult XdsRouteConfigResourceType::Decode(
|
1116
1101
|
const XdsResourceType::DecodeContext& context,
|
1117
|
-
absl::string_view serialized_resource
|
1102
|
+
absl::string_view serialized_resource) const {
|
1118
1103
|
DecodeResult result;
|
1119
1104
|
// Parse serialized proto.
|
1120
1105
|
auto* resource = envoy_config_route_v3_RouteConfiguration_parse(
|
@@ -1128,23 +1113,24 @@ XdsResourceType::DecodeResult XdsRouteConfigResourceType::Decode(
|
|
1128
1113
|
// Validate resource.
|
1129
1114
|
result.name = UpbStringToStdString(
|
1130
1115
|
envoy_config_route_v3_RouteConfiguration_name(resource));
|
1131
|
-
|
1132
|
-
|
1116
|
+
ValidationErrors errors;
|
1117
|
+
auto rds_update = XdsRouteConfigResource::Parse(context, resource, &errors);
|
1118
|
+
if (!errors.ok()) {
|
1119
|
+
absl::Status status =
|
1120
|
+
errors.status("errors validating RouteConfiguration resource");
|
1133
1121
|
if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
|
1134
1122
|
gpr_log(GPR_ERROR, "[xds_client %p] invalid RouteConfiguration %s: %s",
|
1135
|
-
context.client, result.name->c_str(),
|
1136
|
-
rds_update.status().ToString().c_str());
|
1123
|
+
context.client, result.name->c_str(), status.ToString().c_str());
|
1137
1124
|
}
|
1138
|
-
result.resource =
|
1125
|
+
result.resource = std::move(status);
|
1139
1126
|
} else {
|
1140
1127
|
if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
|
1141
1128
|
gpr_log(GPR_INFO, "[xds_client %p] parsed RouteConfiguration %s: %s",
|
1142
1129
|
context.client, result.name->c_str(),
|
1143
|
-
rds_update
|
1130
|
+
rds_update.ToString().c_str());
|
1144
1131
|
}
|
1145
|
-
|
1146
|
-
|
1147
|
-
result.resource = std::move(resource);
|
1132
|
+
result.resource =
|
1133
|
+
std::make_unique<XdsRouteConfigResource>(std::move(rds_update));
|
1148
1134
|
}
|
1149
1135
|
return result;
|
1150
1136
|
}
|