grpc 1.45.0 → 1.53.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +437 -254
- 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/endpoint_config.h +11 -5
- data/include/grpc/event_engine/event_engine.h +129 -39
- 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 -16
- data/include/grpc/event_engine/port.h +1 -1
- data/include/grpc/event_engine/slice.h +306 -0
- data/include/grpc/event_engine/slice_buffer.h +159 -0
- data/include/grpc/fork.h +25 -1
- data/include/grpc/grpc.h +4 -14
- data/include/grpc/grpc_posix.h +1 -1
- data/include/grpc/grpc_security.h +11 -0
- data/include/grpc/impl/codegen/atm.h +3 -71
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
- data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
- data/include/grpc/impl/codegen/atm_windows.h +3 -108
- 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 +5 -83
- data/include/grpc/impl/codegen/connectivity_state.h +5 -21
- data/include/grpc/impl/codegen/fork.h +4 -25
- data/include/grpc/impl/codegen/gpr_types.h +4 -35
- data/include/grpc/impl/codegen/grpc_types.h +5 -797
- data/include/grpc/impl/codegen/log.h +3 -86
- data/include/grpc/impl/codegen/port_platform.h +3 -699
- data/include/grpc/impl/codegen/propagation_bits.h +3 -28
- data/include/grpc/impl/codegen/slice.h +4 -107
- 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 +827 -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 +31 -6
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
- data/src/core/ext/filters/census/grpc_context.cc +19 -17
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
- data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
- data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +6 -4
- data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
- data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
- data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
- data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
- data/src/core/ext/filters/client_channel/client_channel.cc +557 -540
- data/src/core/ext/filters/client_channel/client_channel.h +70 -26
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
- data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
- 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} +33 -27
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
- data/src/core/ext/filters/client_channel/config_selector.h +29 -23
- data/src/core/ext/filters/client_channel/connector.h +19 -10
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
- data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +137 -582
- data/src/core/ext/filters/client_channel/health/health_check_client.h +29 -163
- data/src/core/ext/filters/client_channel/http_proxy.cc +130 -164
- data/src/core/ext/filters/client_channel/http_proxy.h +46 -22
- 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 +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
- 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 +27 -22
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +478 -479
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -409
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +618 -642
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +280 -248
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +251 -187
- 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} +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +212 -216
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +543 -584
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +579 -376
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
- 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 +20 -19
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +86 -224
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +269 -0
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +121 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +413 -303
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
- data/src/core/ext/filters/client_channel/retry_filter.cc +184 -166
- data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
- data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
- data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
- data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
- data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
- data/src/core/ext/filters/client_channel/subchannel.cc +336 -388
- data/src/core/ext/filters/client_channel/subchannel.h +112 -82
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
- data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +154 -372
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +41 -9
- 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} +34 -13
- data/src/core/ext/filters/http/client/http_client_filter.cc +119 -477
- data/src/core/ext/filters/http/client/http_client_filter.h +55 -25
- data/src/core/ext/filters/http/client_authority_filter.cc +48 -58
- data/src/core/ext/filters/http/client_authority_filter.h +32 -28
- data/src/core/ext/filters/http/http_filters_plugin.cc +46 -52
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +111 -385
- data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
- data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
- data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
- data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +90 -202
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -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 +24 -24
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +186 -241
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +209 -215
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +31 -30
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +29 -29
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +893 -1079
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
- data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
- data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
- data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
- data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
- data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +46 -77
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +169 -220
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +59 -61
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +4 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +14 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +114 -542
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +31 -24
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +75 -67
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +70 -48
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
- 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 +21 -21
- data/src/core/ext/transport/chttp2/transport/internal.h +250 -298
- data/src/core/ext/transport/chttp2/transport/parsing.cc +365 -132
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
- data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
- data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
- data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
- data/src/core/ext/transport/chttp2/transport/writing.cc +144 -106
- data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
- data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
- data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +173 -73
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +39 -36
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +210 -85
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +29 -344
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +189 -1489
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +38 -17
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +9 -7
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +56 -13
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +24 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +19 -6
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +15 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +229 -82
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +16 -4
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +26 -4
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +379 -140
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +140 -126
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +824 -301
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +114 -29
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +195 -191
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1042 -412
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +16 -4
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +171 -42
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +517 -202
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +61 -36
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +333 -66
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +20 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +93 -91
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +615 -213
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +417 -79
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +20 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +16 -93
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +38 -17
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +447 -157
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +98 -66
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +545 -191
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +108 -87
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +502 -149
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +9 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +42 -17
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +24 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +110 -18
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +64 -26
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +20 -6
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +118 -49
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +39 -32
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +242 -87
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +226 -105
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +86 -53
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +475 -141
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +379 -160
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +16 -12
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +77 -16
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +9 -6
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +50 -8
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +26 -6
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +253 -102
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +229 -92
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +74 -55
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +494 -160
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +38 -30
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +232 -124
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +458 -351
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2879 -947
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +67 -22
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +79 -54
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +454 -133
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +21 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +16 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +38 -14
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +33 -14
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +89 -38
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +13 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +58 -21
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +50 -16
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +9 -8
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +43 -10
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +16 -8
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +101 -38
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +167 -71
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +16 -8
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +88 -16
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +71 -17
- 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/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +184 -144
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1091 -361
- 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/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +56 -48
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +327 -130
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +88 -31
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +83 -56
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +472 -136
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +35 -13
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +171 -54
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +917 -134
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +59 -25
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -33
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +205 -76
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +23 -8
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +62 -25
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +36 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +55 -22
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +26 -11
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +30 -11
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +20 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +58 -22
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +82 -29
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +49 -22
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +99 -36
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +118 -44
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +120 -40
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +46 -16
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +9 -2
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +25 -8
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +36 -6
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +15 -2
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +23 -6
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +477 -185
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +512 -182
- data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
- data/src/core/ext/upb-generated/google/api/http.upb.h +134 -49
- data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
- data/src/core/ext/upb-generated/google/api/httpbody.upb.h +25 -9
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +12 -2
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +183 -181
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1332 -488
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +16 -6
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +126 -46
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +16 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +81 -18
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +25 -9
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +89 -30
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +55 -14
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +424 -169
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +32 -8
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +18 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +204 -76
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +63 -22
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +115 -16
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +29 -4
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +33 -8
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +26 -4
- data/src/core/ext/upb-generated/validate/validate.upb.c +264 -253
- data/src/core/ext/upb-generated/validate/validate.upb.h +1974 -709
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +115 -16
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +29 -4
- data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +94 -18
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +26 -4
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +9 -2
- 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/core/v3/collection_entry.upb.c +8 -8
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +50 -16
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +33 -12
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +16 -4
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +27 -10
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +83 -34
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +22 -4
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +14 -13
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +84 -28
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
- 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/matcher.upb.c +43 -39
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +309 -121
- 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/matcher/v3/regex.upb.c +4 -4
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +31 -12
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +82 -29
- 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 +3 -4
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +16 -4
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +149 -129
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +168 -154
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -68
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -747
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
- 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/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +483 -445
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -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/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +211 -193
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
- data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
- data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -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 +75 -3
- data/src/core/ext/xds/certificate_provider_store.h +30 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
- data/src/core/ext/xds/upb_utils.h +3 -25
- data/src/core/ext/xds/xds_api.cc +106 -192
- data/src/core/ext/xds/xds_api.h +41 -39
- data/src/core/ext/xds/xds_bootstrap.cc +5 -537
- data/src/core/ext/xds/xds_bootstrap.h +42 -95
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
- data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
- data/src/core/ext/xds/xds_certificate_provider.h +36 -4
- data/src/core/ext/xds/xds_channel_args.h +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
- data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
- data/src/core/ext/xds/xds_client.cc +885 -1360
- data/src/core/ext/xds/xds_client.h +69 -65
- data/src/core/ext/xds/xds_client_grpc.cc +235 -0
- data/src/core/ext/xds/xds_client_grpc.h +79 -0
- data/src/core/ext/xds/xds_client_stats.cc +24 -25
- data/src/core/ext/xds/xds_client_stats.h +26 -24
- data/src/core/ext/xds/xds_cluster.cc +505 -247
- data/src/core/ext/xds/xds_cluster.h +69 -40
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +132 -0
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +97 -0
- data/src/core/ext/xds/xds_common_types.cc +238 -123
- data/src/core/ext/xds/xds_common_types.h +29 -16
- data/src/core/ext/xds/xds_endpoint.cc +266 -156
- data/src/core/ext/xds/xds_endpoint.h +19 -15
- data/src/core/ext/xds/xds_health_status.cc +80 -0
- data/src/core/ext/xds/xds_health_status.h +109 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +68 -59
- data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
- data/src/core/ext/xds/xds_http_filters.cc +70 -71
- data/src/core/ext/xds/xds_http_filters.h +73 -25
- data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
- data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
- 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 +334 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
- data/src/core/ext/xds/xds_listener.cc +573 -481
- data/src/core/ext/xds/xds_listener.h +57 -51
- data/src/core/ext/xds/xds_resource_type.h +28 -22
- data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
- data/src/core/ext/xds/xds_route_config.cc +638 -479
- data/src/core/ext/xds/xds_route_config.h +79 -42
- data/src/core/ext/xds/xds_routing.cc +21 -7
- data/src/core/ext/xds/xds_routing.h +17 -12
- data/src/core/ext/xds/xds_server_config_fetcher.cc +244 -200
- data/src/core/ext/xds/xds_transport.h +86 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
- data/src/core/ext/xds/xds_transport_grpc.h +135 -0
- data/src/core/lib/address_utils/parse_address.cc +52 -52
- data/src/core/lib/address_utils/parse_address.h +46 -42
- data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
- data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
- data/src/core/lib/avl/avl.h +100 -13
- data/src/core/lib/backoff/backoff.cc +19 -21
- data/src/core/lib/backoff/backoff.h +21 -21
- data/src/core/lib/channel/call_finalization.h +6 -4
- data/src/core/lib/channel/call_tracer.h +27 -9
- data/src/core/lib/channel/channel_args.cc +268 -101
- data/src/core/lib/channel/channel_args.h +461 -56
- data/src/core/lib/channel/channel_args_preconditioning.cc +6 -11
- data/src/core/lib/channel/channel_args_preconditioning.h +7 -7
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +92 -52
- data/src/core/lib/channel/channel_stack.h +186 -140
- data/src/core/lib/channel/channel_stack_builder.cc +26 -104
- data/src/core/lib/channel/channel_stack_builder.h +45 -31
- data/src/core/lib/channel/channel_stack_builder_impl.cc +126 -0
- data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
- data/src/core/lib/channel/channel_trace.cc +29 -36
- data/src/core/lib/channel/channel_trace.h +27 -24
- data/src/core/lib/channel/channelz.cc +50 -65
- data/src/core/lib/channel/channelz.h +50 -33
- data/src/core/lib/channel/channelz_registry.cc +28 -36
- data/src/core/lib/channel/channelz_registry.h +31 -30
- data/src/core/lib/channel/connected_channel.cc +1267 -78
- data/src/core/lib/channel/connected_channel.h +22 -23
- data/src/core/lib/channel/context.h +25 -21
- data/src/core/lib/channel/promise_based_filter.cc +2155 -303
- data/src/core/lib/channel/promise_based_filter.h +636 -122
- data/src/core/lib/channel/status_util.cc +64 -17
- data/src/core/lib/channel/status_util.h +38 -24
- data/src/core/lib/compression/compression.cc +24 -19
- data/src/core/lib/compression/compression_internal.cc +89 -70
- data/src/core/lib/compression/compression_internal.h +28 -27
- data/src/core/lib/compression/message_compress.cc +28 -26
- data/src/core/lib/compression/message_compress.h +28 -29
- data/src/core/lib/config/core_configuration.cc +8 -1
- data/src/core/lib/config/core_configuration.h +86 -39
- 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/debug/histogram_view.h +37 -0
- data/src/core/lib/debug/stats.cc +48 -152
- data/src/core/lib/debug/stats.h +50 -57
- data/src/core/lib/debug/stats_data.cc +302 -649
- data/src/core/lib/debug/stats_data.h +293 -548
- data/src/core/lib/debug/trace.cc +18 -20
- data/src/core/lib/debug/trace.h +27 -48
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +99 -0
- data/src/core/lib/event_engine/default_event_engine.h +73 -0
- data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
- data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
- data/src/core/lib/event_engine/event_engine.cc +3 -30
- data/src/core/lib/event_engine/executor/executor.h +38 -0
- data/src/core/lib/event_engine/forkable.cc +106 -0
- data/src/core/lib/event_engine/forkable.h +61 -0
- data/src/core/lib/event_engine/handle_containers.h +74 -0
- data/src/core/lib/event_engine/memory_allocator.cc +11 -3
- data/src/core/lib/event_engine/poller.h +62 -0
- data/src/core/lib/event_engine/posix.h +158 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -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/posix_engine/event_poller_posix_default.h +33 -0
- 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 +1305 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
- 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 +289 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -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 +311 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
- 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/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
- 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/resolved_address.cc +23 -2
- data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
- data/src/core/lib/event_engine/shim.cc +56 -0
- data/src/core/lib/event_engine/shim.h +33 -0
- data/src/core/lib/event_engine/slice.cc +103 -0
- data/src/core/lib/event_engine/slice_buffer.cc +50 -0
- data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
- data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
- data/src/core/lib/event_engine/thread_local.cc +29 -0
- data/src/core/lib/event_engine/thread_local.h +32 -0
- data/src/core/lib/event_engine/thread_pool.cc +253 -0
- data/src/core/lib/event_engine/thread_pool.h +141 -0
- data/src/core/lib/event_engine/time_util.cc +30 -0
- data/src/core/lib/event_engine/time_util.h +32 -0
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/event_engine/trace.cc} +9 -13
- data/src/core/lib/event_engine/trace.h +43 -0
- data/src/core/lib/event_engine/utils.cc +44 -0
- data/src/core/lib/event_engine/utils.h +44 -0
- data/src/core/lib/event_engine/windows/iocp.cc +140 -0
- data/src/core/lib/event_engine/windows/iocp.h +69 -0
- data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
- data/src/core/lib/event_engine/windows/win_socket.h +129 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
- data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
- data/src/core/lib/experiments/config.cc +161 -0
- data/src/core/lib/experiments/config.h +53 -0
- data/src/core/lib/experiments/experiments.cc +81 -0
- data/src/core/lib/experiments/experiments.h +117 -0
- data/src/core/lib/gpr/alloc.cc +19 -25
- data/src/core/lib/gpr/alloc.h +20 -20
- 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 +30 -17
- 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 -25
- data/src/core/lib/gpr/spinlock.h +20 -20
- data/src/core/lib/gpr/string.cc +25 -24
- data/src/core/lib/gpr/string.h +61 -61
- data/src/core/lib/gpr/string_posix.cc +24 -24
- data/src/core/lib/gpr/string_util_windows.cc +25 -52
- 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 +36 -40
- data/src/core/lib/gpr/sync_posix.cc +22 -34
- data/src/core/lib/gpr/sync_windows.cc +29 -27
- data/src/core/lib/gpr/time.cc +34 -30
- data/src/core/lib/gpr/time_posix.cc +41 -45
- data/src/core/lib/gpr/time_precise.cc +22 -22
- data/src/core/lib/gpr/time_precise.h +21 -22
- data/src/core/lib/gpr/time_windows.cc +35 -29
- data/src/core/lib/gpr/tmpfile.h +24 -24
- 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 +28 -29
- data/src/core/lib/gpr/useful.h +83 -30
- data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
- data/src/core/lib/gprpp/atomic_utils.h +20 -20
- data/src/core/lib/gprpp/bitset.h +47 -17
- data/src/core/lib/gprpp/chunked_vector.h +7 -3
- data/src/core/lib/gprpp/construct_destruct.h +4 -3
- data/src/core/lib/gprpp/cpp_impl_of.h +7 -3
- 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 +60 -31
- data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
- data/src/core/lib/gprpp/env.h +53 -0
- data/src/core/lib/gprpp/env_linux.cc +80 -0
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/gprpp/env_posix.cc} +25 -9
- data/src/core/lib/gprpp/env_windows.cc +56 -0
- data/src/core/lib/gprpp/examine_stack.cc +17 -17
- data/src/core/lib/gprpp/examine_stack.h +21 -22
- data/src/core/lib/gprpp/fork.cc +58 -53
- data/src/core/lib/gprpp/fork.h +29 -35
- data/src/core/lib/gprpp/global_config.h +22 -24
- data/src/core/lib/gprpp/global_config_custom.h +20 -20
- data/src/core/lib/gprpp/global_config_env.cc +28 -25
- data/src/core/lib/gprpp/global_config_env.h +29 -27
- data/src/core/lib/gprpp/global_config_generic.h +21 -25
- data/src/core/lib/gprpp/host_port.cc +30 -26
- data/src/core/lib/gprpp/host_port.h +32 -31
- 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 +21 -89
- data/src/core/lib/gprpp/match.h +75 -0
- data/src/core/lib/gprpp/memory.h +22 -26
- data/src/core/lib/gprpp/mpscq.cc +17 -17
- data/src/core/lib/gprpp/mpscq.h +21 -21
- data/src/core/lib/gprpp/no_destruct.h +95 -0
- data/src/core/lib/gprpp/notification.h +67 -0
- data/src/core/lib/gprpp/orphanable.h +22 -25
- data/src/core/lib/gprpp/overload.h +59 -0
- data/src/core/lib/gprpp/packed_table.h +40 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/ref_counted.h +24 -24
- data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
- data/src/core/lib/gprpp/single_set_ptr.h +87 -0
- data/src/core/lib/gprpp/sorted_pack.h +98 -0
- data/src/core/lib/gprpp/stat.h +3 -5
- data/src/core/lib/gprpp/stat_posix.cc +10 -4
- data/src/core/lib/gprpp/stat_windows.cc +4 -2
- data/src/core/lib/gprpp/status_helper.cc +56 -20
- data/src/core/lib/gprpp/status_helper.h +13 -5
- data/src/core/lib/gprpp/strerror.cc +43 -0
- data/src/core/lib/gprpp/strerror.h +29 -0
- data/src/core/lib/gprpp/sync.h +26 -24
- data/src/core/lib/gprpp/table.h +22 -4
- data/src/core/lib/gprpp/tchar.cc +49 -0
- data/src/core/lib/gprpp/tchar.h +33 -0
- data/src/core/lib/gprpp/thd.h +25 -28
- data/src/core/lib/gprpp/thd_posix.cc +33 -32
- data/src/core/lib/gprpp/thd_windows.cc +28 -26
- data/src/core/lib/gprpp/time.cc +64 -9
- data/src/core/lib/gprpp/time.h +79 -5
- data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
- data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
- data/src/core/lib/gprpp/time_util.cc +4 -0
- data/src/core/lib/gprpp/time_util.h +3 -3
- data/src/core/lib/gprpp/unique_type_name.h +104 -0
- data/src/core/lib/gprpp/validation_errors.cc +61 -0
- data/src/core/lib/gprpp/validation_errors.h +127 -0
- data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
- data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
- data/src/core/lib/handshaker/proxy_mapper.h +53 -0
- data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
- data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
- data/src/core/lib/http/format_request.cc +54 -24
- data/src/core/lib/http/format_request.h +23 -21
- data/src/core/lib/http/httpcli.cc +139 -141
- data/src/core/lib/http/httpcli.h +86 -38
- data/src/core/lib/http/httpcli_security_connector.cc +53 -45
- data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
- data/src/core/lib/http/parser.cc +144 -85
- data/src/core/lib/http/parser.h +51 -35
- data/src/core/lib/iomgr/block_annotate.h +23 -23
- data/src/core/lib/iomgr/buffer_list.cc +156 -136
- data/src/core/lib/iomgr/buffer_list.h +123 -101
- data/src/core/lib/iomgr/call_combiner.cc +32 -64
- data/src/core/lib/iomgr/call_combiner.h +24 -25
- data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
- data/src/core/lib/iomgr/cfstream_handle.h +25 -25
- data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
- data/src/core/lib/iomgr/closure.h +95 -58
- data/src/core/lib/iomgr/combiner.cc +20 -39
- data/src/core/lib/iomgr/combiner.h +20 -20
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
- data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
- data/src/core/lib/iomgr/endpoint.cc +21 -21
- data/src/core/lib/iomgr/endpoint.h +53 -51
- data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
- data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
- data/src/core/lib/iomgr/endpoint_pair.h +20 -20
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +34 -27
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +30 -21
- data/src/core/lib/iomgr/error.cc +51 -834
- data/src/core/lib/iomgr/error.h +45 -317
- data/src/core/lib/iomgr/error_cfstream.cc +18 -23
- data/src/core/lib/iomgr/error_cfstream.h +21 -21
- data/src/core/lib/iomgr/ev_apple.cc +21 -21
- data/src/core/lib/iomgr/ev_apple.h +21 -21
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
- data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
- data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
- data/src/core/lib/iomgr/ev_posix.cc +88 -122
- data/src/core/lib/iomgr/ev_posix.h +93 -87
- data/src/core/lib/iomgr/ev_windows.cc +18 -18
- data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
- data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
- data/src/core/lib/iomgr/exec_ctx.cc +34 -56
- data/src/core/lib/iomgr/exec_ctx.h +152 -177
- data/src/core/lib/iomgr/executor.cc +21 -31
- data/src/core/lib/iomgr/executor.h +27 -30
- data/src/core/lib/iomgr/fork_posix.cc +31 -28
- data/src/core/lib/iomgr/fork_windows.cc +21 -21
- data/src/core/lib/iomgr/gethostname.h +20 -20
- 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 +22 -22
- 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 +41 -48
- data/src/core/lib/iomgr/internal_errqueue.h +84 -89
- data/src/core/lib/iomgr/iocp_windows.cc +23 -23
- data/src/core/lib/iomgr/iocp_windows.h +21 -21
- data/src/core/lib/iomgr/iomgr.cc +25 -20
- data/src/core/lib/iomgr/iomgr.h +35 -35
- data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
- data/src/core/lib/iomgr/iomgr_internal.h +28 -28
- data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -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 +22 -22
- data/src/core/lib/iomgr/lockfree_event.cc +114 -131
- data/src/core/lib/iomgr/lockfree_event.h +23 -23
- data/src/core/lib/iomgr/nameser.h +86 -86
- data/src/core/lib/iomgr/polling_entity.cc +25 -21
- data/src/core/lib/iomgr/polling_entity.h +29 -29
- data/src/core/lib/iomgr/pollset.cc +17 -17
- data/src/core/lib/iomgr/pollset.h +55 -55
- data/src/core/lib/iomgr/pollset_set.cc +17 -17
- data/src/core/lib/iomgr/pollset_set.h +26 -28
- data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
- data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
- data/src/core/lib/iomgr/pollset_windows.cc +32 -31
- data/src/core/lib/iomgr/pollset_windows.h +24 -24
- data/src/core/lib/iomgr/port.h +59 -39
- data/src/core/lib/iomgr/python_util.h +24 -24
- data/src/core/lib/iomgr/resolve_address.cc +34 -20
- data/src/core/lib/iomgr/resolve_address.h +73 -43
- data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
- data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
- data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
- data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
- data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
- data/src/core/lib/iomgr/resolved_address.h +3 -3
- data/src/core/lib/iomgr/sockaddr.h +25 -26
- data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
- data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
- data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
- data/src/core/lib/iomgr/socket_mutator.cc +19 -18
- data/src/core/lib/iomgr/socket_mutator.h +39 -39
- data/src/core/lib/iomgr/socket_utils.h +27 -27
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
- data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
- data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
- data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
- 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 +59 -61
- data/src/core/lib/iomgr/systemd_utils.cc +116 -0
- data/src/core/lib/iomgr/systemd_utils.h +33 -0
- data/src/core/lib/iomgr/tcp_client.cc +28 -24
- data/src/core/lib/iomgr/tcp_client.h +49 -38
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
- data/src/core/lib/iomgr/tcp_client_posix.cc +244 -106
- data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
- data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
- data/src/core/lib/iomgr/tcp_posix.cc +562 -361
- data/src/core/lib/iomgr/tcp_posix.h +32 -30
- data/src/core/lib/iomgr/tcp_server.cc +33 -24
- data/src/core/lib/iomgr/tcp_server.h +78 -69
- data/src/core/lib/iomgr/tcp_server_posix.cc +402 -145
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
- data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
- data/src/core/lib/iomgr/tcp_windows.cc +116 -98
- data/src/core/lib/iomgr/tcp_windows.h +34 -35
- data/src/core/lib/iomgr/timer.cc +17 -17
- data/src/core/lib/iomgr/timer.h +68 -68
- data/src/core/lib/iomgr/timer_generic.cc +125 -134
- data/src/core/lib/iomgr/timer_generic.h +21 -21
- data/src/core/lib/iomgr/timer_heap.cc +25 -25
- data/src/core/lib/iomgr/timer_heap.h +22 -22
- data/src/core/lib/iomgr/timer_manager.cc +31 -31
- data/src/core/lib/iomgr/timer_manager.h +27 -27
- data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
- 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 +20 -20
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
- data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
- data/src/core/lib/json/json.h +23 -27
- data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +217 -0
- data/src/core/lib/json/json_object_loader.h +634 -0
- data/src/core/lib/json/json_reader.cc +123 -90
- data/src/core/lib/json/json_util.cc +14 -34
- data/src/core/lib/json/json_util.h +19 -10
- data/src/core/lib/json/json_writer.cc +62 -57
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
- data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
- data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
- data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
- data/src/core/lib/matchers/matchers.cc +12 -7
- data/src/core/lib/matchers/matchers.h +5 -3
- data/src/core/lib/promise/activity.cc +23 -8
- data/src/core/lib/promise/activity.h +116 -58
- data/src/core/lib/promise/arena_promise.h +115 -72
- data/src/core/lib/promise/context.h +18 -11
- data/src/core/lib/promise/detail/basic_join.h +197 -0
- data/src/core/lib/promise/detail/basic_seq.h +28 -33
- data/src/core/lib/promise/detail/promise_factory.h +61 -14
- data/src/core/lib/promise/detail/promise_like.h +3 -3
- data/src/core/lib/promise/detail/status.h +33 -4
- data/src/core/lib/promise/detail/switch.h +21 -21
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
- data/src/core/lib/promise/if.h +195 -0
- data/src/core/lib/promise/interceptor_list.h +308 -0
- data/src/core/lib/promise/intra_activity_waiter.h +55 -0
- data/src/core/lib/promise/latch.h +191 -0
- data/src/core/lib/promise/loop.h +13 -9
- data/src/core/lib/promise/map.h +4 -6
- data/src/core/lib/promise/pipe.h +608 -0
- data/src/core/lib/promise/poll.h +129 -11
- data/src/core/lib/promise/promise.h +5 -5
- data/src/core/lib/promise/race.h +6 -10
- data/src/core/lib/promise/seq.h +32 -14
- data/src/core/lib/promise/sleep.cc +58 -42
- data/src/core/lib/promise/sleep.h +44 -26
- data/src/core/lib/promise/trace.cc +20 -0
- data/src/core/{ext/filters/max_age/max_age_filter.h → lib/promise/trace.h} +6 -8
- data/src/core/lib/promise/try_join.h +82 -0
- data/src/core/lib/promise/try_seq.h +41 -23
- data/src/core/lib/resolver/resolver.cc +17 -59
- data/src/core/lib/resolver/resolver.h +21 -18
- data/src/core/lib/resolver/resolver_factory.h +11 -10
- data/src/core/lib/resolver/resolver_registry.cc +17 -9
- data/src/core/lib/resolver/resolver_registry.h +15 -5
- data/src/core/lib/resolver/server_address.cc +46 -34
- data/src/core/lib/resolver/server_address.h +36 -35
- data/src/core/lib/resource_quota/api.cc +25 -29
- data/src/core/lib/resource_quota/api.h +14 -5
- data/src/core/lib/resource_quota/arena.cc +85 -27
- data/src/core/lib/resource_quota/arena.h +197 -25
- data/src/core/lib/resource_quota/memory_quota.cc +322 -101
- data/src/core/lib/resource_quota/memory_quota.h +191 -56
- data/src/core/lib/resource_quota/periodic_update.cc +78 -0
- data/src/core/lib/resource_quota/periodic_update.h +71 -0
- data/src/core/lib/resource_quota/resource_quota.h +20 -4
- data/src/core/lib/resource_quota/thread_quota.cc +2 -0
- data/src/core/lib/resource_quota/thread_quota.h +7 -3
- data/src/core/lib/resource_quota/trace.h +3 -3
- data/src/core/lib/security/authorization/authorization_engine.h +3 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +17 -3
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
- data/src/core/lib/security/authorization/evaluate_args.h +9 -6
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +26 -13
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +20 -10
- data/src/core/lib/security/authorization/matchers.cc +44 -30
- data/src/core/lib/security/authorization/matchers.h +10 -3
- data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
- data/src/core/lib/security/authorization/rbac_policy.h +10 -3
- data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
- data/src/core/lib/security/context/security_context.cc +27 -25
- data/src/core/lib/security/context/security_context.h +64 -35
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +35 -27
- data/src/core/lib/security/credentials/alts/alts_credentials.h +65 -57
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
- 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 +20 -22
- 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 +38 -39
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
- data/src/core/lib/security/credentials/call_creds_util.cc +13 -3
- data/src/core/lib/security/credentials/call_creds_util.h +6 -5
- data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +46 -41
- data/src/core/lib/security/credentials/composite/composite_credentials.h +51 -38
- data/src/core/lib/security/credentials/credentials.cc +23 -26
- data/src/core/lib/security/credentials/credentials.h +91 -94
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
- data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +48 -48
- data/src/core/lib/security/credentials/fake/fake_credentials.h +57 -47
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +148 -112
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +35 -29
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +35 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.h +37 -23
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +32 -29
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
- data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +37 -30
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +41 -23
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
- data/src/core/lib/security/credentials/local/local_credentials.cc +36 -30
- data/src/core/lib/security/credentials/local/local_credentials.h +36 -26
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +107 -91
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +56 -27
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +42 -36
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +55 -29
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +48 -44
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +43 -23
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +69 -9
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +44 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +75 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +69 -98
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +55 -50
- data/src/core/lib/security/credentials/tls/tls_credentials.h +33 -30
- data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +77 -81
- data/src/core/lib/security/credentials/xds/xds_credentials.h +50 -10
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
- data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
- data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +66 -49
- data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
- data/src/core/lib/security/security_connector/security_connector.cc +37 -35
- data/src/core/lib/security/security_connector/security_connector.h +67 -45
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +59 -48
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
- data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
- data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
- data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -58
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
- data/src/core/lib/security/transport/auth_filters.h +59 -30
- data/src/core/lib/security/transport/client_auth_filter.cc +73 -48
- data/src/core/lib/security/transport/secure_endpoint.cc +305 -181
- data/src/core/lib/security/transport/secure_endpoint.h +29 -28
- data/src/core/lib/security/transport/security_handshaker.cc +142 -110
- data/src/core/lib/security/transport/security_handshaker.h +28 -23
- data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
- data/src/core/lib/security/transport/tsi_error.cc +23 -20
- data/src/core/lib/security/transport/tsi_error.h +20 -20
- data/src/core/lib/security/util/json_util.cc +24 -24
- data/src/core/lib/security/util/json_util.h +21 -23
- data/src/core/lib/service_config/service_config.h +19 -12
- data/src/core/lib/service_config/service_config_call_data.h +15 -5
- data/src/core/lib/service_config/service_config_impl.cc +111 -150
- data/src/core/lib/service_config/service_config_impl.h +27 -27
- data/src/core/lib/service_config/service_config_parser.cc +16 -28
- data/src/core/lib/service_config/service_config_parser.h +18 -19
- data/src/core/lib/slice/b64.cc +26 -26
- data/src/core/lib/slice/b64.h +34 -32
- data/src/core/lib/slice/percent_encoding.cc +24 -30
- data/src/core/lib/slice/percent_encoding.h +28 -34
- data/src/core/lib/slice/slice.cc +59 -46
- data/src/core/lib/slice/slice.h +64 -20
- data/src/core/lib/slice/slice_buffer.cc +136 -76
- data/src/core/lib/slice/slice_buffer.h +168 -0
- data/src/core/lib/slice/slice_internal.h +38 -45
- data/src/core/lib/slice/slice_refcount.cc +3 -18
- data/src/core/lib/slice/slice_refcount.h +53 -19
- data/src/core/lib/slice/slice_string_helpers.cc +17 -33
- data/src/core/lib/slice/slice_string_helpers.h +23 -30
- data/src/core/lib/surface/api_trace.cc +17 -17
- data/src/core/lib/surface/api_trace.h +25 -25
- data/src/core/lib/surface/builtins.cc +7 -2
- data/src/core/lib/surface/builtins.h +3 -3
- data/src/core/lib/surface/byte_buffer.cc +26 -21
- data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
- data/src/core/lib/surface/call.cc +3000 -1131
- data/src/core/lib/surface/call.h +135 -56
- data/src/core/lib/surface/call_details.cc +22 -23
- data/src/core/lib/surface/call_log_batch.cc +25 -18
- data/src/core/lib/surface/call_test_only.h +34 -31
- data/src/core/lib/surface/call_trace.cc +123 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +218 -284
- data/src/core/lib/surface/channel.h +137 -90
- data/src/core/lib/surface/channel_init.cc +19 -20
- data/src/core/lib/surface/channel_init.h +24 -26
- data/src/core/lib/surface/channel_ping.cc +26 -20
- data/src/core/lib/surface/channel_stack_type.cc +21 -19
- data/src/core/lib/surface/channel_stack_type.h +22 -22
- data/src/core/lib/surface/completion_queue.cc +200 -222
- data/src/core/lib/surface/completion_queue.h +42 -40
- data/src/core/lib/surface/completion_queue_factory.cc +34 -28
- data/src/core/lib/surface/completion_queue_factory.h +21 -23
- data/src/core/lib/surface/event_string.cc +19 -24
- data/src/core/lib/surface/event_string.h +21 -21
- data/src/core/lib/surface/init.cc +57 -114
- data/src/core/lib/surface/init.h +20 -28
- data/src/core/lib/surface/init_internally.cc +25 -0
- data/src/core/lib/surface/init_internally.h +37 -0
- data/src/core/lib/surface/lame_client.cc +87 -130
- data/src/core/lib/surface/lame_client.h +62 -24
- data/src/core/lib/surface/metadata_array.cc +18 -17
- data/src/core/lib/surface/server.cc +409 -188
- data/src/core/lib/surface/server.h +57 -26
- data/src/core/lib/surface/validate_metadata.cc +34 -48
- data/src/core/lib/surface/validate_metadata.h +24 -21
- data/src/core/lib/surface/version.cc +21 -21
- data/src/core/lib/transport/bdp_estimator.cc +19 -19
- data/src/core/lib/transport/bdp_estimator.h +22 -24
- data/src/core/lib/transport/connectivity_state.cc +24 -23
- data/src/core/lib/transport/connectivity_state.h +24 -25
- data/src/core/lib/transport/error_utils.cc +57 -79
- data/src/core/lib/transport/error_utils.h +29 -25
- data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
- data/src/core/lib/{channel → transport}/handshaker.h +59 -48
- data/src/core/lib/transport/handshaker_factory.h +74 -0
- data/src/core/lib/transport/handshaker_registry.cc +61 -0
- data/src/core/lib/transport/handshaker_registry.h +69 -0
- data/src/core/lib/transport/http2_errors.h +22 -22
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
- data/src/core/lib/transport/http_connect_handshaker.h +42 -0
- data/src/core/lib/transport/metadata_batch.cc +305 -0
- data/src/core/lib/transport/metadata_batch.h +269 -302
- data/src/core/lib/transport/parsed_metadata.cc +2 -4
- data/src/core/lib/transport/parsed_metadata.h +17 -8
- data/src/core/lib/transport/pid_controller.cc +20 -20
- data/src/core/lib/transport/pid_controller.h +27 -27
- data/src/core/lib/transport/status_conversion.cc +23 -23
- data/src/core/lib/transport/status_conversion.h +24 -24
- data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
- data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
- data/src/core/lib/transport/timeout_encoding.cc +24 -28
- data/src/core/lib/transport/timeout_encoding.h +25 -21
- data/src/core/lib/transport/transport.cc +97 -57
- data/src/core/lib/transport/transport.h +252 -207
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +59 -48
- data/src/core/lib/transport/transport_op_string.cc +40 -39
- data/src/core/lib/uri/uri_parser.cc +12 -4
- data/src/core/lib/uri/uri_parser.h +3 -5
- data/src/core/plugin_registry/grpc_plugin_registry.cc +62 -73
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
- 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 +336 -336
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
- data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
- 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 +82 -83
- 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 +169 -169
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +53 -45
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
- 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 +40 -41
- 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 +35 -36
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
- 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 +55 -56
- 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 +141 -142
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
- data/src/core/tsi/fake_transport_security.cc +146 -110
- data/src/core/tsi/fake_transport_security.h +36 -30
- data/src/core/tsi/local_transport_security.cc +43 -38
- data/src/core/tsi/local_transport_security.h +33 -33
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
- data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -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 +31 -22
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
- data/src/core/tsi/ssl_transport_security.cc +356 -390
- data/src/core/tsi/ssl_transport_security.h +210 -201
- 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 +27 -27
- data/src/core/tsi/transport_security.cc +44 -32
- data/src/core/tsi/transport_security.h +49 -48
- data/src/core/tsi/transport_security_grpc.cc +23 -22
- data/src/core/tsi/transport_security_grpc.h +44 -41
- data/src/core/tsi/transport_security_interface.h +346 -332
- data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -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.gcc +1 -1
- data/src/ruby/ext/grpc/extconf.rb +98 -20
- 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 +60 -60
- data/src/ruby/ext/grpc/rb_loader.c +6 -2
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
- data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
- data/src/ruby/lib/grpc/grpc.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +1 -6
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
- data/src/ruby/pb/test/client.rb +769 -0
- data/src/ruby/pb/test/server.rb +252 -0
- data/src/ruby/pb/test/xds_client.rb +415 -0
- data/src/ruby/spec/channel_spec.rb +5 -43
- data/src/ruby/spec/client_server_spec.rb +20 -8
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
- data/src/ruby/spec/user_agent_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
- data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +221 -39
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
- data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/macros.h +4 -21
- data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
- data/third_party/abseil-cpp/absl/base/options.h +1 -7
- data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- 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/abseil-cpp/absl/container/fixed_array.h +9 -5
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
- data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
- data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
- data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
- data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/random.h +6 -6
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
- data/third_party/abseil-cpp/absl/status/status.cc +193 -14
- data/third_party/abseil-cpp/absl/status/status.h +24 -14
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
- data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
- data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
- data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
- data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
- data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
- data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
- data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
- data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
- data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
- data/third_party/abseil-cpp/absl/time/format.cc +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
- data/third_party/abseil-cpp/absl/time/time.cc +2 -2
- data/third_party/abseil-cpp/absl/time/time.h +268 -169
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
- data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +31 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
- 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/upb/upb/arena.c +277 -0
- data/third_party/upb/upb/arena.h +225 -0
- data/third_party/upb/upb/array.c +114 -0
- data/third_party/upb/upb/array.h +83 -0
- data/third_party/upb/upb/collections.h +36 -0
- data/third_party/upb/upb/decode.c +188 -76
- data/third_party/upb/upb/decode.h +1 -0
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/def.c +128 -57
- data/third_party/upb/upb/def.h +20 -4
- data/third_party/upb/upb/def.hpp +7 -4
- data/third_party/upb/upb/encode.c +43 -28
- data/third_party/upb/upb/encode.h +16 -6
- data/third_party/upb/upb/extension_registry.c +93 -0
- data/third_party/upb/upb/extension_registry.h +84 -0
- data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
- data/third_party/upb/upb/internal/table.h +385 -0
- data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
- data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
- data/third_party/upb/upb/json_decode.c +1512 -0
- data/third_party/upb/upb/json_decode.h +47 -0
- data/third_party/upb/upb/json_encode.c +780 -0
- data/third_party/upb/upb/json_encode.h +65 -0
- data/third_party/upb/upb/map.c +108 -0
- data/third_party/upb/upb/map.h +117 -0
- data/third_party/upb/upb/message_value.h +66 -0
- data/third_party/upb/upb/mini_table.c +1147 -0
- data/third_party/upb/upb/mini_table.h +189 -0
- data/third_party/upb/upb/mini_table.hpp +112 -0
- data/third_party/upb/upb/msg.c +6 -68
- data/third_party/upb/upb/msg.h +2 -46
- data/third_party/upb/upb/msg_internal.h +77 -58
- data/third_party/upb/upb/port_def.inc +10 -1
- data/third_party/upb/upb/port_undef.inc +2 -0
- data/third_party/upb/upb/reflection.c +2 -159
- data/third_party/upb/upb/reflection.h +2 -112
- data/third_party/upb/upb/status.c +86 -0
- data/third_party/upb/upb/status.h +66 -0
- data/third_party/upb/upb/table.c +12 -8
- data/third_party/upb/upb/table_internal.h +3 -350
- data/third_party/upb/upb/text_encode.c +3 -2
- data/third_party/upb/upb/upb.c +4 -290
- data/third_party/upb/upb/upb.h +8 -167
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +975 -292
- data/third_party/zlib/crc32.h +9441 -436
- data/third_party/zlib/deflate.c +183 -129
- data/third_party/zlib/deflate.h +12 -15
- data/third_party/zlib/gzguts.h +3 -2
- data/third_party/zlib/gzlib.c +6 -4
- data/third_party/zlib/gzread.c +8 -12
- data/third_party/zlib/gzwrite.c +26 -14
- data/third_party/zlib/infback.c +12 -8
- data/third_party/zlib/inffast.c +14 -14
- data/third_party/zlib/inflate.c +44 -10
- data/third_party/zlib/inflate.h +3 -2
- data/third_party/zlib/inftrees.c +3 -3
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +85 -107
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +129 -106
- data/third_party/zlib/zutil.c +11 -9
- data/third_party/zlib/zutil.h +13 -9
- metadata +424 -135
- data/include/grpc/impl/codegen/gpr_slice.h +0 -71
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
- data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
- data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -67
- data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
- data/src/core/ext/xds/certificate_provider_registry.h +0 -57
- data/src/core/lib/channel/handshaker_factory.h +0 -50
- data/src/core/lib/channel/handshaker_registry.cc +0 -50
- data/src/core/lib/channel/handshaker_registry.h +0 -71
- data/src/core/lib/event_engine/sockaddr.cc +0 -40
- data/src/core/lib/event_engine/sockaddr.h +0 -44
- data/src/core/lib/gpr/env.h +0 -40
- data/src/core/lib/gpr/env_linux.cc +0 -75
- data/src/core/lib/gpr/env_posix.cc +0 -46
- data/src/core/lib/gpr/env_windows.cc +0 -74
- 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/string_windows.h +0 -32
- data/src/core/lib/gpr/tls.h +0 -157
- data/src/core/lib/gprpp/capture.h +0 -76
- data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
- data/src/core/lib/iomgr/error_internal.h +0 -66
- data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
- data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
- data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
- data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
- data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
- data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
- data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
- data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
- data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
- data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
- data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
- data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
- data/src/core/lib/iomgr/executor/threadpool.h +0 -150
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
- data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
- data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
- data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
- data/src/core/lib/profiling/basic_timers.cc +0 -295
- data/src/core/lib/profiling/stap_timers.cc +0 -50
- data/src/core/lib/profiling/timers.h +0 -94
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_refcount_base.h +0 -61
- data/src/core/lib/slice/slice_split.cc +0 -100
- data/src/core/lib/slice/slice_split.h +0 -40
- data/src/core/lib/transport/byte_stream.cc +0 -162
- data/src/core/lib/transport/byte_stream.h +0 -166
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -19,47 +19,32 @@
|
|
19
19
|
#include "src/core/ext/xds/xds_client.h"
|
20
20
|
|
21
21
|
#include <inttypes.h>
|
22
|
-
#include <limits.h>
|
23
22
|
#include <string.h>
|
24
23
|
|
25
|
-
#include
|
26
|
-
#include
|
24
|
+
#include <algorithm>
|
25
|
+
#include <type_traits>
|
26
|
+
|
27
|
+
#include "absl/strings/match.h"
|
28
|
+
#include "absl/strings/str_cat.h"
|
27
29
|
#include "absl/strings/str_join.h"
|
30
|
+
#include "absl/strings/str_split.h"
|
28
31
|
#include "absl/strings/string_view.h"
|
32
|
+
#include "absl/strings/strip.h"
|
33
|
+
#include "absl/types/optional.h"
|
34
|
+
#include "upb/arena.h"
|
29
35
|
|
30
|
-
#include <grpc/
|
31
|
-
#include <grpc/
|
32
|
-
#include <grpc/support/alloc.h>
|
33
|
-
#include <grpc/support/time.h>
|
36
|
+
#include <grpc/event_engine/event_engine.h>
|
37
|
+
#include <grpc/support/log.h>
|
34
38
|
|
35
|
-
#include "src/core/ext/filters/client_channel/client_channel.h"
|
36
39
|
#include "src/core/ext/xds/xds_api.h"
|
37
40
|
#include "src/core/ext/xds/xds_bootstrap.h"
|
38
|
-
#include "src/core/ext/xds/xds_channel_args.h"
|
39
41
|
#include "src/core/ext/xds/xds_client_stats.h"
|
40
|
-
#include "src/core/ext/xds/xds_cluster.h"
|
41
|
-
#include "src/core/ext/xds/xds_endpoint.h"
|
42
|
-
#include "src/core/ext/xds/xds_http_filters.h"
|
43
|
-
#include "src/core/ext/xds/xds_listener.h"
|
44
|
-
#include "src/core/lib/address_utils/sockaddr_utils.h"
|
45
42
|
#include "src/core/lib/backoff/backoff.h"
|
46
|
-
#include "src/core/lib/
|
47
|
-
#include "src/core/lib/channel/channel_stack.h"
|
48
|
-
#include "src/core/lib/config/core_configuration.h"
|
49
|
-
#include "src/core/lib/gpr/env.h"
|
50
|
-
#include "src/core/lib/gpr/string.h"
|
51
|
-
#include "src/core/lib/gprpp/memory.h"
|
43
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
52
44
|
#include "src/core/lib/gprpp/orphanable.h"
|
53
45
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
54
46
|
#include "src/core/lib/gprpp/sync.h"
|
55
|
-
#include "src/core/lib/iomgr/
|
56
|
-
#include "src/core/lib/iomgr/timer.h"
|
57
|
-
#include "src/core/lib/security/credentials/channel_creds_registry.h"
|
58
|
-
#include "src/core/lib/slice/slice_internal.h"
|
59
|
-
#include "src/core/lib/slice/slice_string_helpers.h"
|
60
|
-
#include "src/core/lib/surface/call.h"
|
61
|
-
#include "src/core/lib/surface/channel.h"
|
62
|
-
#include "src/core/lib/surface/lame_client.h"
|
47
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
63
48
|
#include "src/core/lib/uri/uri_parser.h"
|
64
49
|
|
65
50
|
#define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
@@ -70,56 +55,11 @@
|
|
70
55
|
|
71
56
|
namespace grpc_core {
|
72
57
|
|
58
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
59
|
+
|
73
60
|
TraceFlag grpc_xds_client_trace(false, "xds_client");
|
74
61
|
TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
|
75
62
|
|
76
|
-
namespace {
|
77
|
-
|
78
|
-
Mutex* g_mu = nullptr;
|
79
|
-
|
80
|
-
const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
|
81
|
-
XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
|
82
|
-
char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
|
83
|
-
|
84
|
-
} // namespace
|
85
|
-
|
86
|
-
class XdsClient::Notifier {
|
87
|
-
public:
|
88
|
-
// Helper template function to invoke `OnError()` on a list of watchers \a
|
89
|
-
// watchers_list within \a work_serializer. Works with all 4 resource types.
|
90
|
-
template <class T>
|
91
|
-
static void ScheduleNotifyWatchersOnErrorInWorkSerializer(
|
92
|
-
XdsClient* xds_client, const T& watchers_list, grpc_error_handle error,
|
93
|
-
const DebugLocation& location) {
|
94
|
-
xds_client->work_serializer_.Schedule(
|
95
|
-
[watchers_list, error]()
|
96
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
|
97
|
-
for (const auto& p : watchers_list) {
|
98
|
-
p.first->OnError(GRPC_ERROR_REF(error));
|
99
|
-
}
|
100
|
-
GRPC_ERROR_UNREF(error);
|
101
|
-
},
|
102
|
-
location);
|
103
|
-
}
|
104
|
-
|
105
|
-
// Helper template function to invoke `OnResourceDoesNotExist()` on a list of
|
106
|
-
// watchers \a watchers_list within \a work_serializer. Works with all 4
|
107
|
-
// resource types.
|
108
|
-
template <class T>
|
109
|
-
static void ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
|
110
|
-
XdsClient* xds_client, const T& watchers_list,
|
111
|
-
const DebugLocation& location) {
|
112
|
-
xds_client->work_serializer_.Schedule(
|
113
|
-
[watchers_list]()
|
114
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
|
115
|
-
for (const auto& p : watchers_list) {
|
116
|
-
p.first->OnResourceDoesNotExist();
|
117
|
-
}
|
118
|
-
},
|
119
|
-
location);
|
120
|
-
}
|
121
|
-
};
|
122
|
-
|
123
63
|
//
|
124
64
|
// Internal class declarations
|
125
65
|
//
|
@@ -132,9 +72,12 @@ class XdsClient::ChannelState::RetryableCall
|
|
132
72
|
public:
|
133
73
|
explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
|
134
74
|
|
135
|
-
|
75
|
+
// Disable thread-safety analysis because this method is called via
|
76
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
77
|
+
// through there.
|
78
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
|
136
79
|
|
137
|
-
void OnCallFinishedLocked();
|
80
|
+
void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
138
81
|
|
139
82
|
T* calld() const { return calld_.get(); }
|
140
83
|
ChannelState* chand() const { return chand_.get(); }
|
@@ -143,9 +86,9 @@ class XdsClient::ChannelState::RetryableCall
|
|
143
86
|
|
144
87
|
private:
|
145
88
|
void StartNewCallLocked();
|
146
|
-
void StartRetryTimerLocked();
|
147
|
-
|
148
|
-
void
|
89
|
+
void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
90
|
+
|
91
|
+
void OnRetryTimer();
|
149
92
|
|
150
93
|
// The wrapped xds call that talks to the xds server. It's instantiated
|
151
94
|
// every time we start a new call. It's null during call retry backoff.
|
@@ -155,9 +98,8 @@ class XdsClient::ChannelState::RetryableCall
|
|
155
98
|
|
156
99
|
// Retry state.
|
157
100
|
BackOff backoff_;
|
158
|
-
|
159
|
-
|
160
|
-
bool retry_timer_callback_pending_ = false;
|
101
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
102
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
161
103
|
|
162
104
|
bool shutting_down_ = false;
|
163
105
|
};
|
@@ -168,7 +110,6 @@ class XdsClient::ChannelState::AdsCallState
|
|
168
110
|
public:
|
169
111
|
// The ctor and dtor should not be used directly.
|
170
112
|
explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
|
171
|
-
~AdsCallState() override;
|
172
113
|
|
173
114
|
void Orphan() override;
|
174
115
|
|
@@ -177,7 +118,8 @@ class XdsClient::ChannelState::AdsCallState
|
|
177
118
|
XdsClient* xds_client() const { return chand()->xds_client(); }
|
178
119
|
bool seen_response() const { return seen_response_; }
|
179
120
|
|
180
|
-
void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name
|
121
|
+
void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name,
|
122
|
+
bool delay_send)
|
181
123
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
182
124
|
void UnsubscribeLocked(const XdsResourceType* type,
|
183
125
|
const XdsResourceName& name, bool delay_unsubscription)
|
@@ -205,110 +147,159 @@ class XdsClient::ChannelState::AdsCallState
|
|
205
147
|
absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
|
206
148
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
207
149
|
|
208
|
-
void ParseResource(
|
209
|
-
absl::string_view
|
150
|
+
void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
|
151
|
+
absl::string_view resource_name,
|
210
152
|
absl::string_view serialized_resource) override
|
211
153
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
212
154
|
|
155
|
+
void ResourceWrapperParsingFailed(size_t idx) override;
|
156
|
+
|
213
157
|
Result TakeResult() { return std::move(result_); }
|
214
158
|
|
215
159
|
private:
|
216
160
|
XdsClient* xds_client() const { return ads_call_state_->xds_client(); }
|
217
161
|
|
218
162
|
AdsCallState* ads_call_state_;
|
219
|
-
const Timestamp update_time_ =
|
163
|
+
const Timestamp update_time_ = Timestamp::Now();
|
220
164
|
Result result_;
|
221
165
|
};
|
222
166
|
|
223
167
|
class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
|
224
168
|
public:
|
225
169
|
ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
|
226
|
-
: type_(type), name_(name) {
|
227
|
-
GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
|
228
|
-
grpc_schedule_on_exec_ctx);
|
229
|
-
}
|
170
|
+
: type_(type), name_(name) {}
|
230
171
|
|
231
|
-
|
172
|
+
// Disable thread-safety analysis because this method is called via
|
173
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
174
|
+
// through there.
|
175
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
232
176
|
MaybeCancelTimer();
|
233
177
|
Unref(DEBUG_LOCATION, "Orphan");
|
234
178
|
}
|
235
179
|
|
236
|
-
void
|
237
|
-
|
238
|
-
|
239
|
-
ads_calld_ = std::move(ads_calld);
|
240
|
-
Ref(DEBUG_LOCATION, "timer").release();
|
241
|
-
timer_pending_ = true;
|
242
|
-
grpc_timer_init(
|
243
|
-
&timer_,
|
244
|
-
ExecCtx::Get()->Now() + ads_calld_->xds_client()->request_timeout_,
|
245
|
-
&timer_callback_);
|
180
|
+
void MarkSubscriptionSendStarted()
|
181
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
182
|
+
subscription_sent_ = true;
|
246
183
|
}
|
247
184
|
|
248
|
-
void
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
}
|
185
|
+
void MaybeMarkSubscriptionSendComplete(
|
186
|
+
RefCountedPtr<AdsCallState> ads_calld)
|
187
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
188
|
+
if (subscription_sent_) MaybeStartTimer(std::move(ads_calld));
|
253
189
|
}
|
254
190
|
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
191
|
+
void MarkSeen() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
192
|
+
resource_seen_ = true;
|
193
|
+
MaybeCancelTimer();
|
194
|
+
}
|
195
|
+
|
196
|
+
void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
197
|
+
if (timer_handle_.has_value() &&
|
198
|
+
ads_calld_->xds_client()->engine()->Cancel(*timer_handle_)) {
|
199
|
+
timer_handle_.reset();
|
261
200
|
}
|
262
|
-
self->ads_calld_->xds_client()->work_serializer_.DrainQueue();
|
263
|
-
self->ads_calld_.reset();
|
264
|
-
self->Unref(DEBUG_LOCATION, "timer");
|
265
201
|
}
|
266
202
|
|
267
|
-
|
203
|
+
private:
|
204
|
+
void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld)
|
268
205
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
269
|
-
if
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
206
|
+
// Don't start timer if we've already either seen the resource or
|
207
|
+
// marked it as non-existing.
|
208
|
+
// Note: There are edge cases where we can have seen the resource
|
209
|
+
// before we have sent the initial subscription request, such as
|
210
|
+
// when we unsubscribe and then resubscribe to a given resource
|
211
|
+
// and then get a response containing that resource, all while a
|
212
|
+
// send_message op is in flight.
|
213
|
+
if (resource_seen_) return;
|
214
|
+
// Don't start timer if we haven't yet sent the initial subscription
|
215
|
+
// request for the resource.
|
216
|
+
if (!subscription_sent_) return;
|
217
|
+
// Don't start timer if it's already running.
|
218
|
+
if (timer_handle_.has_value()) return;
|
219
|
+
// Check if we already have a cached version of this resource
|
220
|
+
// (i.e., if this is the initial request for the resource after an
|
221
|
+
// ADS stream restart). If so, we don't start the timer, because
|
222
|
+
// (a) we already have the resource and (b) the server may
|
223
|
+
// optimize by not resending the resource that we already have.
|
224
|
+
auto& authority_state =
|
225
|
+
ads_calld->xds_client()->authority_state_map_[name_.authority];
|
226
|
+
ResourceState& state = authority_state.resource_map[type_][name_.key];
|
227
|
+
if (state.resource != nullptr) return;
|
228
|
+
// Start timer.
|
229
|
+
ads_calld_ = std::move(ads_calld);
|
230
|
+
timer_handle_ = ads_calld_->xds_client()->engine()->RunAfter(
|
231
|
+
ads_calld_->xds_client()->request_timeout_,
|
232
|
+
[self = Ref(DEBUG_LOCATION, "timer")]() {
|
233
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
234
|
+
ExecCtx exec_ctx;
|
235
|
+
self->OnTimer();
|
236
|
+
});
|
237
|
+
}
|
238
|
+
|
239
|
+
void OnTimer() {
|
240
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
241
|
+
gpr_log(GPR_INFO,
|
242
|
+
"[xds_client %p] xds server %s: timeout obtaining resource "
|
243
|
+
"{type=%s name=%s} from xds server",
|
244
|
+
ads_calld_->xds_client(),
|
245
|
+
ads_calld_->chand()->server_.server_uri().c_str(),
|
246
|
+
std::string(type_->type_url()).c_str(),
|
275
247
|
XdsClient::ConstructFullXdsResourceName(
|
276
|
-
name_.authority, type_->type_url(), name_.key)
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
grpc_error_std_string(watcher_error).c_str());
|
284
|
-
}
|
248
|
+
name_.authority, type_->type_url(), name_.key)
|
249
|
+
.c_str());
|
250
|
+
}
|
251
|
+
{
|
252
|
+
MutexLock lock(&ads_calld_->xds_client()->mu_);
|
253
|
+
timer_handle_.reset();
|
254
|
+
resource_seen_ = true;
|
285
255
|
auto& authority_state =
|
286
256
|
ads_calld_->xds_client()->authority_state_map_[name_.authority];
|
287
257
|
ResourceState& state = authority_state.resource_map[type_][name_.key];
|
288
258
|
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
289
|
-
|
290
|
-
|
291
|
-
DEBUG_LOCATION);
|
259
|
+
ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
260
|
+
state.watchers);
|
292
261
|
}
|
293
|
-
|
262
|
+
ads_calld_->xds_client()->work_serializer_.DrainQueue();
|
263
|
+
ads_calld_.reset();
|
294
264
|
}
|
295
265
|
|
296
266
|
const XdsResourceType* type_;
|
297
267
|
const XdsResourceName name_;
|
298
268
|
|
299
269
|
RefCountedPtr<AdsCallState> ads_calld_;
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
270
|
+
// True if we have sent the initial subscription request for this
|
271
|
+
// resource on this ADS stream.
|
272
|
+
bool subscription_sent_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
273
|
+
// True if we have either (a) seen the resource in a response on this
|
274
|
+
// stream or (b) declared the resource to not exist due to the timer
|
275
|
+
// firing.
|
276
|
+
bool resource_seen_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
277
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
278
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
304
279
|
};
|
305
280
|
|
306
|
-
|
307
|
-
|
281
|
+
class StreamEventHandler
|
282
|
+
: public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
|
283
|
+
public:
|
284
|
+
explicit StreamEventHandler(RefCountedPtr<AdsCallState> ads_calld)
|
285
|
+
: ads_calld_(std::move(ads_calld)) {}
|
308
286
|
|
309
|
-
|
287
|
+
void OnRequestSent(bool ok) override { ads_calld_->OnRequestSent(ok); }
|
288
|
+
void OnRecvMessage(absl::string_view payload) override {
|
289
|
+
ads_calld_->OnRecvMessage(payload);
|
290
|
+
}
|
291
|
+
void OnStatusReceived(absl::Status status) override {
|
292
|
+
ads_calld_->OnStatusReceived(std::move(status));
|
293
|
+
}
|
294
|
+
|
295
|
+
private:
|
296
|
+
RefCountedPtr<AdsCallState> ads_calld_;
|
297
|
+
};
|
298
|
+
|
299
|
+
struct ResourceTypeState {
|
300
|
+
// Nonce and status for this resource type.
|
310
301
|
std::string nonce;
|
311
|
-
|
302
|
+
absl::Status status;
|
312
303
|
|
313
304
|
// Subscribed resources of this type.
|
314
305
|
std::map<std::string /*authority*/,
|
@@ -319,47 +310,27 @@ class XdsClient::ChannelState::AdsCallState
|
|
319
310
|
void SendMessageLocked(const XdsResourceType* type)
|
320
311
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
321
312
|
|
322
|
-
|
323
|
-
void
|
324
|
-
|
325
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
326
|
-
bool OnResponseReceivedLocked()
|
327
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
328
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
329
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
330
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
313
|
+
void OnRequestSent(bool ok);
|
314
|
+
void OnRecvMessage(absl::string_view payload);
|
315
|
+
void OnStatusReceived(absl::Status status);
|
331
316
|
|
332
317
|
bool IsCurrentCallOnChannel() const;
|
333
318
|
|
334
319
|
// Constructs a list of resource names of a given type for an ADS
|
335
320
|
// request. Also starts the timer for each resource if needed.
|
336
|
-
std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type)
|
321
|
+
std::vector<std::string> ResourceNamesForRequest(const XdsResourceType* type)
|
322
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
337
323
|
|
338
324
|
// The owning RetryableCall<>.
|
339
325
|
RefCountedPtr<RetryableCall<AdsCallState>> parent_;
|
340
326
|
|
327
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
328
|
+
|
341
329
|
bool sent_initial_message_ = false;
|
342
330
|
bool seen_response_ = false;
|
343
331
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
// recv_initial_metadata
|
348
|
-
grpc_metadata_array initial_metadata_recv_;
|
349
|
-
|
350
|
-
// send_message
|
351
|
-
grpc_byte_buffer* send_message_payload_ = nullptr;
|
352
|
-
grpc_closure on_request_sent_;
|
353
|
-
|
354
|
-
// recv_message
|
355
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
356
|
-
grpc_closure on_response_received_;
|
357
|
-
|
358
|
-
// recv_trailing_metadata
|
359
|
-
grpc_metadata_array trailing_metadata_recv_;
|
360
|
-
grpc_status_code status_code_;
|
361
|
-
grpc_slice status_details_;
|
362
|
-
grpc_closure on_status_received_;
|
332
|
+
const XdsResourceType* send_message_pending_
|
333
|
+
ABSL_GUARDED_BY(&XdsClient::mu_) = nullptr;
|
363
334
|
|
364
335
|
// Resource types for which requests need to be sent.
|
365
336
|
std::set<const XdsResourceType*> buffered_requests_;
|
@@ -374,11 +345,11 @@ class XdsClient::ChannelState::LrsCallState
|
|
374
345
|
public:
|
375
346
|
// The ctor and dtor should not be used directly.
|
376
347
|
explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
|
377
|
-
~LrsCallState() override;
|
378
348
|
|
379
349
|
void Orphan() override;
|
380
350
|
|
381
|
-
void MaybeStartReportingLocked()
|
351
|
+
void MaybeStartReportingLocked()
|
352
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
382
353
|
|
383
354
|
RetryableCall<LrsCallState>* parent() { return parent_.get(); }
|
384
355
|
ChannelState* chand() const { return parent_->chand(); }
|
@@ -386,30 +357,44 @@ class XdsClient::ChannelState::LrsCallState
|
|
386
357
|
bool seen_response() const { return seen_response_; }
|
387
358
|
|
388
359
|
private:
|
360
|
+
class StreamEventHandler
|
361
|
+
: public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
|
362
|
+
public:
|
363
|
+
explicit StreamEventHandler(RefCountedPtr<LrsCallState> lrs_calld)
|
364
|
+
: lrs_calld_(std::move(lrs_calld)) {}
|
365
|
+
|
366
|
+
void OnRequestSent(bool ok) override { lrs_calld_->OnRequestSent(ok); }
|
367
|
+
void OnRecvMessage(absl::string_view payload) override {
|
368
|
+
lrs_calld_->OnRecvMessage(payload);
|
369
|
+
}
|
370
|
+
void OnStatusReceived(absl::Status status) override {
|
371
|
+
lrs_calld_->OnStatusReceived(std::move(status));
|
372
|
+
}
|
373
|
+
|
374
|
+
private:
|
375
|
+
RefCountedPtr<LrsCallState> lrs_calld_;
|
376
|
+
};
|
377
|
+
|
389
378
|
// Reports client-side load stats according to a fixed interval.
|
390
379
|
class Reporter : public InternallyRefCounted<Reporter> {
|
391
380
|
public:
|
392
381
|
Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
|
393
382
|
: parent_(std::move(parent)), report_interval_(report_interval) {
|
394
|
-
GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
|
395
|
-
grpc_schedule_on_exec_ctx);
|
396
|
-
GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
|
397
|
-
grpc_schedule_on_exec_ctx);
|
398
383
|
ScheduleNextReportLocked();
|
399
384
|
}
|
400
385
|
|
401
|
-
|
386
|
+
// Disable thread-safety analysis because this method is called via
|
387
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
388
|
+
// through there.
|
389
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
|
390
|
+
|
391
|
+
void OnReportDoneLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
402
392
|
|
403
393
|
private:
|
404
394
|
void ScheduleNextReportLocked()
|
405
395
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
406
|
-
|
407
|
-
bool OnNextReportTimerLocked(grpc_error_handle error)
|
408
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
396
|
+
bool OnNextReportTimer();
|
409
397
|
bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
410
|
-
static void OnReportDone(void* arg, grpc_error_handle error);
|
411
|
-
bool OnReportDoneLocked(grpc_error_handle error)
|
412
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
413
398
|
|
414
399
|
bool IsCurrentReporterOnCall() const {
|
415
400
|
return this == parent_->reporter_.get();
|
@@ -422,47 +407,23 @@ class XdsClient::ChannelState::LrsCallState
|
|
422
407
|
// The load reporting state.
|
423
408
|
const Duration report_interval_;
|
424
409
|
bool last_report_counters_were_zero_ = false;
|
425
|
-
|
426
|
-
|
427
|
-
grpc_closure on_next_report_timer_;
|
428
|
-
grpc_closure on_report_done_;
|
410
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
411
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
429
412
|
};
|
430
413
|
|
431
|
-
|
432
|
-
void
|
433
|
-
|
434
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
435
|
-
bool OnResponseReceivedLocked()
|
436
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
437
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
438
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
439
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
414
|
+
void OnRequestSent(bool ok);
|
415
|
+
void OnRecvMessage(absl::string_view payload);
|
416
|
+
void OnStatusReceived(absl::Status status);
|
440
417
|
|
441
418
|
bool IsCurrentCallOnChannel() const;
|
442
419
|
|
443
420
|
// The owning RetryableCall<>.
|
444
421
|
RefCountedPtr<RetryableCall<LrsCallState>> parent_;
|
445
|
-
bool seen_response_ = false;
|
446
|
-
|
447
|
-
// Always non-NULL.
|
448
|
-
grpc_call* call_;
|
449
422
|
|
450
|
-
|
451
|
-
grpc_metadata_array initial_metadata_recv_;
|
423
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
452
424
|
|
453
|
-
|
454
|
-
|
455
|
-
grpc_closure on_initial_request_sent_;
|
456
|
-
|
457
|
-
// recv_message
|
458
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
459
|
-
grpc_closure on_response_received_;
|
460
|
-
|
461
|
-
// recv_trailing_metadata
|
462
|
-
grpc_metadata_array trailing_metadata_recv_;
|
463
|
-
grpc_status_code status_code_;
|
464
|
-
grpc_slice status_details_;
|
465
|
-
grpc_closure on_status_received_;
|
425
|
+
bool seen_response_ = false;
|
426
|
+
bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
466
427
|
|
467
428
|
// Load reporting state.
|
468
429
|
bool send_all_clusters_ = false;
|
@@ -471,58 +432,10 @@ class XdsClient::ChannelState::LrsCallState
|
|
471
432
|
OrphanablePtr<Reporter> reporter_;
|
472
433
|
};
|
473
434
|
|
474
|
-
//
|
475
|
-
// XdsClient::ChannelState::StateWatcher
|
476
|
-
//
|
477
|
-
|
478
|
-
class XdsClient::ChannelState::StateWatcher
|
479
|
-
: public AsyncConnectivityStateWatcherInterface {
|
480
|
-
public:
|
481
|
-
explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
|
482
|
-
: parent_(std::move(parent)) {}
|
483
|
-
|
484
|
-
private:
|
485
|
-
void OnConnectivityStateChange(grpc_connectivity_state new_state,
|
486
|
-
const absl::Status& status) override {
|
487
|
-
{
|
488
|
-
MutexLock lock(&parent_->xds_client_->mu_);
|
489
|
-
if (!parent_->shutting_down_ &&
|
490
|
-
new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
491
|
-
// In TRANSIENT_FAILURE. Notify all watchers of error.
|
492
|
-
gpr_log(GPR_INFO,
|
493
|
-
"[xds_client %p] xds channel for server %s in "
|
494
|
-
"state TRANSIENT_FAILURE: %s",
|
495
|
-
parent_->xds_client(), parent_->server_.server_uri.c_str(),
|
496
|
-
status.ToString().c_str());
|
497
|
-
parent_->xds_client_->NotifyOnErrorLocked(
|
498
|
-
GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
|
499
|
-
"xds channel in TRANSIENT_FAILURE, connectivity error: ",
|
500
|
-
status.ToString())));
|
501
|
-
}
|
502
|
-
}
|
503
|
-
parent_->xds_client()->work_serializer_.DrainQueue();
|
504
|
-
}
|
505
|
-
|
506
|
-
WeakRefCountedPtr<ChannelState> parent_;
|
507
|
-
};
|
508
|
-
|
509
435
|
//
|
510
436
|
// XdsClient::ChannelState
|
511
437
|
//
|
512
438
|
|
513
|
-
namespace {
|
514
|
-
|
515
|
-
grpc_channel* CreateXdsChannel(grpc_channel_args* args,
|
516
|
-
const XdsBootstrap::XdsServer& server) {
|
517
|
-
RefCountedPtr<grpc_channel_credentials> channel_creds =
|
518
|
-
CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
|
519
|
-
server.channel_creds_type, server.channel_creds_config);
|
520
|
-
return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
|
521
|
-
args);
|
522
|
-
}
|
523
|
-
|
524
|
-
} // namespace
|
525
|
-
|
526
439
|
XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
527
440
|
const XdsBootstrap::XdsServer& server)
|
528
441
|
: DualRefCounted<ChannelState>(
|
@@ -533,37 +446,45 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
|
533
446
|
server_(server) {
|
534
447
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
535
448
|
gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
|
536
|
-
xds_client_.get(), server.server_uri.c_str());
|
537
|
-
}
|
538
|
-
|
539
|
-
|
540
|
-
|
449
|
+
xds_client_.get(), server.server_uri().c_str());
|
450
|
+
}
|
451
|
+
absl::Status status;
|
452
|
+
transport_ = xds_client_->transport_factory_->Create(
|
453
|
+
server,
|
454
|
+
[self = WeakRef(DEBUG_LOCATION, "OnConnectivityFailure")](
|
455
|
+
absl::Status status) {
|
456
|
+
self->OnConnectivityFailure(std::move(status));
|
457
|
+
},
|
458
|
+
&status);
|
459
|
+
GPR_ASSERT(transport_ != nullptr);
|
460
|
+
if (!status.ok()) SetChannelStatusLocked(std::move(status));
|
541
461
|
}
|
542
462
|
|
543
463
|
XdsClient::ChannelState::~ChannelState() {
|
544
464
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
545
465
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
|
546
|
-
xds_client(), this, server_.server_uri.c_str());
|
466
|
+
xds_client(), this, server_.server_uri().c_str());
|
547
467
|
}
|
548
|
-
grpc_channel_destroy(channel_);
|
549
468
|
xds_client_.reset(DEBUG_LOCATION, "ChannelState");
|
550
469
|
}
|
551
470
|
|
552
471
|
// This method should only ever be called when holding the lock, but we can't
|
553
472
|
// use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
|
554
|
-
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
555
|
-
// lock in this subclass.
|
473
|
+
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
474
|
+
// a lock in this subclass.
|
556
475
|
void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
557
476
|
shutting_down_ = true;
|
558
|
-
|
477
|
+
transport_.reset();
|
559
478
|
// At this time, all strong refs are removed, remove from channel map to
|
560
|
-
// prevent subsequent subscription from trying to use this ChannelState as
|
561
|
-
// is shutting down.
|
562
|
-
xds_client_->xds_server_channel_map_.erase(server_);
|
479
|
+
// prevent subsequent subscription from trying to use this ChannelState as
|
480
|
+
// it is shutting down.
|
481
|
+
xds_client_->xds_server_channel_map_.erase(&server_);
|
563
482
|
ads_calld_.reset();
|
564
483
|
lrs_calld_.reset();
|
565
484
|
}
|
566
485
|
|
486
|
+
void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
|
487
|
+
|
567
488
|
XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
|
568
489
|
const {
|
569
490
|
return ads_calld_->calld();
|
@@ -574,10 +495,6 @@ XdsClient::ChannelState::LrsCallState* XdsClient::ChannelState::lrs_calld()
|
|
574
495
|
return lrs_calld_->calld();
|
575
496
|
}
|
576
497
|
|
577
|
-
bool XdsClient::ChannelState::HasActiveAdsCall() const {
|
578
|
-
return ads_calld_ != nullptr && ads_calld_->calld() != nullptr;
|
579
|
-
}
|
580
|
-
|
581
498
|
void XdsClient::ChannelState::MaybeStartLrsCall() {
|
582
499
|
if (lrs_calld_ != nullptr) return;
|
583
500
|
lrs_calld_.reset(new RetryableCall<LrsCallState>(
|
@@ -585,43 +502,10 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
|
|
585
502
|
}
|
586
503
|
|
587
504
|
void XdsClient::ChannelState::StopLrsCallLocked() {
|
588
|
-
xds_client_->xds_load_report_server_map_.erase(server_);
|
505
|
+
xds_client_->xds_load_report_server_map_.erase(&server_);
|
589
506
|
lrs_calld_.reset();
|
590
507
|
}
|
591
508
|
|
592
|
-
namespace {
|
593
|
-
|
594
|
-
bool IsLameChannel(grpc_channel* channel) {
|
595
|
-
grpc_channel_element* elem =
|
596
|
-
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
597
|
-
return elem->filter == &grpc_lame_filter;
|
598
|
-
}
|
599
|
-
|
600
|
-
} // namespace
|
601
|
-
|
602
|
-
void XdsClient::ChannelState::StartConnectivityWatchLocked() {
|
603
|
-
if (IsLameChannel(channel_)) {
|
604
|
-
xds_client()->NotifyOnErrorLocked(
|
605
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds client has a lame channel"));
|
606
|
-
return;
|
607
|
-
}
|
608
|
-
ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
|
609
|
-
GPR_ASSERT(client_channel != nullptr);
|
610
|
-
watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
|
611
|
-
client_channel->AddConnectivityWatcher(
|
612
|
-
GRPC_CHANNEL_IDLE,
|
613
|
-
OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
|
614
|
-
}
|
615
|
-
|
616
|
-
void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
|
617
|
-
if (IsLameChannel(channel_)) {
|
618
|
-
return;
|
619
|
-
}
|
620
|
-
ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
|
621
|
-
GPR_ASSERT(client_channel != nullptr);
|
622
|
-
client_channel->RemoveConnectivityWatcher(watcher_);
|
623
|
-
}
|
624
|
-
|
625
509
|
void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
|
626
510
|
const XdsResourceName& name) {
|
627
511
|
if (ads_calld_ == nullptr) {
|
@@ -637,7 +521,7 @@ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
|
|
637
521
|
// because when the call is restarted it will resend all necessary requests.
|
638
522
|
if (ads_calld() == nullptr) return;
|
639
523
|
// Subscribe to this resource if the ADS call is active.
|
640
|
-
ads_calld()->SubscribeLocked(type, name);
|
524
|
+
ads_calld()->SubscribeLocked(type, name, /*delay_send=*/false);
|
641
525
|
}
|
642
526
|
|
643
527
|
void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
|
@@ -654,6 +538,56 @@ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
|
|
654
538
|
}
|
655
539
|
}
|
656
540
|
|
541
|
+
void XdsClient::ChannelState::OnConnectivityFailure(absl::Status status) {
|
542
|
+
{
|
543
|
+
MutexLock lock(&xds_client_->mu_);
|
544
|
+
SetChannelStatusLocked(std::move(status));
|
545
|
+
}
|
546
|
+
xds_client_->work_serializer_.DrainQueue();
|
547
|
+
}
|
548
|
+
|
549
|
+
void XdsClient::ChannelState::SetChannelStatusLocked(absl::Status status) {
|
550
|
+
if (shutting_down_) return;
|
551
|
+
status = absl::Status(status.code(), absl::StrCat("xDS channel for server ",
|
552
|
+
server_.server_uri(), ": ",
|
553
|
+
status.message()));
|
554
|
+
gpr_log(GPR_INFO, "[xds_client %p] %s", xds_client(),
|
555
|
+
status.ToString().c_str());
|
556
|
+
// If the node ID is set, append that to the status message that we send to
|
557
|
+
// the watchers, so that it will appear in log messages visible to users.
|
558
|
+
const auto* node = xds_client_->bootstrap_->node();
|
559
|
+
if (node != nullptr) {
|
560
|
+
status = absl::Status(
|
561
|
+
status.code(),
|
562
|
+
absl::StrCat(status.message(),
|
563
|
+
" (node ID:", xds_client_->bootstrap_->node()->id(), ")"));
|
564
|
+
}
|
565
|
+
// Save status in channel, so that we can immediately generate an
|
566
|
+
// error for any new watchers that may be started.
|
567
|
+
status_ = status;
|
568
|
+
// Find all watchers for this channel.
|
569
|
+
std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
|
570
|
+
for (const auto& a : xds_client_->authority_state_map_) { // authority
|
571
|
+
if (a.second.channel_state != this) continue;
|
572
|
+
for (const auto& t : a.second.resource_map) { // type
|
573
|
+
for (const auto& r : t.second) { // resource id
|
574
|
+
for (const auto& w : r.second.watchers) { // watchers
|
575
|
+
watchers.insert(w.second);
|
576
|
+
}
|
577
|
+
}
|
578
|
+
}
|
579
|
+
}
|
580
|
+
// Enqueue notification for the watchers.
|
581
|
+
xds_client_->work_serializer_.Schedule(
|
582
|
+
[watchers = std::move(watchers), status = std::move(status)]()
|
583
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(xds_client_->work_serializer_) {
|
584
|
+
for (const auto& watcher : watchers) {
|
585
|
+
watcher->OnError(status);
|
586
|
+
}
|
587
|
+
},
|
588
|
+
DEBUG_LOCATION);
|
589
|
+
}
|
590
|
+
|
657
591
|
//
|
658
592
|
// XdsClient::ChannelState::RetryableCall<>
|
659
593
|
//
|
@@ -669,9 +603,6 @@ XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
|
|
669
603
|
.set_jitter(GRPC_XDS_RECONNECT_JITTER)
|
670
604
|
.set_max_backoff(Duration::Seconds(
|
671
605
|
GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
|
672
|
-
// Closure Initialization
|
673
|
-
GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
|
674
|
-
grpc_schedule_on_exec_ctx);
|
675
606
|
StartNewCallLocked();
|
676
607
|
}
|
677
608
|
|
@@ -679,35 +610,32 @@ template <typename T>
|
|
679
610
|
void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
|
680
611
|
shutting_down_ = true;
|
681
612
|
calld_.reset();
|
682
|
-
if (
|
613
|
+
if (timer_handle_.has_value()) {
|
614
|
+
chand()->xds_client()->engine()->Cancel(*timer_handle_);
|
615
|
+
timer_handle_.reset();
|
616
|
+
}
|
683
617
|
this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
|
684
618
|
}
|
685
619
|
|
686
620
|
template <typename T>
|
687
621
|
void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
|
688
|
-
|
622
|
+
// If we saw a response on the current stream, reset backoff.
|
623
|
+
if (calld_->seen_response()) backoff_.Reset();
|
689
624
|
calld_.reset();
|
690
|
-
|
691
|
-
|
692
|
-
// call immediately.
|
693
|
-
backoff_.Reset();
|
694
|
-
StartNewCallLocked();
|
695
|
-
} else {
|
696
|
-
// If we failed to connect to the xds server, retry later.
|
697
|
-
StartRetryTimerLocked();
|
698
|
-
}
|
625
|
+
// Start retry timer.
|
626
|
+
StartRetryTimerLocked();
|
699
627
|
}
|
700
628
|
|
701
629
|
template <typename T>
|
702
630
|
void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
|
703
631
|
if (shutting_down_) return;
|
704
|
-
GPR_ASSERT(chand_->
|
632
|
+
GPR_ASSERT(chand_->transport_ != nullptr);
|
705
633
|
GPR_ASSERT(calld_ == nullptr);
|
706
634
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
707
|
-
gpr_log(
|
708
|
-
|
709
|
-
|
710
|
-
|
635
|
+
gpr_log(GPR_INFO,
|
636
|
+
"[xds_client %p] xds server %s: start new call from retryable "
|
637
|
+
"call %p",
|
638
|
+
chand()->xds_client(), chand()->server_.server_uri().c_str(), this);
|
711
639
|
}
|
712
640
|
calld_ = MakeOrphanable<T>(
|
713
641
|
this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
|
@@ -717,45 +645,39 @@ template <typename T>
|
|
717
645
|
void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
|
718
646
|
if (shutting_down_) return;
|
719
647
|
const Timestamp next_attempt_time = backoff_.NextAttemptTime();
|
648
|
+
const Duration timeout =
|
649
|
+
std::max(next_attempt_time - Timestamp::Now(), Duration::Zero());
|
720
650
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
721
|
-
Duration timeout =
|
722
|
-
std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
|
723
651
|
gpr_log(GPR_INFO,
|
724
652
|
"[xds_client %p] xds server %s: call attempt failed; "
|
725
653
|
"retry timer will fire in %" PRId64 "ms.",
|
726
|
-
chand()->xds_client(), chand()->server_.server_uri.c_str(),
|
654
|
+
chand()->xds_client(), chand()->server_.server_uri().c_str(),
|
727
655
|
timeout.millis());
|
728
656
|
}
|
729
|
-
|
730
|
-
|
731
|
-
|
657
|
+
timer_handle_ = chand()->xds_client()->engine()->RunAfter(
|
658
|
+
timeout,
|
659
|
+
[self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
|
660
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
661
|
+
ExecCtx exec_ctx;
|
662
|
+
self->OnRetryTimer();
|
663
|
+
});
|
732
664
|
}
|
733
665
|
|
734
666
|
template <typename T>
|
735
|
-
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
|
741
|
-
}
|
742
|
-
calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
|
743
|
-
}
|
744
|
-
|
745
|
-
template <typename T>
|
746
|
-
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
|
747
|
-
grpc_error_handle error) {
|
748
|
-
retry_timer_callback_pending_ = false;
|
749
|
-
if (!shutting_down_ && error == GRPC_ERROR_NONE) {
|
667
|
+
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer() {
|
668
|
+
MutexLock lock(&chand_->xds_client()->mu_);
|
669
|
+
if (timer_handle_.has_value()) {
|
670
|
+
timer_handle_.reset();
|
671
|
+
if (shutting_down_) return;
|
750
672
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
751
673
|
gpr_log(GPR_INFO,
|
752
674
|
"[xds_client %p] xds server %s: retry timer fired (retryable "
|
753
675
|
"call: %p)",
|
754
|
-
chand()->xds_client(), chand()->server_.server_uri.c_str(),
|
676
|
+
chand()->xds_client(), chand()->server_.server_uri().c_str(),
|
677
|
+
this);
|
755
678
|
}
|
756
679
|
StartNewCallLocked();
|
757
680
|
}
|
758
|
-
GRPC_ERROR_UNREF(error);
|
759
681
|
}
|
760
682
|
|
761
683
|
//
|
@@ -770,7 +692,7 @@ absl::Status XdsClient::ChannelState::AdsCallState::AdsResponseParser::
|
|
770
692
|
"[xds_client %p] xds server %s: received ADS response: type_url=%s, "
|
771
693
|
"version=%s, nonce=%s, num_resources=%" PRIuPTR,
|
772
694
|
ads_call_state_->xds_client(),
|
773
|
-
ads_call_state_->chand()->server_.server_uri.c_str(),
|
695
|
+
ads_call_state_->chand()->server_.server_uri().c_str(),
|
774
696
|
fields.type_url.c_str(), fields.version.c_str(), fields.nonce.c_str(),
|
775
697
|
fields.num_resources);
|
776
698
|
}
|
@@ -813,48 +735,68 @@ void UpdateResourceMetadataNacked(const std::string& version,
|
|
813
735
|
} // namespace
|
814
736
|
|
815
737
|
void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
816
|
-
|
817
|
-
absl::string_view serialized_resource) {
|
738
|
+
upb_Arena* arena, size_t idx, absl::string_view type_url,
|
739
|
+
absl::string_view resource_name, absl::string_view serialized_resource) {
|
740
|
+
std::string error_prefix = absl::StrCat(
|
741
|
+
"resource index ", idx, ": ",
|
742
|
+
resource_name.empty() ? "" : absl::StrCat(resource_name, ": "));
|
818
743
|
// Check the type_url of the resource.
|
819
|
-
|
820
|
-
if (!result_.type->IsType(type_url, &is_v2)) {
|
744
|
+
if (result_.type_url != type_url) {
|
821
745
|
result_.errors.emplace_back(
|
822
|
-
absl::StrCat(
|
823
|
-
|
746
|
+
absl::StrCat(error_prefix, "incorrect resource type \"", type_url,
|
747
|
+
"\" (should be \"", result_.type_url, "\")"));
|
824
748
|
return;
|
825
749
|
}
|
826
750
|
// Parse the resource.
|
827
|
-
|
828
|
-
|
829
|
-
|
751
|
+
XdsResourceType::DecodeContext context = {
|
752
|
+
xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
|
753
|
+
xds_client()->symtab_.ptr(), arena};
|
754
|
+
XdsResourceType::DecodeResult decode_result =
|
755
|
+
result_.type->Decode(context, serialized_resource);
|
756
|
+
// If we didn't already have the resource name from the Resource
|
757
|
+
// wrapper, try to get it from the decoding result.
|
758
|
+
if (resource_name.empty()) {
|
759
|
+
if (decode_result.name.has_value()) {
|
760
|
+
resource_name = *decode_result.name;
|
761
|
+
error_prefix =
|
762
|
+
absl::StrCat("resource index ", idx, ": ", resource_name, ": ");
|
763
|
+
} else {
|
764
|
+
// We don't have any way of determining the resource name, so
|
765
|
+
// there's nothing more we can do here.
|
766
|
+
result_.errors.emplace_back(absl::StrCat(
|
767
|
+
error_prefix, decode_result.resource.status().ToString()));
|
768
|
+
return;
|
769
|
+
}
|
770
|
+
}
|
771
|
+
// If decoding failed, make sure we include the error in the NACK.
|
772
|
+
const absl::Status& decode_status = decode_result.resource.status();
|
773
|
+
if (!decode_status.ok()) {
|
830
774
|
result_.errors.emplace_back(
|
831
|
-
absl::StrCat(
|
832
|
-
return;
|
775
|
+
absl::StrCat(error_prefix, decode_status.ToString()));
|
833
776
|
}
|
834
777
|
// Check the resource name.
|
835
|
-
auto
|
836
|
-
|
837
|
-
if (!
|
838
|
-
result_.errors.emplace_back(
|
839
|
-
|
840
|
-
result->name, "\""));
|
778
|
+
auto parsed_resource_name =
|
779
|
+
xds_client()->ParseXdsResourceName(resource_name, result_.type);
|
780
|
+
if (!parsed_resource_name.ok()) {
|
781
|
+
result_.errors.emplace_back(
|
782
|
+
absl::StrCat(error_prefix, "Cannot parse xDS resource name"));
|
841
783
|
return;
|
842
784
|
}
|
843
785
|
// Cancel resource-does-not-exist timer, if needed.
|
844
786
|
auto timer_it = ads_call_state_->state_map_.find(result_.type);
|
845
787
|
if (timer_it != ads_call_state_->state_map_.end()) {
|
846
|
-
auto it =
|
847
|
-
|
788
|
+
auto it = timer_it->second.subscribed_resources.find(
|
789
|
+
parsed_resource_name->authority);
|
848
790
|
if (it != timer_it->second.subscribed_resources.end()) {
|
849
|
-
auto res_it = it->second.find(
|
791
|
+
auto res_it = it->second.find(parsed_resource_name->key);
|
850
792
|
if (res_it != it->second.end()) {
|
851
|
-
res_it->second->
|
793
|
+
res_it->second->MarkSeen();
|
852
794
|
}
|
853
795
|
}
|
854
796
|
}
|
855
797
|
// Lookup the authority in the cache.
|
856
798
|
auto authority_it =
|
857
|
-
xds_client()->authority_state_map_.find(
|
799
|
+
xds_client()->authority_state_map_.find(parsed_resource_name->authority);
|
858
800
|
if (authority_it == xds_client()->authority_state_map_.end()) {
|
859
801
|
return; // Skip resource -- we don't have a subscription for it.
|
860
802
|
}
|
@@ -866,29 +808,35 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
866
808
|
}
|
867
809
|
auto& type_map = type_it->second;
|
868
810
|
// Found type, so look up resource key.
|
869
|
-
auto it = type_map.find(
|
811
|
+
auto it = type_map.find(parsed_resource_name->key);
|
870
812
|
if (it == type_map.end()) {
|
871
813
|
return; // Skip resource -- we don't have a subscription for it.
|
872
814
|
}
|
873
815
|
ResourceState& resource_state = it->second;
|
874
816
|
// If needed, record that we've seen this resource.
|
875
817
|
if (result_.type->AllResourcesRequiredInSotW()) {
|
876
|
-
result_.resources_seen[
|
818
|
+
result_.resources_seen[parsed_resource_name->authority].insert(
|
819
|
+
parsed_resource_name->key);
|
820
|
+
}
|
821
|
+
// If we previously ignored the resource's deletion, log that we're
|
822
|
+
// now re-adding it.
|
823
|
+
if (resource_state.ignored_deletion) {
|
824
|
+
gpr_log(GPR_INFO,
|
825
|
+
"[xds_client %p] xds server %s: server returned new version of "
|
826
|
+
"resource for which we previously ignored a deletion: type %s "
|
827
|
+
"name %s",
|
828
|
+
xds_client(),
|
829
|
+
ads_call_state_->chand()->server_.server_uri().c_str(),
|
830
|
+
std::string(type_url).c_str(), std::string(resource_name).c_str());
|
831
|
+
resource_state.ignored_deletion = false;
|
877
832
|
}
|
878
833
|
// Update resource state based on whether the resource is valid.
|
879
|
-
if (!
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
grpc_error_set_int(
|
886
|
-
GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
|
887
|
-
"invalid resource: ", result->resource.status().ToString())),
|
888
|
-
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE),
|
889
|
-
DEBUG_LOCATION);
|
890
|
-
UpdateResourceMetadataNacked(result_.version,
|
891
|
-
result->resource.status().ToString(),
|
834
|
+
if (!decode_status.ok()) {
|
835
|
+
xds_client()->NotifyWatchersOnErrorLocked(
|
836
|
+
resource_state.watchers,
|
837
|
+
absl::UnavailableError(
|
838
|
+
absl::StrCat("invalid resource: ", decode_status.ToString())));
|
839
|
+
UpdateResourceMetadataNacked(result_.version, decode_status.ToString(),
|
892
840
|
update_time_, &resource_state.meta);
|
893
841
|
return;
|
894
842
|
}
|
@@ -897,16 +845,17 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
897
845
|
// If it didn't change, ignore it.
|
898
846
|
if (resource_state.resource != nullptr &&
|
899
847
|
result_.type->ResourcesEqual(resource_state.resource.get(),
|
900
|
-
|
848
|
+
decode_result.resource->get())) {
|
901
849
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
902
850
|
gpr_log(GPR_INFO,
|
903
851
|
"[xds_client %p] %s resource %s identical to current, ignoring.",
|
904
|
-
xds_client(), result_.type_url.c_str(),
|
852
|
+
xds_client(), result_.type_url.c_str(),
|
853
|
+
std::string(resource_name).c_str());
|
905
854
|
}
|
906
855
|
return;
|
907
856
|
}
|
908
857
|
// Update the resource state.
|
909
|
-
resource_state.resource = std::move(*
|
858
|
+
resource_state.resource = std::move(*decode_result.resource);
|
910
859
|
resource_state.meta = CreateResourceMetadataAcked(
|
911
860
|
std::string(serialized_resource), result_.version, update_time_);
|
912
861
|
// Notify watchers.
|
@@ -924,6 +873,12 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
924
873
|
DEBUG_LOCATION);
|
925
874
|
}
|
926
875
|
|
876
|
+
void XdsClient::ChannelState::AdsCallState::AdsResponseParser::
|
877
|
+
ResourceWrapperParsingFailed(size_t idx) {
|
878
|
+
result_.errors.emplace_back(absl::StrCat(
|
879
|
+
"resource index ", idx, ": Can't decode Resource proto wrapper"));
|
880
|
+
}
|
881
|
+
|
927
882
|
//
|
928
883
|
// XdsClient::ChannelState::AdsCallState
|
929
884
|
//
|
@@ -935,51 +890,27 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
935
890
|
? "AdsCallState"
|
936
891
|
: nullptr),
|
937
892
|
parent_(std::move(parent)) {
|
938
|
-
// Init the ADS call. Note that the call will progress every time there's
|
939
|
-
// activity in xds_client()->interested_parties_, which is comprised of
|
940
|
-
// the polling entities from client_channel.
|
941
893
|
GPR_ASSERT(xds_client() != nullptr);
|
942
|
-
//
|
894
|
+
// Init the ADS call.
|
943
895
|
const char* method =
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
xds_client()->interested_parties_,
|
952
|
-
StaticSlice::FromStaticString(method).c_slice(), nullptr,
|
953
|
-
Timestamp::InfFuture(), nullptr);
|
896
|
+
"/envoy.service.discovery.v3.AggregatedDiscoveryService/"
|
897
|
+
"StreamAggregatedResources";
|
898
|
+
call_ = chand()->transport_->CreateStreamingCall(
|
899
|
+
method, std::make_unique<StreamEventHandler>(
|
900
|
+
// Passing the initial ref here. This ref will go away when
|
901
|
+
// the StreamEventHandler is destroyed.
|
902
|
+
RefCountedPtr<AdsCallState>(this)));
|
954
903
|
GPR_ASSERT(call_ != nullptr);
|
955
|
-
// Init data associated with the call.
|
956
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
957
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
958
904
|
// Start the call.
|
959
905
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
960
906
|
gpr_log(GPR_INFO,
|
961
907
|
"[xds_client %p] xds server %s: starting ADS call "
|
962
908
|
"(calld: %p, call: %p)",
|
963
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
memset(ops, 0, sizeof(ops));
|
969
|
-
// Op: send initial metadata.
|
970
|
-
grpc_op* op = ops;
|
971
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
972
|
-
op->data.send_initial_metadata.count = 0;
|
973
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
974
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
975
|
-
op->reserved = nullptr;
|
976
|
-
op++;
|
977
|
-
call_error = grpc_call_start_batch_and_execute(
|
978
|
-
call_, ops, static_cast<size_t>(op - ops), nullptr);
|
979
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
980
|
-
// Op: send request message.
|
981
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
982
|
-
grpc_schedule_on_exec_ctx);
|
909
|
+
xds_client(), chand()->server_.server_uri().c_str(), this,
|
910
|
+
call_.get());
|
911
|
+
}
|
912
|
+
// If this is a reconnect, add any necessary subscriptions from what's
|
913
|
+
// already in the cache.
|
983
914
|
for (const auto& a : xds_client()->authority_state_map_) {
|
984
915
|
const std::string& authority = a.first;
|
985
916
|
// Skip authorities that are not using this xDS channel.
|
@@ -988,129 +919,57 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
988
919
|
const XdsResourceType* type = t.first;
|
989
920
|
for (const auto& r : t.second) {
|
990
921
|
const XdsResourceKey& resource_key = r.first;
|
991
|
-
SubscribeLocked(type, {authority, resource_key});
|
922
|
+
SubscribeLocked(type, {authority, resource_key}, /*delay_send=*/true);
|
992
923
|
}
|
993
924
|
}
|
994
925
|
}
|
995
|
-
//
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
&initial_metadata_recv_;
|
1000
|
-
op->flags = 0;
|
1001
|
-
op->reserved = nullptr;
|
1002
|
-
op++;
|
1003
|
-
// Op: recv response.
|
1004
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
1005
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
1006
|
-
op->flags = 0;
|
1007
|
-
op->reserved = nullptr;
|
1008
|
-
op++;
|
1009
|
-
Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
|
1010
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
1011
|
-
grpc_schedule_on_exec_ctx);
|
1012
|
-
call_error = grpc_call_start_batch_and_execute(
|
1013
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
1014
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1015
|
-
// Op: recv server status.
|
1016
|
-
op = ops;
|
1017
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
1018
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1019
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1020
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1021
|
-
op->flags = 0;
|
1022
|
-
op->reserved = nullptr;
|
1023
|
-
op++;
|
1024
|
-
// This callback signals the end of the call, so it relies on the initial
|
1025
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1026
|
-
// unreffed.
|
1027
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1028
|
-
grpc_schedule_on_exec_ctx);
|
1029
|
-
call_error = grpc_call_start_batch_and_execute(
|
1030
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1031
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1032
|
-
}
|
1033
|
-
|
1034
|
-
XdsClient::ChannelState::AdsCallState::~AdsCallState() {
|
1035
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1036
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1037
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1038
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1039
|
-
grpc_slice_unref_internal(status_details_);
|
1040
|
-
GPR_ASSERT(call_ != nullptr);
|
1041
|
-
grpc_call_unref(call_);
|
926
|
+
// Send initial message if we added any subscriptions above.
|
927
|
+
for (const auto& p : state_map_) {
|
928
|
+
SendMessageLocked(p.first);
|
929
|
+
}
|
1042
930
|
}
|
1043
931
|
|
1044
932
|
void XdsClient::ChannelState::AdsCallState::Orphan() {
|
1045
|
-
GPR_ASSERT(call_ != nullptr);
|
1046
|
-
// If we are here because xds_client wants to cancel the call,
|
1047
|
-
// on_status_received_ will complete the cancellation and clean up. Otherwise,
|
1048
|
-
// we are here because xds_client has to orphan a failed call, then the
|
1049
|
-
// following cancellation will be a no-op.
|
1050
|
-
grpc_call_cancel_internal(call_);
|
1051
933
|
state_map_.clear();
|
1052
|
-
// Note that the initial ref is
|
1053
|
-
//
|
934
|
+
// Note that the initial ref is held by the StreamEventHandler, which
|
935
|
+
// will be destroyed when call_ is destroyed, which may not happen
|
936
|
+
// here, since there may be other refs held to call_ by internal callbacks.
|
937
|
+
call_.reset();
|
1054
938
|
}
|
1055
939
|
|
1056
940
|
void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
1057
941
|
const XdsResourceType* type)
|
1058
942
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
1059
943
|
// Buffer message sending if an existing message is in flight.
|
1060
|
-
if (
|
944
|
+
if (send_message_pending_ != nullptr) {
|
1061
945
|
buffered_requests_.insert(type);
|
1062
946
|
return;
|
1063
947
|
}
|
1064
948
|
auto& state = state_map_[type];
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
|
1069
|
-
chand()->resource_type_version_map_[type], state.nonce,
|
1070
|
-
ResourceNamesForRequest(type), GRPC_ERROR_REF(state.error),
|
1071
|
-
!sent_initial_message_);
|
949
|
+
std::string serialized_message = xds_client()->api_.CreateAdsRequest(
|
950
|
+
type->type_url(), chand()->resource_type_version_map_[type], state.nonce,
|
951
|
+
ResourceNamesForRequest(type), state.status, !sent_initial_message_);
|
1072
952
|
sent_initial_message_ = true;
|
1073
953
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1074
954
|
gpr_log(GPR_INFO,
|
1075
955
|
"[xds_client %p] xds server %s: sending ADS request: type=%s "
|
1076
956
|
"version=%s nonce=%s error=%s",
|
1077
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
957
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1078
958
|
std::string(type->type_url()).c_str(),
|
1079
959
|
chand()->resource_type_version_map_[type].c_str(),
|
1080
|
-
state.nonce.c_str(),
|
1081
|
-
}
|
1082
|
-
GRPC_ERROR_UNREF(state.error);
|
1083
|
-
state.error = GRPC_ERROR_NONE;
|
1084
|
-
// Create message payload.
|
1085
|
-
send_message_payload_ =
|
1086
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1087
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1088
|
-
// Send the message.
|
1089
|
-
grpc_op op;
|
1090
|
-
memset(&op, 0, sizeof(op));
|
1091
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1092
|
-
op.data.send_message.send_message = send_message_payload_;
|
1093
|
-
Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
|
1094
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
1095
|
-
grpc_schedule_on_exec_ctx);
|
1096
|
-
grpc_call_error call_error =
|
1097
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
|
1098
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1099
|
-
gpr_log(GPR_ERROR,
|
1100
|
-
"[xds_client %p] xds server %s: error starting ADS send_message "
|
1101
|
-
"batch on calld=%p: call_error=%d",
|
1102
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
1103
|
-
call_error);
|
1104
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
960
|
+
state.nonce.c_str(), state.status.ToString().c_str());
|
1105
961
|
}
|
962
|
+
state.status = absl::OkStatus();
|
963
|
+
call_->SendMessage(std::move(serialized_message));
|
964
|
+
send_message_pending_ = type;
|
1106
965
|
}
|
1107
966
|
|
1108
967
|
void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
|
1109
|
-
const XdsResourceType* type, const XdsResourceName& name) {
|
968
|
+
const XdsResourceType* type, const XdsResourceName& name, bool delay_send) {
|
1110
969
|
auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
|
1111
970
|
if (state == nullptr) {
|
1112
971
|
state = MakeOrphanable<ResourceTimer>(type, name);
|
1113
|
-
SendMessageLocked(type);
|
972
|
+
if (!delay_send) SendMessageLocked(type);
|
1114
973
|
}
|
1115
974
|
}
|
1116
975
|
|
@@ -1123,7 +982,12 @@ void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
|
|
1123
982
|
if (authority_map.empty()) {
|
1124
983
|
type_state_map.subscribed_resources.erase(name.authority);
|
1125
984
|
}
|
1126
|
-
if
|
985
|
+
// Don't need to send unsubscription message if this was the last
|
986
|
+
// resource we were subscribed to, since we'll be closing the stream
|
987
|
+
// immediately in that case.
|
988
|
+
if (!delay_unsubscription && HasSubscribedResources()) {
|
989
|
+
SendMessageLocked(type);
|
990
|
+
}
|
1127
991
|
}
|
1128
992
|
|
1129
993
|
bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
|
@@ -1133,22 +997,21 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
|
|
1133
997
|
return false;
|
1134
998
|
}
|
1135
999
|
|
1136
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSent(
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1000
|
+
void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
|
1001
|
+
MutexLock lock(&xds_client()->mu_);
|
1002
|
+
// For each resource that was in the message we just sent, start the
|
1003
|
+
// resource timer if needed.
|
1004
|
+
if (ok) {
|
1005
|
+
auto& resource_type_state = state_map_[send_message_pending_];
|
1006
|
+
for (const auto& p : resource_type_state.subscribed_resources) {
|
1007
|
+
for (auto& q : p.second) {
|
1008
|
+
q.second->MaybeMarkSubscriptionSendComplete(
|
1009
|
+
Ref(DEBUG_LOCATION, "ResourceTimer"));
|
1010
|
+
}
|
1011
|
+
}
|
1142
1012
|
}
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
1147
|
-
grpc_error_handle error) {
|
1148
|
-
if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
|
1149
|
-
// Clean up the sent message.
|
1150
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1151
|
-
send_message_payload_ = nullptr;
|
1013
|
+
send_message_pending_ = nullptr;
|
1014
|
+
if (ok && IsCurrentCallOnChannel()) {
|
1152
1015
|
// Continue to send another pending message if any.
|
1153
1016
|
// TODO(roth): The current code to handle buffered messages has the
|
1154
1017
|
// advantage of sending only the most recent list of resource names for
|
@@ -1164,173 +1027,149 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
|
1164
1027
|
buffered_requests_.erase(it);
|
1165
1028
|
}
|
1166
1029
|
}
|
1167
|
-
GRPC_ERROR_UNREF(error);
|
1168
1030
|
}
|
1169
1031
|
|
1170
|
-
void XdsClient::ChannelState::AdsCallState::
|
1171
|
-
|
1172
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1173
|
-
bool done;
|
1032
|
+
void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
|
1033
|
+
absl::string_view payload) {
|
1174
1034
|
{
|
1175
|
-
MutexLock lock(&
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
Notifier::
|
1254
|
-
ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
|
1255
|
-
xds_client(), resource_state.watchers, DEBUG_LOCATION);
|
1035
|
+
MutexLock lock(&xds_client()->mu_);
|
1036
|
+
if (!IsCurrentCallOnChannel()) return;
|
1037
|
+
// Parse and validate the response.
|
1038
|
+
AdsResponseParser parser(this);
|
1039
|
+
absl::Status status = xds_client()->api_.ParseAdsResponse(payload, &parser);
|
1040
|
+
if (!status.ok()) {
|
1041
|
+
// Ignore unparsable response.
|
1042
|
+
gpr_log(GPR_ERROR,
|
1043
|
+
"[xds_client %p] xds server %s: error parsing ADS response (%s) "
|
1044
|
+
"-- ignoring",
|
1045
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1046
|
+
status.ToString().c_str());
|
1047
|
+
} else {
|
1048
|
+
seen_response_ = true;
|
1049
|
+
chand()->status_ = absl::OkStatus();
|
1050
|
+
AdsResponseParser::Result result = parser.TakeResult();
|
1051
|
+
// Update nonce.
|
1052
|
+
auto& state = state_map_[result.type];
|
1053
|
+
state.nonce = result.nonce;
|
1054
|
+
// If we got an error, set state.status so that we'll NACK the update.
|
1055
|
+
if (!result.errors.empty()) {
|
1056
|
+
state.status = absl::UnavailableError(
|
1057
|
+
absl::StrCat("xDS response validation errors: [",
|
1058
|
+
absl::StrJoin(result.errors, "; "), "]"));
|
1059
|
+
gpr_log(GPR_ERROR,
|
1060
|
+
"[xds_client %p] xds server %s: ADS response invalid for "
|
1061
|
+
"resource "
|
1062
|
+
"type %s version %s, will NACK: nonce=%s status=%s",
|
1063
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1064
|
+
result.type_url.c_str(), result.version.c_str(),
|
1065
|
+
state.nonce.c_str(), state.status.ToString().c_str());
|
1066
|
+
}
|
1067
|
+
// Delete resources not seen in update if needed.
|
1068
|
+
if (result.type->AllResourcesRequiredInSotW()) {
|
1069
|
+
for (auto& a : xds_client()->authority_state_map_) {
|
1070
|
+
const std::string& authority = a.first;
|
1071
|
+
AuthorityState& authority_state = a.second;
|
1072
|
+
// Skip authorities that are not using this xDS channel.
|
1073
|
+
if (authority_state.channel_state != chand()) continue;
|
1074
|
+
auto seen_authority_it = result.resources_seen.find(authority);
|
1075
|
+
// Find this resource type.
|
1076
|
+
auto type_it = authority_state.resource_map.find(result.type);
|
1077
|
+
if (type_it == authority_state.resource_map.end()) continue;
|
1078
|
+
// Iterate over resource ids.
|
1079
|
+
for (auto& r : type_it->second) {
|
1080
|
+
const XdsResourceKey& resource_key = r.first;
|
1081
|
+
ResourceState& resource_state = r.second;
|
1082
|
+
if (seen_authority_it == result.resources_seen.end() ||
|
1083
|
+
seen_authority_it->second.find(resource_key) ==
|
1084
|
+
seen_authority_it->second.end()) {
|
1085
|
+
// If the resource was newly requested but has not yet been
|
1086
|
+
// received, we don't want to generate an error for the
|
1087
|
+
// watchers, because this ADS response may be in reaction to an
|
1088
|
+
// earlier request that did not yet request the new resource, so
|
1089
|
+
// its absence from the response does not necessarily indicate
|
1090
|
+
// that the resource does not exist. For that case, we rely on
|
1091
|
+
// the request timeout instead.
|
1092
|
+
if (resource_state.resource == nullptr) continue;
|
1093
|
+
if (chand()->server_.IgnoreResourceDeletion()) {
|
1094
|
+
if (!resource_state.ignored_deletion) {
|
1095
|
+
gpr_log(GPR_ERROR,
|
1096
|
+
"[xds_client %p] xds server %s: ignoring deletion "
|
1097
|
+
"for resource type %s name %s",
|
1098
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1099
|
+
result.type_url.c_str(),
|
1100
|
+
XdsClient::ConstructFullXdsResourceName(
|
1101
|
+
authority, result.type_url.c_str(), resource_key)
|
1102
|
+
.c_str());
|
1103
|
+
resource_state.ignored_deletion = true;
|
1104
|
+
}
|
1105
|
+
} else {
|
1106
|
+
resource_state.resource.reset();
|
1107
|
+
resource_state.meta.client_status =
|
1108
|
+
XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
1109
|
+
xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
1110
|
+
resource_state.watchers);
|
1111
|
+
}
|
1112
|
+
}
|
1256
1113
|
}
|
1257
1114
|
}
|
1258
1115
|
}
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
|
1116
|
+
// If we had valid resources or the update was empty, update the version.
|
1117
|
+
if (result.have_valid_resources || result.errors.empty()) {
|
1118
|
+
chand()->resource_type_version_map_[result.type] =
|
1119
|
+
std::move(result.version);
|
1120
|
+
// Start load reporting if needed.
|
1121
|
+
auto& lrs_call = chand()->lrs_calld_;
|
1122
|
+
if (lrs_call != nullptr) {
|
1123
|
+
LrsCallState* lrs_calld = lrs_call->calld();
|
1124
|
+
if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
|
1125
|
+
}
|
1270
1126
|
}
|
1127
|
+
// Send ACK or NACK.
|
1128
|
+
SendMessageLocked(result.type);
|
1271
1129
|
}
|
1272
|
-
|
1273
|
-
|
1274
|
-
}
|
1275
|
-
if (xds_client()->shutting_down_) return true;
|
1276
|
-
// Keep listening for updates.
|
1277
|
-
grpc_op op;
|
1278
|
-
memset(&op, 0, sizeof(op));
|
1279
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1280
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1281
|
-
op.flags = 0;
|
1282
|
-
op.reserved = nullptr;
|
1283
|
-
GPR_ASSERT(call_ != nullptr);
|
1284
|
-
// Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
|
1285
|
-
const grpc_call_error call_error =
|
1286
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1287
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1288
|
-
return false;
|
1130
|
+
}
|
1131
|
+
xds_client()->work_serializer_.DrainQueue();
|
1289
1132
|
}
|
1290
1133
|
|
1291
1134
|
void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
|
1292
|
-
|
1293
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1135
|
+
absl::Status status) {
|
1294
1136
|
{
|
1295
|
-
MutexLock lock(&
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
chand()->server_.server_uri, status_code_,
|
1325
|
-
StringViewFromSlice(status_details_),
|
1326
|
-
grpc_error_std_string(error))));
|
1137
|
+
MutexLock lock(&xds_client()->mu_);
|
1138
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1139
|
+
gpr_log(GPR_INFO,
|
1140
|
+
"[xds_client %p] xds server %s: ADS call status received "
|
1141
|
+
"(chand=%p, ads_calld=%p, call=%p): %s",
|
1142
|
+
xds_client(), chand()->server_.server_uri().c_str(), chand(),
|
1143
|
+
this, call_.get(), status.ToString().c_str());
|
1144
|
+
}
|
1145
|
+
// Cancel any does-not-exist timers that may be pending.
|
1146
|
+
for (const auto& p : state_map_) {
|
1147
|
+
for (const auto& q : p.second.subscribed_resources) {
|
1148
|
+
for (auto& r : q.second) {
|
1149
|
+
r.second->MaybeCancelTimer();
|
1150
|
+
}
|
1151
|
+
}
|
1152
|
+
}
|
1153
|
+
// Ignore status from a stale call.
|
1154
|
+
if (IsCurrentCallOnChannel()) {
|
1155
|
+
// Try to restart the call.
|
1156
|
+
parent_->OnCallFinishedLocked();
|
1157
|
+
// If we didn't receive a response on the stream, report the
|
1158
|
+
// stream failure as a connectivity failure, which will report the
|
1159
|
+
// error to all watchers of resources on this channel.
|
1160
|
+
if (!seen_response_) {
|
1161
|
+
chand()->SetChannelStatusLocked(absl::UnavailableError(
|
1162
|
+
absl::StrCat("xDS call failed with no responses received; status: ",
|
1163
|
+
status.ToString())));
|
1164
|
+
}
|
1165
|
+
}
|
1327
1166
|
}
|
1328
|
-
|
1167
|
+
xds_client()->work_serializer_.DrainQueue();
|
1329
1168
|
}
|
1330
1169
|
|
1331
1170
|
bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
|
1332
|
-
// If the retryable ADS call is null (which only happens when the xds
|
1333
|
-
// is shutting down), all the ADS calls are stale.
|
1171
|
+
// If the retryable ADS call is null (which only happens when the xds
|
1172
|
+
// channel is shutting down), all the ADS calls are stale.
|
1334
1173
|
if (chand()->ads_calld_ == nullptr) return false;
|
1335
1174
|
return this == chand()->ads_calld_->calld();
|
1336
1175
|
}
|
@@ -1348,7 +1187,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
|
|
1348
1187
|
resource_names.emplace_back(XdsClient::ConstructFullXdsResourceName(
|
1349
1188
|
authority, type->type_url(), resource_key));
|
1350
1189
|
OrphanablePtr<ResourceTimer>& resource_timer = p.second;
|
1351
|
-
resource_timer->
|
1190
|
+
resource_timer->MarkSubscriptionSendStarted();
|
1352
1191
|
}
|
1353
1192
|
}
|
1354
1193
|
}
|
@@ -1360,38 +1199,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
|
|
1360
1199
|
//
|
1361
1200
|
|
1362
1201
|
void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
|
1363
|
-
if (
|
1364
|
-
|
1202
|
+
if (timer_handle_.has_value() &&
|
1203
|
+
xds_client()->engine()->Cancel(*timer_handle_)) {
|
1204
|
+
timer_handle_.reset();
|
1205
|
+
Unref(DEBUG_LOCATION, "Orphan");
|
1365
1206
|
}
|
1366
1207
|
}
|
1367
1208
|
|
1368
1209
|
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1369
1210
|
ScheduleNextReportLocked() {
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
void* arg, grpc_error_handle error) {
|
1378
|
-
Reporter* self = static_cast<Reporter*>(arg);
|
1379
|
-
bool done;
|
1380
|
-
{
|
1381
|
-
MutexLock lock(&self->xds_client()->mu_);
|
1382
|
-
done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
|
1383
|
-
}
|
1384
|
-
if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
|
1211
|
+
timer_handle_ = xds_client()->engine()->RunAfter(report_interval_, [this]() {
|
1212
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
1213
|
+
ExecCtx exec_ctx;
|
1214
|
+
if (OnNextReportTimer()) {
|
1215
|
+
Unref(DEBUG_LOCATION, "OnNextReportTimer()");
|
1216
|
+
}
|
1217
|
+
});
|
1385
1218
|
}
|
1386
1219
|
|
1387
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::
|
1388
|
-
|
1389
|
-
|
1390
|
-
if (
|
1391
|
-
|
1392
|
-
|
1393
|
-
}
|
1394
|
-
return SendReportLocked();
|
1220
|
+
bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer() {
|
1221
|
+
MutexLock lock(&xds_client()->mu_);
|
1222
|
+
timer_handle_.reset();
|
1223
|
+
if (!IsCurrentReporterOnCall()) return true;
|
1224
|
+
SendReportLocked();
|
1225
|
+
return false;
|
1395
1226
|
}
|
1396
1227
|
|
1397
1228
|
namespace {
|
@@ -1422,7 +1253,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
|
|
1422
1253
|
last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
|
1423
1254
|
if (old_val && last_report_counters_were_zero_) {
|
1424
1255
|
auto it = xds_client()->xds_load_report_server_map_.find(
|
1425
|
-
parent_->chand()->server_);
|
1256
|
+
&parent_->chand()->server_);
|
1426
1257
|
if (it == xds_client()->xds_load_report_server_map_.end() ||
|
1427
1258
|
it->second.load_report_map.empty()) {
|
1428
1259
|
it->second.channel_state->StopLrsCallLocked();
|
@@ -1431,65 +1262,34 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
|
|
1431
1262
|
ScheduleNextReportLocked();
|
1432
1263
|
return false;
|
1433
1264
|
}
|
1434
|
-
//
|
1435
|
-
|
1265
|
+
// Send a request that contains the snapshot.
|
1266
|
+
std::string serialized_payload =
|
1436
1267
|
xds_client()->api_.CreateLrsRequest(std::move(snapshot));
|
1437
|
-
parent_->
|
1438
|
-
|
1439
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1440
|
-
// Send the report.
|
1441
|
-
grpc_op op;
|
1442
|
-
memset(&op, 0, sizeof(op));
|
1443
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1444
|
-
op.data.send_message.send_message = parent_->send_message_payload_;
|
1445
|
-
grpc_call_error call_error = grpc_call_start_batch_and_execute(
|
1446
|
-
parent_->call_, &op, 1, &on_report_done_);
|
1447
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1448
|
-
gpr_log(GPR_ERROR,
|
1449
|
-
"[xds_client %p] xds server %s: error starting LRS send_message "
|
1450
|
-
"batch on calld=%p: call_error=%d",
|
1451
|
-
xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
|
1452
|
-
call_error);
|
1453
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1454
|
-
}
|
1268
|
+
parent_->call_->SendMessage(std::move(serialized_payload));
|
1269
|
+
parent_->send_message_pending_ = true;
|
1455
1270
|
return false;
|
1456
1271
|
}
|
1457
1272
|
|
1458
|
-
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1459
|
-
|
1460
|
-
|
1461
|
-
|
1462
|
-
|
1463
|
-
|
1464
|
-
|
1465
|
-
|
1466
|
-
if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
|
1467
|
-
}
|
1468
|
-
|
1469
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
|
1470
|
-
grpc_error_handle error) {
|
1471
|
-
grpc_byte_buffer_destroy(parent_->send_message_payload_);
|
1472
|
-
parent_->send_message_payload_ = nullptr;
|
1273
|
+
void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked() {
|
1274
|
+
// If a reporter starts a send_message op, then the reporting interval
|
1275
|
+
// changes and we destroy that reporter and create a new one, and then
|
1276
|
+
// the send_message op started by the old reporter finishes, this
|
1277
|
+
// method will be called even though it was for a completion started
|
1278
|
+
// by the old reporter. In that case, the timer will be pending, so
|
1279
|
+
// we just ignore the completion and wait for the timer to fire.
|
1280
|
+
if (timer_handle_.has_value()) return;
|
1473
1281
|
// If there are no more registered stats to report, cancel the call.
|
1474
|
-
auto it =
|
1475
|
-
|
1476
|
-
if (it == xds_client()->xds_load_report_server_map_.end()
|
1477
|
-
|
1478
|
-
it->second.channel_state
|
1479
|
-
|
1480
|
-
return true;
|
1481
|
-
}
|
1482
|
-
if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
|
1483
|
-
GRPC_ERROR_UNREF(error);
|
1484
|
-
// If this reporter is no longer the current one on the call, the reason
|
1485
|
-
// might be that it was orphaned for a new one due to config update.
|
1486
|
-
if (!IsCurrentReporterOnCall()) {
|
1487
|
-
parent_->MaybeStartReportingLocked();
|
1282
|
+
auto it = xds_client()->xds_load_report_server_map_.find(
|
1283
|
+
&parent_->chand()->server_);
|
1284
|
+
if (it == xds_client()->xds_load_report_server_map_.end()) return;
|
1285
|
+
if (it->second.load_report_map.empty()) {
|
1286
|
+
if (it->second.channel_state != nullptr) {
|
1287
|
+
it->second.channel_state->StopLrsCallLocked();
|
1488
1288
|
}
|
1489
|
-
return
|
1289
|
+
return;
|
1490
1290
|
}
|
1291
|
+
// Otherwise, schedule the next load report.
|
1491
1292
|
ScheduleNextReportLocked();
|
1492
|
-
return false;
|
1493
1293
|
}
|
1494
1294
|
|
1495
1295
|
//
|
@@ -1508,123 +1308,41 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
|
|
1508
1308
|
// the polling entities from client_channel.
|
1509
1309
|
GPR_ASSERT(xds_client() != nullptr);
|
1510
1310
|
const char* method =
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
Slice::FromStaticString(method).c_slice(), nullptr,
|
1518
|
-
Timestamp::InfFuture(), nullptr);
|
1311
|
+
"/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats";
|
1312
|
+
call_ = chand()->transport_->CreateStreamingCall(
|
1313
|
+
method, std::make_unique<StreamEventHandler>(
|
1314
|
+
// Passing the initial ref here. This ref will go away when
|
1315
|
+
// the StreamEventHandler is destroyed.
|
1316
|
+
RefCountedPtr<LrsCallState>(this)));
|
1519
1317
|
GPR_ASSERT(call_ != nullptr);
|
1520
|
-
// Init the request payload.
|
1521
|
-
grpc_slice request_payload_slice =
|
1522
|
-
xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
|
1523
|
-
send_message_payload_ =
|
1524
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1525
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1526
|
-
// Init other data associated with the LRS call.
|
1527
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
1528
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
1529
1318
|
// Start the call.
|
1530
1319
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1531
|
-
gpr_log(
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1539
|
-
|
1540
|
-
|
1541
|
-
grpc_op* op = ops;
|
1542
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
1543
|
-
op->data.send_initial_metadata.count = 0;
|
1544
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
1545
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
1546
|
-
op->reserved = nullptr;
|
1547
|
-
op++;
|
1548
|
-
// Op: send request message.
|
1549
|
-
GPR_ASSERT(send_message_payload_ != nullptr);
|
1550
|
-
op->op = GRPC_OP_SEND_MESSAGE;
|
1551
|
-
op->data.send_message.send_message = send_message_payload_;
|
1552
|
-
op->flags = 0;
|
1553
|
-
op->reserved = nullptr;
|
1554
|
-
op++;
|
1555
|
-
Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
|
1556
|
-
GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
|
1557
|
-
grpc_schedule_on_exec_ctx);
|
1558
|
-
call_error = grpc_call_start_batch_and_execute(
|
1559
|
-
call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
|
1560
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1561
|
-
// Op: recv initial metadata.
|
1562
|
-
op = ops;
|
1563
|
-
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
1564
|
-
op->data.recv_initial_metadata.recv_initial_metadata =
|
1565
|
-
&initial_metadata_recv_;
|
1566
|
-
op->flags = 0;
|
1567
|
-
op->reserved = nullptr;
|
1568
|
-
op++;
|
1569
|
-
// Op: recv response.
|
1570
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
1571
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
1572
|
-
op->flags = 0;
|
1573
|
-
op->reserved = nullptr;
|
1574
|
-
op++;
|
1575
|
-
Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
|
1576
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
1577
|
-
grpc_schedule_on_exec_ctx);
|
1578
|
-
call_error = grpc_call_start_batch_and_execute(
|
1579
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
1580
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1581
|
-
// Op: recv server status.
|
1582
|
-
op = ops;
|
1583
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
1584
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1585
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1586
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1587
|
-
op->flags = 0;
|
1588
|
-
op->reserved = nullptr;
|
1589
|
-
op++;
|
1590
|
-
// This callback signals the end of the call, so it relies on the initial
|
1591
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1592
|
-
// unreffed.
|
1593
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1594
|
-
grpc_schedule_on_exec_ctx);
|
1595
|
-
call_error = grpc_call_start_batch_and_execute(
|
1596
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1597
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1598
|
-
}
|
1599
|
-
|
1600
|
-
XdsClient::ChannelState::LrsCallState::~LrsCallState() {
|
1601
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1602
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1603
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1604
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1605
|
-
grpc_slice_unref_internal(status_details_);
|
1606
|
-
GPR_ASSERT(call_ != nullptr);
|
1607
|
-
grpc_call_unref(call_);
|
1320
|
+
gpr_log(GPR_INFO,
|
1321
|
+
"[xds_client %p] xds server %s: starting LRS call (calld=%p, "
|
1322
|
+
"call=%p)",
|
1323
|
+
xds_client(), chand()->server_.server_uri().c_str(), this,
|
1324
|
+
call_.get());
|
1325
|
+
}
|
1326
|
+
// Send the initial request.
|
1327
|
+
std::string serialized_payload = xds_client()->api_.CreateLrsInitialRequest();
|
1328
|
+
call_->SendMessage(std::move(serialized_payload));
|
1329
|
+
send_message_pending_ = true;
|
1608
1330
|
}
|
1609
1331
|
|
1610
1332
|
void XdsClient::ChannelState::LrsCallState::Orphan() {
|
1611
1333
|
reporter_.reset();
|
1612
|
-
|
1613
|
-
//
|
1614
|
-
//
|
1615
|
-
|
1616
|
-
// following cancellation will be a no-op.
|
1617
|
-
grpc_call_cancel_internal(call_);
|
1618
|
-
// Note that the initial ref is hold by on_status_received_. So the
|
1619
|
-
// corresponding unref happens in on_status_received_ instead of here.
|
1334
|
+
// Note that the initial ref is held by the StreamEventHandler, which
|
1335
|
+
// will be destroyed when call_ is destroyed, which may not happen
|
1336
|
+
// here, since there may be other refs held to call_ by internal callbacks.
|
1337
|
+
call_.reset();
|
1620
1338
|
}
|
1621
1339
|
|
1622
1340
|
void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
1623
1341
|
// Don't start again if already started.
|
1624
1342
|
if (reporter_ != nullptr) return;
|
1625
|
-
// Don't start if the previous send_message op (of the initial request or
|
1626
|
-
// last report of the previous reporter) hasn't completed.
|
1627
|
-
if (
|
1343
|
+
// Don't start if the previous send_message op (of the initial request or
|
1344
|
+
// the last report of the previous reporter) hasn't completed.
|
1345
|
+
if (call_ != nullptr && send_message_pending_) return;
|
1628
1346
|
// Don't start if no LRS response has arrived.
|
1629
1347
|
if (!seen_response()) return;
|
1630
1348
|
// Don't start if the ADS call hasn't received any valid response. Note that
|
@@ -1640,166 +1358,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
|
1640
1358
|
Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
|
1641
1359
|
}
|
1642
1360
|
|
1643
|
-
void XdsClient::ChannelState::LrsCallState::
|
1644
|
-
|
1645
|
-
|
1646
|
-
{
|
1647
|
-
|
1648
|
-
|
1361
|
+
void XdsClient::ChannelState::LrsCallState::OnRequestSent(bool /*ok*/) {
|
1362
|
+
MutexLock lock(&xds_client()->mu_);
|
1363
|
+
send_message_pending_ = false;
|
1364
|
+
if (reporter_ != nullptr) {
|
1365
|
+
reporter_->OnReportDoneLocked();
|
1366
|
+
} else {
|
1367
|
+
MaybeStartReportingLocked();
|
1649
1368
|
}
|
1650
|
-
lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
|
1651
1369
|
}
|
1652
1370
|
|
1653
|
-
void XdsClient::ChannelState::LrsCallState::
|
1654
|
-
|
1655
|
-
|
1656
|
-
|
1657
|
-
|
1658
|
-
|
1659
|
-
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1672
|
-
|
1673
|
-
if (
|
1674
|
-
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1678
|
-
|
1679
|
-
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
|
1686
|
-
bool send_all_clusters = false;
|
1687
|
-
std::set<std::string> new_cluster_names;
|
1688
|
-
Duration new_load_reporting_interval;
|
1689
|
-
grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
|
1690
|
-
response_slice, &send_all_clusters, &new_cluster_names,
|
1691
|
-
&new_load_reporting_interval);
|
1692
|
-
if (parse_error != GRPC_ERROR_NONE) {
|
1693
|
-
gpr_log(GPR_ERROR,
|
1694
|
-
"[xds_client %p] xds server %s: LRS response parsing failed: %s",
|
1695
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1696
|
-
grpc_error_std_string(parse_error).c_str());
|
1697
|
-
GRPC_ERROR_UNREF(parse_error);
|
1698
|
-
return;
|
1371
|
+
void XdsClient::ChannelState::LrsCallState::OnRecvMessage(
|
1372
|
+
absl::string_view payload) {
|
1373
|
+
MutexLock lock(&xds_client()->mu_);
|
1374
|
+
// If we're no longer the current call, ignore the result.
|
1375
|
+
if (!IsCurrentCallOnChannel()) return;
|
1376
|
+
// Parse the response.
|
1377
|
+
bool send_all_clusters = false;
|
1378
|
+
std::set<std::string> new_cluster_names;
|
1379
|
+
Duration new_load_reporting_interval;
|
1380
|
+
absl::Status status = xds_client()->api_.ParseLrsResponse(
|
1381
|
+
payload, &send_all_clusters, &new_cluster_names,
|
1382
|
+
&new_load_reporting_interval);
|
1383
|
+
if (!status.ok()) {
|
1384
|
+
gpr_log(GPR_ERROR,
|
1385
|
+
"[xds_client %p] xds server %s: LRS response parsing failed: %s",
|
1386
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1387
|
+
status.ToString().c_str());
|
1388
|
+
return;
|
1389
|
+
}
|
1390
|
+
seen_response_ = true;
|
1391
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1392
|
+
gpr_log(
|
1393
|
+
GPR_INFO,
|
1394
|
+
"[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
|
1395
|
+
" cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
|
1396
|
+
"ms",
|
1397
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1398
|
+
new_cluster_names.size(), send_all_clusters,
|
1399
|
+
new_load_reporting_interval.millis());
|
1400
|
+
size_t i = 0;
|
1401
|
+
for (const auto& name : new_cluster_names) {
|
1402
|
+
gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
|
1403
|
+
xds_client(), i++, name.c_str());
|
1699
1404
|
}
|
1700
|
-
|
1405
|
+
}
|
1406
|
+
if (new_load_reporting_interval <
|
1407
|
+
Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
|
1408
|
+
new_load_reporting_interval =
|
1409
|
+
Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1701
1410
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1702
|
-
gpr_log(
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1708
|
-
new_cluster_names.size(), send_all_clusters,
|
1709
|
-
new_load_reporting_interval.millis());
|
1710
|
-
size_t i = 0;
|
1711
|
-
for (const auto& name : new_cluster_names) {
|
1712
|
-
gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
|
1713
|
-
xds_client(), i++, name.c_str());
|
1714
|
-
}
|
1715
|
-
}
|
1716
|
-
if (new_load_reporting_interval <
|
1717
|
-
Duration::Milliseconds(
|
1718
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
|
1719
|
-
new_load_reporting_interval = Duration::Milliseconds(
|
1720
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1721
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1722
|
-
gpr_log(GPR_INFO,
|
1723
|
-
"[xds_client %p] xds server %s: increased load_report_interval "
|
1724
|
-
"to minimum value %dms",
|
1725
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1726
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1727
|
-
}
|
1411
|
+
gpr_log(GPR_INFO,
|
1412
|
+
"[xds_client %p] xds server %s: increased load_report_interval "
|
1413
|
+
"to minimum value %dms",
|
1414
|
+
xds_client(), chand()->server_.server_uri().c_str(),
|
1415
|
+
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1728
1416
|
}
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
}
|
1740
|
-
return;
|
1417
|
+
}
|
1418
|
+
// Ignore identical update.
|
1419
|
+
if (send_all_clusters == send_all_clusters_ &&
|
1420
|
+
cluster_names_ == new_cluster_names &&
|
1421
|
+
load_reporting_interval_ == new_load_reporting_interval) {
|
1422
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1423
|
+
gpr_log(GPR_INFO,
|
1424
|
+
"[xds_client %p] xds server %s: incoming LRS response identical "
|
1425
|
+
"to current, ignoring.",
|
1426
|
+
xds_client(), chand()->server_.server_uri().c_str());
|
1741
1427
|
}
|
1742
|
-
|
1743
|
-
reporter_.reset();
|
1744
|
-
// Record the new config.
|
1745
|
-
send_all_clusters_ = send_all_clusters;
|
1746
|
-
cluster_names_ = std::move(new_cluster_names);
|
1747
|
-
load_reporting_interval_ = new_load_reporting_interval;
|
1748
|
-
// Try starting sending load report.
|
1749
|
-
MaybeStartReportingLocked();
|
1750
|
-
}();
|
1751
|
-
grpc_slice_unref_internal(response_slice);
|
1752
|
-
if (xds_client()->shutting_down_) return true;
|
1753
|
-
// Keep listening for LRS config updates.
|
1754
|
-
grpc_op op;
|
1755
|
-
memset(&op, 0, sizeof(op));
|
1756
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1757
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1758
|
-
op.flags = 0;
|
1759
|
-
op.reserved = nullptr;
|
1760
|
-
GPR_ASSERT(call_ != nullptr);
|
1761
|
-
// Reuse the "OnResponseReceivedLocked" ref taken in ctor.
|
1762
|
-
const grpc_call_error call_error =
|
1763
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1764
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1765
|
-
return false;
|
1766
|
-
}
|
1767
|
-
|
1768
|
-
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1769
|
-
void* arg, grpc_error_handle error) {
|
1770
|
-
LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
|
1771
|
-
{
|
1772
|
-
MutexLock lock(&lrs_calld->xds_client()->mu_);
|
1773
|
-
lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
|
1428
|
+
return;
|
1774
1429
|
}
|
1775
|
-
|
1430
|
+
// Stop current load reporting (if any) to adopt the new config.
|
1431
|
+
reporter_.reset();
|
1432
|
+
// Record the new config.
|
1433
|
+
send_all_clusters_ = send_all_clusters;
|
1434
|
+
cluster_names_ = std::move(new_cluster_names);
|
1435
|
+
load_reporting_interval_ = new_load_reporting_interval;
|
1436
|
+
// Try starting sending load report.
|
1437
|
+
MaybeStartReportingLocked();
|
1776
1438
|
}
|
1777
1439
|
|
1778
|
-
void XdsClient::ChannelState::LrsCallState::
|
1779
|
-
|
1780
|
-
|
1440
|
+
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1441
|
+
absl::Status status) {
|
1442
|
+
MutexLock lock(&xds_client()->mu_);
|
1781
1443
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1782
|
-
char* status_details = grpc_slice_to_c_string(status_details_);
|
1783
1444
|
gpr_log(GPR_INFO,
|
1784
1445
|
"[xds_client %p] xds server %s: LRS call status received "
|
1785
|
-
"(chand=%p, calld=%p, call=%p): "
|
1786
|
-
|
1787
|
-
|
1788
|
-
call_, status_code_, status_details,
|
1789
|
-
grpc_error_std_string(error).c_str());
|
1790
|
-
gpr_free(status_details);
|
1446
|
+
"(chand=%p, calld=%p, call=%p): %s",
|
1447
|
+
xds_client(), chand()->server_.server_uri().c_str(), chand(), this,
|
1448
|
+
call_.get(), status.ToString().c_str());
|
1791
1449
|
}
|
1792
1450
|
// Ignore status from a stale call.
|
1793
1451
|
if (IsCurrentCallOnChannel()) {
|
1794
1452
|
// Try to restart the call.
|
1795
1453
|
parent_->OnCallFinishedLocked();
|
1796
1454
|
}
|
1797
|
-
GRPC_ERROR_UNREF(error);
|
1798
1455
|
}
|
1799
1456
|
|
1800
1457
|
bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
1801
|
-
// If the retryable LRS call is null (which only happens when the xds
|
1802
|
-
// is shutting down), all the LRS calls are stale.
|
1458
|
+
// If the retryable LRS call is null (which only happens when the xds
|
1459
|
+
// channel is shutting down), all the LRS calls are stale.
|
1803
1460
|
if (chand()->lrs_calld_ == nullptr) return false;
|
1804
1461
|
return this == chand()->lrs_calld_->calld();
|
1805
1462
|
}
|
@@ -1808,85 +1465,66 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
|
1808
1465
|
// XdsClient
|
1809
1466
|
//
|
1810
1467
|
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1815
|
-
|
1816
|
-
|
1817
|
-
}
|
1818
|
-
|
1819
|
-
grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
|
1820
|
-
absl::InlinedVector<grpc_arg, 1> args_to_add = {
|
1821
|
-
grpc_channel_arg_integer_create(
|
1822
|
-
const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
|
1823
|
-
5 * 60 * GPR_MS_PER_SEC),
|
1824
|
-
};
|
1825
|
-
return grpc_channel_args_copy_and_add(args, args_to_add.data(),
|
1826
|
-
args_to_add.size());
|
1827
|
-
}
|
1828
|
-
|
1829
|
-
} // namespace
|
1830
|
-
|
1831
|
-
XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
|
1832
|
-
const grpc_channel_args* args)
|
1468
|
+
XdsClient::XdsClient(
|
1469
|
+
std::unique_ptr<XdsBootstrap> bootstrap,
|
1470
|
+
OrphanablePtr<XdsTransportFactory> transport_factory,
|
1471
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine,
|
1472
|
+
std::string user_agent_name, std::string user_agent_version,
|
1473
|
+
Duration resource_request_timeout)
|
1833
1474
|
: DualRefCounted<XdsClient>(
|
1834
1475
|
GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
|
1835
1476
|
: nullptr),
|
1836
1477
|
bootstrap_(std::move(bootstrap)),
|
1837
|
-
|
1838
|
-
request_timeout_(
|
1839
|
-
|
1840
|
-
|
1841
|
-
|
1842
|
-
|
1843
|
-
&bootstrap_->certificate_providers(), &symtab_) {
|
1478
|
+
transport_factory_(std::move(transport_factory)),
|
1479
|
+
request_timeout_(resource_request_timeout),
|
1480
|
+
xds_federation_enabled_(XdsFederationEnabled()),
|
1481
|
+
api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_,
|
1482
|
+
std::move(user_agent_name), std::move(user_agent_version)),
|
1483
|
+
engine_(std::move(engine)) {
|
1844
1484
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1845
1485
|
gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
|
1846
1486
|
}
|
1847
|
-
|
1848
|
-
|
1849
|
-
|
1487
|
+
GPR_ASSERT(bootstrap_ != nullptr);
|
1488
|
+
if (bootstrap_->node() != nullptr) {
|
1489
|
+
gpr_log(GPR_INFO, "[xds_client %p] xDS node ID: %s", this,
|
1490
|
+
bootstrap_->node()->id().c_str());
|
1491
|
+
}
|
1850
1492
|
}
|
1851
1493
|
|
1852
1494
|
XdsClient::~XdsClient() {
|
1853
1495
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1854
1496
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
|
1855
1497
|
}
|
1856
|
-
grpc_channel_args_destroy(args_);
|
1857
|
-
grpc_pollset_set_destroy(interested_parties_);
|
1858
|
-
// Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
|
1859
|
-
// is destroyed.
|
1860
|
-
grpc_shutdown();
|
1861
1498
|
}
|
1862
1499
|
|
1863
1500
|
void XdsClient::Orphan() {
|
1864
1501
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1865
1502
|
gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
|
1866
1503
|
}
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1504
|
+
MutexLock lock(&mu_);
|
1505
|
+
shutting_down_ = true;
|
1506
|
+
// Clear cache and any remaining watchers that may not have been cancelled.
|
1507
|
+
authority_state_map_.clear();
|
1508
|
+
invalid_watchers_.clear();
|
1509
|
+
// We may still be sending lingering queued load report data, so don't
|
1510
|
+
// just clear the load reporting map, but we do want to clear the refs
|
1511
|
+
// we're holding to the ChannelState objects, to make sure that
|
1512
|
+
// everything shuts down properly.
|
1513
|
+
for (auto& p : xds_load_report_server_map_) {
|
1514
|
+
p.second.channel_state.reset(DEBUG_LOCATION, "XdsClient::Orphan()");
|
1877
1515
|
}
|
1878
1516
|
}
|
1879
1517
|
|
1880
1518
|
RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
|
1881
|
-
const XdsBootstrap::XdsServer& server) {
|
1882
|
-
auto it = xds_server_channel_map_.find(server);
|
1519
|
+
const XdsBootstrap::XdsServer& server, const char* reason) {
|
1520
|
+
auto it = xds_server_channel_map_.find(&server);
|
1883
1521
|
if (it != xds_server_channel_map_.end()) {
|
1884
|
-
return it->second->Ref(DEBUG_LOCATION,
|
1522
|
+
return it->second->Ref(DEBUG_LOCATION, reason);
|
1885
1523
|
}
|
1886
1524
|
// Channel not found, so create a new one.
|
1887
1525
|
auto channel_state = MakeRefCounted<ChannelState>(
|
1888
1526
|
WeakRef(DEBUG_LOCATION, "ChannelState"), server);
|
1889
|
-
xds_server_channel_map_[server] = channel_state.get();
|
1527
|
+
xds_server_channel_map_[&server] = channel_state.get();
|
1890
1528
|
return channel_state;
|
1891
1529
|
}
|
1892
1530
|
|
@@ -1895,24 +1533,23 @@ void XdsClient::WatchResource(const XdsResourceType* type,
|
|
1895
1533
|
RefCountedPtr<ResourceWatcherInterface> watcher) {
|
1896
1534
|
ResourceWatcherInterface* w = watcher.get();
|
1897
1535
|
// Lambda for handling failure cases.
|
1898
|
-
auto fail = [&](
|
1536
|
+
auto fail = [&](absl::Status status) mutable {
|
1899
1537
|
{
|
1900
1538
|
MutexLock lock(&mu_);
|
1901
1539
|
MaybeRegisterResourceTypeLocked(type);
|
1902
1540
|
invalid_watchers_[w] = watcher;
|
1903
1541
|
}
|
1904
1542
|
work_serializer_.Run(
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1909
|
-
},
|
1543
|
+
[watcher = std::move(watcher), status = std::move(status)]()
|
1544
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
|
1545
|
+
watcher->OnError(status);
|
1546
|
+
},
|
1910
1547
|
DEBUG_LOCATION);
|
1911
1548
|
};
|
1912
1549
|
auto resource_name = ParseXdsResourceName(name, type);
|
1913
1550
|
if (!resource_name.ok()) {
|
1914
|
-
fail(
|
1915
|
-
"Unable to parse resource name
|
1551
|
+
fail(absl::UnavailableError(
|
1552
|
+
absl::StrCat("Unable to parse resource name ", name)));
|
1916
1553
|
return;
|
1917
1554
|
}
|
1918
1555
|
// Find server to use.
|
@@ -1921,14 +1558,12 @@ void XdsClient::WatchResource(const XdsResourceType* type,
|
|
1921
1558
|
if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
|
1922
1559
|
auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
|
1923
1560
|
if (authority == nullptr) {
|
1924
|
-
fail(
|
1561
|
+
fail(absl::UnavailableError(
|
1925
1562
|
absl::StrCat("authority \"", authority_name,
|
1926
1563
|
"\" not present in bootstrap config")));
|
1927
1564
|
return;
|
1928
1565
|
}
|
1929
|
-
|
1930
|
-
xds_server = &authority->xds_servers[0];
|
1931
|
-
}
|
1566
|
+
xds_server = authority->server();
|
1932
1567
|
}
|
1933
1568
|
if (xds_server == nullptr) xds_server = &bootstrap_->server();
|
1934
1569
|
{
|
@@ -1954,12 +1589,60 @@ void XdsClient::WatchResource(const XdsResourceType* type,
|
|
1954
1589
|
delete value;
|
1955
1590
|
},
|
1956
1591
|
DEBUG_LOCATION);
|
1592
|
+
} else if (resource_state.meta.client_status ==
|
1593
|
+
XdsApi::ResourceMetadata::DOES_NOT_EXIST) {
|
1594
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1595
|
+
gpr_log(GPR_INFO,
|
1596
|
+
"[xds_client %p] reporting cached does-not-exist for %s", this,
|
1597
|
+
std::string(name).c_str());
|
1598
|
+
}
|
1599
|
+
work_serializer_.Schedule(
|
1600
|
+
[watcher]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
|
1601
|
+
watcher->OnResourceDoesNotExist();
|
1602
|
+
},
|
1603
|
+
DEBUG_LOCATION);
|
1604
|
+
} else if (resource_state.meta.client_status ==
|
1605
|
+
XdsApi::ResourceMetadata::NACKED) {
|
1606
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1607
|
+
gpr_log(
|
1608
|
+
GPR_INFO,
|
1609
|
+
"[xds_client %p] reporting cached validation failure for %s: %s",
|
1610
|
+
this, std::string(name).c_str(),
|
1611
|
+
resource_state.meta.failed_details.c_str());
|
1612
|
+
}
|
1613
|
+
std::string details = resource_state.meta.failed_details;
|
1614
|
+
const auto* node = bootstrap_->node();
|
1615
|
+
if (node != nullptr) {
|
1616
|
+
absl::StrAppend(&details, " (node ID:", bootstrap_->node()->id(), ")");
|
1617
|
+
}
|
1618
|
+
work_serializer_.Schedule(
|
1619
|
+
[watcher, details = std::move(details)]()
|
1620
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
|
1621
|
+
watcher->OnError(absl::UnavailableError(
|
1622
|
+
absl::StrCat("invalid resource: ", details)));
|
1623
|
+
},
|
1624
|
+
DEBUG_LOCATION);
|
1957
1625
|
}
|
1958
1626
|
// If the authority doesn't yet have a channel, set it, creating it if
|
1959
1627
|
// needed.
|
1960
1628
|
if (authority_state.channel_state == nullptr) {
|
1961
1629
|
authority_state.channel_state =
|
1962
|
-
GetOrCreateChannelStateLocked(*xds_server);
|
1630
|
+
GetOrCreateChannelStateLocked(*xds_server, "start watch");
|
1631
|
+
}
|
1632
|
+
absl::Status channel_status = authority_state.channel_state->status();
|
1633
|
+
if (!channel_status.ok()) {
|
1634
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1635
|
+
gpr_log(GPR_INFO,
|
1636
|
+
"[xds_client %p] returning cached channel error for %s: %s",
|
1637
|
+
this, std::string(name).c_str(),
|
1638
|
+
channel_status.ToString().c_str());
|
1639
|
+
}
|
1640
|
+
work_serializer_.Schedule(
|
1641
|
+
[watcher = std::move(watcher), status = std::move(channel_status)]()
|
1642
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) mutable {
|
1643
|
+
watcher->OnError(std::move(status));
|
1644
|
+
},
|
1645
|
+
DEBUG_LOCATION);
|
1963
1646
|
}
|
1964
1647
|
authority_state.channel_state->SubscribeLocked(type, *resource_name);
|
1965
1648
|
}
|
@@ -1972,12 +1655,11 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
|
|
1972
1655
|
bool delay_unsubscription) {
|
1973
1656
|
auto resource_name = ParseXdsResourceName(name, type);
|
1974
1657
|
MutexLock lock(&mu_);
|
1975
|
-
|
1976
|
-
|
1977
|
-
|
1978
|
-
}
|
1979
|
-
if (shutting_down_) return;
|
1658
|
+
// We cannot be sure whether the watcher is in invalid_watchers_ or in
|
1659
|
+
// authority_state_map_, so we check both, just to be safe.
|
1660
|
+
invalid_watchers_.erase(watcher);
|
1980
1661
|
// Find authority.
|
1662
|
+
if (!resource_name.ok()) return;
|
1981
1663
|
auto authority_it = authority_state_map_.find(resource_name->authority);
|
1982
1664
|
if (authority_it == authority_state_map_.end()) return;
|
1983
1665
|
AuthorityState& authority_state = authority_it->second;
|
@@ -1993,6 +1675,13 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
|
|
1993
1675
|
resource_state.watchers.erase(watcher);
|
1994
1676
|
// Clean up empty map entries, if any.
|
1995
1677
|
if (resource_state.watchers.empty()) {
|
1678
|
+
if (resource_state.ignored_deletion) {
|
1679
|
+
gpr_log(GPR_INFO,
|
1680
|
+
"[xds_client %p] unsubscribing from a resource for which we "
|
1681
|
+
"previously ignored a deletion: type %s name %s",
|
1682
|
+
this, std::string(type->type_url()).c_str(),
|
1683
|
+
std::string(name).c_str());
|
1684
|
+
}
|
1996
1685
|
authority_state.channel_state->UnsubscribeLocked(type, *resource_name,
|
1997
1686
|
delay_unsubscription);
|
1998
1687
|
type_map.erase(resource_it);
|
@@ -2013,24 +1702,22 @@ void XdsClient::MaybeRegisterResourceTypeLocked(
|
|
2013
1702
|
return;
|
2014
1703
|
}
|
2015
1704
|
resource_types_.emplace(resource_type->type_url(), resource_type);
|
2016
|
-
|
2017
|
-
resource_type->InitUpbSymtab(symtab_.ptr());
|
1705
|
+
resource_type->InitUpbSymtab(this, symtab_.ptr());
|
2018
1706
|
}
|
2019
1707
|
|
2020
1708
|
const XdsResourceType* XdsClient::GetResourceTypeLocked(
|
2021
1709
|
absl::string_view resource_type) {
|
2022
1710
|
auto it = resource_types_.find(resource_type);
|
2023
1711
|
if (it != resource_types_.end()) return it->second;
|
2024
|
-
auto it2 = v2_resource_types_.find(resource_type);
|
2025
|
-
if (it2 != v2_resource_types_.end()) return it2->second;
|
2026
1712
|
return nullptr;
|
2027
1713
|
}
|
2028
1714
|
|
2029
1715
|
absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
|
2030
1716
|
absl::string_view name, const XdsResourceType* type) {
|
2031
1717
|
// Old-style names use the empty string for authority.
|
2032
|
-
// authority is prefixed with "old:" to indicate that it's an old-style
|
2033
|
-
|
1718
|
+
// authority is prefixed with "old:" to indicate that it's an old-style
|
1719
|
+
// name.
|
1720
|
+
if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
|
2034
1721
|
return XdsResourceName{"old:", {std::string(name), {}}};
|
2035
1722
|
}
|
2036
1723
|
// New style name. Parse URI.
|
@@ -2039,7 +1726,7 @@ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
|
|
2039
1726
|
// Split the resource type off of the path to get the id.
|
2040
1727
|
std::pair<absl::string_view, absl::string_view> path_parts = absl::StrSplit(
|
2041
1728
|
absl::StripPrefix(uri->path(), "/"), absl::MaxSplits('/', 1));
|
2042
|
-
if (
|
1729
|
+
if (type->type_url() != path_parts.first) {
|
2043
1730
|
return absl::InvalidArgumentError(
|
2044
1731
|
"xdstp URI path must indicate valid xDS resource type");
|
2045
1732
|
}
|
@@ -2071,40 +1758,45 @@ std::string XdsClient::ConstructFullXdsResourceName(
|
|
2071
1758
|
RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
|
2072
1759
|
const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
|
2073
1760
|
absl::string_view eds_service_name) {
|
2074
|
-
|
1761
|
+
const auto* server = bootstrap_->FindXdsServer(xds_server);
|
1762
|
+
if (server == nullptr) return nullptr;
|
2075
1763
|
auto key =
|
2076
1764
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2077
|
-
MutexLock lock(&mu_);
|
2078
|
-
// We jump through some hoops here to make sure that the const
|
2079
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2080
|
-
// stored in the XdsClusterDropStats object point to the
|
2081
|
-
// XdsBootstrap::XdsServer and strings
|
2082
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2083
|
-
auto server_it =
|
2084
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2085
|
-
if (server_it->second.channel_state == nullptr) {
|
2086
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2087
|
-
}
|
2088
|
-
auto load_report_it = server_it->second.load_report_map
|
2089
|
-
.emplace(std::move(key), LoadReportState())
|
2090
|
-
.first;
|
2091
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2092
1765
|
RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
|
2093
|
-
|
2094
|
-
|
2095
|
-
|
2096
|
-
|
1766
|
+
{
|
1767
|
+
MutexLock lock(&mu_);
|
1768
|
+
// We jump through some hoops here to make sure that the const
|
1769
|
+
// XdsBootstrap::XdsServer& and absl::string_views
|
1770
|
+
// stored in the XdsClusterDropStats object point to the
|
1771
|
+
// XdsBootstrap::XdsServer and strings
|
1772
|
+
// in the load_report_map_ key, so that they have the same lifetime.
|
1773
|
+
auto server_it =
|
1774
|
+
xds_load_report_server_map_.emplace(server, LoadReportServer()).first;
|
1775
|
+
if (server_it->second.channel_state == nullptr) {
|
1776
|
+
server_it->second.channel_state = GetOrCreateChannelStateLocked(
|
1777
|
+
*server, "load report map (drop stats)");
|
1778
|
+
}
|
1779
|
+
auto load_report_it = server_it->second.load_report_map
|
1780
|
+
.emplace(std::move(key), LoadReportState())
|
1781
|
+
.first;
|
1782
|
+
LoadReportState& load_report_state = load_report_it->second;
|
2097
1783
|
if (load_report_state.drop_stats != nullptr) {
|
2098
|
-
load_report_state.
|
2099
|
-
|
1784
|
+
cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
|
1785
|
+
}
|
1786
|
+
if (cluster_drop_stats == nullptr) {
|
1787
|
+
if (load_report_state.drop_stats != nullptr) {
|
1788
|
+
load_report_state.deleted_drop_stats +=
|
1789
|
+
load_report_state.drop_stats->GetSnapshotAndReset();
|
1790
|
+
}
|
1791
|
+
cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
|
1792
|
+
Ref(DEBUG_LOCATION, "DropStats"), *server,
|
1793
|
+
load_report_it->first.first /*cluster_name*/,
|
1794
|
+
load_report_it->first.second /*eds_service_name*/);
|
1795
|
+
load_report_state.drop_stats = cluster_drop_stats.get();
|
2100
1796
|
}
|
2101
|
-
|
2102
|
-
Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
|
2103
|
-
load_report_it->first.first /*cluster_name*/,
|
2104
|
-
load_report_it->first.second /*eds_service_name*/);
|
2105
|
-
load_report_state.drop_stats = cluster_drop_stats.get();
|
1797
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2106
1798
|
}
|
2107
|
-
|
1799
|
+
work_serializer_.DrainQueue();
|
2108
1800
|
return cluster_drop_stats;
|
2109
1801
|
}
|
2110
1802
|
|
@@ -2112,8 +1804,10 @@ void XdsClient::RemoveClusterDropStats(
|
|
2112
1804
|
const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
|
2113
1805
|
absl::string_view eds_service_name,
|
2114
1806
|
XdsClusterDropStats* cluster_drop_stats) {
|
1807
|
+
const auto* server = bootstrap_->FindXdsServer(xds_server);
|
1808
|
+
if (server == nullptr) return;
|
2115
1809
|
MutexLock lock(&mu_);
|
2116
|
-
auto server_it = xds_load_report_server_map_.find(
|
1810
|
+
auto server_it = xds_load_report_server_map_.find(server);
|
2117
1811
|
if (server_it == xds_load_report_server_map_.end()) return;
|
2118
1812
|
auto load_report_it = server_it->second.load_report_map.find(
|
2119
1813
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
|
@@ -2132,42 +1826,48 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
|
|
2132
1826
|
const XdsBootstrap::XdsServer& xds_server, absl::string_view cluster_name,
|
2133
1827
|
absl::string_view eds_service_name,
|
2134
1828
|
RefCountedPtr<XdsLocalityName> locality) {
|
2135
|
-
|
1829
|
+
const auto* server = bootstrap_->FindXdsServer(xds_server);
|
1830
|
+
if (server == nullptr) return nullptr;
|
2136
1831
|
auto key =
|
2137
1832
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2138
|
-
MutexLock lock(&mu_);
|
2139
|
-
// We jump through some hoops here to make sure that the const
|
2140
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2141
|
-
// stored in the XdsClusterDropStats object point to the
|
2142
|
-
// XdsBootstrap::XdsServer and strings
|
2143
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2144
|
-
auto server_it =
|
2145
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2146
|
-
if (server_it->second.channel_state == nullptr) {
|
2147
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2148
|
-
}
|
2149
|
-
auto load_report_it = server_it->second.load_report_map
|
2150
|
-
.emplace(std::move(key), LoadReportState())
|
2151
|
-
.first;
|
2152
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2153
|
-
LoadReportState::LocalityState& locality_state =
|
2154
|
-
load_report_state.locality_stats[locality];
|
2155
1833
|
RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2159
|
-
|
1834
|
+
{
|
1835
|
+
MutexLock lock(&mu_);
|
1836
|
+
// We jump through some hoops here to make sure that the const
|
1837
|
+
// XdsBootstrap::XdsServer& and absl::string_views
|
1838
|
+
// stored in the XdsClusterDropStats object point to the
|
1839
|
+
// XdsBootstrap::XdsServer and strings
|
1840
|
+
// in the load_report_map_ key, so that they have the same lifetime.
|
1841
|
+
auto server_it =
|
1842
|
+
xds_load_report_server_map_.emplace(server, LoadReportServer()).first;
|
1843
|
+
if (server_it->second.channel_state == nullptr) {
|
1844
|
+
server_it->second.channel_state = GetOrCreateChannelStateLocked(
|
1845
|
+
*server, "load report map (locality stats)");
|
1846
|
+
}
|
1847
|
+
auto load_report_it = server_it->second.load_report_map
|
1848
|
+
.emplace(std::move(key), LoadReportState())
|
1849
|
+
.first;
|
1850
|
+
LoadReportState& load_report_state = load_report_it->second;
|
1851
|
+
LoadReportState::LocalityState& locality_state =
|
1852
|
+
load_report_state.locality_stats[locality];
|
2160
1853
|
if (locality_state.locality_stats != nullptr) {
|
2161
|
-
locality_state.
|
2162
|
-
|
1854
|
+
cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
|
1855
|
+
}
|
1856
|
+
if (cluster_locality_stats == nullptr) {
|
1857
|
+
if (locality_state.locality_stats != nullptr) {
|
1858
|
+
locality_state.deleted_locality_stats +=
|
1859
|
+
locality_state.locality_stats->GetSnapshotAndReset();
|
1860
|
+
}
|
1861
|
+
cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
|
1862
|
+
Ref(DEBUG_LOCATION, "LocalityStats"), *server,
|
1863
|
+
load_report_it->first.first /*cluster_name*/,
|
1864
|
+
load_report_it->first.second /*eds_service_name*/,
|
1865
|
+
std::move(locality));
|
1866
|
+
locality_state.locality_stats = cluster_locality_stats.get();
|
2163
1867
|
}
|
2164
|
-
|
2165
|
-
Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
|
2166
|
-
load_report_it->first.first /*cluster_name*/,
|
2167
|
-
load_report_it->first.second /*eds_service_name*/, std::move(locality));
|
2168
|
-
locality_state.locality_stats = cluster_locality_stats.get();
|
1868
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2169
1869
|
}
|
2170
|
-
|
1870
|
+
work_serializer_.DrainQueue();
|
2171
1871
|
return cluster_locality_stats;
|
2172
1872
|
}
|
2173
1873
|
|
@@ -2176,8 +1876,10 @@ void XdsClient::RemoveClusterLocalityStats(
|
|
2176
1876
|
absl::string_view eds_service_name,
|
2177
1877
|
const RefCountedPtr<XdsLocalityName>& locality,
|
2178
1878
|
XdsClusterLocalityStats* cluster_locality_stats) {
|
1879
|
+
const auto* server = bootstrap_->FindXdsServer(xds_server);
|
1880
|
+
if (server == nullptr) return;
|
2179
1881
|
MutexLock lock(&mu_);
|
2180
|
-
auto server_it = xds_load_report_server_map_.find(
|
1882
|
+
auto server_it = xds_load_report_server_map_.find(server);
|
2181
1883
|
if (server_it == xds_load_report_server_map_.end()) return;
|
2182
1884
|
auto load_report_it = server_it->second.load_report_map.find(
|
2183
1885
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
|
@@ -2198,29 +1900,38 @@ void XdsClient::RemoveClusterLocalityStats(
|
|
2198
1900
|
void XdsClient::ResetBackoff() {
|
2199
1901
|
MutexLock lock(&mu_);
|
2200
1902
|
for (auto& p : xds_server_channel_map_) {
|
2201
|
-
|
1903
|
+
p.second->ResetBackoff();
|
2202
1904
|
}
|
2203
1905
|
}
|
2204
1906
|
|
2205
|
-
void XdsClient::
|
2206
|
-
|
2207
|
-
|
2208
|
-
|
2209
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
}
|
1907
|
+
void XdsClient::NotifyWatchersOnErrorLocked(
|
1908
|
+
const std::map<ResourceWatcherInterface*,
|
1909
|
+
RefCountedPtr<ResourceWatcherInterface>>& watchers,
|
1910
|
+
absl::Status status) {
|
1911
|
+
const auto* node = bootstrap_->node();
|
1912
|
+
if (node != nullptr) {
|
1913
|
+
status = absl::Status(
|
1914
|
+
status.code(),
|
1915
|
+
absl::StrCat(status.message(), " (node ID:", node->id(), ")"));
|
2215
1916
|
}
|
2216
1917
|
work_serializer_.Schedule(
|
2217
|
-
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
2221
|
-
|
1918
|
+
[watchers, status = std::move(status)]()
|
1919
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
|
1920
|
+
for (const auto& p : watchers) {
|
1921
|
+
p.first->OnError(status);
|
1922
|
+
}
|
1923
|
+
},
|
1924
|
+
DEBUG_LOCATION);
|
1925
|
+
}
|
1926
|
+
|
1927
|
+
void XdsClient::NotifyWatchersOnResourceDoesNotExist(
|
1928
|
+
const std::map<ResourceWatcherInterface*,
|
1929
|
+
RefCountedPtr<ResourceWatcherInterface>>& watchers) {
|
1930
|
+
work_serializer_.Schedule(
|
1931
|
+
[watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
|
1932
|
+
for (const auto& p : watchers) {
|
1933
|
+
p.first->OnResourceDoesNotExist();
|
2222
1934
|
}
|
2223
|
-
GRPC_ERROR_UNREF(error);
|
2224
1935
|
},
|
2225
1936
|
DEBUG_LOCATION);
|
2226
1937
|
}
|
@@ -2232,7 +1943,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
|
|
2232
1943
|
gpr_log(GPR_INFO, "[xds_client %p] start building load report", this);
|
2233
1944
|
}
|
2234
1945
|
XdsApi::ClusterLoadReportMap snapshot_map;
|
2235
|
-
auto server_it = xds_load_report_server_map_.find(xds_server);
|
1946
|
+
auto server_it = xds_load_report_server_map_.find(&xds_server);
|
2236
1947
|
if (server_it == xds_load_report_server_map_.end()) return snapshot_map;
|
2237
1948
|
auto& load_report_map = server_it->second.load_report_map;
|
2238
1949
|
for (auto load_report_it = load_report_map.begin();
|
@@ -2291,7 +2002,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
|
|
2291
2002
|
}
|
2292
2003
|
}
|
2293
2004
|
// Compute load report interval.
|
2294
|
-
const Timestamp now =
|
2005
|
+
const Timestamp now = Timestamp::Now();
|
2295
2006
|
snapshot.load_report_interval = now - load_report.last_report_time;
|
2296
2007
|
load_report.last_report_time = now;
|
2297
2008
|
// Record snapshot.
|
@@ -2331,190 +2042,4 @@ std::string XdsClient::DumpClientConfigBinary() {
|
|
2331
2042
|
return api_.AssembleClientConfig(resource_type_metadata_map);
|
2332
2043
|
}
|
2333
2044
|
|
2334
|
-
//
|
2335
|
-
// accessors for global state
|
2336
|
-
//
|
2337
|
-
|
2338
|
-
void XdsClientGlobalInit() {
|
2339
|
-
g_mu = new Mutex;
|
2340
|
-
XdsHttpFilterRegistry::Init();
|
2341
|
-
}
|
2342
|
-
|
2343
|
-
// TODO(roth): Find a better way to clear the fallback config that does
|
2344
|
-
// not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
|
2345
|
-
void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
2346
|
-
gpr_free(g_fallback_bootstrap_config);
|
2347
|
-
g_fallback_bootstrap_config = nullptr;
|
2348
|
-
delete g_mu;
|
2349
|
-
g_mu = nullptr;
|
2350
|
-
XdsHttpFilterRegistry::Shutdown();
|
2351
|
-
}
|
2352
|
-
|
2353
|
-
namespace {
|
2354
|
-
|
2355
|
-
std::string GetBootstrapContents(const char* fallback_config,
|
2356
|
-
grpc_error_handle* error) {
|
2357
|
-
// First, try GRPC_XDS_BOOTSTRAP env var.
|
2358
|
-
UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
|
2359
|
-
if (path != nullptr) {
|
2360
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2361
|
-
gpr_log(GPR_INFO,
|
2362
|
-
"Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
|
2363
|
-
"environment variable: %s",
|
2364
|
-
path.get());
|
2365
|
-
}
|
2366
|
-
grpc_slice contents;
|
2367
|
-
*error =
|
2368
|
-
grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
|
2369
|
-
if (*error != GRPC_ERROR_NONE) return "";
|
2370
|
-
std::string contents_str(StringViewFromSlice(contents));
|
2371
|
-
grpc_slice_unref_internal(contents);
|
2372
|
-
return contents_str;
|
2373
|
-
}
|
2374
|
-
// Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
|
2375
|
-
UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
|
2376
|
-
if (env_config != nullptr) {
|
2377
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2378
|
-
gpr_log(GPR_INFO,
|
2379
|
-
"Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
|
2380
|
-
"environment variable");
|
2381
|
-
}
|
2382
|
-
return env_config.get();
|
2383
|
-
}
|
2384
|
-
// Finally, try fallback config.
|
2385
|
-
if (fallback_config != nullptr) {
|
2386
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2387
|
-
gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
|
2388
|
-
}
|
2389
|
-
return fallback_config;
|
2390
|
-
}
|
2391
|
-
// No bootstrap config found.
|
2392
|
-
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
2393
|
-
"Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
|
2394
|
-
"not defined");
|
2395
|
-
return "";
|
2396
|
-
}
|
2397
|
-
|
2398
|
-
} // namespace
|
2399
|
-
|
2400
|
-
RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
|
2401
|
-
grpc_error_handle* error) {
|
2402
|
-
RefCountedPtr<XdsClient> xds_client;
|
2403
|
-
// If getting bootstrap from channel args, create a local XdsClient
|
2404
|
-
// instance for the channel or server instead of using the global instance.
|
2405
|
-
const char* bootstrap_config = grpc_channel_args_find_string(
|
2406
|
-
args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
|
2407
|
-
if (bootstrap_config != nullptr) {
|
2408
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2409
|
-
XdsBootstrap::Create(bootstrap_config, error);
|
2410
|
-
if (*error == GRPC_ERROR_NONE) {
|
2411
|
-
grpc_channel_args* xds_channel_args =
|
2412
|
-
grpc_channel_args_find_pointer<grpc_channel_args>(
|
2413
|
-
args,
|
2414
|
-
GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
|
2415
|
-
return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
|
2416
|
-
}
|
2417
|
-
return nullptr;
|
2418
|
-
}
|
2419
|
-
// Otherwise, use the global instance.
|
2420
|
-
{
|
2421
|
-
MutexLock lock(g_mu);
|
2422
|
-
if (g_xds_client != nullptr) {
|
2423
|
-
auto xds_client = g_xds_client->RefIfNonZero();
|
2424
|
-
if (xds_client != nullptr) return xds_client;
|
2425
|
-
}
|
2426
|
-
// Find bootstrap contents.
|
2427
|
-
std::string bootstrap_contents =
|
2428
|
-
GetBootstrapContents(g_fallback_bootstrap_config, error);
|
2429
|
-
if (*error != GRPC_ERROR_NONE) return nullptr;
|
2430
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2431
|
-
gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
|
2432
|
-
bootstrap_contents.c_str());
|
2433
|
-
}
|
2434
|
-
// Parse bootstrap.
|
2435
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2436
|
-
XdsBootstrap::Create(bootstrap_contents, error);
|
2437
|
-
if (*error != GRPC_ERROR_NONE) return nullptr;
|
2438
|
-
// Instantiate XdsClient.
|
2439
|
-
xds_client =
|
2440
|
-
MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
|
2441
|
-
g_xds_client = xds_client.get();
|
2442
|
-
}
|
2443
|
-
return xds_client;
|
2444
|
-
}
|
2445
|
-
|
2446
|
-
namespace internal {
|
2447
|
-
|
2448
|
-
void SetXdsChannelArgsForTest(grpc_channel_args* args) {
|
2449
|
-
MutexLock lock(g_mu);
|
2450
|
-
g_channel_args = args;
|
2451
|
-
}
|
2452
|
-
|
2453
|
-
void UnsetGlobalXdsClientForTest() {
|
2454
|
-
MutexLock lock(g_mu);
|
2455
|
-
g_xds_client = nullptr;
|
2456
|
-
}
|
2457
|
-
|
2458
|
-
void SetXdsFallbackBootstrapConfig(const char* config) {
|
2459
|
-
MutexLock lock(g_mu);
|
2460
|
-
gpr_free(g_fallback_bootstrap_config);
|
2461
|
-
g_fallback_bootstrap_config = gpr_strdup(config);
|
2462
|
-
}
|
2463
|
-
|
2464
|
-
} // namespace internal
|
2465
|
-
|
2466
|
-
//
|
2467
|
-
// embedding XdsClient in channel args
|
2468
|
-
//
|
2469
|
-
|
2470
|
-
#define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
|
2471
|
-
|
2472
|
-
namespace {
|
2473
|
-
|
2474
|
-
void* XdsClientArgCopy(void* p) {
|
2475
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2476
|
-
xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
|
2477
|
-
return p;
|
2478
|
-
}
|
2479
|
-
|
2480
|
-
void XdsClientArgDestroy(void* p) {
|
2481
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2482
|
-
xds_client->Unref(DEBUG_LOCATION, "channel arg");
|
2483
|
-
}
|
2484
|
-
|
2485
|
-
int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
|
2486
|
-
|
2487
|
-
const grpc_arg_pointer_vtable kXdsClientArgVtable = {
|
2488
|
-
XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
|
2489
|
-
|
2490
|
-
} // namespace
|
2491
|
-
|
2492
|
-
grpc_arg XdsClient::MakeChannelArg() const {
|
2493
|
-
return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
|
2494
|
-
const_cast<XdsClient*>(this),
|
2495
|
-
&kXdsClientArgVtable);
|
2496
|
-
}
|
2497
|
-
|
2498
|
-
RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
|
2499
|
-
const grpc_channel_args& args) {
|
2500
|
-
XdsClient* xds_client =
|
2501
|
-
grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
|
2502
|
-
if (xds_client == nullptr) return nullptr;
|
2503
|
-
return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
|
2504
|
-
}
|
2505
|
-
|
2506
2045
|
} // namespace grpc_core
|
2507
|
-
|
2508
|
-
// The returned bytes may contain NULL(0), so we can't use c-string.
|
2509
|
-
grpc_slice grpc_dump_xds_configs() {
|
2510
|
-
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
2511
|
-
grpc_core::ExecCtx exec_ctx;
|
2512
|
-
grpc_error_handle error = GRPC_ERROR_NONE;
|
2513
|
-
auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
|
2514
|
-
if (error != GRPC_ERROR_NONE) {
|
2515
|
-
// If we isn't using xDS, just return an empty string.
|
2516
|
-
GRPC_ERROR_UNREF(error);
|
2517
|
-
return grpc_empty_slice();
|
2518
|
-
}
|
2519
|
-
return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
|
2520
|
-
}
|