grpc-z 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/Makefile +23896 -0
- data/etc/roots.pem +4475 -0
- data/include/grpc/byte_buffer.h +27 -0
- data/include/grpc/byte_buffer_reader.h +26 -0
- data/include/grpc/census.h +40 -0
- data/include/grpc/compression.h +75 -0
- data/include/grpc/fork.h +26 -0
- data/include/grpc/grpc.h +469 -0
- data/include/grpc/grpc_cronet.h +38 -0
- data/include/grpc/grpc_posix.h +67 -0
- data/include/grpc/grpc_security.h +495 -0
- data/include/grpc/grpc_security_constants.h +107 -0
- data/include/grpc/impl/codegen/atm.h +95 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +91 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +83 -0
- data/include/grpc/impl/codegen/atm_windows.h +126 -0
- data/include/grpc/impl/codegen/byte_buffer.h +88 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +42 -0
- data/include/grpc/impl/codegen/compression_types.h +107 -0
- data/include/grpc/impl/codegen/connectivity_state.h +44 -0
- data/include/grpc/impl/codegen/fork.h +48 -0
- data/include/grpc/impl/codegen/gpr_slice.h +69 -0
- data/include/grpc/impl/codegen/gpr_types.h +59 -0
- data/include/grpc/impl/codegen/grpc_types.h +669 -0
- data/include/grpc/impl/codegen/port_platform.h +507 -0
- data/include/grpc/impl/codegen/propagation_bits.h +52 -0
- data/include/grpc/impl/codegen/slice.h +147 -0
- data/include/grpc/impl/codegen/status.h +153 -0
- data/include/grpc/impl/codegen/sync.h +63 -0
- data/include/grpc/impl/codegen/sync_custom.h +38 -0
- data/include/grpc/impl/codegen/sync_generic.h +48 -0
- data/include/grpc/impl/codegen/sync_posix.h +34 -0
- data/include/grpc/impl/codegen/sync_windows.h +36 -0
- data/include/grpc/load_reporting.h +48 -0
- data/include/grpc/module.modulemap +74 -0
- data/include/grpc/slice.h +172 -0
- data/include/grpc/slice_buffer.h +84 -0
- data/include/grpc/status.h +26 -0
- data/include/grpc/support/alloc.h +68 -0
- data/include/grpc/support/atm.h +26 -0
- data/include/grpc/support/atm_gcc_atomic.h +26 -0
- data/include/grpc/support/atm_gcc_sync.h +26 -0
- data/include/grpc/support/atm_windows.h +26 -0
- data/include/grpc/support/cpu.h +44 -0
- data/include/grpc/support/log.h +104 -0
- data/include/grpc/support/log_windows.h +38 -0
- data/include/grpc/support/port_platform.h +24 -0
- data/include/grpc/support/string_util.h +49 -0
- data/include/grpc/support/sync.h +298 -0
- data/include/grpc/support/sync_custom.h +26 -0
- data/include/grpc/support/sync_generic.h +26 -0
- data/include/grpc/support/sync_posix.h +26 -0
- data/include/grpc/support/sync_windows.h +26 -0
- data/include/grpc/support/thd_id.h +44 -0
- data/include/grpc/support/time.h +92 -0
- data/include/grpc/support/workaround_list.h +31 -0
- data/src/boringssl/err_data.c +1348 -0
- data/src/core/ext/census/grpc_context.cc +38 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +174 -0
- data/src/core/ext/filters/client_channel/backup_poller.h +35 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +248 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +3209 -0
- data/src/core/ext/filters/client_channel/client_channel.h +57 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +67 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +74 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +62 -0
- data/src/core/ext/filters/client_channel/connector.cc +41 -0
- data/src/core/ext/filters/client_channel/connector.h +73 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +370 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +34 -0
- data/src/core/ext/filters/client_channel/http_proxy.cc +195 -0
- data/src/core/ext/filters/client_channel/http_proxy.h +24 -0
- data/src/core/ext/filters/client_channel/lb_policy.cc +59 -0
- data/src/core/ext/filters/client_channel/lb_policy.h +201 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +138 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +29 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1906 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +36 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +108 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +152 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +67 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +304 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +88 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +102 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +190 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +591 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +687 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +253 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +136 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.cc +155 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +127 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +97 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +54 -0
- data/src/core/ext/filters/client_channel/method_params.cc +178 -0
- data/src/core/ext/filters/client_channel/method_params.h +74 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +192 -0
- data/src/core/ext/filters/client_channel/parse_address.h +50 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.cc +48 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +74 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +122 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +44 -0
- data/src/core/ext/filters/client_channel/resolver.cc +35 -0
- data/src/core/ext/filters/client_channel/resolver.h +134 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +493 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +53 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +351 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +593 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +74 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +59 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +340 -0
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +297 -0
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +83 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +214 -0
- data/src/core/ext/filters/client_channel/resolver_factory.h +71 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +178 -0
- data/src/core/ext/filters/client_channel/resolver_registry.h +83 -0
- data/src/core/ext/filters/client_channel/retry_throttle.cc +191 -0
- data/src/core/ext/filters/client_channel/retry_throttle.h +77 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +815 -0
- data/src/core/ext/filters/client_channel/subchannel.h +183 -0
- data/src/core/ext/filters/client_channel/subchannel_index.cc +254 -0
- data/src/core/ext/filters/client_channel/subchannel_index.h +79 -0
- data/src/core/ext/filters/client_channel/uri_parser.cc +314 -0
- data/src/core/ext/filters/client_channel/uri_parser.h +50 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +386 -0
- data/src/core/ext/filters/deadline/deadline_filter.h +93 -0
- data/src/core/ext/filters/http/client/http_client_filter.cc +558 -0
- data/src/core/ext/filters/http/client/http_client_filter.h +31 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +156 -0
- data/src/core/ext/filters/http/client_authority_filter.h +34 -0
- data/src/core/ext/filters/http/http_filters_plugin.cc +89 -0
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +499 -0
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +53 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +434 -0
- data/src/core/ext/filters/http/server/http_server_filter.h +29 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +222 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +30 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +71 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +61 -0
- data/src/core/ext/filters/max_age/max_age_filter.cc +543 -0
- data/src/core/ext/filters/max_age/max_age_filter.h +26 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +324 -0
- data/src/core/ext/filters/message_size/message_size_filter.h +26 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +208 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +27 -0
- data/src/core/ext/filters/workarounds/workaround_utils.cc +53 -0
- data/src/core/ext/filters/workarounds/workaround_utils.h +39 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +44 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +36 -0
- data/src/core/ext/transport/chttp2/client/authority.cc +42 -0
- data/src/core/ext/transport/chttp2/client/authority.h +36 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +229 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +110 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +79 -0
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +230 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +353 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +45 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +74 -0
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +89 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +249 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +56 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +231 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +41 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +35 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3102 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +45 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +405 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +482 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +47 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +314 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.h +84 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +186 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +62 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +131 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +45 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +112 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +43 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +238 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +60 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +122 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +45 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +699 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1680 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +109 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +368 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +95 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +62 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +62 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.cc +92 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +33 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +73 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +49 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +799 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +745 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +216 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +167 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.h +68 -0
- data/src/core/ext/transport/chttp2/transport/varint.cc +56 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +60 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +641 -0
- data/src/core/ext/transport/inproc/inproc_plugin.cc +28 -0
- data/src/core/ext/transport/inproc/inproc_transport.cc +1240 -0
- data/src/core/ext/transport/inproc/inproc_transport.h +35 -0
- data/src/core/lib/avl/avl.cc +306 -0
- data/src/core/lib/avl/avl.h +94 -0
- data/src/core/lib/backoff/backoff.cc +78 -0
- data/src/core/lib/backoff/backoff.h +89 -0
- data/src/core/lib/channel/channel_args.cc +413 -0
- data/src/core/lib/channel/channel_args.h +127 -0
- data/src/core/lib/channel/channel_stack.cc +258 -0
- data/src/core/lib/channel/channel_stack.h +280 -0
- data/src/core/lib/channel/channel_stack_builder.cc +314 -0
- data/src/core/lib/channel/channel_stack_builder.h +160 -0
- data/src/core/lib/channel/channel_trace.cc +239 -0
- data/src/core/lib/channel/channel_trace.h +133 -0
- data/src/core/lib/channel/channel_trace_registry.cc +80 -0
- data/src/core/lib/channel/channel_trace_registry.h +43 -0
- data/src/core/lib/channel/connected_channel.cc +236 -0
- data/src/core/lib/channel/connected_channel.h +34 -0
- data/src/core/lib/channel/context.h +49 -0
- data/src/core/lib/channel/handshaker.cc +259 -0
- data/src/core/lib/channel/handshaker.h +166 -0
- data/src/core/lib/channel/handshaker_factory.cc +41 -0
- data/src/core/lib/channel/handshaker_factory.h +50 -0
- data/src/core/lib/channel/handshaker_registry.cc +97 -0
- data/src/core/lib/channel/handshaker_registry.h +48 -0
- data/src/core/lib/channel/status_util.cc +100 -0
- data/src/core/lib/channel/status_util.h +58 -0
- data/src/core/lib/compression/algorithm_metadata.h +61 -0
- data/src/core/lib/compression/compression.cc +174 -0
- data/src/core/lib/compression/compression_internal.cc +276 -0
- data/src/core/lib/compression/compression_internal.h +88 -0
- data/src/core/lib/compression/message_compress.cc +187 -0
- data/src/core/lib/compression/message_compress.h +40 -0
- data/src/core/lib/compression/stream_compression.cc +79 -0
- data/src/core/lib/compression/stream_compression.h +116 -0
- data/src/core/lib/compression/stream_compression_gzip.cc +230 -0
- data/src/core/lib/compression/stream_compression_gzip.h +28 -0
- data/src/core/lib/compression/stream_compression_identity.cc +94 -0
- data/src/core/lib/compression/stream_compression_identity.h +29 -0
- data/src/core/lib/debug/stats.cc +178 -0
- data/src/core/lib/debug/stats.h +61 -0
- data/src/core/lib/debug/stats_data.cc +682 -0
- data/src/core/lib/debug/stats_data.h +435 -0
- data/src/core/lib/debug/trace.cc +144 -0
- data/src/core/lib/debug/trace.h +104 -0
- data/src/core/lib/gpr/alloc.cc +99 -0
- data/src/core/lib/gpr/arena.cc +152 -0
- data/src/core/lib/gpr/arena.h +41 -0
- data/src/core/lib/gpr/atm.cc +35 -0
- data/src/core/lib/gpr/cpu_iphone.cc +36 -0
- data/src/core/lib/gpr/cpu_linux.cc +82 -0
- data/src/core/lib/gpr/cpu_posix.cc +81 -0
- data/src/core/lib/gpr/cpu_windows.cc +33 -0
- data/src/core/lib/gpr/env.h +43 -0
- data/src/core/lib/gpr/env_linux.cc +82 -0
- data/src/core/lib/gpr/env_posix.cc +47 -0
- data/src/core/lib/gpr/env_windows.cc +72 -0
- data/src/core/lib/gpr/fork.cc +78 -0
- data/src/core/lib/gpr/fork.h +35 -0
- data/src/core/lib/gpr/host_port.cc +98 -0
- data/src/core/lib/gpr/host_port.h +43 -0
- data/src/core/lib/gpr/log.cc +96 -0
- data/src/core/lib/gpr/log_android.cc +72 -0
- data/src/core/lib/gpr/log_linux.cc +93 -0
- data/src/core/lib/gpr/log_posix.cc +90 -0
- data/src/core/lib/gpr/log_windows.cc +97 -0
- data/src/core/lib/gpr/mpscq.cc +117 -0
- data/src/core/lib/gpr/mpscq.h +86 -0
- data/src/core/lib/gpr/murmur_hash.cc +80 -0
- data/src/core/lib/gpr/murmur_hash.h +29 -0
- data/src/core/lib/gpr/spinlock.h +46 -0
- data/src/core/lib/gpr/string.cc +319 -0
- data/src/core/lib/gpr/string.h +109 -0
- data/src/core/lib/gpr/string_posix.cc +72 -0
- data/src/core/lib/gpr/string_util_windows.cc +82 -0
- data/src/core/lib/gpr/string_windows.cc +69 -0
- data/src/core/lib/gpr/string_windows.h +32 -0
- data/src/core/lib/gpr/sync.cc +124 -0
- data/src/core/lib/gpr/sync_posix.cc +107 -0
- data/src/core/lib/gpr/sync_windows.cc +118 -0
- data/src/core/lib/gpr/time.cc +251 -0
- data/src/core/lib/gpr/time_posix.cc +167 -0
- data/src/core/lib/gpr/time_precise.cc +78 -0
- data/src/core/lib/gpr/time_precise.h +29 -0
- data/src/core/lib/gpr/time_windows.cc +98 -0
- data/src/core/lib/gpr/tls.h +68 -0
- data/src/core/lib/gpr/tls_gcc.h +52 -0
- data/src/core/lib/gpr/tls_msvc.h +52 -0
- data/src/core/lib/gpr/tls_pthread.cc +30 -0
- data/src/core/lib/gpr/tls_pthread.h +56 -0
- data/src/core/lib/gpr/tmpfile.h +32 -0
- data/src/core/lib/gpr/tmpfile_msys.cc +58 -0
- data/src/core/lib/gpr/tmpfile_posix.cc +70 -0
- data/src/core/lib/gpr/tmpfile_windows.cc +69 -0
- data/src/core/lib/gpr/useful.h +65 -0
- data/src/core/lib/gpr/wrap_memcpy.cc +42 -0
- data/src/core/lib/gprpp/abstract.h +34 -0
- data/src/core/lib/gprpp/atomic.h +30 -0
- data/src/core/lib/gprpp/atomic_with_atm.h +57 -0
- data/src/core/lib/gprpp/atomic_with_std.h +35 -0
- data/src/core/lib/gprpp/debug_location.h +52 -0
- data/src/core/lib/gprpp/inlined_vector.h +136 -0
- data/src/core/lib/gprpp/manual_constructor.h +213 -0
- data/src/core/lib/gprpp/memory.h +111 -0
- data/src/core/lib/gprpp/orphanable.h +199 -0
- data/src/core/lib/gprpp/ref_counted.h +169 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +112 -0
- data/src/core/lib/gprpp/thd.h +135 -0
- data/src/core/lib/gprpp/thd_posix.cc +209 -0
- data/src/core/lib/gprpp/thd_windows.cc +162 -0
- data/src/core/lib/http/format_request.cc +122 -0
- data/src/core/lib/http/format_request.h +34 -0
- data/src/core/lib/http/httpcli.cc +303 -0
- data/src/core/lib/http/httpcli.h +127 -0
- data/src/core/lib/http/httpcli_security_connector.cc +202 -0
- data/src/core/lib/http/parser.cc +371 -0
- data/src/core/lib/http/parser.h +113 -0
- data/src/core/lib/iomgr/block_annotate.h +57 -0
- data/src/core/lib/iomgr/call_combiner.cc +212 -0
- data/src/core/lib/iomgr/call_combiner.h +112 -0
- data/src/core/lib/iomgr/closure.h +351 -0
- data/src/core/lib/iomgr/combiner.cc +358 -0
- data/src/core/lib/iomgr/combiner.h +66 -0
- data/src/core/lib/iomgr/endpoint.cc +63 -0
- data/src/core/lib/iomgr/endpoint.h +98 -0
- data/src/core/lib/iomgr/endpoint_pair.h +34 -0
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +73 -0
- data/src/core/lib/iomgr/endpoint_pair_uv.cc +40 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +87 -0
- data/src/core/lib/iomgr/error.cc +793 -0
- data/src/core/lib/iomgr/error.h +207 -0
- data/src/core/lib/iomgr/error_internal.h +63 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +1248 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.h +31 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +1494 -0
- data/src/core/lib/iomgr/ev_epollex_linux.h +30 -0
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +1735 -0
- data/src/core/lib/iomgr/ev_epollsig_linux.h +35 -0
- data/src/core/lib/iomgr/ev_poll_posix.cc +1758 -0
- data/src/core/lib/iomgr/ev_poll_posix.h +29 -0
- data/src/core/lib/iomgr/ev_posix.cc +330 -0
- data/src/core/lib/iomgr/ev_posix.h +145 -0
- data/src/core/lib/iomgr/ev_windows.cc +30 -0
- data/src/core/lib/iomgr/exec_ctx.cc +147 -0
- data/src/core/lib/iomgr/exec_ctx.h +210 -0
- data/src/core/lib/iomgr/executor.cc +301 -0
- data/src/core/lib/iomgr/executor.h +50 -0
- data/src/core/lib/iomgr/fork_posix.cc +89 -0
- data/src/core/lib/iomgr/fork_windows.cc +41 -0
- data/src/core/lib/iomgr/gethostname.h +26 -0
- data/src/core/lib/iomgr/gethostname_fallback.cc +30 -0
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +40 -0
- data/src/core/lib/iomgr/gethostname_sysconf.cc +40 -0
- data/src/core/lib/iomgr/iocp_windows.cc +152 -0
- data/src/core/lib/iomgr/iocp_windows.h +48 -0
- data/src/core/lib/iomgr/iomgr.cc +178 -0
- data/src/core/lib/iomgr/iomgr.h +36 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +63 -0
- data/src/core/lib/iomgr/iomgr_custom.h +47 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +43 -0
- data/src/core/lib/iomgr/iomgr_internal.h +57 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +67 -0
- data/src/core/lib/iomgr/iomgr_posix.h +26 -0
- data/src/core/lib/iomgr/iomgr_uv.cc +40 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +87 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +104 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.h +36 -0
- data/src/core/lib/iomgr/load_file.cc +80 -0
- data/src/core/lib/iomgr/load_file.h +35 -0
- data/src/core/lib/iomgr/lockfree_event.cc +250 -0
- data/src/core/lib/iomgr/lockfree_event.h +72 -0
- data/src/core/lib/iomgr/nameser.h +106 -0
- data/src/core/lib/iomgr/network_status_tracker.cc +36 -0
- data/src/core/lib/iomgr/network_status_tracker.h +32 -0
- data/src/core/lib/iomgr/polling_entity.cc +87 -0
- data/src/core/lib/iomgr/polling_entity.h +68 -0
- data/src/core/lib/iomgr/pollset.cc +56 -0
- data/src/core/lib/iomgr/pollset.h +99 -0
- data/src/core/lib/iomgr/pollset_custom.cc +106 -0
- data/src/core/lib/iomgr/pollset_custom.h +35 -0
- data/src/core/lib/iomgr/pollset_set.cc +55 -0
- data/src/core/lib/iomgr/pollset_set.h +55 -0
- data/src/core/lib/iomgr/pollset_set_custom.cc +48 -0
- data/src/core/lib/iomgr/pollset_set_custom.h +26 -0
- data/src/core/lib/iomgr/pollset_set_windows.cc +51 -0
- data/src/core/lib/iomgr/pollset_set_windows.h +26 -0
- data/src/core/lib/iomgr/pollset_uv.cc +93 -0
- data/src/core/lib/iomgr/pollset_windows.cc +229 -0
- data/src/core/lib/iomgr/pollset_windows.h +70 -0
- data/src/core/lib/iomgr/port.h +147 -0
- data/src/core/lib/iomgr/resolve_address.cc +50 -0
- data/src/core/lib/iomgr/resolve_address.h +83 -0
- data/src/core/lib/iomgr/resolve_address_custom.cc +187 -0
- data/src/core/lib/iomgr/resolve_address_custom.h +43 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +180 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +165 -0
- data/src/core/lib/iomgr/resource_quota.cc +871 -0
- data/src/core/lib/iomgr/resource_quota.h +142 -0
- data/src/core/lib/iomgr/sockaddr.h +32 -0
- data/src/core/lib/iomgr/sockaddr_custom.h +54 -0
- data/src/core/lib/iomgr/sockaddr_posix.h +55 -0
- data/src/core/lib/iomgr/sockaddr_utils.cc +298 -0
- data/src/core/lib/iomgr/sockaddr_utils.h +84 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +55 -0
- data/src/core/lib/iomgr/socket_factory_posix.cc +94 -0
- data/src/core/lib/iomgr/socket_factory_posix.h +69 -0
- data/src/core/lib/iomgr/socket_mutator.cc +83 -0
- data/src/core/lib/iomgr/socket_mutator.h +61 -0
- data/src/core/lib/iomgr/socket_utils.h +38 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +327 -0
- data/src/core/lib/iomgr/socket_utils_linux.cc +43 -0
- data/src/core/lib/iomgr/socket_utils_posix.cc +59 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +134 -0
- data/src/core/lib/iomgr/socket_utils_uv.cc +45 -0
- data/src/core/lib/iomgr/socket_utils_windows.cc +43 -0
- data/src/core/lib/iomgr/socket_windows.cc +151 -0
- data/src/core/lib/iomgr/socket_windows.h +113 -0
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +30 -0
- data/src/core/lib/iomgr/tcp_client.cc +36 -0
- data/src/core/lib/iomgr/tcp_client.h +52 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +151 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +359 -0
- data/src/core/lib/iomgr/tcp_client_posix.h +68 -0
- data/src/core/lib/iomgr/tcp_client_windows.cc +231 -0
- data/src/core/lib/iomgr/tcp_custom.cc +365 -0
- data/src/core/lib/iomgr/tcp_custom.h +81 -0
- data/src/core/lib/iomgr/tcp_posix.cc +814 -0
- data/src/core/lib/iomgr/tcp_posix.h +57 -0
- data/src/core/lib/iomgr/tcp_server.cc +73 -0
- data/src/core/lib/iomgr/tcp_server.h +122 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +472 -0
- data/src/core/lib/iomgr/tcp_server_posix.cc +582 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +122 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +208 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +184 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +36 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +559 -0
- data/src/core/lib/iomgr/tcp_uv.cc +417 -0
- data/src/core/lib/iomgr/tcp_windows.cc +455 -0
- data/src/core/lib/iomgr/tcp_windows.h +51 -0
- data/src/core/lib/iomgr/time_averaged_stats.cc +64 -0
- data/src/core/lib/iomgr/time_averaged_stats.h +73 -0
- data/src/core/lib/iomgr/timer.cc +45 -0
- data/src/core/lib/iomgr/timer.h +125 -0
- data/src/core/lib/iomgr/timer_custom.cc +93 -0
- data/src/core/lib/iomgr/timer_custom.h +43 -0
- data/src/core/lib/iomgr/timer_generic.cc +663 -0
- data/src/core/lib/iomgr/timer_heap.cc +135 -0
- data/src/core/lib/iomgr/timer_heap.h +44 -0
- data/src/core/lib/iomgr/timer_manager.cc +347 -0
- data/src/core/lib/iomgr/timer_manager.h +39 -0
- data/src/core/lib/iomgr/timer_uv.cc +63 -0
- data/src/core/lib/iomgr/udp_server.cc +692 -0
- data/src/core/lib/iomgr/udp_server.h +103 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +104 -0
- data/src/core/lib/iomgr/unix_sockets_posix.h +43 -0
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +49 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +107 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +69 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +83 -0
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +38 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +100 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +28 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +87 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.h +96 -0
- data/src/core/lib/json/json.cc +86 -0
- data/src/core/lib/json/json.h +94 -0
- data/src/core/lib/json/json_common.h +34 -0
- data/src/core/lib/json/json_reader.cc +663 -0
- data/src/core/lib/json/json_reader.h +146 -0
- data/src/core/lib/json/json_string.cc +367 -0
- data/src/core/lib/json/json_writer.cc +245 -0
- data/src/core/lib/json/json_writer.h +84 -0
- data/src/core/lib/profiling/basic_timers.cc +286 -0
- data/src/core/lib/profiling/stap_timers.cc +50 -0
- data/src/core/lib/profiling/timers.h +94 -0
- data/src/core/lib/security/context/security_context.cc +348 -0
- data/src/core/lib/security/context/security_context.h +115 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +119 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.h +102 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +72 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +57 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +67 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +33 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +114 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +126 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +46 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +112 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +58 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +269 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +59 -0
- data/src/core/lib/security/credentials/credentials.cc +286 -0
- data/src/core/lib/security/credentials/credentials.h +246 -0
- data/src/core/lib/security/credentials/credentials_metadata.cc +62 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +136 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.h +64 -0
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +41 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +322 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +45 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +86 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.h +31 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +314 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +75 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +190 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +49 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +934 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +123 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +532 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +106 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +271 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +46 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +349 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +54 -0
- data/src/core/lib/security/security_connector/alts_security_connector.cc +287 -0
- data/src/core/lib/security/security_connector/alts_security_connector.h +69 -0
- data/src/core/lib/security/security_connector/security_connector.cc +1200 -0
- data/src/core/lib/security/security_connector/security_connector.h +283 -0
- data/src/core/lib/security/transport/auth_filters.h +37 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +418 -0
- data/src/core/lib/security/transport/secure_endpoint.cc +429 -0
- data/src/core/lib/security/transport/secure_endpoint.h +41 -0
- data/src/core/lib/security/transport/security_handshaker.cc +526 -0
- data/src/core/lib/security/transport/security_handshaker.h +34 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +269 -0
- data/src/core/lib/security/transport/target_authority_table.cc +75 -0
- data/src/core/lib/security/transport/target_authority_table.h +40 -0
- data/src/core/lib/security/transport/tsi_error.cc +29 -0
- data/src/core/lib/security/transport/tsi_error.h +29 -0
- data/src/core/lib/security/util/json_util.cc +48 -0
- data/src/core/lib/security/util/json_util.h +42 -0
- data/src/core/lib/slice/b64.cc +240 -0
- data/src/core/lib/slice/b64.h +51 -0
- data/src/core/lib/slice/percent_encoding.cc +169 -0
- data/src/core/lib/slice/percent_encoding.h +65 -0
- data/src/core/lib/slice/slice.cc +489 -0
- data/src/core/lib/slice/slice_buffer.cc +359 -0
- data/src/core/lib/slice/slice_hash_table.h +201 -0
- data/src/core/lib/slice/slice_intern.cc +332 -0
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.cc +118 -0
- data/src/core/lib/slice/slice_string_helpers.h +47 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +105 -0
- data/src/core/lib/surface/api_trace.cc +24 -0
- data/src/core/lib/surface/api_trace.h +52 -0
- data/src/core/lib/surface/byte_buffer.cc +92 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +129 -0
- data/src/core/lib/surface/call.cc +2002 -0
- data/src/core/lib/surface/call.h +109 -0
- data/src/core/lib/surface/call_details.cc +42 -0
- data/src/core/lib/surface/call_log_batch.cc +120 -0
- data/src/core/lib/surface/call_test_only.h +43 -0
- data/src/core/lib/surface/channel.cc +450 -0
- data/src/core/lib/surface/channel.h +83 -0
- data/src/core/lib/surface/channel_init.cc +109 -0
- data/src/core/lib/surface/channel_init.h +73 -0
- data/src/core/lib/surface/channel_ping.cc +65 -0
- data/src/core/lib/surface/channel_stack_type.cc +58 -0
- data/src/core/lib/surface/channel_stack_type.h +47 -0
- data/src/core/lib/surface/completion_queue.cc +1262 -0
- data/src/core/lib/surface/completion_queue.h +93 -0
- data/src/core/lib/surface/completion_queue_factory.cc +79 -0
- data/src/core/lib/surface/completion_queue_factory.h +38 -0
- data/src/core/lib/surface/event_string.cc +68 -0
- data/src/core/lib/surface/event_string.h +29 -0
- data/src/core/lib/surface/init.cc +196 -0
- data/src/core/lib/surface/init.h +27 -0
- data/src/core/lib/surface/init_secure.cc +81 -0
- data/src/core/lib/surface/lame_client.cc +180 -0
- data/src/core/lib/surface/lame_client.h +28 -0
- data/src/core/lib/surface/metadata_array.cc +36 -0
- data/src/core/lib/surface/server.cc +1445 -0
- data/src/core/lib/surface/server.h +58 -0
- data/src/core/lib/surface/validate_metadata.cc +95 -0
- data/src/core/lib/surface/validate_metadata.h +30 -0
- data/src/core/lib/surface/version.cc +28 -0
- data/src/core/lib/transport/bdp_estimator.cc +87 -0
- data/src/core/lib/transport/bdp_estimator.h +94 -0
- data/src/core/lib/transport/byte_stream.cc +160 -0
- data/src/core/lib/transport/byte_stream.h +164 -0
- data/src/core/lib/transport/connectivity_state.cc +196 -0
- data/src/core/lib/transport/connectivity_state.h +87 -0
- data/src/core/lib/transport/error_utils.cc +118 -0
- data/src/core/lib/transport/error_utils.h +46 -0
- data/src/core/lib/transport/http2_errors.h +41 -0
- data/src/core/lib/transport/metadata.cc +539 -0
- data/src/core/lib/transport/metadata.h +165 -0
- data/src/core/lib/transport/metadata_batch.cc +329 -0
- data/src/core/lib/transport/metadata_batch.h +150 -0
- data/src/core/lib/transport/pid_controller.cc +51 -0
- data/src/core/lib/transport/pid_controller.h +116 -0
- data/src/core/lib/transport/service_config.cc +106 -0
- data/src/core/lib/transport/service_config.h +249 -0
- data/src/core/lib/transport/static_metadata.cc +601 -0
- data/src/core/lib/transport/static_metadata.h +603 -0
- data/src/core/lib/transport/status_conversion.cc +100 -0
- data/src/core/lib/transport/status_conversion.h +38 -0
- data/src/core/lib/transport/status_metadata.cc +54 -0
- data/src/core/lib/transport/status_metadata.h +30 -0
- data/src/core/lib/transport/timeout_encoding.cc +144 -0
- data/src/core/lib/transport/timeout_encoding.h +37 -0
- data/src/core/lib/transport/transport.cc +278 -0
- data/src/core/lib/transport/transport.h +378 -0
- data/src/core/lib/transport/transport_impl.h +71 -0
- data/src/core/lib/transport/transport_op_string.cc +214 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +97 -0
- data/src/core/tsi/alts/crypt/aes_gcm.cc +687 -0
- data/src/core/tsi/alts/crypt/gsec.cc +189 -0
- data/src/core/tsi/alts/crypt/gsec.h +454 -0
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +118 -0
- data/src/core/tsi/alts/frame_protector/alts_counter.h +98 -0
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +66 -0
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +255 -0
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +407 -0
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +55 -0
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +114 -0
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +114 -0
- data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +105 -0
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +103 -0
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +218 -0
- data/src/core/tsi/alts/frame_protector/frame_handler.h +236 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +316 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +137 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +520 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +323 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +143 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +149 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_event.cc +73 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_event.h +93 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +483 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +83 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +52 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +58 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +52 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.c +48 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.h +64 -0
- data/src/core/tsi/alts/handshaker/handshaker.pb.c +123 -0
- data/src/core/tsi/alts/handshaker/handshaker.pb.h +255 -0
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +50 -0
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +78 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +196 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +163 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +180 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +52 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +144 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +49 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +91 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +174 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +100 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +476 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +199 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +296 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +52 -0
- data/src/core/tsi/alts_transport_security.cc +63 -0
- data/src/core/tsi/alts_transport_security.h +47 -0
- data/src/core/tsi/fake_transport_security.cc +787 -0
- data/src/core/tsi/fake_transport_security.h +45 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +73 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +58 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +211 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +93 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +76 -0
- data/src/core/tsi/ssl_transport_security.cc +1831 -0
- data/src/core/tsi/ssl_transport_security.h +314 -0
- data/src/core/tsi/ssl_types.h +42 -0
- data/src/core/tsi/transport_security.cc +326 -0
- data/src/core/tsi/transport_security.h +127 -0
- data/src/core/tsi/transport_security_adapter.cc +235 -0
- data/src/core/tsi/transport_security_adapter.h +41 -0
- data/src/core/tsi/transport_security_grpc.cc +66 -0
- data/src/core/tsi/transport_security_grpc.h +74 -0
- data/src/core/tsi/transport_security_interface.h +454 -0
- data/src/ruby/bin/apis/google/protobuf/empty.rb +29 -0
- data/src/ruby/bin/apis/pubsub_demo.rb +241 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +159 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +88 -0
- data/src/ruby/bin/math_client.rb +132 -0
- data/src/ruby/bin/math_pb.rb +32 -0
- data/src/ruby/bin/math_server.rb +191 -0
- data/src/ruby/bin/math_services_pb.rb +51 -0
- data/src/ruby/bin/noproto_client.rb +93 -0
- data/src/ruby/bin/noproto_server.rb +97 -0
- data/src/ruby/ext/grpc/extconf.rb +118 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.c +64 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.h +35 -0
- data/src/ruby/ext/grpc/rb_call.c +1041 -0
- data/src/ruby/ext/grpc/rb_call.h +53 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +290 -0
- data/src/ruby/ext/grpc/rb_call_credentials.h +31 -0
- data/src/ruby/ext/grpc/rb_channel.c +828 -0
- data/src/ruby/ext/grpc/rb_channel.h +34 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +155 -0
- data/src/ruby/ext/grpc/rb_channel_args.h +38 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +263 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.h +32 -0
- data/src/ruby/ext/grpc/rb_completion_queue.c +100 -0
- data/src/ruby/ext/grpc/rb_completion_queue.h +36 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +468 -0
- data/src/ruby/ext/grpc/rb_compression_options.h +29 -0
- data/src/ruby/ext/grpc/rb_event_thread.c +141 -0
- data/src/ruby/ext/grpc/rb_event_thread.h +21 -0
- data/src/ruby/ext/grpc/rb_grpc.c +340 -0
- data/src/ruby/ext/grpc/rb_grpc.h +72 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +507 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +766 -0
- data/src/ruby/ext/grpc/rb_loader.c +57 -0
- data/src/ruby/ext/grpc/rb_loader.h +25 -0
- data/src/ruby/ext/grpc/rb_server.c +366 -0
- data/src/ruby/ext/grpc/rb_server.h +32 -0
- data/src/ruby/ext/grpc/rb_server_credentials.c +243 -0
- data/src/ruby/ext/grpc/rb_server_credentials.h +32 -0
- data/src/ruby/lib/grpc.rb +35 -0
- data/src/ruby/lib/grpc/core/time_consts.rb +56 -0
- data/src/ruby/lib/grpc/errors.rb +201 -0
- data/src/ruby/lib/grpc/generic/active_call.rb +674 -0
- data/src/ruby/lib/grpc/generic/bidi_call.rb +233 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +501 -0
- data/src/ruby/lib/grpc/generic/interceptor_registry.rb +53 -0
- data/src/ruby/lib/grpc/generic/interceptors.rb +186 -0
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +204 -0
- data/src/ruby/lib/grpc/generic/rpc_server.rb +490 -0
- data/src/ruby/lib/grpc/generic/service.rb +210 -0
- data/src/ruby/lib/grpc/google_rpc_status_utils.rb +35 -0
- data/src/ruby/lib/grpc/grpc.rb +24 -0
- data/src/ruby/lib/grpc/logconfig.rb +44 -0
- data/src/ruby/lib/grpc/notifier.rb +45 -0
- data/src/ruby/lib/grpc/version.rb +18 -0
- data/src/ruby/pb/README.md +42 -0
- data/src/ruby/pb/generate_proto_ruby.sh +43 -0
- data/src/ruby/pb/grpc/health/checker.rb +76 -0
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +28 -0
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +41 -0
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +44 -0
- data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
- data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +49 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +15 -0
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +82 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +14 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +102 -0
- data/src/ruby/pb/test/client.rb +764 -0
- data/src/ruby/pb/test/server.rb +252 -0
- data/src/ruby/spec/call_credentials_spec.rb +42 -0
- data/src/ruby/spec/call_spec.rb +180 -0
- data/src/ruby/spec/channel_connection_spec.rb +126 -0
- data/src/ruby/spec/channel_credentials_spec.rb +82 -0
- data/src/ruby/spec/channel_spec.rb +190 -0
- data/src/ruby/spec/client_auth_spec.rb +137 -0
- data/src/ruby/spec/client_server_spec.rb +664 -0
- data/src/ruby/spec/compression_options_spec.rb +149 -0
- data/src/ruby/spec/error_sanity_spec.rb +49 -0
- data/src/ruby/spec/generic/active_call_spec.rb +672 -0
- data/src/ruby/spec/generic/client_interceptors_spec.rb +153 -0
- data/src/ruby/spec/generic/client_stub_spec.rb +1067 -0
- data/src/ruby/spec/generic/interceptor_registry_spec.rb +65 -0
- data/src/ruby/spec/generic/rpc_desc_spec.rb +374 -0
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +127 -0
- data/src/ruby/spec/generic/rpc_server_spec.rb +726 -0
- data/src/ruby/spec/generic/server_interceptors_spec.rb +218 -0
- data/src/ruby/spec/generic/service_spec.rb +261 -0
- data/src/ruby/spec/google_rpc_status_utils_spec.rb +293 -0
- data/src/ruby/spec/pb/duplicate/codegen_spec.rb +56 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +236 -0
- data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +54 -0
- data/src/ruby/spec/pb/package_with_underscore/data.proto +23 -0
- data/src/ruby/spec/pb/package_with_underscore/service.proto +23 -0
- data/src/ruby/spec/server_credentials_spec.rb +79 -0
- data/src/ruby/spec/server_spec.rb +209 -0
- data/src/ruby/spec/spec_helper.rb +60 -0
- data/src/ruby/spec/support/helpers.rb +107 -0
- data/src/ruby/spec/support/services.rb +147 -0
- data/src/ruby/spec/testdata/README +1 -0
- data/src/ruby/spec/testdata/ca.pem +15 -0
- data/src/ruby/spec/testdata/client.key +16 -0
- data/src/ruby/spec/testdata/client.pem +14 -0
- data/src/ruby/spec/testdata/server1.key +16 -0
- data/src/ruby/spec/testdata/server1.pem +16 -0
- data/src/ruby/spec/time_consts_spec.rb +74 -0
- data/third_party/address_sorting/address_sorting.c +369 -0
- data/third_party/address_sorting/address_sorting_internal.h +70 -0
- data/third_party/address_sorting/address_sorting_posix.c +97 -0
- data/third_party/address_sorting/address_sorting_windows.c +55 -0
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +110 -0
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +271 -0
- data/third_party/boringssl/crypto/asn1/a_bool.c +110 -0
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +297 -0
- data/third_party/boringssl/crypto/asn1/a_dup.c +111 -0
- data/third_party/boringssl/crypto/asn1/a_enum.c +195 -0
- data/third_party/boringssl/crypto/asn1/a_gentm.c +261 -0
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +150 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +474 -0
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +409 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +275 -0
- data/third_party/boringssl/crypto/asn1/a_octet.c +77 -0
- data/third_party/boringssl/crypto/asn1/a_print.c +93 -0
- data/third_party/boringssl/crypto/asn1/a_strnid.c +312 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +213 -0
- data/third_party/boringssl/crypto/asn1/a_type.c +151 -0
- data/third_party/boringssl/crypto/asn1/a_utctm.c +303 -0
- data/third_party/boringssl/crypto/asn1/a_utf8.c +234 -0
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +442 -0
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +101 -0
- data/third_party/boringssl/crypto/asn1/asn1_par.c +80 -0
- data/third_party/boringssl/crypto/asn1/asn_pack.c +105 -0
- data/third_party/boringssl/crypto/asn1/f_enum.c +93 -0
- data/third_party/boringssl/crypto/asn1/f_int.c +97 -0
- data/third_party/boringssl/crypto/asn1/f_string.c +91 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +1223 -0
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +662 -0
- data/third_party/boringssl/crypto/asn1/tasn_fre.c +244 -0
- data/third_party/boringssl/crypto/asn1/tasn_new.c +387 -0
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +131 -0
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +280 -0
- data/third_party/boringssl/crypto/asn1/time_support.c +206 -0
- data/third_party/boringssl/crypto/base64/base64.c +466 -0
- data/third_party/boringssl/crypto/bio/bio.c +636 -0
- data/third_party/boringssl/crypto/bio/bio_mem.c +330 -0
- data/third_party/boringssl/crypto/bio/connect.c +542 -0
- data/third_party/boringssl/crypto/bio/fd.c +275 -0
- data/third_party/boringssl/crypto/bio/file.c +313 -0
- data/third_party/boringssl/crypto/bio/hexdump.c +192 -0
- data/third_party/boringssl/crypto/bio/internal.h +111 -0
- data/third_party/boringssl/crypto/bio/pair.c +489 -0
- data/third_party/boringssl/crypto/bio/printf.c +115 -0
- data/third_party/boringssl/crypto/bio/socket.c +202 -0
- data/third_party/boringssl/crypto/bio/socket_helper.c +114 -0
- data/third_party/boringssl/crypto/bn_extra/bn_asn1.c +64 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +465 -0
- data/third_party/boringssl/crypto/buf/buf.c +231 -0
- data/third_party/boringssl/crypto/bytestring/asn1_compat.c +52 -0
- data/third_party/boringssl/crypto/bytestring/ber.c +264 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +568 -0
- data/third_party/boringssl/crypto/bytestring/cbs.c +487 -0
- data/third_party/boringssl/crypto/bytestring/internal.h +75 -0
- data/third_party/boringssl/crypto/chacha/chacha.c +167 -0
- data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +114 -0
- data/third_party/boringssl/crypto/cipher_extra/derive_key.c +152 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +281 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +867 -0
- data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +326 -0
- data/third_party/boringssl/crypto/cipher_extra/e_null.c +85 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +460 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc4.c +87 -0
- data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +460 -0
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +681 -0
- data/third_party/boringssl/crypto/cipher_extra/internal.h +128 -0
- data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +482 -0
- data/third_party/boringssl/crypto/cmac/cmac.c +241 -0
- data/third_party/boringssl/crypto/conf/conf.c +803 -0
- data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
- data/third_party/boringssl/crypto/conf/internal.h +31 -0
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +363 -0
- data/third_party/boringssl/crypto/cpu-arm.c +38 -0
- data/third_party/boringssl/crypto/cpu-intel.c +288 -0
- data/third_party/boringssl/crypto/cpu-ppc64le.c +38 -0
- data/third_party/boringssl/crypto/crypto.c +198 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +539 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +247 -0
- data/third_party/boringssl/crypto/dh/check.c +217 -0
- data/third_party/boringssl/crypto/dh/dh.c +519 -0
- data/third_party/boringssl/crypto/dh/dh_asn1.c +160 -0
- data/third_party/boringssl/crypto/dh/params.c +93 -0
- data/third_party/boringssl/crypto/digest_extra/digest_extra.c +240 -0
- data/third_party/boringssl/crypto/dsa/dsa.c +984 -0
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +339 -0
- data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +563 -0
- data/third_party/boringssl/crypto/ecdh/ecdh.c +161 -0
- data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +275 -0
- data/third_party/boringssl/crypto/engine/engine.c +98 -0
- data/third_party/boringssl/crypto/err/err.c +847 -0
- data/third_party/boringssl/crypto/err/internal.h +58 -0
- data/third_party/boringssl/crypto/evp/digestsign.c +231 -0
- data/third_party/boringssl/crypto/evp/evp.c +362 -0
- data/third_party/boringssl/crypto/evp/evp_asn1.c +337 -0
- data/third_party/boringssl/crypto/evp/evp_ctx.c +446 -0
- data/third_party/boringssl/crypto/evp/internal.h +252 -0
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +268 -0
- data/third_party/boringssl/crypto/evp/p_ec.c +239 -0
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +256 -0
- data/third_party/boringssl/crypto/evp/p_ed25519.c +71 -0
- data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +190 -0
- data/third_party/boringssl/crypto/evp/p_rsa.c +634 -0
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +189 -0
- data/third_party/boringssl/crypto/evp/pbkdf.c +146 -0
- data/third_party/boringssl/crypto/evp/print.c +489 -0
- data/third_party/boringssl/crypto/evp/scrypt.c +209 -0
- data/third_party/boringssl/crypto/evp/sign.c +151 -0
- data/third_party/boringssl/crypto/ex_data.c +261 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +1100 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +100 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +138 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +112 -0
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +679 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/add.c +371 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +540 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +370 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +269 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +303 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +733 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +1390 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +627 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +710 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +413 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +146 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +483 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +207 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +902 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +894 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +299 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +53 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +305 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +502 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/aead.c +284 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +615 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +1437 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +233 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +129 -0
- data/third_party/boringssl/crypto/fipsmodule/delocate.h +88 -0
- data/third_party/boringssl/crypto/fipsmodule/des/des.c +785 -0
- data/third_party/boringssl/crypto/fipsmodule/des/internal.h +238 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +256 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +280 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/internal.h +112 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +268 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +943 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +517 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +277 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +316 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +404 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +1131 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +1674 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9543 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +456 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +113 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +1052 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/util-64.c +109 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +474 -0
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +442 -0
- data/third_party/boringssl/crypto/fipsmodule/hmac/hmac.c +228 -0
- data/third_party/boringssl/crypto/fipsmodule/is_fips.c +27 -0
- data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +298 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +211 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +234 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +220 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +1063 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +384 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +95 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/polyval.c +91 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +200 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +92 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +358 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +302 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +263 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +131 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +692 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +857 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +1051 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha1-altivec.c +361 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +375 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +337 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +608 -0
- data/third_party/boringssl/crypto/hkdf/hkdf.c +112 -0
- data/third_party/boringssl/crypto/internal.h +676 -0
- data/third_party/boringssl/crypto/lhash/lhash.c +336 -0
- data/third_party/boringssl/crypto/mem.c +237 -0
- data/third_party/boringssl/crypto/obj/obj.c +621 -0
- data/third_party/boringssl/crypto/obj/obj_dat.h +6244 -0
- data/third_party/boringssl/crypto/obj/obj_xref.c +122 -0
- data/third_party/boringssl/crypto/pem/pem_all.c +262 -0
- data/third_party/boringssl/crypto/pem/pem_info.c +379 -0
- data/third_party/boringssl/crypto/pem/pem_lib.c +776 -0
- data/third_party/boringssl/crypto/pem/pem_oth.c +88 -0
- data/third_party/boringssl/crypto/pem/pem_pk8.c +258 -0
- data/third_party/boringssl/crypto/pem/pem_pkey.c +227 -0
- data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
- data/third_party/boringssl/crypto/pem/pem_xaux.c +65 -0
- data/third_party/boringssl/crypto/pkcs7/internal.h +49 -0
- data/third_party/boringssl/crypto/pkcs7/pkcs7.c +166 -0
- data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +233 -0
- data/third_party/boringssl/crypto/pkcs8/internal.h +120 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +307 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +513 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +789 -0
- data/third_party/boringssl/crypto/poly1305/internal.h +41 -0
- data/third_party/boringssl/crypto/poly1305/poly1305.c +318 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +304 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +839 -0
- data/third_party/boringssl/crypto/pool/internal.h +45 -0
- data/third_party/boringssl/crypto/pool/pool.c +200 -0
- data/third_party/boringssl/crypto/rand_extra/deterministic.c +48 -0
- data/third_party/boringssl/crypto/rand_extra/forkunsafe.c +46 -0
- data/third_party/boringssl/crypto/rand_extra/fuchsia.c +43 -0
- data/third_party/boringssl/crypto/rand_extra/rand_extra.c +70 -0
- data/third_party/boringssl/crypto/rand_extra/windows.c +53 -0
- data/third_party/boringssl/crypto/rc4/rc4.c +98 -0
- data/third_party/boringssl/crypto/refcount_c11.c +67 -0
- data/third_party/boringssl/crypto/refcount_lock.c +53 -0
- data/third_party/boringssl/crypto/rsa_extra/rsa_asn1.c +325 -0
- data/third_party/boringssl/crypto/stack/stack.c +380 -0
- data/third_party/boringssl/crypto/thread.c +110 -0
- data/third_party/boringssl/crypto/thread_none.c +59 -0
- data/third_party/boringssl/crypto/thread_pthread.c +176 -0
- data/third_party/boringssl/crypto/thread_win.c +237 -0
- data/third_party/boringssl/crypto/x509/a_digest.c +96 -0
- data/third_party/boringssl/crypto/x509/a_sign.c +128 -0
- data/third_party/boringssl/crypto/x509/a_strex.c +633 -0
- data/third_party/boringssl/crypto/x509/a_verify.c +115 -0
- data/third_party/boringssl/crypto/x509/algorithm.c +153 -0
- data/third_party/boringssl/crypto/x509/asn1_gen.c +841 -0
- data/third_party/boringssl/crypto/x509/by_dir.c +451 -0
- data/third_party/boringssl/crypto/x509/by_file.c +274 -0
- data/third_party/boringssl/crypto/x509/charmap.h +15 -0
- data/third_party/boringssl/crypto/x509/i2d_pr.c +83 -0
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_crl.c +128 -0
- data/third_party/boringssl/crypto/x509/t_req.c +246 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +547 -0
- data/third_party/boringssl/crypto/x509/t_x509a.c +111 -0
- data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
- data/third_party/boringssl/crypto/x509/x509.c +157 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +381 -0
- data/third_party/boringssl/crypto/x509/x509_cmp.c +477 -0
- data/third_party/boringssl/crypto/x509/x509_d2.c +106 -0
- data/third_party/boringssl/crypto/x509/x509_def.c +103 -0
- data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
- data/third_party/boringssl/crypto/x509/x509_lu.c +725 -0
- data/third_party/boringssl/crypto/x509/x509_obj.c +198 -0
- data/third_party/boringssl/crypto/x509/x509_r2x.c +117 -0
- data/third_party/boringssl/crypto/x509/x509_req.c +322 -0
- data/third_party/boringssl/crypto/x509/x509_set.c +164 -0
- data/third_party/boringssl/crypto/x509/x509_trs.c +326 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +205 -0
- data/third_party/boringssl/crypto/x509/x509_v3.c +278 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +2472 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +648 -0
- data/third_party/boringssl/crypto/x509/x509cset.c +170 -0
- data/third_party/boringssl/crypto/x509/x509name.c +389 -0
- data/third_party/boringssl/crypto/x509/x509rset.c +81 -0
- data/third_party/boringssl/crypto/x509/x509spki.c +137 -0
- data/third_party/boringssl/crypto/x509/x_algor.c +151 -0
- data/third_party/boringssl/crypto/x509/x_all.c +501 -0
- data/third_party/boringssl/crypto/x509/x_attrib.c +111 -0
- data/third_party/boringssl/crypto/x509/x_crl.c +541 -0
- data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
- data/third_party/boringssl/crypto/x509/x_info.c +98 -0
- data/third_party/boringssl/crypto/x509/x_name.c +541 -0
- data/third_party/boringssl/crypto/x509/x_pkey.c +106 -0
- data/third_party/boringssl/crypto/x509/x_pubkey.c +368 -0
- data/third_party/boringssl/crypto/x509/x_req.c +109 -0
- data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
- data/third_party/boringssl/crypto/x509/x_spki.c +80 -0
- data/third_party/boringssl/crypto/x509/x_val.c +69 -0
- data/third_party/boringssl/crypto/x509/x_x509.c +328 -0
- data/third_party/boringssl/crypto/x509/x_x509a.c +198 -0
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +143 -0
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +284 -0
- data/third_party/boringssl/crypto/x509v3/pcy_data.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +217 -0
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +155 -0
- data/third_party/boringssl/crypto/x509v3/pcy_map.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +188 -0
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +840 -0
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +204 -0
- data/third_party/boringssl/crypto/x509v3/v3_akeya.c +72 -0
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +623 -0
- data/third_party/boringssl/crypto/x509v3/v3_bcons.c +133 -0
- data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +462 -0
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +502 -0
- data/third_party/boringssl/crypto/x509v3/v3_crld.c +561 -0
- data/third_party/boringssl/crypto/x509v3/v3_enum.c +100 -0
- data/third_party/boringssl/crypto/x509v3/v3_extku.c +148 -0
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +251 -0
- data/third_party/boringssl/crypto/x509v3/v3_ia5.c +122 -0
- data/third_party/boringssl/crypto/x509v3/v3_info.c +219 -0
- data/third_party/boringssl/crypto/x509v3/v3_int.c +91 -0
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +370 -0
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +501 -0
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +287 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcia.c +57 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcons.c +139 -0
- data/third_party/boringssl/crypto/x509v3/v3_pku.c +110 -0
- data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +154 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +229 -0
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +866 -0
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +152 -0
- data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +274 -0
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +1352 -0
- data/third_party/boringssl/include/openssl/aead.h +423 -0
- data/third_party/boringssl/include/openssl/aes.h +170 -0
- data/third_party/boringssl/include/openssl/arm_arch.h +121 -0
- data/third_party/boringssl/include/openssl/asn1.h +982 -0
- data/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
- data/third_party/boringssl/include/openssl/asn1t.h +892 -0
- data/third_party/boringssl/include/openssl/base.h +469 -0
- data/third_party/boringssl/include/openssl/base64.h +187 -0
- data/third_party/boringssl/include/openssl/bio.h +902 -0
- data/third_party/boringssl/include/openssl/blowfish.h +93 -0
- data/third_party/boringssl/include/openssl/bn.h +975 -0
- data/third_party/boringssl/include/openssl/buf.h +137 -0
- data/third_party/boringssl/include/openssl/buffer.h +18 -0
- data/third_party/boringssl/include/openssl/bytestring.h +480 -0
- data/third_party/boringssl/include/openssl/cast.h +96 -0
- data/third_party/boringssl/include/openssl/chacha.h +41 -0
- data/third_party/boringssl/include/openssl/cipher.h +608 -0
- data/third_party/boringssl/include/openssl/cmac.h +87 -0
- data/third_party/boringssl/include/openssl/conf.h +183 -0
- data/third_party/boringssl/include/openssl/cpu.h +196 -0
- data/third_party/boringssl/include/openssl/crypto.h +118 -0
- data/third_party/boringssl/include/openssl/curve25519.h +201 -0
- data/third_party/boringssl/include/openssl/des.h +177 -0
- data/third_party/boringssl/include/openssl/dh.h +298 -0
- data/third_party/boringssl/include/openssl/digest.h +316 -0
- data/third_party/boringssl/include/openssl/dsa.h +435 -0
- data/third_party/boringssl/include/openssl/dtls1.h +16 -0
- data/third_party/boringssl/include/openssl/ec.h +407 -0
- data/third_party/boringssl/include/openssl/ec_key.h +341 -0
- data/third_party/boringssl/include/openssl/ecdh.h +101 -0
- data/third_party/boringssl/include/openssl/ecdsa.h +199 -0
- data/third_party/boringssl/include/openssl/engine.h +109 -0
- data/third_party/boringssl/include/openssl/err.h +458 -0
- data/third_party/boringssl/include/openssl/evp.h +873 -0
- data/third_party/boringssl/include/openssl/ex_data.h +203 -0
- data/third_party/boringssl/include/openssl/hkdf.h +64 -0
- data/third_party/boringssl/include/openssl/hmac.h +186 -0
- data/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
- data/third_party/boringssl/include/openssl/lhash.h +174 -0
- data/third_party/boringssl/include/openssl/lhash_macros.h +174 -0
- data/third_party/boringssl/include/openssl/md4.h +106 -0
- data/third_party/boringssl/include/openssl/md5.h +107 -0
- data/third_party/boringssl/include/openssl/mem.h +156 -0
- data/third_party/boringssl/include/openssl/nid.h +4242 -0
- data/third_party/boringssl/include/openssl/obj.h +233 -0
- data/third_party/boringssl/include/openssl/obj_mac.h +18 -0
- data/third_party/boringssl/include/openssl/objects.h +18 -0
- data/third_party/boringssl/include/openssl/opensslconf.h +67 -0
- data/third_party/boringssl/include/openssl/opensslv.h +18 -0
- data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
- data/third_party/boringssl/include/openssl/pem.h +397 -0
- data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
- data/third_party/boringssl/include/openssl/pkcs7.h +82 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +230 -0
- data/third_party/boringssl/include/openssl/poly1305.h +51 -0
- data/third_party/boringssl/include/openssl/pool.h +91 -0
- data/third_party/boringssl/include/openssl/rand.h +125 -0
- data/third_party/boringssl/include/openssl/rc4.h +96 -0
- data/third_party/boringssl/include/openssl/ripemd.h +107 -0
- data/third_party/boringssl/include/openssl/rsa.h +731 -0
- data/third_party/boringssl/include/openssl/safestack.h +16 -0
- data/third_party/boringssl/include/openssl/sha.h +256 -0
- data/third_party/boringssl/include/openssl/span.h +191 -0
- data/third_party/boringssl/include/openssl/srtp.h +18 -0
- data/third_party/boringssl/include/openssl/ssl.h +4592 -0
- data/third_party/boringssl/include/openssl/ssl3.h +333 -0
- data/third_party/boringssl/include/openssl/stack.h +485 -0
- data/third_party/boringssl/include/openssl/thread.h +191 -0
- data/third_party/boringssl/include/openssl/tls1.h +610 -0
- data/third_party/boringssl/include/openssl/type_check.h +91 -0
- data/third_party/boringssl/include/openssl/x509.h +1176 -0
- data/third_party/boringssl/include/openssl/x509_vfy.h +614 -0
- data/third_party/boringssl/include/openssl/x509v3.h +826 -0
- data/third_party/boringssl/ssl/bio_ssl.cc +179 -0
- data/third_party/boringssl/ssl/custom_extensions.cc +265 -0
- data/third_party/boringssl/ssl/d1_both.cc +837 -0
- data/third_party/boringssl/ssl/d1_lib.cc +267 -0
- data/third_party/boringssl/ssl/d1_pkt.cc +274 -0
- data/third_party/boringssl/ssl/d1_srtp.cc +232 -0
- data/third_party/boringssl/ssl/dtls_method.cc +193 -0
- data/third_party/boringssl/ssl/dtls_record.cc +353 -0
- data/third_party/boringssl/ssl/handshake.cc +616 -0
- data/third_party/boringssl/ssl/handshake_client.cc +1836 -0
- data/third_party/boringssl/ssl/handshake_server.cc +1662 -0
- data/third_party/boringssl/ssl/internal.h +3011 -0
- data/third_party/boringssl/ssl/s3_both.cc +585 -0
- data/third_party/boringssl/ssl/s3_lib.cc +224 -0
- data/third_party/boringssl/ssl/s3_pkt.cc +443 -0
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +415 -0
- data/third_party/boringssl/ssl/ssl_asn1.cc +840 -0
- data/third_party/boringssl/ssl/ssl_buffer.cc +286 -0
- data/third_party/boringssl/ssl/ssl_cert.cc +913 -0
- data/third_party/boringssl/ssl/ssl_cipher.cc +1777 -0
- data/third_party/boringssl/ssl/ssl_file.cc +583 -0
- data/third_party/boringssl/ssl/ssl_key_share.cc +250 -0
- data/third_party/boringssl/ssl/ssl_lib.cc +2650 -0
- data/third_party/boringssl/ssl/ssl_privkey.cc +488 -0
- data/third_party/boringssl/ssl/ssl_session.cc +1221 -0
- data/third_party/boringssl/ssl/ssl_stat.cc +224 -0
- data/third_party/boringssl/ssl/ssl_transcript.cc +398 -0
- data/third_party/boringssl/ssl/ssl_versions.cc +472 -0
- data/third_party/boringssl/ssl/ssl_x509.cc +1299 -0
- data/third_party/boringssl/ssl/t1_enc.cc +503 -0
- data/third_party/boringssl/ssl/t1_lib.cc +3457 -0
- data/third_party/boringssl/ssl/tls13_both.cc +551 -0
- data/third_party/boringssl/ssl/tls13_client.cc +977 -0
- data/third_party/boringssl/ssl/tls13_enc.cc +563 -0
- data/third_party/boringssl/ssl/tls13_server.cc +1068 -0
- data/third_party/boringssl/ssl/tls_method.cc +291 -0
- data/third_party/boringssl/ssl/tls_record.cc +712 -0
- data/third_party/boringssl/third_party/fiat/curve25519.c +5062 -0
- data/third_party/boringssl/third_party/fiat/internal.h +142 -0
- data/third_party/cares/ares_build.h +223 -0
- data/third_party/cares/cares/ares.h +658 -0
- data/third_party/cares/cares/ares__close_sockets.c +61 -0
- data/third_party/cares/cares/ares__get_hostent.c +261 -0
- data/third_party/cares/cares/ares__read_line.c +73 -0
- data/third_party/cares/cares/ares__timeval.c +111 -0
- data/third_party/cares/cares/ares_cancel.c +63 -0
- data/third_party/cares/cares/ares_create_query.c +202 -0
- data/third_party/cares/cares/ares_data.c +221 -0
- data/third_party/cares/cares/ares_data.h +72 -0
- data/third_party/cares/cares/ares_destroy.c +108 -0
- data/third_party/cares/cares/ares_dns.h +103 -0
- data/third_party/cares/cares/ares_expand_name.c +209 -0
- data/third_party/cares/cares/ares_expand_string.c +70 -0
- data/third_party/cares/cares/ares_fds.c +59 -0
- data/third_party/cares/cares/ares_free_hostent.c +41 -0
- data/third_party/cares/cares/ares_free_string.c +25 -0
- data/third_party/cares/cares/ares_getenv.c +30 -0
- data/third_party/cares/cares/ares_getenv.h +26 -0
- data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
- data/third_party/cares/cares/ares_gethostbyname.c +518 -0
- data/third_party/cares/cares/ares_getnameinfo.c +442 -0
- data/third_party/cares/cares/ares_getopt.c +122 -0
- data/third_party/cares/cares/ares_getopt.h +53 -0
- data/third_party/cares/cares/ares_getsock.c +66 -0
- data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
- data/third_party/cares/cares/ares_init.c +2514 -0
- data/third_party/cares/cares/ares_iphlpapi.h +221 -0
- data/third_party/cares/cares/ares_ipv6.h +78 -0
- data/third_party/cares/cares/ares_library_init.c +177 -0
- data/third_party/cares/cares/ares_library_init.h +43 -0
- data/third_party/cares/cares/ares_llist.c +63 -0
- data/third_party/cares/cares/ares_llist.h +39 -0
- data/third_party/cares/cares/ares_mkquery.c +24 -0
- data/third_party/cares/cares/ares_nowarn.c +260 -0
- data/third_party/cares/cares/ares_nowarn.h +61 -0
- data/third_party/cares/cares/ares_options.c +402 -0
- data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
- data/third_party/cares/cares/ares_parse_naptr_reply.c +193 -0
- data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
- data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
- data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
- data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
- data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
- data/third_party/cares/cares/ares_platform.c +11035 -0
- data/third_party/cares/cares/ares_platform.h +43 -0
- data/third_party/cares/cares/ares_private.h +374 -0
- data/third_party/cares/cares/ares_process.c +1448 -0
- data/third_party/cares/cares/ares_query.c +186 -0
- data/third_party/cares/cares/ares_rules.h +125 -0
- data/third_party/cares/cares/ares_search.c +316 -0
- data/third_party/cares/cares/ares_send.c +131 -0
- data/third_party/cares/cares/ares_setup.h +217 -0
- data/third_party/cares/cares/ares_strcasecmp.c +66 -0
- data/third_party/cares/cares/ares_strcasecmp.h +30 -0
- data/third_party/cares/cares/ares_strdup.c +49 -0
- data/third_party/cares/cares/ares_strdup.h +24 -0
- data/third_party/cares/cares/ares_strerror.c +56 -0
- data/third_party/cares/cares/ares_timeout.c +88 -0
- data/third_party/cares/cares/ares_version.c +11 -0
- data/third_party/cares/cares/ares_version.h +24 -0
- data/third_party/cares/cares/ares_writev.c +79 -0
- data/third_party/cares/cares/bitncmp.c +59 -0
- data/third_party/cares/cares/bitncmp.h +26 -0
- data/third_party/cares/cares/config-win32.h +351 -0
- data/third_party/cares/cares/inet_net_pton.c +450 -0
- data/third_party/cares/cares/inet_ntop.c +208 -0
- data/third_party/cares/cares/setup_once.h +554 -0
- data/third_party/cares/cares/windows_port.c +22 -0
- data/third_party/cares/config_darwin/ares_config.h +425 -0
- data/third_party/cares/config_freebsd/ares_config.h +502 -0
- data/third_party/cares/config_linux/ares_config.h +458 -0
- data/third_party/cares/config_openbsd/ares_config.h +502 -0
- data/third_party/nanopb/pb.h +579 -0
- data/third_party/nanopb/pb_common.c +97 -0
- data/third_party/nanopb/pb_common.h +42 -0
- data/third_party/nanopb/pb_decode.c +1347 -0
- data/third_party/nanopb/pb_decode.h +149 -0
- data/third_party/nanopb/pb_encode.c +696 -0
- data/third_party/nanopb/pb_encode.h +154 -0
- data/third_party/zlib/adler32.c +186 -0
- data/third_party/zlib/compress.c +86 -0
- data/third_party/zlib/crc32.c +442 -0
- data/third_party/zlib/crc32.h +441 -0
- data/third_party/zlib/deflate.c +2163 -0
- data/third_party/zlib/deflate.h +349 -0
- data/third_party/zlib/gzclose.c +25 -0
- data/third_party/zlib/gzguts.h +218 -0
- data/third_party/zlib/gzlib.c +637 -0
- data/third_party/zlib/gzread.c +654 -0
- data/third_party/zlib/gzwrite.c +665 -0
- data/third_party/zlib/infback.c +640 -0
- data/third_party/zlib/inffast.c +323 -0
- data/third_party/zlib/inffast.h +11 -0
- data/third_party/zlib/inffixed.h +94 -0
- data/third_party/zlib/inflate.c +1561 -0
- data/third_party/zlib/inflate.h +125 -0
- data/third_party/zlib/inftrees.c +304 -0
- data/third_party/zlib/inftrees.h +62 -0
- data/third_party/zlib/trees.c +1203 -0
- data/third_party/zlib/trees.h +128 -0
- data/third_party/zlib/uncompr.c +93 -0
- data/third_party/zlib/zconf.h +534 -0
- data/third_party/zlib/zlib.h +1912 -0
- data/third_party/zlib/zutil.c +325 -0
- data/third_party/zlib/zutil.h +271 -0
- metadata +1586 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2017 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#include <grpc/support/port_platform.h>
|
|
20
|
+
|
|
21
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
|
|
22
|
+
|
|
23
|
+
#include <grpc/support/atm.h>
|
|
24
|
+
#include <grpc/support/log.h>
|
|
25
|
+
|
|
26
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
|
27
|
+
#include "src/core/lib/iomgr/error.h"
|
|
28
|
+
#include "src/core/lib/profiling/timers.h"
|
|
29
|
+
|
|
30
|
+
static grpc_error* init_channel_elem(grpc_channel_element* elem,
|
|
31
|
+
grpc_channel_element_args* args) {
|
|
32
|
+
return GRPC_ERROR_NONE;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static void destroy_channel_elem(grpc_channel_element* elem) {}
|
|
36
|
+
|
|
37
|
+
namespace {
|
|
38
|
+
struct call_data {
|
|
39
|
+
// Stats object to update.
|
|
40
|
+
grpc_grpclb_client_stats* client_stats;
|
|
41
|
+
// State for intercepting send_initial_metadata.
|
|
42
|
+
grpc_closure on_complete_for_send;
|
|
43
|
+
grpc_closure* original_on_complete_for_send;
|
|
44
|
+
bool send_initial_metadata_succeeded;
|
|
45
|
+
// State for intercepting recv_initial_metadata.
|
|
46
|
+
grpc_closure recv_initial_metadata_ready;
|
|
47
|
+
grpc_closure* original_recv_initial_metadata_ready;
|
|
48
|
+
bool recv_initial_metadata_succeeded;
|
|
49
|
+
};
|
|
50
|
+
} // namespace
|
|
51
|
+
|
|
52
|
+
static void on_complete_for_send(void* arg, grpc_error* error) {
|
|
53
|
+
call_data* calld = static_cast<call_data*>(arg);
|
|
54
|
+
if (error == GRPC_ERROR_NONE) {
|
|
55
|
+
calld->send_initial_metadata_succeeded = true;
|
|
56
|
+
}
|
|
57
|
+
GRPC_CLOSURE_RUN(calld->original_on_complete_for_send, GRPC_ERROR_REF(error));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
|
|
61
|
+
call_data* calld = static_cast<call_data*>(arg);
|
|
62
|
+
if (error == GRPC_ERROR_NONE) {
|
|
63
|
+
calld->recv_initial_metadata_succeeded = true;
|
|
64
|
+
}
|
|
65
|
+
GRPC_CLOSURE_RUN(calld->original_recv_initial_metadata_ready,
|
|
66
|
+
GRPC_ERROR_REF(error));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static grpc_error* init_call_elem(grpc_call_element* elem,
|
|
70
|
+
const grpc_call_element_args* args) {
|
|
71
|
+
call_data* calld = static_cast<call_data*>(elem->call_data);
|
|
72
|
+
// Get stats object from context and take a ref.
|
|
73
|
+
GPR_ASSERT(args->context != nullptr);
|
|
74
|
+
if (args->context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) {
|
|
75
|
+
calld->client_stats =
|
|
76
|
+
grpc_grpclb_client_stats_ref(static_cast<grpc_grpclb_client_stats*>(
|
|
77
|
+
args->context[GRPC_GRPCLB_CLIENT_STATS].value));
|
|
78
|
+
// Record call started.
|
|
79
|
+
grpc_grpclb_client_stats_add_call_started(calld->client_stats);
|
|
80
|
+
}
|
|
81
|
+
return GRPC_ERROR_NONE;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static void destroy_call_elem(grpc_call_element* elem,
|
|
85
|
+
const grpc_call_final_info* final_info,
|
|
86
|
+
grpc_closure* ignored) {
|
|
87
|
+
call_data* calld = static_cast<call_data*>(elem->call_data);
|
|
88
|
+
if (calld->client_stats != nullptr) {
|
|
89
|
+
// Record call finished, optionally setting client_failed_to_send and
|
|
90
|
+
// received.
|
|
91
|
+
grpc_grpclb_client_stats_add_call_finished(
|
|
92
|
+
!calld->send_initial_metadata_succeeded /* client_failed_to_send */,
|
|
93
|
+
calld->recv_initial_metadata_succeeded /* known_received */,
|
|
94
|
+
calld->client_stats);
|
|
95
|
+
// All done, so unref the stats object.
|
|
96
|
+
grpc_grpclb_client_stats_unref(calld->client_stats);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static void start_transport_stream_op_batch(
|
|
101
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
|
102
|
+
call_data* calld = static_cast<call_data*>(elem->call_data);
|
|
103
|
+
GPR_TIMER_SCOPE("clr_start_transport_stream_op_batch", 0);
|
|
104
|
+
if (calld->client_stats != nullptr) {
|
|
105
|
+
// Intercept send_initial_metadata.
|
|
106
|
+
if (batch->send_initial_metadata) {
|
|
107
|
+
calld->original_on_complete_for_send = batch->on_complete;
|
|
108
|
+
GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
|
|
109
|
+
calld, grpc_schedule_on_exec_ctx);
|
|
110
|
+
batch->on_complete = &calld->on_complete_for_send;
|
|
111
|
+
}
|
|
112
|
+
// Intercept recv_initial_metadata.
|
|
113
|
+
if (batch->recv_initial_metadata) {
|
|
114
|
+
calld->original_recv_initial_metadata_ready =
|
|
115
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
|
116
|
+
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
|
|
117
|
+
recv_initial_metadata_ready, calld,
|
|
118
|
+
grpc_schedule_on_exec_ctx);
|
|
119
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
|
120
|
+
&calld->recv_initial_metadata_ready;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Chain to next filter.
|
|
124
|
+
grpc_call_next_op(elem, batch);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const grpc_channel_filter grpc_client_load_reporting_filter = {
|
|
128
|
+
start_transport_stream_op_batch,
|
|
129
|
+
grpc_channel_next_op,
|
|
130
|
+
sizeof(call_data),
|
|
131
|
+
init_call_elem,
|
|
132
|
+
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
|
133
|
+
destroy_call_elem,
|
|
134
|
+
0, // sizeof(channel_data)
|
|
135
|
+
init_channel_elem,
|
|
136
|
+
destroy_channel_elem,
|
|
137
|
+
grpc_channel_next_get_info,
|
|
138
|
+
"client_load_reporting"};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2017 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
|
|
20
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
|
|
21
|
+
|
|
22
|
+
#include <grpc/support/port_platform.h>
|
|
23
|
+
|
|
24
|
+
#include "src/core/lib/channel/channel_stack.h"
|
|
25
|
+
|
|
26
|
+
extern const grpc_channel_filter grpc_client_load_reporting_filter;
|
|
27
|
+
|
|
28
|
+
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H \
|
|
29
|
+
*/
|
|
@@ -0,0 +1,1906 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/// Implementation of the gRPC LB policy.
|
|
20
|
+
///
|
|
21
|
+
/// This policy takes as input a list of resolved addresses, which must
|
|
22
|
+
/// include at least one balancer address.
|
|
23
|
+
///
|
|
24
|
+
/// An internal channel (\a lb_channel_) is created for the addresses
|
|
25
|
+
/// from that are balancers. This channel behaves just like a regular
|
|
26
|
+
/// channel that uses pick_first to select from the list of balancer
|
|
27
|
+
/// addresses.
|
|
28
|
+
///
|
|
29
|
+
/// The first time the policy gets a request for a pick, a ping, or to exit
|
|
30
|
+
/// the idle state, \a StartPickingLocked() is called. This method is
|
|
31
|
+
/// responsible for instantiating the internal *streaming* call to the LB
|
|
32
|
+
/// server (whichever address pick_first chose). The call will be complete
|
|
33
|
+
/// when either the balancer sends status or when we cancel the call (e.g.,
|
|
34
|
+
/// because we are shutting down). In needed, we retry the call. If we
|
|
35
|
+
/// received at least one valid message from the server, a new call attempt
|
|
36
|
+
/// will be made immediately; otherwise, we apply back-off delays between
|
|
37
|
+
/// attempts.
|
|
38
|
+
///
|
|
39
|
+
/// We maintain an internal round_robin policy instance for distributing
|
|
40
|
+
/// requests across backends. Whenever we receive a new serverlist from
|
|
41
|
+
/// the balancer, we update the round_robin policy with the new list of
|
|
42
|
+
/// addresses. If we cannot communicate with the balancer on startup,
|
|
43
|
+
/// however, we may enter fallback mode, in which case we will populate
|
|
44
|
+
/// the RR policy's addresses from the backend addresses returned by the
|
|
45
|
+
/// resolver.
|
|
46
|
+
///
|
|
47
|
+
/// Once an RR policy instance is in place (and getting updated as described),
|
|
48
|
+
/// calls for a pick, a ping, or a cancellation will be serviced right
|
|
49
|
+
/// away by forwarding them to the RR instance. Any time there's no RR
|
|
50
|
+
/// policy available (i.e., right after the creation of the gRPCLB policy),
|
|
51
|
+
/// pick and ping requests are added to a list of pending picks and pings
|
|
52
|
+
/// to be flushed and serviced when the RR policy instance becomes available.
|
|
53
|
+
///
|
|
54
|
+
/// \see https://github.com/grpc/grpc/blob/master/doc/load-balancing.md for the
|
|
55
|
+
/// high level design and details.
|
|
56
|
+
|
|
57
|
+
// With the addition of a libuv endpoint, sockaddr.h now includes uv.h when
|
|
58
|
+
// using that endpoint. Because of various transitive includes in uv.h,
|
|
59
|
+
// including windows.h on Windows, uv.h must be included before other system
|
|
60
|
+
// headers. Therefore, sockaddr.h must always be included first.
|
|
61
|
+
#include <grpc/support/port_platform.h>
|
|
62
|
+
|
|
63
|
+
#include "src/core/lib/iomgr/sockaddr.h"
|
|
64
|
+
#include "src/core/lib/iomgr/socket_utils.h"
|
|
65
|
+
|
|
66
|
+
#include <inttypes.h>
|
|
67
|
+
#include <limits.h>
|
|
68
|
+
#include <string.h>
|
|
69
|
+
|
|
70
|
+
#include <grpc/byte_buffer_reader.h>
|
|
71
|
+
#include <grpc/grpc.h>
|
|
72
|
+
#include <grpc/support/alloc.h>
|
|
73
|
+
#include <grpc/support/string_util.h>
|
|
74
|
+
#include <grpc/support/time.h>
|
|
75
|
+
|
|
76
|
+
#include "src/core/ext/filters/client_channel/client_channel.h"
|
|
77
|
+
#include "src/core/ext/filters/client_channel/client_channel_factory.h"
|
|
78
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
|
|
79
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
|
|
80
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
|
81
|
+
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
|
|
82
|
+
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
|
83
|
+
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
|
84
|
+
#include "src/core/ext/filters/client_channel/parse_address.h"
|
|
85
|
+
#include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
|
|
86
|
+
#include "src/core/ext/filters/client_channel/subchannel_index.h"
|
|
87
|
+
#include "src/core/lib/backoff/backoff.h"
|
|
88
|
+
#include "src/core/lib/channel/channel_args.h"
|
|
89
|
+
#include "src/core/lib/channel/channel_stack.h"
|
|
90
|
+
#include "src/core/lib/gpr/host_port.h"
|
|
91
|
+
#include "src/core/lib/gpr/string.h"
|
|
92
|
+
#include "src/core/lib/gprpp/manual_constructor.h"
|
|
93
|
+
#include "src/core/lib/gprpp/memory.h"
|
|
94
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
|
95
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
|
96
|
+
#include "src/core/lib/iomgr/combiner.h"
|
|
97
|
+
#include "src/core/lib/iomgr/sockaddr.h"
|
|
98
|
+
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
|
99
|
+
#include "src/core/lib/iomgr/timer.h"
|
|
100
|
+
#include "src/core/lib/slice/slice_hash_table.h"
|
|
101
|
+
#include "src/core/lib/slice/slice_internal.h"
|
|
102
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
|
103
|
+
#include "src/core/lib/surface/call.h"
|
|
104
|
+
#include "src/core/lib/surface/channel.h"
|
|
105
|
+
#include "src/core/lib/surface/channel_init.h"
|
|
106
|
+
#include "src/core/lib/transport/static_metadata.h"
|
|
107
|
+
|
|
108
|
+
#define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
|
109
|
+
#define GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
|
110
|
+
#define GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS 120
|
|
111
|
+
#define GRPC_GRPCLB_RECONNECT_JITTER 0.2
|
|
112
|
+
#define GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS 10000
|
|
113
|
+
|
|
114
|
+
namespace grpc_core {
|
|
115
|
+
|
|
116
|
+
TraceFlag grpc_lb_glb_trace(false, "glb");
|
|
117
|
+
|
|
118
|
+
namespace {
|
|
119
|
+
|
|
120
|
+
class GrpcLb : public LoadBalancingPolicy {
|
|
121
|
+
public:
|
|
122
|
+
GrpcLb(const grpc_lb_addresses* addresses, const Args& args);
|
|
123
|
+
|
|
124
|
+
void UpdateLocked(const grpc_channel_args& args) override;
|
|
125
|
+
bool PickLocked(PickState* pick) override;
|
|
126
|
+
void CancelPickLocked(PickState* pick, grpc_error* error) override;
|
|
127
|
+
void CancelMatchingPicksLocked(uint32_t initial_metadata_flags_mask,
|
|
128
|
+
uint32_t initial_metadata_flags_eq,
|
|
129
|
+
grpc_error* error) override;
|
|
130
|
+
void NotifyOnStateChangeLocked(grpc_connectivity_state* state,
|
|
131
|
+
grpc_closure* closure) override;
|
|
132
|
+
grpc_connectivity_state CheckConnectivityLocked(
|
|
133
|
+
grpc_error** connectivity_error) override;
|
|
134
|
+
void HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) override;
|
|
135
|
+
void PingOneLocked(grpc_closure* on_initiate, grpc_closure* on_ack) override;
|
|
136
|
+
void ExitIdleLocked() override;
|
|
137
|
+
|
|
138
|
+
private:
|
|
139
|
+
/// Linked list of pending pick requests. It stores all information needed to
|
|
140
|
+
/// eventually call (Round Robin's) pick() on them. They mainly stay pending
|
|
141
|
+
/// waiting for the RR policy to be created.
|
|
142
|
+
///
|
|
143
|
+
/// Note that when a pick is sent to the RR policy, we inject our own
|
|
144
|
+
/// on_complete callback, so that we can intercept the result before
|
|
145
|
+
/// invoking the original on_complete callback. This allows us to set the
|
|
146
|
+
/// LB token metadata and add client_stats to the call context.
|
|
147
|
+
/// See \a pending_pick_complete() for details.
|
|
148
|
+
struct PendingPick {
|
|
149
|
+
// The grpclb instance that created the wrapping. This instance is not
|
|
150
|
+
// owned; reference counts are untouched. It's used only for logging
|
|
151
|
+
// purposes.
|
|
152
|
+
GrpcLb* grpclb_policy;
|
|
153
|
+
// The original pick.
|
|
154
|
+
PickState* pick;
|
|
155
|
+
// Our on_complete closure and the original one.
|
|
156
|
+
grpc_closure on_complete;
|
|
157
|
+
grpc_closure* original_on_complete;
|
|
158
|
+
// The LB token associated with the pick. This is set via user_data in
|
|
159
|
+
// the pick.
|
|
160
|
+
grpc_mdelem lb_token;
|
|
161
|
+
// Stats for client-side load reporting. Note that this holds a
|
|
162
|
+
// reference, which must be either passed on via context or unreffed.
|
|
163
|
+
grpc_grpclb_client_stats* client_stats = nullptr;
|
|
164
|
+
// Next pending pick.
|
|
165
|
+
PendingPick* next = nullptr;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/// A linked list of pending pings waiting for the RR policy to be created.
|
|
169
|
+
struct PendingPing {
|
|
170
|
+
grpc_closure* on_initiate;
|
|
171
|
+
grpc_closure* on_ack;
|
|
172
|
+
PendingPing* next = nullptr;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/// Contains a call to the LB server and all the data related to the call.
|
|
176
|
+
class BalancerCallState
|
|
177
|
+
: public InternallyRefCountedWithTracing<BalancerCallState> {
|
|
178
|
+
public:
|
|
179
|
+
explicit BalancerCallState(
|
|
180
|
+
RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy);
|
|
181
|
+
|
|
182
|
+
// It's the caller's responsibility to ensure that Orphan() is called from
|
|
183
|
+
// inside the combiner.
|
|
184
|
+
void Orphan() override;
|
|
185
|
+
|
|
186
|
+
void StartQuery();
|
|
187
|
+
|
|
188
|
+
grpc_grpclb_client_stats* client_stats() const { return client_stats_; }
|
|
189
|
+
bool seen_initial_response() const { return seen_initial_response_; }
|
|
190
|
+
|
|
191
|
+
private:
|
|
192
|
+
~BalancerCallState();
|
|
193
|
+
|
|
194
|
+
GrpcLb* grpclb_policy() const {
|
|
195
|
+
return static_cast<GrpcLb*>(grpclb_policy_.get());
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
void ScheduleNextClientLoadReportLocked();
|
|
199
|
+
void SendClientLoadReportLocked();
|
|
200
|
+
|
|
201
|
+
static bool LoadReportCountersAreZero(grpc_grpclb_request* request);
|
|
202
|
+
|
|
203
|
+
static void MaybeSendClientLoadReportLocked(void* arg, grpc_error* error);
|
|
204
|
+
static void ClientLoadReportDoneLocked(void* arg, grpc_error* error);
|
|
205
|
+
static void OnInitialRequestSentLocked(void* arg, grpc_error* error);
|
|
206
|
+
static void OnBalancerMessageReceivedLocked(void* arg, grpc_error* error);
|
|
207
|
+
static void OnBalancerStatusReceivedLocked(void* arg, grpc_error* error);
|
|
208
|
+
|
|
209
|
+
// The owning LB policy.
|
|
210
|
+
RefCountedPtr<LoadBalancingPolicy> grpclb_policy_;
|
|
211
|
+
|
|
212
|
+
// The streaming call to the LB server. Always non-NULL.
|
|
213
|
+
grpc_call* lb_call_ = nullptr;
|
|
214
|
+
|
|
215
|
+
// recv_initial_metadata
|
|
216
|
+
grpc_metadata_array lb_initial_metadata_recv_;
|
|
217
|
+
|
|
218
|
+
// send_message
|
|
219
|
+
grpc_byte_buffer* send_message_payload_ = nullptr;
|
|
220
|
+
grpc_closure lb_on_initial_request_sent_;
|
|
221
|
+
|
|
222
|
+
// recv_message
|
|
223
|
+
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
|
224
|
+
grpc_closure lb_on_balancer_message_received_;
|
|
225
|
+
bool seen_initial_response_ = false;
|
|
226
|
+
|
|
227
|
+
// recv_trailing_metadata
|
|
228
|
+
grpc_closure lb_on_balancer_status_received_;
|
|
229
|
+
grpc_metadata_array lb_trailing_metadata_recv_;
|
|
230
|
+
grpc_status_code lb_call_status_;
|
|
231
|
+
grpc_slice lb_call_status_details_;
|
|
232
|
+
|
|
233
|
+
// The stats for client-side load reporting associated with this LB call.
|
|
234
|
+
// Created after the first serverlist is received.
|
|
235
|
+
grpc_grpclb_client_stats* client_stats_ = nullptr;
|
|
236
|
+
grpc_millis client_stats_report_interval_ = 0;
|
|
237
|
+
grpc_timer client_load_report_timer_;
|
|
238
|
+
bool client_load_report_timer_callback_pending_ = false;
|
|
239
|
+
bool last_client_load_report_counters_were_zero_ = false;
|
|
240
|
+
bool client_load_report_is_due_ = false;
|
|
241
|
+
// The closure used for either the load report timer or the callback for
|
|
242
|
+
// completion of sending the load report.
|
|
243
|
+
grpc_closure client_load_report_closure_;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
~GrpcLb();
|
|
247
|
+
|
|
248
|
+
void ShutdownLocked() override;
|
|
249
|
+
|
|
250
|
+
// Helper function used in ctor and UpdateLocked().
|
|
251
|
+
void ProcessChannelArgsLocked(const grpc_channel_args& args);
|
|
252
|
+
|
|
253
|
+
// Methods for dealing with the balancer channel and call.
|
|
254
|
+
void StartPickingLocked();
|
|
255
|
+
void StartBalancerCallLocked();
|
|
256
|
+
static void OnFallbackTimerLocked(void* arg, grpc_error* error);
|
|
257
|
+
void StartBalancerCallRetryTimerLocked();
|
|
258
|
+
static void OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error);
|
|
259
|
+
static void OnBalancerChannelConnectivityChangedLocked(void* arg,
|
|
260
|
+
grpc_error* error);
|
|
261
|
+
|
|
262
|
+
// Pending pick methods.
|
|
263
|
+
static void PendingPickSetMetadataAndContext(PendingPick* pp);
|
|
264
|
+
PendingPick* PendingPickCreate(PickState* pick);
|
|
265
|
+
void AddPendingPick(PendingPick* pp);
|
|
266
|
+
static void OnPendingPickComplete(void* arg, grpc_error* error);
|
|
267
|
+
|
|
268
|
+
// Pending ping methods.
|
|
269
|
+
void AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack);
|
|
270
|
+
|
|
271
|
+
// Methods for dealing with the RR policy.
|
|
272
|
+
void CreateOrUpdateRoundRobinPolicyLocked();
|
|
273
|
+
grpc_channel_args* CreateRoundRobinPolicyArgsLocked();
|
|
274
|
+
void CreateRoundRobinPolicyLocked(const Args& args);
|
|
275
|
+
bool PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp);
|
|
276
|
+
void UpdateConnectivityStateFromRoundRobinPolicyLocked(
|
|
277
|
+
grpc_error* rr_state_error);
|
|
278
|
+
static void OnRoundRobinConnectivityChangedLocked(void* arg,
|
|
279
|
+
grpc_error* error);
|
|
280
|
+
static void OnRoundRobinRequestReresolutionLocked(void* arg,
|
|
281
|
+
grpc_error* error);
|
|
282
|
+
|
|
283
|
+
// Who the client is trying to communicate with.
|
|
284
|
+
const char* server_name_ = nullptr;
|
|
285
|
+
|
|
286
|
+
// Current channel args from the resolver.
|
|
287
|
+
grpc_channel_args* args_ = nullptr;
|
|
288
|
+
|
|
289
|
+
// Internal state.
|
|
290
|
+
bool started_picking_ = false;
|
|
291
|
+
bool shutting_down_ = false;
|
|
292
|
+
grpc_connectivity_state_tracker state_tracker_;
|
|
293
|
+
|
|
294
|
+
// The channel for communicating with the LB server.
|
|
295
|
+
grpc_channel* lb_channel_ = nullptr;
|
|
296
|
+
grpc_connectivity_state lb_channel_connectivity_;
|
|
297
|
+
grpc_closure lb_channel_on_connectivity_changed_;
|
|
298
|
+
// Are we already watching the LB channel's connectivity?
|
|
299
|
+
bool watching_lb_channel_ = false;
|
|
300
|
+
// Response generator to inject address updates into lb_channel_.
|
|
301
|
+
RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
|
|
302
|
+
|
|
303
|
+
// The data associated with the current LB call. It holds a ref to this LB
|
|
304
|
+
// policy. It's initialized every time we query for backends. It's reset to
|
|
305
|
+
// NULL whenever the current LB call is no longer needed (e.g., the LB policy
|
|
306
|
+
// is shutting down, or the LB call has ended). A non-NULL lb_calld_ always
|
|
307
|
+
// contains a non-NULL lb_call_.
|
|
308
|
+
OrphanablePtr<BalancerCallState> lb_calld_;
|
|
309
|
+
// Timeout in milliseconds for the LB call. 0 means no deadline.
|
|
310
|
+
int lb_call_timeout_ms_ = 0;
|
|
311
|
+
// Balancer call retry state.
|
|
312
|
+
BackOff lb_call_backoff_;
|
|
313
|
+
bool retry_timer_callback_pending_ = false;
|
|
314
|
+
grpc_timer lb_call_retry_timer_;
|
|
315
|
+
grpc_closure lb_on_call_retry_;
|
|
316
|
+
|
|
317
|
+
// The deserialized response from the balancer. May be nullptr until one
|
|
318
|
+
// such response has arrived.
|
|
319
|
+
grpc_grpclb_serverlist* serverlist_ = nullptr;
|
|
320
|
+
// Index into serverlist for next pick.
|
|
321
|
+
// If the server at this index is a drop, we return a drop.
|
|
322
|
+
// Otherwise, we delegate to the RR policy.
|
|
323
|
+
size_t serverlist_index_ = 0;
|
|
324
|
+
|
|
325
|
+
// Timeout in milliseconds for before using fallback backend addresses.
|
|
326
|
+
// 0 means not using fallback.
|
|
327
|
+
int lb_fallback_timeout_ms_ = 0;
|
|
328
|
+
// The backend addresses from the resolver.
|
|
329
|
+
grpc_lb_addresses* fallback_backend_addresses_ = nullptr;
|
|
330
|
+
// Fallback timer.
|
|
331
|
+
bool fallback_timer_callback_pending_ = false;
|
|
332
|
+
grpc_timer lb_fallback_timer_;
|
|
333
|
+
grpc_closure lb_on_fallback_;
|
|
334
|
+
|
|
335
|
+
// Pending picks and pings that are waiting on the RR policy's connectivity.
|
|
336
|
+
PendingPick* pending_picks_ = nullptr;
|
|
337
|
+
PendingPing* pending_pings_ = nullptr;
|
|
338
|
+
|
|
339
|
+
// The RR policy to use for the backends.
|
|
340
|
+
OrphanablePtr<LoadBalancingPolicy> rr_policy_;
|
|
341
|
+
grpc_connectivity_state rr_connectivity_state_;
|
|
342
|
+
grpc_closure on_rr_connectivity_changed_;
|
|
343
|
+
grpc_closure on_rr_request_reresolution_;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
//
|
|
347
|
+
// serverlist parsing code
|
|
348
|
+
//
|
|
349
|
+
|
|
350
|
+
// vtable for LB tokens in grpc_lb_addresses
|
|
351
|
+
void* lb_token_copy(void* token) {
|
|
352
|
+
return token == nullptr
|
|
353
|
+
? nullptr
|
|
354
|
+
: (void*)GRPC_MDELEM_REF(grpc_mdelem{(uintptr_t)token}).payload;
|
|
355
|
+
}
|
|
356
|
+
void lb_token_destroy(void* token) {
|
|
357
|
+
if (token != nullptr) {
|
|
358
|
+
GRPC_MDELEM_UNREF(grpc_mdelem{(uintptr_t)token});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
int lb_token_cmp(void* token1, void* token2) {
|
|
362
|
+
if (token1 > token2) return 1;
|
|
363
|
+
if (token1 < token2) return -1;
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
const grpc_lb_user_data_vtable lb_token_vtable = {
|
|
367
|
+
lb_token_copy, lb_token_destroy, lb_token_cmp};
|
|
368
|
+
|
|
369
|
+
// Returns the backend addresses extracted from the given addresses.
|
|
370
|
+
grpc_lb_addresses* ExtractBackendAddresses(const grpc_lb_addresses* addresses) {
|
|
371
|
+
// First pass: count the number of backend addresses.
|
|
372
|
+
size_t num_backends = 0;
|
|
373
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
|
374
|
+
if (!addresses->addresses[i].is_balancer) {
|
|
375
|
+
++num_backends;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Second pass: actually populate the addresses and (empty) LB tokens.
|
|
379
|
+
grpc_lb_addresses* backend_addresses =
|
|
380
|
+
grpc_lb_addresses_create(num_backends, &lb_token_vtable);
|
|
381
|
+
size_t num_copied = 0;
|
|
382
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
|
383
|
+
if (addresses->addresses[i].is_balancer) continue;
|
|
384
|
+
const grpc_resolved_address* addr = &addresses->addresses[i].address;
|
|
385
|
+
grpc_lb_addresses_set_address(backend_addresses, num_copied, &addr->addr,
|
|
386
|
+
addr->len, false /* is_balancer */,
|
|
387
|
+
nullptr /* balancer_name */,
|
|
388
|
+
(void*)GRPC_MDELEM_LB_TOKEN_EMPTY.payload);
|
|
389
|
+
++num_copied;
|
|
390
|
+
}
|
|
391
|
+
return backend_addresses;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
bool IsServerValid(const grpc_grpclb_server* server, size_t idx, bool log) {
|
|
395
|
+
if (server->drop) return false;
|
|
396
|
+
const grpc_grpclb_ip_address* ip = &server->ip_address;
|
|
397
|
+
if (server->port >> 16 != 0) {
|
|
398
|
+
if (log) {
|
|
399
|
+
gpr_log(GPR_ERROR,
|
|
400
|
+
"Invalid port '%d' at index %lu of serverlist. Ignoring.",
|
|
401
|
+
server->port, (unsigned long)idx);
|
|
402
|
+
}
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
if (ip->size != 4 && ip->size != 16) {
|
|
406
|
+
if (log) {
|
|
407
|
+
gpr_log(GPR_ERROR,
|
|
408
|
+
"Expected IP to be 4 or 16 bytes, got %d at index %lu of "
|
|
409
|
+
"serverlist. Ignoring",
|
|
410
|
+
ip->size, (unsigned long)idx);
|
|
411
|
+
}
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
void ParseServer(const grpc_grpclb_server* server,
|
|
418
|
+
grpc_resolved_address* addr) {
|
|
419
|
+
memset(addr, 0, sizeof(*addr));
|
|
420
|
+
if (server->drop) return;
|
|
421
|
+
const uint16_t netorder_port = grpc_htons((uint16_t)server->port);
|
|
422
|
+
/* the addresses are given in binary format (a in(6)_addr struct) in
|
|
423
|
+
* server->ip_address.bytes. */
|
|
424
|
+
const grpc_grpclb_ip_address* ip = &server->ip_address;
|
|
425
|
+
if (ip->size == 4) {
|
|
426
|
+
addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
|
|
427
|
+
grpc_sockaddr_in* addr4 = reinterpret_cast<grpc_sockaddr_in*>(&addr->addr);
|
|
428
|
+
addr4->sin_family = GRPC_AF_INET;
|
|
429
|
+
memcpy(&addr4->sin_addr, ip->bytes, ip->size);
|
|
430
|
+
addr4->sin_port = netorder_port;
|
|
431
|
+
} else if (ip->size == 16) {
|
|
432
|
+
addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
|
|
433
|
+
grpc_sockaddr_in6* addr6 = (grpc_sockaddr_in6*)&addr->addr;
|
|
434
|
+
addr6->sin6_family = GRPC_AF_INET6;
|
|
435
|
+
memcpy(&addr6->sin6_addr, ip->bytes, ip->size);
|
|
436
|
+
addr6->sin6_port = netorder_port;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Returns addresses extracted from \a serverlist.
|
|
441
|
+
grpc_lb_addresses* ProcessServerlist(const grpc_grpclb_serverlist* serverlist) {
|
|
442
|
+
size_t num_valid = 0;
|
|
443
|
+
/* first pass: count how many are valid in order to allocate the necessary
|
|
444
|
+
* memory in a single block */
|
|
445
|
+
for (size_t i = 0; i < serverlist->num_servers; ++i) {
|
|
446
|
+
if (IsServerValid(serverlist->servers[i], i, true)) ++num_valid;
|
|
447
|
+
}
|
|
448
|
+
grpc_lb_addresses* lb_addresses =
|
|
449
|
+
grpc_lb_addresses_create(num_valid, &lb_token_vtable);
|
|
450
|
+
/* second pass: actually populate the addresses and LB tokens (aka user data
|
|
451
|
+
* to the outside world) to be read by the RR policy during its creation.
|
|
452
|
+
* Given that the validity tests are very cheap, they are performed again
|
|
453
|
+
* instead of marking the valid ones during the first pass, as this would
|
|
454
|
+
* incurr in an allocation due to the arbitrary number of server */
|
|
455
|
+
size_t addr_idx = 0;
|
|
456
|
+
for (size_t sl_idx = 0; sl_idx < serverlist->num_servers; ++sl_idx) {
|
|
457
|
+
const grpc_grpclb_server* server = serverlist->servers[sl_idx];
|
|
458
|
+
if (!IsServerValid(serverlist->servers[sl_idx], sl_idx, false)) continue;
|
|
459
|
+
GPR_ASSERT(addr_idx < num_valid);
|
|
460
|
+
/* address processing */
|
|
461
|
+
grpc_resolved_address addr;
|
|
462
|
+
ParseServer(server, &addr);
|
|
463
|
+
/* lb token processing */
|
|
464
|
+
void* user_data;
|
|
465
|
+
if (server->has_load_balance_token) {
|
|
466
|
+
const size_t lb_token_max_length =
|
|
467
|
+
GPR_ARRAY_SIZE(server->load_balance_token);
|
|
468
|
+
const size_t lb_token_length =
|
|
469
|
+
strnlen(server->load_balance_token, lb_token_max_length);
|
|
470
|
+
grpc_slice lb_token_mdstr = grpc_slice_from_copied_buffer(
|
|
471
|
+
server->load_balance_token, lb_token_length);
|
|
472
|
+
user_data =
|
|
473
|
+
(void*)grpc_mdelem_from_slices(GRPC_MDSTR_LB_TOKEN, lb_token_mdstr)
|
|
474
|
+
.payload;
|
|
475
|
+
} else {
|
|
476
|
+
char* uri = grpc_sockaddr_to_uri(&addr);
|
|
477
|
+
gpr_log(GPR_INFO,
|
|
478
|
+
"Missing LB token for backend address '%s'. The empty token will "
|
|
479
|
+
"be used instead",
|
|
480
|
+
uri);
|
|
481
|
+
gpr_free(uri);
|
|
482
|
+
user_data = (void*)GRPC_MDELEM_LB_TOKEN_EMPTY.payload;
|
|
483
|
+
}
|
|
484
|
+
grpc_lb_addresses_set_address(lb_addresses, addr_idx, &addr.addr, addr.len,
|
|
485
|
+
false /* is_balancer */,
|
|
486
|
+
nullptr /* balancer_name */, user_data);
|
|
487
|
+
++addr_idx;
|
|
488
|
+
}
|
|
489
|
+
GPR_ASSERT(addr_idx == num_valid);
|
|
490
|
+
return lb_addresses;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
//
|
|
494
|
+
// GrpcLb::BalancerCallState
|
|
495
|
+
//
|
|
496
|
+
|
|
497
|
+
GrpcLb::BalancerCallState::BalancerCallState(
|
|
498
|
+
RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy)
|
|
499
|
+
: InternallyRefCountedWithTracing<BalancerCallState>(&grpc_lb_glb_trace),
|
|
500
|
+
grpclb_policy_(std::move(parent_grpclb_policy)) {
|
|
501
|
+
GPR_ASSERT(grpclb_policy_ != nullptr);
|
|
502
|
+
GPR_ASSERT(!grpclb_policy()->shutting_down_);
|
|
503
|
+
// Init the LB call. Note that the LB call will progress every time there's
|
|
504
|
+
// activity in grpclb_policy_->interested_parties(), which is comprised of
|
|
505
|
+
// the polling entities from client_channel.
|
|
506
|
+
GPR_ASSERT(grpclb_policy()->server_name_ != nullptr);
|
|
507
|
+
GPR_ASSERT(grpclb_policy()->server_name_[0] != '\0');
|
|
508
|
+
const grpc_millis deadline =
|
|
509
|
+
grpclb_policy()->lb_call_timeout_ms_ == 0
|
|
510
|
+
? GRPC_MILLIS_INF_FUTURE
|
|
511
|
+
: ExecCtx::Get()->Now() + grpclb_policy()->lb_call_timeout_ms_;
|
|
512
|
+
lb_call_ = grpc_channel_create_pollset_set_call(
|
|
513
|
+
grpclb_policy()->lb_channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
|
|
514
|
+
grpclb_policy_->interested_parties(),
|
|
515
|
+
GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD,
|
|
516
|
+
nullptr, deadline, nullptr);
|
|
517
|
+
// Init the LB call request payload.
|
|
518
|
+
grpc_grpclb_request* request =
|
|
519
|
+
grpc_grpclb_request_create(grpclb_policy()->server_name_);
|
|
520
|
+
grpc_slice request_payload_slice = grpc_grpclb_request_encode(request);
|
|
521
|
+
send_message_payload_ =
|
|
522
|
+
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
|
523
|
+
grpc_slice_unref_internal(request_payload_slice);
|
|
524
|
+
grpc_grpclb_request_destroy(request);
|
|
525
|
+
// Init other data associated with the LB call.
|
|
526
|
+
grpc_metadata_array_init(&lb_initial_metadata_recv_);
|
|
527
|
+
grpc_metadata_array_init(&lb_trailing_metadata_recv_);
|
|
528
|
+
GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSentLocked,
|
|
529
|
+
this, grpc_combiner_scheduler(grpclb_policy()->combiner()));
|
|
530
|
+
GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_,
|
|
531
|
+
OnBalancerMessageReceivedLocked, this,
|
|
532
|
+
grpc_combiner_scheduler(grpclb_policy()->combiner()));
|
|
533
|
+
GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_,
|
|
534
|
+
OnBalancerStatusReceivedLocked, this,
|
|
535
|
+
grpc_combiner_scheduler(grpclb_policy()->combiner()));
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
GrpcLb::BalancerCallState::~BalancerCallState() {
|
|
539
|
+
GPR_ASSERT(lb_call_ != nullptr);
|
|
540
|
+
grpc_call_unref(lb_call_);
|
|
541
|
+
grpc_metadata_array_destroy(&lb_initial_metadata_recv_);
|
|
542
|
+
grpc_metadata_array_destroy(&lb_trailing_metadata_recv_);
|
|
543
|
+
grpc_byte_buffer_destroy(send_message_payload_);
|
|
544
|
+
grpc_byte_buffer_destroy(recv_message_payload_);
|
|
545
|
+
grpc_slice_unref_internal(lb_call_status_details_);
|
|
546
|
+
if (client_stats_ != nullptr) {
|
|
547
|
+
grpc_grpclb_client_stats_unref(client_stats_);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
void GrpcLb::BalancerCallState::Orphan() {
|
|
552
|
+
GPR_ASSERT(lb_call_ != nullptr);
|
|
553
|
+
// If we are here because grpclb_policy wants to cancel the call,
|
|
554
|
+
// lb_on_balancer_status_received_ will complete the cancellation and clean
|
|
555
|
+
// up. Otherwise, we are here because grpclb_policy has to orphan a failed
|
|
556
|
+
// call, then the following cancellation will be a no-op.
|
|
557
|
+
grpc_call_cancel(lb_call_, nullptr);
|
|
558
|
+
if (client_load_report_timer_callback_pending_) {
|
|
559
|
+
grpc_timer_cancel(&client_load_report_timer_);
|
|
560
|
+
}
|
|
561
|
+
// Note that the initial ref is hold by lb_on_balancer_status_received_
|
|
562
|
+
// instead of the caller of this function. So the corresponding unref happens
|
|
563
|
+
// in lb_on_balancer_status_received_ instead of here.
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
void GrpcLb::BalancerCallState::StartQuery() {
|
|
567
|
+
GPR_ASSERT(lb_call_ != nullptr);
|
|
568
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
569
|
+
gpr_log(GPR_INFO,
|
|
570
|
+
"[grpclb %p] Starting LB call (lb_calld: %p, lb_call: %p)",
|
|
571
|
+
grpclb_policy_.get(), this, lb_call_);
|
|
572
|
+
}
|
|
573
|
+
// Create the ops.
|
|
574
|
+
grpc_call_error call_error;
|
|
575
|
+
grpc_op ops[3];
|
|
576
|
+
memset(ops, 0, sizeof(ops));
|
|
577
|
+
// Op: send initial metadata.
|
|
578
|
+
grpc_op* op = ops;
|
|
579
|
+
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
|
580
|
+
op->data.send_initial_metadata.count = 0;
|
|
581
|
+
op->flags = 0;
|
|
582
|
+
op->reserved = nullptr;
|
|
583
|
+
op++;
|
|
584
|
+
// Op: send request message.
|
|
585
|
+
GPR_ASSERT(send_message_payload_ != nullptr);
|
|
586
|
+
op->op = GRPC_OP_SEND_MESSAGE;
|
|
587
|
+
op->data.send_message.send_message = send_message_payload_;
|
|
588
|
+
op->flags = 0;
|
|
589
|
+
op->reserved = nullptr;
|
|
590
|
+
op++;
|
|
591
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
592
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
593
|
+
// with the callback.
|
|
594
|
+
auto self = Ref(DEBUG_LOCATION, "on_initial_request_sent");
|
|
595
|
+
self.release();
|
|
596
|
+
call_error = grpc_call_start_batch_and_execute(
|
|
597
|
+
lb_call_, ops, (size_t)(op - ops), &lb_on_initial_request_sent_);
|
|
598
|
+
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
|
599
|
+
// Op: recv initial metadata.
|
|
600
|
+
op = ops;
|
|
601
|
+
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
|
602
|
+
op->data.recv_initial_metadata.recv_initial_metadata =
|
|
603
|
+
&lb_initial_metadata_recv_;
|
|
604
|
+
op->flags = 0;
|
|
605
|
+
op->reserved = nullptr;
|
|
606
|
+
op++;
|
|
607
|
+
// Op: recv response.
|
|
608
|
+
op->op = GRPC_OP_RECV_MESSAGE;
|
|
609
|
+
op->data.recv_message.recv_message = &recv_message_payload_;
|
|
610
|
+
op->flags = 0;
|
|
611
|
+
op->reserved = nullptr;
|
|
612
|
+
op++;
|
|
613
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
614
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
615
|
+
// with the callback.
|
|
616
|
+
self = Ref(DEBUG_LOCATION, "on_message_received");
|
|
617
|
+
self.release();
|
|
618
|
+
call_error = grpc_call_start_batch_and_execute(
|
|
619
|
+
lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_message_received_);
|
|
620
|
+
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
|
621
|
+
// Op: recv server status.
|
|
622
|
+
op = ops;
|
|
623
|
+
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
|
624
|
+
op->data.recv_status_on_client.trailing_metadata =
|
|
625
|
+
&lb_trailing_metadata_recv_;
|
|
626
|
+
op->data.recv_status_on_client.status = &lb_call_status_;
|
|
627
|
+
op->data.recv_status_on_client.status_details = &lb_call_status_details_;
|
|
628
|
+
op->flags = 0;
|
|
629
|
+
op->reserved = nullptr;
|
|
630
|
+
op++;
|
|
631
|
+
// This callback signals the end of the LB call, so it relies on the initial
|
|
632
|
+
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
|
633
|
+
// unreffed.
|
|
634
|
+
call_error = grpc_call_start_batch_and_execute(
|
|
635
|
+
lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_status_received_);
|
|
636
|
+
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() {
|
|
640
|
+
const grpc_millis next_client_load_report_time =
|
|
641
|
+
ExecCtx::Get()->Now() + client_stats_report_interval_;
|
|
642
|
+
GRPC_CLOSURE_INIT(&client_load_report_closure_,
|
|
643
|
+
MaybeSendClientLoadReportLocked, this,
|
|
644
|
+
grpc_combiner_scheduler(grpclb_policy()->combiner()));
|
|
645
|
+
grpc_timer_init(&client_load_report_timer_, next_client_load_report_time,
|
|
646
|
+
&client_load_report_closure_);
|
|
647
|
+
client_load_report_timer_callback_pending_ = true;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked(
|
|
651
|
+
void* arg, grpc_error* error) {
|
|
652
|
+
BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
|
|
653
|
+
GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
|
|
654
|
+
lb_calld->client_load_report_timer_callback_pending_ = false;
|
|
655
|
+
if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
|
|
656
|
+
lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
// If we've already sent the initial request, then we can go ahead and send
|
|
660
|
+
// the load report. Otherwise, we need to wait until the initial request has
|
|
661
|
+
// been sent to send this (see OnInitialRequestSentLocked()).
|
|
662
|
+
if (lb_calld->send_message_payload_ == nullptr) {
|
|
663
|
+
lb_calld->SendClientLoadReportLocked();
|
|
664
|
+
} else {
|
|
665
|
+
lb_calld->client_load_report_is_due_ = true;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
bool GrpcLb::BalancerCallState::LoadReportCountersAreZero(
|
|
670
|
+
grpc_grpclb_request* request) {
|
|
671
|
+
grpc_grpclb_dropped_call_counts* drop_entries =
|
|
672
|
+
static_cast<grpc_grpclb_dropped_call_counts*>(
|
|
673
|
+
request->client_stats.calls_finished_with_drop.arg);
|
|
674
|
+
return request->client_stats.num_calls_started == 0 &&
|
|
675
|
+
request->client_stats.num_calls_finished == 0 &&
|
|
676
|
+
request->client_stats.num_calls_finished_with_client_failed_to_send ==
|
|
677
|
+
0 &&
|
|
678
|
+
request->client_stats.num_calls_finished_known_received == 0 &&
|
|
679
|
+
(drop_entries == nullptr || drop_entries->num_entries == 0);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
|
|
683
|
+
// Construct message payload.
|
|
684
|
+
GPR_ASSERT(send_message_payload_ == nullptr);
|
|
685
|
+
grpc_grpclb_request* request =
|
|
686
|
+
grpc_grpclb_load_report_request_create_locked(client_stats_);
|
|
687
|
+
// Skip client load report if the counters were all zero in the last
|
|
688
|
+
// report and they are still zero in this one.
|
|
689
|
+
if (LoadReportCountersAreZero(request)) {
|
|
690
|
+
if (last_client_load_report_counters_were_zero_) {
|
|
691
|
+
grpc_grpclb_request_destroy(request);
|
|
692
|
+
ScheduleNextClientLoadReportLocked();
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
last_client_load_report_counters_were_zero_ = true;
|
|
696
|
+
} else {
|
|
697
|
+
last_client_load_report_counters_were_zero_ = false;
|
|
698
|
+
}
|
|
699
|
+
grpc_slice request_payload_slice = grpc_grpclb_request_encode(request);
|
|
700
|
+
send_message_payload_ =
|
|
701
|
+
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
|
702
|
+
grpc_slice_unref_internal(request_payload_slice);
|
|
703
|
+
grpc_grpclb_request_destroy(request);
|
|
704
|
+
// Send the report.
|
|
705
|
+
grpc_op op;
|
|
706
|
+
memset(&op, 0, sizeof(op));
|
|
707
|
+
op.op = GRPC_OP_SEND_MESSAGE;
|
|
708
|
+
op.data.send_message.send_message = send_message_payload_;
|
|
709
|
+
GRPC_CLOSURE_INIT(&client_load_report_closure_, ClientLoadReportDoneLocked,
|
|
710
|
+
this, grpc_combiner_scheduler(grpclb_policy()->combiner()));
|
|
711
|
+
grpc_call_error call_error = grpc_call_start_batch_and_execute(
|
|
712
|
+
lb_call_, &op, 1, &client_load_report_closure_);
|
|
713
|
+
if (call_error != GRPC_CALL_OK) {
|
|
714
|
+
gpr_log(GPR_ERROR, "[grpclb %p] call_error=%d", grpclb_policy_.get(),
|
|
715
|
+
call_error);
|
|
716
|
+
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg,
|
|
721
|
+
grpc_error* error) {
|
|
722
|
+
BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
|
|
723
|
+
GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
|
|
724
|
+
grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
|
|
725
|
+
lb_calld->send_message_payload_ = nullptr;
|
|
726
|
+
if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
|
|
727
|
+
lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
lb_calld->ScheduleNextClientLoadReportLocked();
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
void GrpcLb::BalancerCallState::OnInitialRequestSentLocked(void* arg,
|
|
734
|
+
grpc_error* error) {
|
|
735
|
+
BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
|
|
736
|
+
grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
|
|
737
|
+
lb_calld->send_message_payload_ = nullptr;
|
|
738
|
+
// If we attempted to send a client load report before the initial request was
|
|
739
|
+
// sent (and this lb_calld is still in use), send the load report now.
|
|
740
|
+
if (lb_calld->client_load_report_is_due_ &&
|
|
741
|
+
lb_calld == lb_calld->grpclb_policy()->lb_calld_.get()) {
|
|
742
|
+
lb_calld->SendClientLoadReportLocked();
|
|
743
|
+
lb_calld->client_load_report_is_due_ = false;
|
|
744
|
+
}
|
|
745
|
+
lb_calld->Unref(DEBUG_LOCATION, "on_initial_request_sent");
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
|
|
749
|
+
void* arg, grpc_error* error) {
|
|
750
|
+
BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
|
|
751
|
+
GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
|
|
752
|
+
// Empty payload means the LB call was cancelled.
|
|
753
|
+
if (lb_calld != grpclb_policy->lb_calld_.get() ||
|
|
754
|
+
lb_calld->recv_message_payload_ == nullptr) {
|
|
755
|
+
lb_calld->Unref(DEBUG_LOCATION, "on_message_received");
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
grpc_byte_buffer_reader bbr;
|
|
759
|
+
grpc_byte_buffer_reader_init(&bbr, lb_calld->recv_message_payload_);
|
|
760
|
+
grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
|
|
761
|
+
grpc_byte_buffer_reader_destroy(&bbr);
|
|
762
|
+
grpc_byte_buffer_destroy(lb_calld->recv_message_payload_);
|
|
763
|
+
lb_calld->recv_message_payload_ = nullptr;
|
|
764
|
+
grpc_grpclb_initial_response* initial_response;
|
|
765
|
+
grpc_grpclb_serverlist* serverlist;
|
|
766
|
+
if (!lb_calld->seen_initial_response_ &&
|
|
767
|
+
(initial_response = grpc_grpclb_initial_response_parse(response_slice)) !=
|
|
768
|
+
nullptr) {
|
|
769
|
+
// Have NOT seen initial response, look for initial response.
|
|
770
|
+
if (initial_response->has_client_stats_report_interval) {
|
|
771
|
+
lb_calld->client_stats_report_interval_ = GPR_MAX(
|
|
772
|
+
GPR_MS_PER_SEC, grpc_grpclb_duration_to_millis(
|
|
773
|
+
&initial_response->client_stats_report_interval));
|
|
774
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
775
|
+
gpr_log(GPR_INFO,
|
|
776
|
+
"[grpclb %p] Received initial LB response message; "
|
|
777
|
+
"client load reporting interval = %" PRIdPTR " milliseconds",
|
|
778
|
+
grpclb_policy, lb_calld->client_stats_report_interval_);
|
|
779
|
+
}
|
|
780
|
+
} else if (grpc_lb_glb_trace.enabled()) {
|
|
781
|
+
gpr_log(GPR_INFO,
|
|
782
|
+
"[grpclb %p] Received initial LB response message; client load "
|
|
783
|
+
"reporting NOT enabled",
|
|
784
|
+
grpclb_policy);
|
|
785
|
+
}
|
|
786
|
+
grpc_grpclb_initial_response_destroy(initial_response);
|
|
787
|
+
lb_calld->seen_initial_response_ = true;
|
|
788
|
+
} else if ((serverlist = grpc_grpclb_response_parse_serverlist(
|
|
789
|
+
response_slice)) != nullptr) {
|
|
790
|
+
// Have seen initial response, look for serverlist.
|
|
791
|
+
GPR_ASSERT(lb_calld->lb_call_ != nullptr);
|
|
792
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
793
|
+
gpr_log(GPR_INFO,
|
|
794
|
+
"[grpclb %p] Serverlist with %" PRIuPTR " servers received",
|
|
795
|
+
grpclb_policy, serverlist->num_servers);
|
|
796
|
+
for (size_t i = 0; i < serverlist->num_servers; ++i) {
|
|
797
|
+
grpc_resolved_address addr;
|
|
798
|
+
ParseServer(serverlist->servers[i], &addr);
|
|
799
|
+
char* ipport;
|
|
800
|
+
grpc_sockaddr_to_string(&ipport, &addr, false);
|
|
801
|
+
gpr_log(GPR_INFO, "[grpclb %p] Serverlist[%" PRIuPTR "]: %s",
|
|
802
|
+
grpclb_policy, i, ipport);
|
|
803
|
+
gpr_free(ipport);
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
/* update serverlist */
|
|
807
|
+
if (serverlist->num_servers > 0) {
|
|
808
|
+
// Start sending client load report only after we start using the
|
|
809
|
+
// serverlist returned from the current LB call.
|
|
810
|
+
if (lb_calld->client_stats_report_interval_ > 0 &&
|
|
811
|
+
lb_calld->client_stats_ == nullptr) {
|
|
812
|
+
lb_calld->client_stats_ = grpc_grpclb_client_stats_create();
|
|
813
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
814
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
815
|
+
// with the callback.
|
|
816
|
+
auto self = lb_calld->Ref(DEBUG_LOCATION, "client_load_report");
|
|
817
|
+
self.release();
|
|
818
|
+
lb_calld->ScheduleNextClientLoadReportLocked();
|
|
819
|
+
}
|
|
820
|
+
if (grpc_grpclb_serverlist_equals(grpclb_policy->serverlist_,
|
|
821
|
+
serverlist)) {
|
|
822
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
823
|
+
gpr_log(GPR_INFO,
|
|
824
|
+
"[grpclb %p] Incoming server list identical to current, "
|
|
825
|
+
"ignoring.",
|
|
826
|
+
grpclb_policy);
|
|
827
|
+
}
|
|
828
|
+
grpc_grpclb_destroy_serverlist(serverlist);
|
|
829
|
+
} else { /* new serverlist */
|
|
830
|
+
if (grpclb_policy->serverlist_ != nullptr) {
|
|
831
|
+
/* dispose of the old serverlist */
|
|
832
|
+
grpc_grpclb_destroy_serverlist(grpclb_policy->serverlist_);
|
|
833
|
+
} else {
|
|
834
|
+
/* or dispose of the fallback */
|
|
835
|
+
grpc_lb_addresses_destroy(grpclb_policy->fallback_backend_addresses_);
|
|
836
|
+
grpclb_policy->fallback_backend_addresses_ = nullptr;
|
|
837
|
+
if (grpclb_policy->fallback_timer_callback_pending_) {
|
|
838
|
+
grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// and update the copy in the GrpcLb instance. This
|
|
842
|
+
// serverlist instance will be destroyed either upon the next
|
|
843
|
+
// update or when the GrpcLb instance is destroyed.
|
|
844
|
+
grpclb_policy->serverlist_ = serverlist;
|
|
845
|
+
grpclb_policy->serverlist_index_ = 0;
|
|
846
|
+
grpclb_policy->CreateOrUpdateRoundRobinPolicyLocked();
|
|
847
|
+
}
|
|
848
|
+
} else {
|
|
849
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
850
|
+
gpr_log(GPR_INFO, "[grpclb %p] Received empty server list, ignoring.",
|
|
851
|
+
grpclb_policy);
|
|
852
|
+
}
|
|
853
|
+
grpc_grpclb_destroy_serverlist(serverlist);
|
|
854
|
+
}
|
|
855
|
+
} else {
|
|
856
|
+
// No valid initial response or serverlist found.
|
|
857
|
+
gpr_log(GPR_ERROR,
|
|
858
|
+
"[grpclb %p] Invalid LB response received: '%s'. Ignoring.",
|
|
859
|
+
grpclb_policy,
|
|
860
|
+
grpc_dump_slice(response_slice, GPR_DUMP_ASCII | GPR_DUMP_HEX));
|
|
861
|
+
}
|
|
862
|
+
grpc_slice_unref_internal(response_slice);
|
|
863
|
+
if (!grpclb_policy->shutting_down_) {
|
|
864
|
+
// Keep listening for serverlist updates.
|
|
865
|
+
grpc_op op;
|
|
866
|
+
memset(&op, 0, sizeof(op));
|
|
867
|
+
op.op = GRPC_OP_RECV_MESSAGE;
|
|
868
|
+
op.data.recv_message.recv_message = &lb_calld->recv_message_payload_;
|
|
869
|
+
op.flags = 0;
|
|
870
|
+
op.reserved = nullptr;
|
|
871
|
+
// Reuse the "OnBalancerMessageReceivedLocked" ref taken in StartQuery().
|
|
872
|
+
const grpc_call_error call_error = grpc_call_start_batch_and_execute(
|
|
873
|
+
lb_calld->lb_call_, &op, 1,
|
|
874
|
+
&lb_calld->lb_on_balancer_message_received_);
|
|
875
|
+
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
|
876
|
+
} else {
|
|
877
|
+
lb_calld->Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown");
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
|
|
882
|
+
void* arg, grpc_error* error) {
|
|
883
|
+
BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
|
|
884
|
+
GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
|
|
885
|
+
GPR_ASSERT(lb_calld->lb_call_ != nullptr);
|
|
886
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
887
|
+
char* status_details =
|
|
888
|
+
grpc_slice_to_c_string(lb_calld->lb_call_status_details_);
|
|
889
|
+
gpr_log(GPR_INFO,
|
|
890
|
+
"[grpclb %p] Status from LB server received. Status = %d, details "
|
|
891
|
+
"= '%s', (lb_calld: %p, lb_call: %p), error '%s'",
|
|
892
|
+
grpclb_policy, lb_calld->lb_call_status_, status_details, lb_calld,
|
|
893
|
+
lb_calld->lb_call_, grpc_error_string(error));
|
|
894
|
+
gpr_free(status_details);
|
|
895
|
+
}
|
|
896
|
+
grpclb_policy->TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_NONE);
|
|
897
|
+
// If this lb_calld is still in use, this call ended because of a failure so
|
|
898
|
+
// we want to retry connecting. Otherwise, we have deliberately ended this
|
|
899
|
+
// call and no further action is required.
|
|
900
|
+
if (lb_calld == grpclb_policy->lb_calld_.get()) {
|
|
901
|
+
grpclb_policy->lb_calld_.reset();
|
|
902
|
+
GPR_ASSERT(!grpclb_policy->shutting_down_);
|
|
903
|
+
if (lb_calld->seen_initial_response_) {
|
|
904
|
+
// If we lose connection to the LB server, reset the backoff and restart
|
|
905
|
+
// the LB call immediately.
|
|
906
|
+
grpclb_policy->lb_call_backoff_.Reset();
|
|
907
|
+
grpclb_policy->StartBalancerCallLocked();
|
|
908
|
+
} else {
|
|
909
|
+
// If this LB call fails establishing any connection to the LB server,
|
|
910
|
+
// retry later.
|
|
911
|
+
grpclb_policy->StartBalancerCallRetryTimerLocked();
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
lb_calld->Unref(DEBUG_LOCATION, "lb_call_ended");
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
//
|
|
918
|
+
// helper code for creating balancer channel
|
|
919
|
+
//
|
|
920
|
+
|
|
921
|
+
grpc_lb_addresses* ExtractBalancerAddresses(
|
|
922
|
+
const grpc_lb_addresses* addresses) {
|
|
923
|
+
size_t num_grpclb_addrs = 0;
|
|
924
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
|
925
|
+
if (addresses->addresses[i].is_balancer) ++num_grpclb_addrs;
|
|
926
|
+
}
|
|
927
|
+
// There must be at least one balancer address, or else the
|
|
928
|
+
// client_channel would not have chosen this LB policy.
|
|
929
|
+
GPR_ASSERT(num_grpclb_addrs > 0);
|
|
930
|
+
grpc_lb_addresses* lb_addresses =
|
|
931
|
+
grpc_lb_addresses_create(num_grpclb_addrs, nullptr);
|
|
932
|
+
size_t lb_addresses_idx = 0;
|
|
933
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
|
934
|
+
if (!addresses->addresses[i].is_balancer) continue;
|
|
935
|
+
if (addresses->addresses[i].user_data != nullptr) {
|
|
936
|
+
gpr_log(GPR_ERROR,
|
|
937
|
+
"This LB policy doesn't support user data. It will be ignored");
|
|
938
|
+
}
|
|
939
|
+
grpc_lb_addresses_set_address(
|
|
940
|
+
lb_addresses, lb_addresses_idx++, addresses->addresses[i].address.addr,
|
|
941
|
+
addresses->addresses[i].address.len, false /* is balancer */,
|
|
942
|
+
addresses->addresses[i].balancer_name, nullptr /* user data */);
|
|
943
|
+
}
|
|
944
|
+
GPR_ASSERT(num_grpclb_addrs == lb_addresses_idx);
|
|
945
|
+
return lb_addresses;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
/* Returns the channel args for the LB channel, used to create a bidirectional
|
|
949
|
+
* stream for the reception of load balancing updates.
|
|
950
|
+
*
|
|
951
|
+
* Inputs:
|
|
952
|
+
* - \a addresses: corresponding to the balancers.
|
|
953
|
+
* - \a response_generator: in order to propagate updates from the resolver
|
|
954
|
+
* above the grpclb policy.
|
|
955
|
+
* - \a args: other args inherited from the grpclb policy. */
|
|
956
|
+
grpc_channel_args* BuildBalancerChannelArgs(
|
|
957
|
+
const grpc_lb_addresses* addresses,
|
|
958
|
+
FakeResolverResponseGenerator* response_generator,
|
|
959
|
+
const grpc_channel_args* args) {
|
|
960
|
+
grpc_lb_addresses* lb_addresses = ExtractBalancerAddresses(addresses);
|
|
961
|
+
// Channel args to remove.
|
|
962
|
+
static const char* args_to_remove[] = {
|
|
963
|
+
// LB policy name, since we want to use the default (pick_first) in
|
|
964
|
+
// the LB channel.
|
|
965
|
+
GRPC_ARG_LB_POLICY_NAME,
|
|
966
|
+
// The channel arg for the server URI, since that will be different for
|
|
967
|
+
// the LB channel than for the parent channel. The client channel
|
|
968
|
+
// factory will re-add this arg with the right value.
|
|
969
|
+
GRPC_ARG_SERVER_URI,
|
|
970
|
+
// The resolved addresses, which will be generated by the name resolver
|
|
971
|
+
// used in the LB channel. Note that the LB channel will use the fake
|
|
972
|
+
// resolver, so this won't actually generate a query to DNS (or some
|
|
973
|
+
// other name service). However, the addresses returned by the fake
|
|
974
|
+
// resolver will have is_balancer=false, whereas our own addresses have
|
|
975
|
+
// is_balancer=true. We need the LB channel to return addresses with
|
|
976
|
+
// is_balancer=false so that it does not wind up recursively using the
|
|
977
|
+
// grpclb LB policy, as per the special case logic in client_channel.c.
|
|
978
|
+
GRPC_ARG_LB_ADDRESSES,
|
|
979
|
+
// The fake resolver response generator, because we are replacing it
|
|
980
|
+
// with the one from the grpclb policy, used to propagate updates to
|
|
981
|
+
// the LB channel.
|
|
982
|
+
GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
|
|
983
|
+
// The LB channel should use the authority indicated by the target
|
|
984
|
+
// authority table (see \a grpc_lb_policy_grpclb_modify_lb_channel_args),
|
|
985
|
+
// as opposed to the authority from the parent channel.
|
|
986
|
+
GRPC_ARG_DEFAULT_AUTHORITY,
|
|
987
|
+
// Just as for \a GRPC_ARG_DEFAULT_AUTHORITY, the LB channel should be
|
|
988
|
+
// treated as a stand-alone channel and not inherit this argument from the
|
|
989
|
+
// args of the parent channel.
|
|
990
|
+
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
|
|
991
|
+
};
|
|
992
|
+
// Channel args to add.
|
|
993
|
+
const grpc_arg args_to_add[] = {
|
|
994
|
+
// New LB addresses.
|
|
995
|
+
// Note that we pass these in both when creating the LB channel
|
|
996
|
+
// and via the fake resolver. The latter is what actually gets used.
|
|
997
|
+
grpc_lb_addresses_create_channel_arg(lb_addresses),
|
|
998
|
+
// The fake resolver response generator, which we use to inject
|
|
999
|
+
// address updates into the LB channel.
|
|
1000
|
+
grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
|
|
1001
|
+
response_generator),
|
|
1002
|
+
};
|
|
1003
|
+
// Construct channel args.
|
|
1004
|
+
grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
|
|
1005
|
+
args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add,
|
|
1006
|
+
GPR_ARRAY_SIZE(args_to_add));
|
|
1007
|
+
// Make any necessary modifications for security.
|
|
1008
|
+
new_args = grpc_lb_policy_grpclb_modify_lb_channel_args(new_args);
|
|
1009
|
+
// Clean up.
|
|
1010
|
+
grpc_lb_addresses_destroy(lb_addresses);
|
|
1011
|
+
return new_args;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
//
|
|
1015
|
+
// ctor and dtor
|
|
1016
|
+
//
|
|
1017
|
+
|
|
1018
|
+
GrpcLb::GrpcLb(const grpc_lb_addresses* addresses,
|
|
1019
|
+
const LoadBalancingPolicy::Args& args)
|
|
1020
|
+
: LoadBalancingPolicy(args),
|
|
1021
|
+
response_generator_(MakeRefCounted<FakeResolverResponseGenerator>()),
|
|
1022
|
+
lb_call_backoff_(
|
|
1023
|
+
BackOff::Options()
|
|
1024
|
+
.set_initial_backoff(GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS *
|
|
1025
|
+
1000)
|
|
1026
|
+
.set_multiplier(GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER)
|
|
1027
|
+
.set_jitter(GRPC_GRPCLB_RECONNECT_JITTER)
|
|
1028
|
+
.set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS *
|
|
1029
|
+
1000)) {
|
|
1030
|
+
// Initialization.
|
|
1031
|
+
grpc_subchannel_index_ref();
|
|
1032
|
+
GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_,
|
|
1033
|
+
&GrpcLb::OnBalancerChannelConnectivityChangedLocked, this,
|
|
1034
|
+
grpc_combiner_scheduler(args.combiner));
|
|
1035
|
+
GRPC_CLOSURE_INIT(&on_rr_connectivity_changed_,
|
|
1036
|
+
&GrpcLb::OnRoundRobinConnectivityChangedLocked, this,
|
|
1037
|
+
grpc_combiner_scheduler(args.combiner));
|
|
1038
|
+
GRPC_CLOSURE_INIT(&on_rr_request_reresolution_,
|
|
1039
|
+
&GrpcLb::OnRoundRobinRequestReresolutionLocked, this,
|
|
1040
|
+
grpc_combiner_scheduler(args.combiner));
|
|
1041
|
+
grpc_connectivity_state_init(&state_tracker_, GRPC_CHANNEL_IDLE, "grpclb");
|
|
1042
|
+
// Record server name.
|
|
1043
|
+
const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
|
|
1044
|
+
const char* server_uri = grpc_channel_arg_get_string(arg);
|
|
1045
|
+
GPR_ASSERT(server_uri != nullptr);
|
|
1046
|
+
grpc_uri* uri = grpc_uri_parse(server_uri, true);
|
|
1047
|
+
GPR_ASSERT(uri->path[0] != '\0');
|
|
1048
|
+
server_name_ = gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path);
|
|
1049
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1050
|
+
gpr_log(GPR_INFO,
|
|
1051
|
+
"[grpclb %p] Will use '%s' as the server name for LB request.",
|
|
1052
|
+
this, server_name_);
|
|
1053
|
+
}
|
|
1054
|
+
grpc_uri_destroy(uri);
|
|
1055
|
+
// Record LB call timeout.
|
|
1056
|
+
arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS);
|
|
1057
|
+
lb_call_timeout_ms_ = grpc_channel_arg_get_integer(arg, {0, 0, INT_MAX});
|
|
1058
|
+
// Record fallback timeout.
|
|
1059
|
+
arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS);
|
|
1060
|
+
lb_fallback_timeout_ms_ = grpc_channel_arg_get_integer(
|
|
1061
|
+
arg, {GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX});
|
|
1062
|
+
// Process channel args.
|
|
1063
|
+
ProcessChannelArgsLocked(*args.args);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
GrpcLb::~GrpcLb() {
|
|
1067
|
+
GPR_ASSERT(pending_picks_ == nullptr);
|
|
1068
|
+
GPR_ASSERT(pending_pings_ == nullptr);
|
|
1069
|
+
gpr_free((void*)server_name_);
|
|
1070
|
+
grpc_channel_args_destroy(args_);
|
|
1071
|
+
grpc_connectivity_state_destroy(&state_tracker_);
|
|
1072
|
+
if (serverlist_ != nullptr) {
|
|
1073
|
+
grpc_grpclb_destroy_serverlist(serverlist_);
|
|
1074
|
+
}
|
|
1075
|
+
if (fallback_backend_addresses_ != nullptr) {
|
|
1076
|
+
grpc_lb_addresses_destroy(fallback_backend_addresses_);
|
|
1077
|
+
}
|
|
1078
|
+
grpc_subchannel_index_unref();
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
void GrpcLb::ShutdownLocked() {
|
|
1082
|
+
grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel shutdown");
|
|
1083
|
+
shutting_down_ = true;
|
|
1084
|
+
lb_calld_.reset();
|
|
1085
|
+
if (retry_timer_callback_pending_) {
|
|
1086
|
+
grpc_timer_cancel(&lb_call_retry_timer_);
|
|
1087
|
+
}
|
|
1088
|
+
if (fallback_timer_callback_pending_) {
|
|
1089
|
+
grpc_timer_cancel(&lb_fallback_timer_);
|
|
1090
|
+
}
|
|
1091
|
+
rr_policy_.reset();
|
|
1092
|
+
TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_CANCELLED);
|
|
1093
|
+
// We destroy the LB channel here instead of in our destructor because
|
|
1094
|
+
// destroying the channel triggers a last callback to
|
|
1095
|
+
// OnBalancerChannelConnectivityChangedLocked(), and we need to be
|
|
1096
|
+
// alive when that callback is invoked.
|
|
1097
|
+
if (lb_channel_ != nullptr) {
|
|
1098
|
+
grpc_channel_destroy(lb_channel_);
|
|
1099
|
+
lb_channel_ = nullptr;
|
|
1100
|
+
}
|
|
1101
|
+
grpc_connectivity_state_set(&state_tracker_, GRPC_CHANNEL_SHUTDOWN,
|
|
1102
|
+
GRPC_ERROR_REF(error), "grpclb_shutdown");
|
|
1103
|
+
// Clear pending picks.
|
|
1104
|
+
PendingPick* pp;
|
|
1105
|
+
while ((pp = pending_picks_) != nullptr) {
|
|
1106
|
+
pending_picks_ = pp->next;
|
|
1107
|
+
pp->pick->connected_subchannel.reset();
|
|
1108
|
+
// Note: pp is deleted in this callback.
|
|
1109
|
+
GRPC_CLOSURE_SCHED(&pp->on_complete, GRPC_ERROR_REF(error));
|
|
1110
|
+
}
|
|
1111
|
+
// Clear pending pings.
|
|
1112
|
+
PendingPing* pping;
|
|
1113
|
+
while ((pping = pending_pings_) != nullptr) {
|
|
1114
|
+
pending_pings_ = pping->next;
|
|
1115
|
+
GRPC_CLOSURE_SCHED(pping->on_initiate, GRPC_ERROR_REF(error));
|
|
1116
|
+
GRPC_CLOSURE_SCHED(pping->on_ack, GRPC_ERROR_REF(error));
|
|
1117
|
+
Delete(pping);
|
|
1118
|
+
}
|
|
1119
|
+
GRPC_ERROR_UNREF(error);
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
//
|
|
1123
|
+
// public methods
|
|
1124
|
+
//
|
|
1125
|
+
|
|
1126
|
+
void GrpcLb::HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) {
|
|
1127
|
+
PendingPick* pp;
|
|
1128
|
+
while ((pp = pending_picks_) != nullptr) {
|
|
1129
|
+
pending_picks_ = pp->next;
|
|
1130
|
+
pp->pick->on_complete = pp->original_on_complete;
|
|
1131
|
+
pp->pick->user_data = nullptr;
|
|
1132
|
+
if (new_policy->PickLocked(pp->pick)) {
|
|
1133
|
+
// Synchronous return; schedule closure.
|
|
1134
|
+
GRPC_CLOSURE_SCHED(pp->pick->on_complete, GRPC_ERROR_NONE);
|
|
1135
|
+
}
|
|
1136
|
+
Delete(pp);
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
// Cancel a specific pending pick.
|
|
1141
|
+
//
|
|
1142
|
+
// A grpclb pick progresses as follows:
|
|
1143
|
+
// - If there's a Round Robin policy (rr_policy_) available, it'll be
|
|
1144
|
+
// handed over to the RR policy (in CreateRoundRobinPolicyLocked()). From
|
|
1145
|
+
// that point onwards, it'll be RR's responsibility. For cancellations, that
|
|
1146
|
+
// implies the pick needs also be cancelled by the RR instance.
|
|
1147
|
+
// - Otherwise, without an RR instance, picks stay pending at this policy's
|
|
1148
|
+
// level (grpclb), inside the pending_picks_ list. To cancel these,
|
|
1149
|
+
// we invoke the completion closure and set the pick's connected
|
|
1150
|
+
// subchannel to nullptr right here.
|
|
1151
|
+
void GrpcLb::CancelPickLocked(PickState* pick, grpc_error* error) {
|
|
1152
|
+
PendingPick* pp = pending_picks_;
|
|
1153
|
+
pending_picks_ = nullptr;
|
|
1154
|
+
while (pp != nullptr) {
|
|
1155
|
+
PendingPick* next = pp->next;
|
|
1156
|
+
if (pp->pick == pick) {
|
|
1157
|
+
pick->connected_subchannel.reset();
|
|
1158
|
+
// Note: pp is deleted in this callback.
|
|
1159
|
+
GRPC_CLOSURE_SCHED(&pp->on_complete,
|
|
1160
|
+
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
|
1161
|
+
"Pick Cancelled", &error, 1));
|
|
1162
|
+
} else {
|
|
1163
|
+
pp->next = pending_picks_;
|
|
1164
|
+
pending_picks_ = pp;
|
|
1165
|
+
}
|
|
1166
|
+
pp = next;
|
|
1167
|
+
}
|
|
1168
|
+
if (rr_policy_ != nullptr) {
|
|
1169
|
+
rr_policy_->CancelPickLocked(pick, GRPC_ERROR_REF(error));
|
|
1170
|
+
}
|
|
1171
|
+
GRPC_ERROR_UNREF(error);
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
// Cancel all pending picks.
|
|
1175
|
+
//
|
|
1176
|
+
// A grpclb pick progresses as follows:
|
|
1177
|
+
// - If there's a Round Robin policy (rr_policy_) available, it'll be
|
|
1178
|
+
// handed over to the RR policy (in CreateRoundRobinPolicyLocked()). From
|
|
1179
|
+
// that point onwards, it'll be RR's responsibility. For cancellations, that
|
|
1180
|
+
// implies the pick needs also be cancelled by the RR instance.
|
|
1181
|
+
// - Otherwise, without an RR instance, picks stay pending at this policy's
|
|
1182
|
+
// level (grpclb), inside the pending_picks_ list. To cancel these,
|
|
1183
|
+
// we invoke the completion closure and set the pick's connected
|
|
1184
|
+
// subchannel to nullptr right here.
|
|
1185
|
+
void GrpcLb::CancelMatchingPicksLocked(uint32_t initial_metadata_flags_mask,
|
|
1186
|
+
uint32_t initial_metadata_flags_eq,
|
|
1187
|
+
grpc_error* error) {
|
|
1188
|
+
PendingPick* pp = pending_picks_;
|
|
1189
|
+
pending_picks_ = nullptr;
|
|
1190
|
+
while (pp != nullptr) {
|
|
1191
|
+
PendingPick* next = pp->next;
|
|
1192
|
+
if ((pp->pick->initial_metadata_flags & initial_metadata_flags_mask) ==
|
|
1193
|
+
initial_metadata_flags_eq) {
|
|
1194
|
+
// Note: pp is deleted in this callback.
|
|
1195
|
+
GRPC_CLOSURE_SCHED(&pp->on_complete,
|
|
1196
|
+
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
|
1197
|
+
"Pick Cancelled", &error, 1));
|
|
1198
|
+
} else {
|
|
1199
|
+
pp->next = pending_picks_;
|
|
1200
|
+
pending_picks_ = pp;
|
|
1201
|
+
}
|
|
1202
|
+
pp = next;
|
|
1203
|
+
}
|
|
1204
|
+
if (rr_policy_ != nullptr) {
|
|
1205
|
+
rr_policy_->CancelMatchingPicksLocked(initial_metadata_flags_mask,
|
|
1206
|
+
initial_metadata_flags_eq,
|
|
1207
|
+
GRPC_ERROR_REF(error));
|
|
1208
|
+
}
|
|
1209
|
+
GRPC_ERROR_UNREF(error);
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
void GrpcLb::ExitIdleLocked() {
|
|
1213
|
+
if (!started_picking_) {
|
|
1214
|
+
StartPickingLocked();
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
bool GrpcLb::PickLocked(PickState* pick) {
|
|
1219
|
+
PendingPick* pp = PendingPickCreate(pick);
|
|
1220
|
+
bool pick_done = false;
|
|
1221
|
+
if (rr_policy_ != nullptr) {
|
|
1222
|
+
const grpc_connectivity_state rr_connectivity_state =
|
|
1223
|
+
rr_policy_->CheckConnectivityLocked(nullptr);
|
|
1224
|
+
// The RR policy may have transitioned to SHUTDOWN but the callback
|
|
1225
|
+
// registered to capture this event (on_rr_connectivity_changed_) may not
|
|
1226
|
+
// have been invoked yet. We need to make sure we aren't trying to pick
|
|
1227
|
+
// from an RR policy instance that's in shutdown.
|
|
1228
|
+
if (rr_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
|
|
1229
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1230
|
+
gpr_log(GPR_INFO,
|
|
1231
|
+
"[grpclb %p] NOT picking from from RR %p: RR conn state=%s",
|
|
1232
|
+
this, rr_policy_.get(),
|
|
1233
|
+
grpc_connectivity_state_name(rr_connectivity_state));
|
|
1234
|
+
}
|
|
1235
|
+
AddPendingPick(pp);
|
|
1236
|
+
pick_done = false;
|
|
1237
|
+
} else { // RR not in shutdown
|
|
1238
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1239
|
+
gpr_log(GPR_INFO, "[grpclb %p] about to PICK from RR %p", this,
|
|
1240
|
+
rr_policy_.get());
|
|
1241
|
+
}
|
|
1242
|
+
pick_done = PickFromRoundRobinPolicyLocked(false /* force_async */, pp);
|
|
1243
|
+
}
|
|
1244
|
+
} else { // rr_policy_ == NULL
|
|
1245
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1246
|
+
gpr_log(GPR_DEBUG,
|
|
1247
|
+
"[grpclb %p] No RR policy. Adding to grpclb's pending picks",
|
|
1248
|
+
this);
|
|
1249
|
+
}
|
|
1250
|
+
AddPendingPick(pp);
|
|
1251
|
+
if (!started_picking_) {
|
|
1252
|
+
StartPickingLocked();
|
|
1253
|
+
}
|
|
1254
|
+
pick_done = false;
|
|
1255
|
+
}
|
|
1256
|
+
return pick_done;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
void GrpcLb::PingOneLocked(grpc_closure* on_initiate, grpc_closure* on_ack) {
|
|
1260
|
+
if (rr_policy_ != nullptr) {
|
|
1261
|
+
rr_policy_->PingOneLocked(on_initiate, on_ack);
|
|
1262
|
+
} else {
|
|
1263
|
+
AddPendingPing(on_initiate, on_ack);
|
|
1264
|
+
if (!started_picking_) {
|
|
1265
|
+
StartPickingLocked();
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
grpc_connectivity_state GrpcLb::CheckConnectivityLocked(
|
|
1271
|
+
grpc_error** connectivity_error) {
|
|
1272
|
+
return grpc_connectivity_state_get(&state_tracker_, connectivity_error);
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
void GrpcLb::NotifyOnStateChangeLocked(grpc_connectivity_state* current,
|
|
1276
|
+
grpc_closure* notify) {
|
|
1277
|
+
grpc_connectivity_state_notify_on_state_change(&state_tracker_, current,
|
|
1278
|
+
notify);
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
void GrpcLb::ProcessChannelArgsLocked(const grpc_channel_args& args) {
|
|
1282
|
+
const grpc_arg* arg = grpc_channel_args_find(&args, GRPC_ARG_LB_ADDRESSES);
|
|
1283
|
+
if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
|
|
1284
|
+
// Ignore this update.
|
|
1285
|
+
gpr_log(
|
|
1286
|
+
GPR_ERROR,
|
|
1287
|
+
"[grpclb %p] No valid LB addresses channel arg in update, ignoring.",
|
|
1288
|
+
this);
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
const grpc_lb_addresses* addresses =
|
|
1292
|
+
static_cast<const grpc_lb_addresses*>(arg->value.pointer.p);
|
|
1293
|
+
// Update fallback address list.
|
|
1294
|
+
if (fallback_backend_addresses_ != nullptr) {
|
|
1295
|
+
grpc_lb_addresses_destroy(fallback_backend_addresses_);
|
|
1296
|
+
}
|
|
1297
|
+
fallback_backend_addresses_ = ExtractBackendAddresses(addresses);
|
|
1298
|
+
// Make sure that GRPC_ARG_LB_POLICY_NAME is set in channel args,
|
|
1299
|
+
// since we use this to trigger the client_load_reporting filter.
|
|
1300
|
+
static const char* args_to_remove[] = {GRPC_ARG_LB_POLICY_NAME};
|
|
1301
|
+
grpc_arg new_arg = grpc_channel_arg_string_create(
|
|
1302
|
+
(char*)GRPC_ARG_LB_POLICY_NAME, (char*)"grpclb");
|
|
1303
|
+
grpc_channel_args_destroy(args_);
|
|
1304
|
+
args_ = grpc_channel_args_copy_and_add_and_remove(
|
|
1305
|
+
&args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
|
|
1306
|
+
// Construct args for balancer channel.
|
|
1307
|
+
grpc_channel_args* lb_channel_args =
|
|
1308
|
+
BuildBalancerChannelArgs(addresses, response_generator_.get(), &args);
|
|
1309
|
+
// Create balancer channel if needed.
|
|
1310
|
+
if (lb_channel_ == nullptr) {
|
|
1311
|
+
char* uri_str;
|
|
1312
|
+
gpr_asprintf(&uri_str, "fake:///%s", server_name_);
|
|
1313
|
+
lb_channel_ = grpc_client_channel_factory_create_channel(
|
|
1314
|
+
client_channel_factory(), uri_str,
|
|
1315
|
+
GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, lb_channel_args);
|
|
1316
|
+
GPR_ASSERT(lb_channel_ != nullptr);
|
|
1317
|
+
gpr_free(uri_str);
|
|
1318
|
+
}
|
|
1319
|
+
// Propagate updates to the LB channel (pick_first) through the fake
|
|
1320
|
+
// resolver.
|
|
1321
|
+
response_generator_->SetResponse(lb_channel_args);
|
|
1322
|
+
grpc_channel_args_destroy(lb_channel_args);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
void GrpcLb::UpdateLocked(const grpc_channel_args& args) {
|
|
1326
|
+
ProcessChannelArgsLocked(args);
|
|
1327
|
+
// If fallback is configured and the RR policy already exists, update
|
|
1328
|
+
// it with the new fallback addresses.
|
|
1329
|
+
if (lb_fallback_timeout_ms_ > 0 && rr_policy_ != nullptr) {
|
|
1330
|
+
CreateOrUpdateRoundRobinPolicyLocked();
|
|
1331
|
+
}
|
|
1332
|
+
// Start watching the LB channel connectivity for connection, if not
|
|
1333
|
+
// already doing so.
|
|
1334
|
+
if (!watching_lb_channel_) {
|
|
1335
|
+
lb_channel_connectivity_ = grpc_channel_check_connectivity_state(
|
|
1336
|
+
lb_channel_, true /* try to connect */);
|
|
1337
|
+
grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element(
|
|
1338
|
+
grpc_channel_get_channel_stack(lb_channel_));
|
|
1339
|
+
GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
|
|
1340
|
+
watching_lb_channel_ = true;
|
|
1341
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
1342
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
1343
|
+
// with the callback.
|
|
1344
|
+
auto self = Ref(DEBUG_LOCATION, "watch_lb_channel_connectivity");
|
|
1345
|
+
self.release();
|
|
1346
|
+
grpc_client_channel_watch_connectivity_state(
|
|
1347
|
+
client_channel_elem,
|
|
1348
|
+
grpc_polling_entity_create_from_pollset_set(interested_parties()),
|
|
1349
|
+
&lb_channel_connectivity_, &lb_channel_on_connectivity_changed_,
|
|
1350
|
+
nullptr);
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
//
|
|
1355
|
+
// code for balancer channel and call
|
|
1356
|
+
//
|
|
1357
|
+
|
|
1358
|
+
void GrpcLb::StartPickingLocked() {
|
|
1359
|
+
// Start a timer to fall back.
|
|
1360
|
+
if (lb_fallback_timeout_ms_ > 0 && serverlist_ == nullptr &&
|
|
1361
|
+
!fallback_timer_callback_pending_) {
|
|
1362
|
+
grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_;
|
|
1363
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
1364
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
1365
|
+
// with the callback.
|
|
1366
|
+
auto self = Ref(DEBUG_LOCATION, "on_fallback_timer");
|
|
1367
|
+
self.release();
|
|
1368
|
+
GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimerLocked, this,
|
|
1369
|
+
grpc_combiner_scheduler(combiner()));
|
|
1370
|
+
fallback_timer_callback_pending_ = true;
|
|
1371
|
+
grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_);
|
|
1372
|
+
}
|
|
1373
|
+
started_picking_ = true;
|
|
1374
|
+
StartBalancerCallLocked();
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
void GrpcLb::StartBalancerCallLocked() {
|
|
1378
|
+
GPR_ASSERT(lb_channel_ != nullptr);
|
|
1379
|
+
if (shutting_down_) return;
|
|
1380
|
+
// Init the LB call data.
|
|
1381
|
+
GPR_ASSERT(lb_calld_ == nullptr);
|
|
1382
|
+
lb_calld_ = MakeOrphanable<BalancerCallState>(Ref());
|
|
1383
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1384
|
+
gpr_log(GPR_INFO,
|
|
1385
|
+
"[grpclb %p] Query for backends (lb_channel: %p, lb_calld: %p)",
|
|
1386
|
+
this, lb_channel_, lb_calld_.get());
|
|
1387
|
+
}
|
|
1388
|
+
lb_calld_->StartQuery();
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
|
|
1392
|
+
GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
|
|
1393
|
+
grpclb_policy->fallback_timer_callback_pending_ = false;
|
|
1394
|
+
// If we receive a serverlist after the timer fires but before this callback
|
|
1395
|
+
// actually runs, don't fall back.
|
|
1396
|
+
if (grpclb_policy->serverlist_ == nullptr && !grpclb_policy->shutting_down_ &&
|
|
1397
|
+
error == GRPC_ERROR_NONE) {
|
|
1398
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1399
|
+
gpr_log(GPR_INFO,
|
|
1400
|
+
"[grpclb %p] Falling back to use backends from resolver",
|
|
1401
|
+
grpclb_policy);
|
|
1402
|
+
}
|
|
1403
|
+
GPR_ASSERT(grpclb_policy->fallback_backend_addresses_ != nullptr);
|
|
1404
|
+
grpclb_policy->CreateOrUpdateRoundRobinPolicyLocked();
|
|
1405
|
+
}
|
|
1406
|
+
grpclb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer");
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
void GrpcLb::StartBalancerCallRetryTimerLocked() {
|
|
1410
|
+
grpc_millis next_try = lb_call_backoff_.NextAttemptTime();
|
|
1411
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1412
|
+
gpr_log(GPR_DEBUG, "[grpclb %p] Connection to LB server lost...", this);
|
|
1413
|
+
grpc_millis timeout = next_try - ExecCtx::Get()->Now();
|
|
1414
|
+
if (timeout > 0) {
|
|
1415
|
+
gpr_log(GPR_DEBUG,
|
|
1416
|
+
"[grpclb %p] ... retry_timer_active in %" PRIuPTR "ms.", this,
|
|
1417
|
+
timeout);
|
|
1418
|
+
} else {
|
|
1419
|
+
gpr_log(GPR_DEBUG, "[grpclb %p] ... retry_timer_active immediately.",
|
|
1420
|
+
this);
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
// TODO(roth): We currently track this ref manually. Once the
|
|
1424
|
+
// ClosureRef API is ready, we should pass the RefCountedPtr<> along
|
|
1425
|
+
// with the callback.
|
|
1426
|
+
auto self = Ref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
|
|
1427
|
+
self.release();
|
|
1428
|
+
GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimerLocked,
|
|
1429
|
+
this, grpc_combiner_scheduler(combiner()));
|
|
1430
|
+
retry_timer_callback_pending_ = true;
|
|
1431
|
+
grpc_timer_init(&lb_call_retry_timer_, next_try, &lb_on_call_retry_);
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
void GrpcLb::OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error) {
|
|
1435
|
+
GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
|
|
1436
|
+
grpclb_policy->retry_timer_callback_pending_ = false;
|
|
1437
|
+
if (!grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE &&
|
|
1438
|
+
grpclb_policy->lb_calld_ == nullptr) {
|
|
1439
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1440
|
+
gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server",
|
|
1441
|
+
grpclb_policy);
|
|
1442
|
+
}
|
|
1443
|
+
grpclb_policy->StartBalancerCallLocked();
|
|
1444
|
+
}
|
|
1445
|
+
grpclb_policy->Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
// Invoked as part of the update process. It continues watching the LB channel
|
|
1449
|
+
// until it shuts down or becomes READY. It's invoked even if the LB channel
|
|
1450
|
+
// stayed READY throughout the update (for example if the update is identical).
|
|
1451
|
+
void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg,
|
|
1452
|
+
grpc_error* error) {
|
|
1453
|
+
GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
|
|
1454
|
+
if (grpclb_policy->shutting_down_) goto done;
|
|
1455
|
+
// Re-initialize the lb_call. This should also take care of updating the
|
|
1456
|
+
// embedded RR policy. Note that the current RR policy, if any, will stay in
|
|
1457
|
+
// effect until an update from the new lb_call is received.
|
|
1458
|
+
switch (grpclb_policy->lb_channel_connectivity_) {
|
|
1459
|
+
case GRPC_CHANNEL_CONNECTING:
|
|
1460
|
+
case GRPC_CHANNEL_TRANSIENT_FAILURE: {
|
|
1461
|
+
// Keep watching the LB channel.
|
|
1462
|
+
grpc_channel_element* client_channel_elem =
|
|
1463
|
+
grpc_channel_stack_last_element(
|
|
1464
|
+
grpc_channel_get_channel_stack(grpclb_policy->lb_channel_));
|
|
1465
|
+
GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
|
|
1466
|
+
grpc_client_channel_watch_connectivity_state(
|
|
1467
|
+
client_channel_elem,
|
|
1468
|
+
grpc_polling_entity_create_from_pollset_set(
|
|
1469
|
+
grpclb_policy->interested_parties()),
|
|
1470
|
+
&grpclb_policy->lb_channel_connectivity_,
|
|
1471
|
+
&grpclb_policy->lb_channel_on_connectivity_changed_, nullptr);
|
|
1472
|
+
break;
|
|
1473
|
+
}
|
|
1474
|
+
// The LB channel may be IDLE because it's shut down before the update.
|
|
1475
|
+
// Restart the LB call to kick the LB channel into gear.
|
|
1476
|
+
case GRPC_CHANNEL_IDLE:
|
|
1477
|
+
case GRPC_CHANNEL_READY:
|
|
1478
|
+
grpclb_policy->lb_calld_.reset();
|
|
1479
|
+
if (grpclb_policy->started_picking_) {
|
|
1480
|
+
if (grpclb_policy->retry_timer_callback_pending_) {
|
|
1481
|
+
grpc_timer_cancel(&grpclb_policy->lb_call_retry_timer_);
|
|
1482
|
+
}
|
|
1483
|
+
grpclb_policy->lb_call_backoff_.Reset();
|
|
1484
|
+
grpclb_policy->StartBalancerCallLocked();
|
|
1485
|
+
}
|
|
1486
|
+
// Fall through.
|
|
1487
|
+
case GRPC_CHANNEL_SHUTDOWN:
|
|
1488
|
+
done:
|
|
1489
|
+
grpclb_policy->watching_lb_channel_ = false;
|
|
1490
|
+
grpclb_policy->Unref(DEBUG_LOCATION,
|
|
1491
|
+
"watch_lb_channel_connectivity_cb_shutdown");
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
//
|
|
1496
|
+
// PendingPick
|
|
1497
|
+
//
|
|
1498
|
+
|
|
1499
|
+
// Adds lb_token of selected subchannel (address) to the call's initial
|
|
1500
|
+
// metadata.
|
|
1501
|
+
grpc_error* AddLbTokenToInitialMetadata(
|
|
1502
|
+
grpc_mdelem lb_token, grpc_linked_mdelem* lb_token_mdelem_storage,
|
|
1503
|
+
grpc_metadata_batch* initial_metadata) {
|
|
1504
|
+
GPR_ASSERT(lb_token_mdelem_storage != nullptr);
|
|
1505
|
+
GPR_ASSERT(!GRPC_MDISNULL(lb_token));
|
|
1506
|
+
return grpc_metadata_batch_add_tail(initial_metadata, lb_token_mdelem_storage,
|
|
1507
|
+
lb_token);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
// Destroy function used when embedding client stats in call context.
|
|
1511
|
+
void DestroyClientStats(void* arg) {
|
|
1512
|
+
grpc_grpclb_client_stats_unref(static_cast<grpc_grpclb_client_stats*>(arg));
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
void GrpcLb::PendingPickSetMetadataAndContext(PendingPick* pp) {
|
|
1516
|
+
/* if connected_subchannel is nullptr, no pick has been made by the RR
|
|
1517
|
+
* policy (e.g., all addresses failed to connect). There won't be any
|
|
1518
|
+
* user_data/token available */
|
|
1519
|
+
if (pp->pick->connected_subchannel != nullptr) {
|
|
1520
|
+
if (!GRPC_MDISNULL(pp->lb_token)) {
|
|
1521
|
+
AddLbTokenToInitialMetadata(GRPC_MDELEM_REF(pp->lb_token),
|
|
1522
|
+
&pp->pick->lb_token_mdelem_storage,
|
|
1523
|
+
pp->pick->initial_metadata);
|
|
1524
|
+
} else {
|
|
1525
|
+
gpr_log(GPR_ERROR,
|
|
1526
|
+
"[grpclb %p] No LB token for connected subchannel pick %p",
|
|
1527
|
+
pp->grpclb_policy, pp->pick);
|
|
1528
|
+
abort();
|
|
1529
|
+
}
|
|
1530
|
+
// Pass on client stats via context. Passes ownership of the reference.
|
|
1531
|
+
if (pp->client_stats != nullptr) {
|
|
1532
|
+
pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].value =
|
|
1533
|
+
pp->client_stats;
|
|
1534
|
+
pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].destroy =
|
|
1535
|
+
DestroyClientStats;
|
|
1536
|
+
}
|
|
1537
|
+
} else {
|
|
1538
|
+
if (pp->client_stats != nullptr) {
|
|
1539
|
+
grpc_grpclb_client_stats_unref(pp->client_stats);
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
/* The \a on_complete closure passed as part of the pick requires keeping a
|
|
1545
|
+
* reference to its associated round robin instance. We wrap this closure in
|
|
1546
|
+
* order to unref the round robin instance upon its invocation */
|
|
1547
|
+
void GrpcLb::OnPendingPickComplete(void* arg, grpc_error* error) {
|
|
1548
|
+
PendingPick* pp = static_cast<PendingPick*>(arg);
|
|
1549
|
+
PendingPickSetMetadataAndContext(pp);
|
|
1550
|
+
GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_REF(error));
|
|
1551
|
+
Delete(pp);
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
GrpcLb::PendingPick* GrpcLb::PendingPickCreate(PickState* pick) {
|
|
1555
|
+
PendingPick* pp = New<PendingPick>();
|
|
1556
|
+
pp->grpclb_policy = this;
|
|
1557
|
+
pp->pick = pick;
|
|
1558
|
+
GRPC_CLOSURE_INIT(&pp->on_complete, &GrpcLb::OnPendingPickComplete, pp,
|
|
1559
|
+
grpc_schedule_on_exec_ctx);
|
|
1560
|
+
pp->original_on_complete = pick->on_complete;
|
|
1561
|
+
pick->on_complete = &pp->on_complete;
|
|
1562
|
+
return pp;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
void GrpcLb::AddPendingPick(PendingPick* pp) {
|
|
1566
|
+
pp->next = pending_picks_;
|
|
1567
|
+
pending_picks_ = pp;
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
//
|
|
1571
|
+
// PendingPing
|
|
1572
|
+
//
|
|
1573
|
+
|
|
1574
|
+
void GrpcLb::AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack) {
|
|
1575
|
+
PendingPing* pping = New<PendingPing>();
|
|
1576
|
+
pping->on_initiate = on_initiate;
|
|
1577
|
+
pping->on_ack = on_ack;
|
|
1578
|
+
pping->next = pending_pings_;
|
|
1579
|
+
pending_pings_ = pping;
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
//
|
|
1583
|
+
// code for interacting with the RR policy
|
|
1584
|
+
//
|
|
1585
|
+
|
|
1586
|
+
// Performs a pick over \a rr_policy_. Given that a pick can return
|
|
1587
|
+
// immediately (ignoring its completion callback), we need to perform the
|
|
1588
|
+
// cleanups this callback would otherwise be responsible for.
|
|
1589
|
+
// If \a force_async is true, then we will manually schedule the
|
|
1590
|
+
// completion callback even if the pick is available immediately.
|
|
1591
|
+
bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp) {
|
|
1592
|
+
// Check for drops if we are not using fallback backend addresses.
|
|
1593
|
+
if (serverlist_ != nullptr) {
|
|
1594
|
+
// Look at the index into the serverlist to see if we should drop this call.
|
|
1595
|
+
grpc_grpclb_server* server = serverlist_->servers[serverlist_index_++];
|
|
1596
|
+
if (serverlist_index_ == serverlist_->num_servers) {
|
|
1597
|
+
serverlist_index_ = 0; // Wrap-around.
|
|
1598
|
+
}
|
|
1599
|
+
if (server->drop) {
|
|
1600
|
+
// Update client load reporting stats to indicate the number of
|
|
1601
|
+
// dropped calls. Note that we have to do this here instead of in
|
|
1602
|
+
// the client_load_reporting filter, because we do not create a
|
|
1603
|
+
// subchannel call (and therefore no client_load_reporting filter)
|
|
1604
|
+
// for dropped calls.
|
|
1605
|
+
if (lb_calld_ != nullptr && lb_calld_->client_stats() != nullptr) {
|
|
1606
|
+
grpc_grpclb_client_stats_add_call_dropped_locked(
|
|
1607
|
+
server->load_balance_token, lb_calld_->client_stats());
|
|
1608
|
+
}
|
|
1609
|
+
if (force_async) {
|
|
1610
|
+
GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
|
|
1611
|
+
Delete(pp);
|
|
1612
|
+
return false;
|
|
1613
|
+
}
|
|
1614
|
+
Delete(pp);
|
|
1615
|
+
return true;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
// Set client_stats and user_data.
|
|
1619
|
+
if (lb_calld_ != nullptr && lb_calld_->client_stats() != nullptr) {
|
|
1620
|
+
pp->client_stats = grpc_grpclb_client_stats_ref(lb_calld_->client_stats());
|
|
1621
|
+
}
|
|
1622
|
+
GPR_ASSERT(pp->pick->user_data == nullptr);
|
|
1623
|
+
pp->pick->user_data = (void**)&pp->lb_token;
|
|
1624
|
+
// Pick via the RR policy.
|
|
1625
|
+
bool pick_done = rr_policy_->PickLocked(pp->pick);
|
|
1626
|
+
if (pick_done) {
|
|
1627
|
+
PendingPickSetMetadataAndContext(pp);
|
|
1628
|
+
if (force_async) {
|
|
1629
|
+
GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
|
|
1630
|
+
pick_done = false;
|
|
1631
|
+
}
|
|
1632
|
+
Delete(pp);
|
|
1633
|
+
}
|
|
1634
|
+
// else, the pending pick will be registered and taken care of by the
|
|
1635
|
+
// pending pick list inside the RR policy. Eventually,
|
|
1636
|
+
// OnPendingPickComplete() will be called, which will (among other
|
|
1637
|
+
// things) add the LB token to the call's initial metadata.
|
|
1638
|
+
return pick_done;
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
void GrpcLb::CreateRoundRobinPolicyLocked(const Args& args) {
|
|
1642
|
+
GPR_ASSERT(rr_policy_ == nullptr);
|
|
1643
|
+
rr_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
|
|
1644
|
+
"round_robin", args);
|
|
1645
|
+
if (rr_policy_ == nullptr) {
|
|
1646
|
+
gpr_log(GPR_ERROR, "[grpclb %p] Failure creating a RoundRobin policy",
|
|
1647
|
+
this);
|
|
1648
|
+
return;
|
|
1649
|
+
}
|
|
1650
|
+
// TODO(roth): We currently track this ref manually. Once the new
|
|
1651
|
+
// ClosureRef API is done, pass the RefCountedPtr<> along with the closure.
|
|
1652
|
+
auto self = Ref(DEBUG_LOCATION, "on_rr_reresolution_requested");
|
|
1653
|
+
self.release();
|
|
1654
|
+
rr_policy_->SetReresolutionClosureLocked(&on_rr_request_reresolution_);
|
|
1655
|
+
grpc_error* rr_state_error = nullptr;
|
|
1656
|
+
rr_connectivity_state_ = rr_policy_->CheckConnectivityLocked(&rr_state_error);
|
|
1657
|
+
// Connectivity state is a function of the RR policy updated/created.
|
|
1658
|
+
UpdateConnectivityStateFromRoundRobinPolicyLocked(rr_state_error);
|
|
1659
|
+
// Add the gRPC LB's interested_parties pollset_set to that of the newly
|
|
1660
|
+
// created RR policy. This will make the RR policy progress upon activity on
|
|
1661
|
+
// gRPC LB, which in turn is tied to the application's call.
|
|
1662
|
+
grpc_pollset_set_add_pollset_set(rr_policy_->interested_parties(),
|
|
1663
|
+
interested_parties());
|
|
1664
|
+
// Subscribe to changes to the connectivity of the new RR.
|
|
1665
|
+
// TODO(roth): We currently track this ref manually. Once the new
|
|
1666
|
+
// ClosureRef API is done, pass the RefCountedPtr<> along with the closure.
|
|
1667
|
+
self = Ref(DEBUG_LOCATION, "on_rr_connectivity_changed");
|
|
1668
|
+
self.release();
|
|
1669
|
+
rr_policy_->NotifyOnStateChangeLocked(&rr_connectivity_state_,
|
|
1670
|
+
&on_rr_connectivity_changed_);
|
|
1671
|
+
rr_policy_->ExitIdleLocked();
|
|
1672
|
+
// Send pending picks to RR policy.
|
|
1673
|
+
PendingPick* pp;
|
|
1674
|
+
while ((pp = pending_picks_)) {
|
|
1675
|
+
pending_picks_ = pp->next;
|
|
1676
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1677
|
+
gpr_log(GPR_INFO,
|
|
1678
|
+
"[grpclb %p] Pending pick about to (async) PICK from RR %p", this,
|
|
1679
|
+
rr_policy_.get());
|
|
1680
|
+
}
|
|
1681
|
+
PickFromRoundRobinPolicyLocked(true /* force_async */, pp);
|
|
1682
|
+
}
|
|
1683
|
+
// Send pending pings to RR policy.
|
|
1684
|
+
PendingPing* pping;
|
|
1685
|
+
while ((pping = pending_pings_)) {
|
|
1686
|
+
pending_pings_ = pping->next;
|
|
1687
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1688
|
+
gpr_log(GPR_INFO, "[grpclb %p] Pending ping about to PING from RR %p",
|
|
1689
|
+
this, rr_policy_.get());
|
|
1690
|
+
}
|
|
1691
|
+
rr_policy_->PingOneLocked(pping->on_initiate, pping->on_ack);
|
|
1692
|
+
Delete(pping);
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
grpc_channel_args* GrpcLb::CreateRoundRobinPolicyArgsLocked() {
|
|
1697
|
+
grpc_lb_addresses* addresses;
|
|
1698
|
+
if (serverlist_ != nullptr) {
|
|
1699
|
+
GPR_ASSERT(serverlist_->num_servers > 0);
|
|
1700
|
+
addresses = ProcessServerlist(serverlist_);
|
|
1701
|
+
} else {
|
|
1702
|
+
// If CreateOrUpdateRoundRobinPolicyLocked() is invoked when we haven't
|
|
1703
|
+
// received any serverlist from the balancer, we use the fallback backends
|
|
1704
|
+
// returned by the resolver. Note that the fallback backend list may be
|
|
1705
|
+
// empty, in which case the new round_robin policy will keep the requested
|
|
1706
|
+
// picks pending.
|
|
1707
|
+
GPR_ASSERT(fallback_backend_addresses_ != nullptr);
|
|
1708
|
+
addresses = grpc_lb_addresses_copy(fallback_backend_addresses_);
|
|
1709
|
+
}
|
|
1710
|
+
GPR_ASSERT(addresses != nullptr);
|
|
1711
|
+
// Replace the LB addresses in the channel args that we pass down to
|
|
1712
|
+
// the subchannel.
|
|
1713
|
+
static const char* keys_to_remove[] = {GRPC_ARG_LB_ADDRESSES};
|
|
1714
|
+
const grpc_arg arg = grpc_lb_addresses_create_channel_arg(addresses);
|
|
1715
|
+
grpc_channel_args* args = grpc_channel_args_copy_and_add_and_remove(
|
|
1716
|
+
args_, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &arg, 1);
|
|
1717
|
+
grpc_lb_addresses_destroy(addresses);
|
|
1718
|
+
return args;
|
|
1719
|
+
}
|
|
1720
|
+
|
|
1721
|
+
void GrpcLb::CreateOrUpdateRoundRobinPolicyLocked() {
|
|
1722
|
+
if (shutting_down_) return;
|
|
1723
|
+
grpc_channel_args* args = CreateRoundRobinPolicyArgsLocked();
|
|
1724
|
+
GPR_ASSERT(args != nullptr);
|
|
1725
|
+
if (rr_policy_ != nullptr) {
|
|
1726
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1727
|
+
gpr_log(GPR_DEBUG, "[grpclb %p] Updating RR policy %p", this,
|
|
1728
|
+
rr_policy_.get());
|
|
1729
|
+
}
|
|
1730
|
+
rr_policy_->UpdateLocked(*args);
|
|
1731
|
+
} else {
|
|
1732
|
+
LoadBalancingPolicy::Args lb_policy_args;
|
|
1733
|
+
lb_policy_args.combiner = combiner();
|
|
1734
|
+
lb_policy_args.client_channel_factory = client_channel_factory();
|
|
1735
|
+
lb_policy_args.args = args;
|
|
1736
|
+
CreateRoundRobinPolicyLocked(lb_policy_args);
|
|
1737
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1738
|
+
gpr_log(GPR_DEBUG, "[grpclb %p] Created new RR policy %p", this,
|
|
1739
|
+
rr_policy_.get());
|
|
1740
|
+
}
|
|
1741
|
+
}
|
|
1742
|
+
grpc_channel_args_destroy(args);
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
void GrpcLb::OnRoundRobinRequestReresolutionLocked(void* arg,
|
|
1746
|
+
grpc_error* error) {
|
|
1747
|
+
GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
|
|
1748
|
+
if (grpclb_policy->shutting_down_ || error != GRPC_ERROR_NONE) {
|
|
1749
|
+
grpclb_policy->Unref(DEBUG_LOCATION, "on_rr_reresolution_requested");
|
|
1750
|
+
return;
|
|
1751
|
+
}
|
|
1752
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1753
|
+
gpr_log(
|
|
1754
|
+
GPR_DEBUG,
|
|
1755
|
+
"[grpclb %p] Re-resolution requested from the internal RR policy (%p).",
|
|
1756
|
+
grpclb_policy, grpclb_policy->rr_policy_.get());
|
|
1757
|
+
}
|
|
1758
|
+
// If we are talking to a balancer, we expect to get updated addresses form
|
|
1759
|
+
// the balancer, so we can ignore the re-resolution request from the RR
|
|
1760
|
+
// policy. Otherwise, handle the re-resolution request using the
|
|
1761
|
+
// grpclb policy's original re-resolution closure.
|
|
1762
|
+
if (grpclb_policy->lb_calld_ == nullptr ||
|
|
1763
|
+
!grpclb_policy->lb_calld_->seen_initial_response()) {
|
|
1764
|
+
grpclb_policy->TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_NONE);
|
|
1765
|
+
}
|
|
1766
|
+
// Give back the wrapper closure to the RR policy.
|
|
1767
|
+
grpclb_policy->rr_policy_->SetReresolutionClosureLocked(
|
|
1768
|
+
&grpclb_policy->on_rr_request_reresolution_);
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
void GrpcLb::UpdateConnectivityStateFromRoundRobinPolicyLocked(
|
|
1772
|
+
grpc_error* rr_state_error) {
|
|
1773
|
+
const grpc_connectivity_state curr_glb_state =
|
|
1774
|
+
grpc_connectivity_state_check(&state_tracker_);
|
|
1775
|
+
/* The new connectivity status is a function of the previous one and the new
|
|
1776
|
+
* input coming from the status of the RR policy.
|
|
1777
|
+
*
|
|
1778
|
+
* current state (grpclb's)
|
|
1779
|
+
* |
|
|
1780
|
+
* v || I | C | R | TF | SD | <- new state (RR's)
|
|
1781
|
+
* ===++====+=====+=====+======+======+
|
|
1782
|
+
* I || I | C | R | [I] | [I] |
|
|
1783
|
+
* ---++----+-----+-----+------+------+
|
|
1784
|
+
* C || I | C | R | [C] | [C] |
|
|
1785
|
+
* ---++----+-----+-----+------+------+
|
|
1786
|
+
* R || I | C | R | [R] | [R] |
|
|
1787
|
+
* ---++----+-----+-----+------+------+
|
|
1788
|
+
* TF || I | C | R | [TF] | [TF] |
|
|
1789
|
+
* ---++----+-----+-----+------+------+
|
|
1790
|
+
* SD || NA | NA | NA | NA | NA | (*)
|
|
1791
|
+
* ---++----+-----+-----+------+------+
|
|
1792
|
+
*
|
|
1793
|
+
* A [STATE] indicates that the old RR policy is kept. In those cases, STATE
|
|
1794
|
+
* is the current state of grpclb, which is left untouched.
|
|
1795
|
+
*
|
|
1796
|
+
* In summary, if the new state is TRANSIENT_FAILURE or SHUTDOWN, stick to
|
|
1797
|
+
* the previous RR instance.
|
|
1798
|
+
*
|
|
1799
|
+
* Note that the status is never updated to SHUTDOWN as a result of calling
|
|
1800
|
+
* this function. Only glb_shutdown() has the power to set that state.
|
|
1801
|
+
*
|
|
1802
|
+
* (*) This function mustn't be called during shutting down. */
|
|
1803
|
+
GPR_ASSERT(curr_glb_state != GRPC_CHANNEL_SHUTDOWN);
|
|
1804
|
+
switch (rr_connectivity_state_) {
|
|
1805
|
+
case GRPC_CHANNEL_TRANSIENT_FAILURE:
|
|
1806
|
+
case GRPC_CHANNEL_SHUTDOWN:
|
|
1807
|
+
GPR_ASSERT(rr_state_error != GRPC_ERROR_NONE);
|
|
1808
|
+
break;
|
|
1809
|
+
case GRPC_CHANNEL_IDLE:
|
|
1810
|
+
case GRPC_CHANNEL_CONNECTING:
|
|
1811
|
+
case GRPC_CHANNEL_READY:
|
|
1812
|
+
GPR_ASSERT(rr_state_error == GRPC_ERROR_NONE);
|
|
1813
|
+
}
|
|
1814
|
+
if (grpc_lb_glb_trace.enabled()) {
|
|
1815
|
+
gpr_log(
|
|
1816
|
+
GPR_INFO,
|
|
1817
|
+
"[grpclb %p] Setting grpclb's state to %s from new RR policy %p state.",
|
|
1818
|
+
this, grpc_connectivity_state_name(rr_connectivity_state_),
|
|
1819
|
+
rr_policy_.get());
|
|
1820
|
+
}
|
|
1821
|
+
grpc_connectivity_state_set(&state_tracker_, rr_connectivity_state_,
|
|
1822
|
+
rr_state_error,
|
|
1823
|
+
"update_lb_connectivity_status_locked");
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
void GrpcLb::OnRoundRobinConnectivityChangedLocked(void* arg,
|
|
1827
|
+
grpc_error* error) {
|
|
1828
|
+
GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
|
|
1829
|
+
if (grpclb_policy->shutting_down_) {
|
|
1830
|
+
grpclb_policy->Unref(DEBUG_LOCATION, "on_rr_connectivity_changed");
|
|
1831
|
+
return;
|
|
1832
|
+
}
|
|
1833
|
+
grpclb_policy->UpdateConnectivityStateFromRoundRobinPolicyLocked(
|
|
1834
|
+
GRPC_ERROR_REF(error));
|
|
1835
|
+
// Resubscribe. Reuse the "on_rr_connectivity_changed" ref.
|
|
1836
|
+
grpclb_policy->rr_policy_->NotifyOnStateChangeLocked(
|
|
1837
|
+
&grpclb_policy->rr_connectivity_state_,
|
|
1838
|
+
&grpclb_policy->on_rr_connectivity_changed_);
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
//
|
|
1842
|
+
// factory
|
|
1843
|
+
//
|
|
1844
|
+
|
|
1845
|
+
class GrpcLbFactory : public LoadBalancingPolicyFactory {
|
|
1846
|
+
public:
|
|
1847
|
+
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
|
1848
|
+
const LoadBalancingPolicy::Args& args) const override {
|
|
1849
|
+
/* Count the number of gRPC-LB addresses. There must be at least one. */
|
|
1850
|
+
const grpc_arg* arg =
|
|
1851
|
+
grpc_channel_args_find(args.args, GRPC_ARG_LB_ADDRESSES);
|
|
1852
|
+
if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
|
|
1853
|
+
return nullptr;
|
|
1854
|
+
}
|
|
1855
|
+
grpc_lb_addresses* addresses =
|
|
1856
|
+
static_cast<grpc_lb_addresses*>(arg->value.pointer.p);
|
|
1857
|
+
size_t num_grpclb_addrs = 0;
|
|
1858
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
|
1859
|
+
if (addresses->addresses[i].is_balancer) ++num_grpclb_addrs;
|
|
1860
|
+
}
|
|
1861
|
+
if (num_grpclb_addrs == 0) return nullptr;
|
|
1862
|
+
return OrphanablePtr<LoadBalancingPolicy>(New<GrpcLb>(addresses, args));
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
const char* name() const override { return "grpclb"; }
|
|
1866
|
+
};
|
|
1867
|
+
|
|
1868
|
+
} // namespace
|
|
1869
|
+
|
|
1870
|
+
} // namespace grpc_core
|
|
1871
|
+
|
|
1872
|
+
//
|
|
1873
|
+
// Plugin registration
|
|
1874
|
+
//
|
|
1875
|
+
|
|
1876
|
+
namespace {
|
|
1877
|
+
|
|
1878
|
+
// Only add client_load_reporting filter if the grpclb LB policy is used.
|
|
1879
|
+
bool maybe_add_client_load_reporting_filter(grpc_channel_stack_builder* builder,
|
|
1880
|
+
void* arg) {
|
|
1881
|
+
const grpc_channel_args* args =
|
|
1882
|
+
grpc_channel_stack_builder_get_channel_arguments(builder);
|
|
1883
|
+
const grpc_arg* channel_arg =
|
|
1884
|
+
grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
|
|
1885
|
+
if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
|
|
1886
|
+
strcmp(channel_arg->value.string, "grpclb") == 0) {
|
|
1887
|
+
return grpc_channel_stack_builder_append_filter(
|
|
1888
|
+
builder, (const grpc_channel_filter*)arg, nullptr, nullptr);
|
|
1889
|
+
}
|
|
1890
|
+
return true;
|
|
1891
|
+
}
|
|
1892
|
+
|
|
1893
|
+
} // namespace
|
|
1894
|
+
|
|
1895
|
+
void grpc_lb_policy_grpclb_init() {
|
|
1896
|
+
grpc_core::LoadBalancingPolicyRegistry::Builder::
|
|
1897
|
+
RegisterLoadBalancingPolicyFactory(
|
|
1898
|
+
grpc_core::UniquePtr<grpc_core::LoadBalancingPolicyFactory>(
|
|
1899
|
+
grpc_core::New<grpc_core::GrpcLbFactory>()));
|
|
1900
|
+
grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL,
|
|
1901
|
+
GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
|
|
1902
|
+
maybe_add_client_load_reporting_filter,
|
|
1903
|
+
(void*)&grpc_client_load_reporting_filter);
|
|
1904
|
+
}
|
|
1905
|
+
|
|
1906
|
+
void grpc_lb_policy_grpclb_shutdown() {}
|