grpc 1.19.0 → 1.20.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +4131 -7903
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +51 -9
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/grpc_types.h +4 -0
- data/include/grpc/impl/codegen/port_platform.h +37 -6
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +560 -236
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +7 -4
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +105 -28
- data/src/core/ext/filters/client_channel/lb_policy.h +259 -141
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +789 -803
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +8 -8
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +127 -219
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +103 -282
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +709 -906
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +8 -8
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -6
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +51 -22
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +34 -86
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +29 -41
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -78
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +109 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +69 -49
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -8
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +568 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +141 -0
- data/src/core/ext/filters/client_channel/server_address.cc +0 -48
- data/src/core/ext/filters/client_channel/server_address.h +0 -10
- data/src/core/{lib/transport → ext/filters/client_channel}/service_config.cc +10 -5
- data/src/core/{lib/transport → ext/filters/client_channel}/service_config.h +16 -12
- data/src/core/ext/filters/client_channel/subchannel.cc +11 -16
- data/src/core/ext/filters/client_channel/subchannel.h +3 -0
- data/src/core/ext/filters/max_age/max_age_filter.cc +4 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -45
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +133 -134
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -29
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +6 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +5 -4
- data/src/core/ext/transport/chttp2/transport/parsing.cc +9 -9
- data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +8 -0
- data/src/core/lib/channel/channel_args.cc +2 -0
- data/src/core/lib/channel/channel_args.h +3 -0
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +32 -19
- data/src/core/lib/channel/channelz.h +4 -4
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/context.h +0 -3
- data/src/core/lib/channel/handshaker_registry.cc +7 -3
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +1 -1
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +1 -1
- data/src/core/lib/debug/trace.h +2 -1
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +0 -2
- data/src/core/lib/gprpp/orphanable.h +3 -2
- data/src/core/lib/gprpp/ref_counted.h +9 -11
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +3 -2
- data/src/core/lib/http/httpcli_security_connector.cc +0 -1
- data/src/core/lib/http/parser.cc +2 -1
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/error.cc +9 -9
- data/src/core/lib/iomgr/error.h +4 -3
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +6 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +14 -9
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -481
- data/src/core/lib/iomgr/ev_posix.cc +7 -3
- data/src/core/lib/iomgr/ev_posix.h +8 -0
- data/src/core/lib/iomgr/executor.cc +13 -0
- data/src/core/lib/iomgr/executor.h +2 -1
- data/src/core/lib/iomgr/internal_errqueue.cc +2 -4
- data/src/core/lib/iomgr/iomgr.cc +5 -0
- data/src/core/lib/iomgr/iomgr.h +7 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +9 -2
- data/src/core/lib/iomgr/iomgr_internal.cc +6 -0
- data/src/core/lib/iomgr/iomgr_internal.h +9 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +10 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +10 -2
- data/src/core/lib/iomgr/port.h +19 -0
- data/src/core/lib/iomgr/tcp_client_windows.cc +6 -4
- data/src/core/lib/iomgr/tcp_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +158 -54
- data/src/core/lib/iomgr/tcp_windows.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -6
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -2
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +28 -17
- data/src/core/lib/security/security_connector/ssl_utils.cc +134 -0
- data/src/core/lib/security/security_connector/ssl_utils.h +32 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +2 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +35 -39
- data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
- data/src/core/lib/security/transport/security_handshaker.cc +4 -3
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +27 -30
- data/src/core/lib/slice/slice_hash_table.h +2 -2
- data/src/core/lib/slice/slice_intern.cc +1 -1
- data/src/core/lib/slice/slice_internal.h +14 -3
- data/src/core/lib/slice/slice_weak_hash_table.h +4 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +8 -3
- data/src/core/lib/surface/completion_queue.cc +134 -148
- data/src/core/lib/surface/init.cc +78 -30
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/lame_client.cc +4 -6
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/metadata.cc +66 -33
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.h +4 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +1 -5
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +39 -37
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -946
- data/src/core/ext/filters/client_channel/request_routing.h +0 -181
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/gprpp/atomic_with_std.h +0 -35
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
@@ -33,55 +33,12 @@
|
|
33
33
|
#include "src/core/lib/security/transport/target_authority_table.h"
|
34
34
|
#include "src/core/lib/slice/slice_internal.h"
|
35
35
|
|
36
|
-
namespace grpc_core {
|
37
|
-
namespace {
|
38
|
-
|
39
|
-
int BalancerNameCmp(const grpc_core::UniquePtr<char>& a,
|
40
|
-
const grpc_core::UniquePtr<char>& b) {
|
41
|
-
return strcmp(a.get(), b.get());
|
42
|
-
}
|
43
|
-
|
44
|
-
RefCountedPtr<TargetAuthorityTable> CreateTargetAuthorityTable(
|
45
|
-
const ServerAddressList& addresses) {
|
46
|
-
TargetAuthorityTable::Entry* target_authority_entries =
|
47
|
-
static_cast<TargetAuthorityTable::Entry*>(
|
48
|
-
gpr_zalloc(sizeof(*target_authority_entries) * addresses.size()));
|
49
|
-
for (size_t i = 0; i < addresses.size(); ++i) {
|
50
|
-
char* addr_str;
|
51
|
-
GPR_ASSERT(
|
52
|
-
grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0);
|
53
|
-
target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str);
|
54
|
-
gpr_free(addr_str);
|
55
|
-
char* balancer_name = grpc_channel_arg_get_string(grpc_channel_args_find(
|
56
|
-
addresses[i].args(), GRPC_ARG_ADDRESS_BALANCER_NAME));
|
57
|
-
target_authority_entries[i].value.reset(gpr_strdup(balancer_name));
|
58
|
-
}
|
59
|
-
RefCountedPtr<TargetAuthorityTable> target_authority_table =
|
60
|
-
TargetAuthorityTable::Create(addresses.size(), target_authority_entries,
|
61
|
-
BalancerNameCmp);
|
62
|
-
gpr_free(target_authority_entries);
|
63
|
-
return target_authority_table;
|
64
|
-
}
|
65
|
-
|
66
|
-
} // namespace
|
67
|
-
} // namespace grpc_core
|
68
|
-
|
69
36
|
grpc_channel_args* grpc_lb_policy_xds_modify_lb_channel_args(
|
70
37
|
grpc_channel_args* args) {
|
71
38
|
const char* args_to_remove[1];
|
72
39
|
size_t num_args_to_remove = 0;
|
73
40
|
grpc_arg args_to_add[2];
|
74
41
|
size_t num_args_to_add = 0;
|
75
|
-
// Add arg for targets info table.
|
76
|
-
grpc_core::ServerAddressList* addresses =
|
77
|
-
grpc_core::FindServerAddressListChannelArg(args);
|
78
|
-
GPR_ASSERT(addresses != nullptr);
|
79
|
-
grpc_core::RefCountedPtr<grpc_core::TargetAuthorityTable>
|
80
|
-
target_authority_table =
|
81
|
-
grpc_core::CreateTargetAuthorityTable(*addresses);
|
82
|
-
args_to_add[num_args_to_add++] =
|
83
|
-
grpc_core::CreateTargetAuthorityTableChannelArg(
|
84
|
-
target_authority_table.get());
|
85
42
|
// Substitute the channel credentials with a version without call
|
86
43
|
// credentials: the load balancer is not necessarily trusted to handle
|
87
44
|
// bearer token credentials.
|
@@ -161,10 +161,10 @@ void xds_grpclb_request_destroy(xds_grpclb_request* request) {
|
|
161
161
|
|
162
162
|
typedef grpc_lb_v1_LoadBalanceResponse xds_grpclb_response;
|
163
163
|
xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
|
164
|
-
grpc_slice encoded_xds_grpclb_response) {
|
165
|
-
pb_istream_t stream =
|
166
|
-
|
167
|
-
|
164
|
+
const grpc_slice& encoded_xds_grpclb_response) {
|
165
|
+
pb_istream_t stream = pb_istream_from_buffer(
|
166
|
+
const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response)),
|
167
|
+
GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
|
168
168
|
xds_grpclb_response res;
|
169
169
|
memset(&res, 0, sizeof(xds_grpclb_response));
|
170
170
|
if (GPR_UNLIKELY(
|
@@ -185,10 +185,10 @@ xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
|
|
185
185
|
}
|
186
186
|
|
187
187
|
xds_grpclb_serverlist* xds_grpclb_response_parse_serverlist(
|
188
|
-
grpc_slice encoded_xds_grpclb_response) {
|
189
|
-
pb_istream_t stream =
|
190
|
-
|
191
|
-
|
188
|
+
const grpc_slice& encoded_xds_grpclb_response) {
|
189
|
+
pb_istream_t stream = pb_istream_from_buffer(
|
190
|
+
const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response)),
|
191
|
+
GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
|
192
192
|
pb_istream_t stream_at_start = stream;
|
193
193
|
xds_grpclb_serverlist* sl = static_cast<xds_grpclb_serverlist*>(
|
194
194
|
gpr_zalloc(sizeof(xds_grpclb_serverlist)));
|
@@ -55,11 +55,11 @@ void xds_grpclb_request_destroy(xds_grpclb_request* request);
|
|
55
55
|
/** Parse (ie, decode) the bytes in \a encoded_xds_grpclb_response as a \a
|
56
56
|
* xds_grpclb_initial_response */
|
57
57
|
xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
|
58
|
-
grpc_slice encoded_xds_grpclb_response);
|
58
|
+
const grpc_slice& encoded_xds_grpclb_response);
|
59
59
|
|
60
60
|
/** Parse the list of servers from an encoded \a xds_grpclb_response */
|
61
61
|
xds_grpclb_serverlist* xds_grpclb_response_parse_serverlist(
|
62
|
-
grpc_slice encoded_xds_grpclb_response);
|
62
|
+
const grpc_slice& encoded_xds_grpclb_response);
|
63
63
|
|
64
64
|
/** Return a copy of \a sl. The caller is responsible for calling \a
|
65
65
|
* xds_grpclb_destroy_serverlist on the returned copy. */
|
@@ -31,12 +31,7 @@ class LoadBalancingPolicyFactory {
|
|
31
31
|
public:
|
32
32
|
/// Returns a new LB policy instance.
|
33
33
|
virtual OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
34
|
-
LoadBalancingPolicy::Args
|
35
|
-
std::move(args); // Suppress clang-tidy complaint.
|
36
|
-
// The rest of this is copied from the GRPC_ABSTRACT macro.
|
37
|
-
gpr_log(GPR_ERROR, "Function marked GRPC_ABSTRACT was not implemented");
|
38
|
-
GPR_ASSERT(false);
|
39
|
-
}
|
34
|
+
LoadBalancingPolicy::Args) const GRPC_ABSTRACT;
|
40
35
|
|
41
36
|
/// Returns the LB policy name that this factory provides.
|
42
37
|
/// Caller does NOT take ownership of result.
|
@@ -26,10 +26,63 @@ grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount(false,
|
|
26
26
|
|
27
27
|
namespace grpc_core {
|
28
28
|
|
29
|
-
|
29
|
+
//
|
30
|
+
// Resolver
|
31
|
+
//
|
32
|
+
|
33
|
+
Resolver::Resolver(grpc_combiner* combiner,
|
34
|
+
UniquePtr<ResultHandler> result_handler)
|
30
35
|
: InternallyRefCounted(&grpc_trace_resolver_refcount),
|
36
|
+
result_handler_(std::move(result_handler)),
|
31
37
|
combiner_(GRPC_COMBINER_REF(combiner, "resolver")) {}
|
32
38
|
|
33
39
|
Resolver::~Resolver() { GRPC_COMBINER_UNREF(combiner_, "resolver"); }
|
34
40
|
|
41
|
+
//
|
42
|
+
// Resolver::Result
|
43
|
+
//
|
44
|
+
|
45
|
+
Resolver::Result::~Result() {
|
46
|
+
GRPC_ERROR_UNREF(service_config_error);
|
47
|
+
grpc_channel_args_destroy(args);
|
48
|
+
}
|
49
|
+
|
50
|
+
Resolver::Result::Result(const Result& other) {
|
51
|
+
addresses = other.addresses;
|
52
|
+
service_config = other.service_config;
|
53
|
+
service_config_error = GRPC_ERROR_REF(other.service_config_error);
|
54
|
+
args = grpc_channel_args_copy(other.args);
|
55
|
+
}
|
56
|
+
|
57
|
+
Resolver::Result::Result(Result&& other) {
|
58
|
+
addresses = std::move(other.addresses);
|
59
|
+
service_config = std::move(other.service_config);
|
60
|
+
service_config_error = other.service_config_error;
|
61
|
+
other.service_config_error = GRPC_ERROR_NONE;
|
62
|
+
args = other.args;
|
63
|
+
other.args = nullptr;
|
64
|
+
}
|
65
|
+
|
66
|
+
Resolver::Result& Resolver::Result::operator=(const Result& other) {
|
67
|
+
addresses = other.addresses;
|
68
|
+
service_config = other.service_config;
|
69
|
+
GRPC_ERROR_UNREF(service_config_error);
|
70
|
+
service_config_error = GRPC_ERROR_REF(other.service_config_error);
|
71
|
+
grpc_channel_args_destroy(args);
|
72
|
+
args = grpc_channel_args_copy(other.args);
|
73
|
+
return *this;
|
74
|
+
}
|
75
|
+
|
76
|
+
Resolver::Result& Resolver::Result::operator=(Result&& other) {
|
77
|
+
addresses = std::move(other.addresses);
|
78
|
+
service_config = std::move(other.service_config);
|
79
|
+
GRPC_ERROR_UNREF(service_config_error);
|
80
|
+
service_config_error = other.service_config_error;
|
81
|
+
other.service_config_error = GRPC_ERROR_NONE;
|
82
|
+
grpc_channel_args_destroy(args);
|
83
|
+
args = other.args;
|
84
|
+
other.args = nullptr;
|
85
|
+
return *this;
|
86
|
+
}
|
87
|
+
|
35
88
|
} // namespace grpc_core
|
@@ -23,8 +23,11 @@
|
|
23
23
|
|
24
24
|
#include <grpc/impl/codegen/grpc_types.h>
|
25
25
|
|
26
|
+
#include "src/core/ext/filters/client_channel/server_address.h"
|
27
|
+
#include "src/core/ext/filters/client_channel/service_config.h"
|
26
28
|
#include "src/core/lib/gprpp/abstract.h"
|
27
29
|
#include "src/core/lib/gprpp/orphanable.h"
|
30
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
28
31
|
#include "src/core/lib/iomgr/combiner.h"
|
29
32
|
#include "src/core/lib/iomgr/iomgr.h"
|
30
33
|
|
@@ -46,27 +49,50 @@ namespace grpc_core {
|
|
46
49
|
/// combiner passed to the constructor.
|
47
50
|
class Resolver : public InternallyRefCounted<Resolver> {
|
48
51
|
public:
|
52
|
+
/// Results returned by the resolver.
|
53
|
+
struct Result {
|
54
|
+
ServerAddressList addresses;
|
55
|
+
RefCountedPtr<ServiceConfig> service_config;
|
56
|
+
grpc_error* service_config_error = GRPC_ERROR_NONE;
|
57
|
+
const grpc_channel_args* args = nullptr;
|
58
|
+
|
59
|
+
// TODO(roth): Remove everything below once grpc_error and
|
60
|
+
// grpc_channel_args are convert to copyable and movable C++ objects.
|
61
|
+
Result() = default;
|
62
|
+
~Result();
|
63
|
+
Result(const Result& other);
|
64
|
+
Result(Result&& other);
|
65
|
+
Result& operator=(const Result& other);
|
66
|
+
Result& operator=(Result&& other);
|
67
|
+
};
|
68
|
+
|
69
|
+
/// A proxy object used by the resolver to return results to the
|
70
|
+
/// client channel.
|
71
|
+
class ResultHandler {
|
72
|
+
public:
|
73
|
+
virtual ~ResultHandler() {}
|
74
|
+
|
75
|
+
/// Returns a result to the channel.
|
76
|
+
/// Takes ownership of \a result.args.
|
77
|
+
virtual void ReturnResult(Result result) GRPC_ABSTRACT; // NOLINT
|
78
|
+
|
79
|
+
/// Returns a transient error to the channel.
|
80
|
+
/// If the resolver does not set the GRPC_ERROR_INT_GRPC_STATUS
|
81
|
+
/// attribute on the error, calls will be failed with status UNKNOWN.
|
82
|
+
virtual void ReturnError(grpc_error* error) GRPC_ABSTRACT;
|
83
|
+
|
84
|
+
// TODO(yashkt): As part of the service config error handling
|
85
|
+
// changes, add a method to parse the service config JSON string.
|
86
|
+
|
87
|
+
GRPC_ABSTRACT_BASE_CLASS
|
88
|
+
};
|
89
|
+
|
49
90
|
// Not copyable nor movable.
|
50
91
|
Resolver(const Resolver&) = delete;
|
51
92
|
Resolver& operator=(const Resolver&) = delete;
|
52
93
|
|
53
|
-
///
|
54
|
-
|
55
|
-
/// and schedules \a on_complete for execution.
|
56
|
-
/// Upon transient failure, sets \a *result to nullptr and schedules
|
57
|
-
/// \a on_complete with no error.
|
58
|
-
/// If resolution is fatally broken, sets \a *result to nullptr and
|
59
|
-
/// schedules \a on_complete with an error.
|
60
|
-
/// TODO(roth): When we have time, improve the way this API represents
|
61
|
-
/// transient failure vs. shutdown.
|
62
|
-
///
|
63
|
-
/// Note that the client channel will almost always have a request
|
64
|
-
/// to \a NextLocked() pending. When it gets the callback, it will
|
65
|
-
/// process the new result and then immediately make another call to
|
66
|
-
/// \a NextLocked(). This allows push-based resolvers to provide new
|
67
|
-
/// data as soon as it becomes available.
|
68
|
-
virtual void NextLocked(grpc_channel_args** result,
|
69
|
-
grpc_closure* on_complete) GRPC_ABSTRACT;
|
94
|
+
/// Starts resolving.
|
95
|
+
virtual void StartLocked() GRPC_ABSTRACT;
|
70
96
|
|
71
97
|
/// Asks the resolver to obtain an updated resolver result, if
|
72
98
|
/// applicable.
|
@@ -79,8 +105,8 @@ class Resolver : public InternallyRefCounted<Resolver> {
|
|
79
105
|
///
|
80
106
|
/// For push-based implementations, this may be a no-op.
|
81
107
|
///
|
82
|
-
///
|
83
|
-
///
|
108
|
+
/// Note: Implementations must not invoke any method on the
|
109
|
+
/// ResultHandler from within this call.
|
84
110
|
virtual void RequestReresolutionLocked() {}
|
85
111
|
|
86
112
|
/// Resets the re-resolution backoff, if any.
|
@@ -108,16 +134,18 @@ class Resolver : public InternallyRefCounted<Resolver> {
|
|
108
134
|
// TODO(roth): Once we have a C++-like interface for combiners, this
|
109
135
|
// API should change to take a RefCountedPtr<>, so that we always take
|
110
136
|
// ownership of a new ref.
|
111
|
-
explicit Resolver(grpc_combiner* combiner
|
137
|
+
explicit Resolver(grpc_combiner* combiner,
|
138
|
+
UniquePtr<ResultHandler> result_handler);
|
112
139
|
|
113
140
|
virtual ~Resolver();
|
114
141
|
|
115
|
-
/// Shuts down the resolver.
|
116
|
-
/// NextLocked(), the callback will be scheduled with an error.
|
142
|
+
/// Shuts down the resolver.
|
117
143
|
virtual void ShutdownLocked() GRPC_ABSTRACT;
|
118
144
|
|
119
145
|
grpc_combiner* combiner() const { return combiner_; }
|
120
146
|
|
147
|
+
ResultHandler* result_handler() const { return result_handler_.get(); }
|
148
|
+
|
121
149
|
private:
|
122
150
|
static void ShutdownAndUnrefLocked(void* arg, grpc_error* ignored) {
|
123
151
|
Resolver* resolver = static_cast<Resolver*>(arg);
|
@@ -125,6 +153,7 @@ class Resolver : public InternallyRefCounted<Resolver> {
|
|
125
153
|
resolver->Unref();
|
126
154
|
}
|
127
155
|
|
156
|
+
UniquePtr<ResultHandler> result_handler_;
|
128
157
|
grpc_combiner* combiner_;
|
129
158
|
};
|
130
159
|
|
@@ -34,6 +34,7 @@
|
|
34
34
|
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
|
35
35
|
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
36
36
|
#include "src/core/ext/filters/client_channel/server_address.h"
|
37
|
+
#include "src/core/ext/filters/client_channel/service_config.h"
|
37
38
|
#include "src/core/lib/backoff/backoff.h"
|
38
39
|
#include "src/core/lib/channel/channel_args.h"
|
39
40
|
#include "src/core/lib/gpr/env.h"
|
@@ -45,7 +46,6 @@
|
|
45
46
|
#include "src/core/lib/iomgr/resolve_address.h"
|
46
47
|
#include "src/core/lib/iomgr/timer.h"
|
47
48
|
#include "src/core/lib/json/json.h"
|
48
|
-
#include "src/core/lib/transport/service_config.h"
|
49
49
|
|
50
50
|
#define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
51
51
|
#define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
@@ -60,10 +60,9 @@ const char kDefaultPort[] = "https";
|
|
60
60
|
|
61
61
|
class AresDnsResolver : public Resolver {
|
62
62
|
public:
|
63
|
-
explicit AresDnsResolver(
|
63
|
+
explicit AresDnsResolver(ResolverArgs args);
|
64
64
|
|
65
|
-
void
|
66
|
-
grpc_closure* on_complete) override;
|
65
|
+
void StartLocked() override;
|
67
66
|
|
68
67
|
void RequestReresolutionLocked() override;
|
69
68
|
|
@@ -76,7 +75,6 @@ class AresDnsResolver : public Resolver {
|
|
76
75
|
|
77
76
|
void MaybeStartResolvingLocked();
|
78
77
|
void StartResolvingLocked();
|
79
|
-
void MaybeFinishNextLocked();
|
80
78
|
|
81
79
|
static void OnNextResolutionLocked(void* arg, grpc_error* error);
|
82
80
|
static void OnResolvedLocked(void* arg, grpc_error* error);
|
@@ -98,16 +96,6 @@ class AresDnsResolver : public Resolver {
|
|
98
96
|
bool resolving_ = false;
|
99
97
|
/// the pending resolving request
|
100
98
|
grpc_ares_request* pending_request_ = nullptr;
|
101
|
-
/// which version of the result have we published?
|
102
|
-
int published_version_ = 0;
|
103
|
-
/// which version of the result is current?
|
104
|
-
int resolved_version_ = 0;
|
105
|
-
/// pending next completion, or NULL
|
106
|
-
grpc_closure* next_completion_ = nullptr;
|
107
|
-
/// target result address for next completion
|
108
|
-
grpc_channel_args** target_result_ = nullptr;
|
109
|
-
/// current (fully resolved) result
|
110
|
-
grpc_channel_args* resolved_result_ = nullptr;
|
111
99
|
/// next resolution timer
|
112
100
|
bool have_next_resolution_timer_ = false;
|
113
101
|
grpc_timer next_resolution_timer_;
|
@@ -129,8 +117,8 @@ class AresDnsResolver : public Resolver {
|
|
129
117
|
bool enable_srv_queries_;
|
130
118
|
};
|
131
119
|
|
132
|
-
AresDnsResolver::AresDnsResolver(
|
133
|
-
: Resolver(args.combiner),
|
120
|
+
AresDnsResolver::AresDnsResolver(ResolverArgs args)
|
121
|
+
: Resolver(args.combiner, std::move(args.result_handler)),
|
134
122
|
backoff_(
|
135
123
|
BackOff::Options()
|
136
124
|
.set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
|
@@ -177,27 +165,16 @@ AresDnsResolver::AresDnsResolver(const ResolverArgs& args)
|
|
177
165
|
|
178
166
|
AresDnsResolver::~AresDnsResolver() {
|
179
167
|
GRPC_CARES_TRACE_LOG("resolver:%p destroying AresDnsResolver", this);
|
180
|
-
if (resolved_result_ != nullptr) {
|
181
|
-
grpc_channel_args_destroy(resolved_result_);
|
182
|
-
}
|
183
168
|
grpc_pollset_set_destroy(interested_parties_);
|
184
169
|
gpr_free(dns_server_);
|
185
170
|
gpr_free(name_to_resolve_);
|
186
171
|
grpc_channel_args_destroy(channel_args_);
|
187
172
|
}
|
188
173
|
|
189
|
-
void AresDnsResolver::
|
190
|
-
|
191
|
-
GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::NextLocked() is called.",
|
174
|
+
void AresDnsResolver::StartLocked() {
|
175
|
+
GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::StartLocked() is called.",
|
192
176
|
this);
|
193
|
-
|
194
|
-
next_completion_ = on_complete;
|
195
|
-
target_result_ = target_result;
|
196
|
-
if (resolved_version_ == 0 && !resolving_) {
|
197
|
-
MaybeStartResolvingLocked();
|
198
|
-
} else {
|
199
|
-
MaybeFinishNextLocked();
|
200
|
-
}
|
177
|
+
MaybeStartResolvingLocked();
|
201
178
|
}
|
202
179
|
|
203
180
|
void AresDnsResolver::RequestReresolutionLocked() {
|
@@ -221,12 +198,6 @@ void AresDnsResolver::ShutdownLocked() {
|
|
221
198
|
if (pending_request_ != nullptr) {
|
222
199
|
grpc_cancel_ares_request_locked(pending_request_);
|
223
200
|
}
|
224
|
-
if (next_completion_ != nullptr) {
|
225
|
-
*target_result_ = nullptr;
|
226
|
-
GRPC_CLOSURE_SCHED(next_completion_, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
227
|
-
"Resolver Shutdown"));
|
228
|
-
next_completion_ = nullptr;
|
229
|
-
}
|
230
201
|
}
|
231
202
|
|
232
203
|
void AresDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) {
|
@@ -319,41 +290,42 @@ char* ChooseServiceConfig(char* service_config_choice_json) {
|
|
319
290
|
|
320
291
|
void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
|
321
292
|
AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
|
322
|
-
grpc_channel_args* result = nullptr;
|
323
293
|
GPR_ASSERT(r->resolving_);
|
324
294
|
r->resolving_ = false;
|
325
295
|
gpr_free(r->pending_request_);
|
326
296
|
r->pending_request_ = nullptr;
|
297
|
+
if (r->shutdown_initiated_) {
|
298
|
+
r->Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown");
|
299
|
+
return;
|
300
|
+
}
|
327
301
|
if (r->addresses_ != nullptr) {
|
328
|
-
|
329
|
-
|
330
|
-
grpc_arg args_to_add[2];
|
331
|
-
size_t num_args_to_add = 0;
|
332
|
-
args_to_add[num_args_to_add++] =
|
333
|
-
CreateServerAddressListChannelArg(r->addresses_.get());
|
334
|
-
char* service_config_string = nullptr;
|
302
|
+
Result result;
|
303
|
+
result.addresses = std::move(*r->addresses_);
|
335
304
|
if (r->service_config_json_ != nullptr) {
|
336
|
-
service_config_string =
|
305
|
+
char* service_config_string =
|
306
|
+
ChooseServiceConfig(r->service_config_json_);
|
337
307
|
gpr_free(r->service_config_json_);
|
338
308
|
if (service_config_string != nullptr) {
|
339
309
|
GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s",
|
340
310
|
r, service_config_string);
|
341
|
-
|
342
|
-
args_to_add[num_args_to_add++] = grpc_channel_arg_string_create(
|
343
|
-
(char*)GRPC_ARG_SERVICE_CONFIG, service_config_string);
|
311
|
+
result.service_config = ServiceConfig::Create(service_config_string);
|
344
312
|
}
|
313
|
+
gpr_free(service_config_string);
|
345
314
|
}
|
346
|
-
result =
|
347
|
-
|
348
|
-
num_args_to_add);
|
349
|
-
gpr_free(service_config_string);
|
315
|
+
result.args = grpc_channel_args_copy(r->channel_args_);
|
316
|
+
r->result_handler()->ReturnResult(std::move(result));
|
350
317
|
r->addresses_.reset();
|
351
318
|
// Reset backoff state so that we start from the beginning when the
|
352
319
|
// next request gets triggered.
|
353
320
|
r->backoff_.Reset();
|
354
|
-
} else
|
355
|
-
|
356
|
-
|
321
|
+
} else {
|
322
|
+
GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", r,
|
323
|
+
grpc_error_string(error));
|
324
|
+
r->result_handler()->ReturnError(grpc_error_set_int(
|
325
|
+
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
326
|
+
"DNS resolution failed", &error, 1),
|
327
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
|
328
|
+
// Set retry timer.
|
357
329
|
grpc_millis next_try = r->backoff_.NextAttemptTime();
|
358
330
|
grpc_millis timeout = next_try - ExecCtx::Get()->Now();
|
359
331
|
GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed (will retry): %s",
|
@@ -363,8 +335,7 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
|
|
363
335
|
// TODO(roth): We currently deal with this ref manually. Once the
|
364
336
|
// new closure API is done, find a way to track this ref with the timer
|
365
337
|
// callback as part of the type system.
|
366
|
-
|
367
|
-
self.release();
|
338
|
+
r->Ref(DEBUG_LOCATION, "retry-timer").release();
|
368
339
|
if (timeout > 0) {
|
369
340
|
GRPC_CARES_TRACE_LOG("resolver:%p retrying in %" PRId64 " milliseconds",
|
370
341
|
r, timeout);
|
@@ -374,12 +345,6 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
|
|
374
345
|
grpc_timer_init(&r->next_resolution_timer_, next_try,
|
375
346
|
&r->on_next_resolution_);
|
376
347
|
}
|
377
|
-
if (r->resolved_result_ != nullptr) {
|
378
|
-
grpc_channel_args_destroy(r->resolved_result_);
|
379
|
-
}
|
380
|
-
r->resolved_result_ = result;
|
381
|
-
++r->resolved_version_;
|
382
|
-
r->MaybeFinishNextLocked();
|
383
348
|
r->Unref(DEBUG_LOCATION, "dns-resolving");
|
384
349
|
}
|
385
350
|
|
@@ -403,9 +368,7 @@ void AresDnsResolver::MaybeStartResolvingLocked() {
|
|
403
368
|
// TODO(roth): We currently deal with this ref manually. Once the
|
404
369
|
// new closure API is done, find a way to track this ref with the timer
|
405
370
|
// callback as part of the type system.
|
406
|
-
|
407
|
-
Ref(DEBUG_LOCATION, "next_resolution_timer_cooldown");
|
408
|
-
self.release();
|
371
|
+
Ref(DEBUG_LOCATION, "next_resolution_timer_cooldown").release();
|
409
372
|
grpc_timer_init(&next_resolution_timer_, ms_until_next_resolution,
|
410
373
|
&on_next_resolution_);
|
411
374
|
return;
|
@@ -418,8 +381,7 @@ void AresDnsResolver::StartResolvingLocked() {
|
|
418
381
|
// TODO(roth): We currently deal with this ref manually. Once the
|
419
382
|
// new closure API is done, find a way to track this ref with the timer
|
420
383
|
// callback as part of the type system.
|
421
|
-
|
422
|
-
self.release();
|
384
|
+
Ref(DEBUG_LOCATION, "dns-resolving").release();
|
423
385
|
GPR_ASSERT(!resolving_);
|
424
386
|
resolving_ = true;
|
425
387
|
service_config_json_ = nullptr;
|
@@ -433,28 +395,14 @@ void AresDnsResolver::StartResolvingLocked() {
|
|
433
395
|
this, pending_request_);
|
434
396
|
}
|
435
397
|
|
436
|
-
void AresDnsResolver::MaybeFinishNextLocked() {
|
437
|
-
if (next_completion_ != nullptr && resolved_version_ != published_version_) {
|
438
|
-
*target_result_ = resolved_result_ == nullptr
|
439
|
-
? nullptr
|
440
|
-
: grpc_channel_args_copy(resolved_result_);
|
441
|
-
GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::MaybeFinishNextLocked()",
|
442
|
-
this);
|
443
|
-
GRPC_CLOSURE_SCHED(next_completion_, GRPC_ERROR_NONE);
|
444
|
-
next_completion_ = nullptr;
|
445
|
-
published_version_ = resolved_version_;
|
446
|
-
}
|
447
|
-
}
|
448
|
-
|
449
398
|
//
|
450
399
|
// Factory
|
451
400
|
//
|
452
401
|
|
453
402
|
class AresDnsResolverFactory : public ResolverFactory {
|
454
403
|
public:
|
455
|
-
OrphanablePtr<Resolver> CreateResolver(
|
456
|
-
|
457
|
-
return OrphanablePtr<Resolver>(New<AresDnsResolver>(args));
|
404
|
+
OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
|
405
|
+
return OrphanablePtr<Resolver>(New<AresDnsResolver>(std::move(args)));
|
458
406
|
}
|
459
407
|
|
460
408
|
const char* scheme() const override { return "dns"; }
|
@@ -489,7 +437,7 @@ void grpc_resolver_dns_ares_init() {
|
|
489
437
|
address_sorting_init();
|
490
438
|
grpc_error* error = grpc_ares_init();
|
491
439
|
if (error != GRPC_ERROR_NONE) {
|
492
|
-
GRPC_LOG_IF_ERROR("
|
440
|
+
GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
|
493
441
|
return;
|
494
442
|
}
|
495
443
|
if (default_resolver == nullptr) {
|