|
|
|
@ -40,32 +40,11 @@ |
|
|
|
|
namespace grpc_core { |
|
|
|
|
namespace internal { |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
// Converts string format from JSON to proto.
|
|
|
|
|
grpc_core::UniquePtr<char> ConvertCamelToSnake(const char* camel) { |
|
|
|
|
const size_t size = strlen(camel); |
|
|
|
|
char* snake = static_cast<char*>(gpr_malloc(size * 2)); |
|
|
|
|
size_t j = 0; |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
if (isupper(camel[i])) { |
|
|
|
|
snake[j++] = '_'; |
|
|
|
|
snake[j++] = tolower(camel[i]); |
|
|
|
|
} else { |
|
|
|
|
snake[j++] = camel[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
snake[j] = '\0'; |
|
|
|
|
return grpc_core::UniquePtr<char>(snake); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
ProcessedResolverResult::ProcessedResolverResult( |
|
|
|
|
const grpc_channel_args* resolver_result, bool parse_retry) { |
|
|
|
|
ProcessServiceConfig(resolver_result, parse_retry); |
|
|
|
|
// If no LB config was found above, just find the LB policy name then.
|
|
|
|
|
if (lb_policy_config_ == nullptr) ProcessLbPolicyName(resolver_result); |
|
|
|
|
if (lb_policy_name_ == nullptr) ProcessLbPolicyName(resolver_result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ProcessedResolverResult::ProcessServiceConfig( |
|
|
|
@ -98,18 +77,25 @@ void ProcessedResolverResult::ProcessServiceConfig( |
|
|
|
|
|
|
|
|
|
void ProcessedResolverResult::ProcessLbPolicyName( |
|
|
|
|
const grpc_channel_args* resolver_result) { |
|
|
|
|
const char* lb_policy_name = nullptr; |
|
|
|
|
// Prefer the LB policy name found in the service config. Note that this is
|
|
|
|
|
// checking the deprecated loadBalancingPolicy field, rather than the new
|
|
|
|
|
// loadBalancingConfig field.
|
|
|
|
|
if (service_config_ != nullptr) { |
|
|
|
|
lb_policy_name = service_config_->GetLoadBalancingPolicyName(); |
|
|
|
|
lb_policy_name_.reset( |
|
|
|
|
gpr_strdup(service_config_->GetLoadBalancingPolicyName())); |
|
|
|
|
// Convert to lower-case.
|
|
|
|
|
if (lb_policy_name_ != nullptr) { |
|
|
|
|
char* lb_policy_name = lb_policy_name_.get(); |
|
|
|
|
for (size_t i = 0; i < strlen(lb_policy_name); ++i) { |
|
|
|
|
lb_policy_name[i] = tolower(lb_policy_name[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Otherwise, find the LB policy name set by the client API.
|
|
|
|
|
if (lb_policy_name == nullptr) { |
|
|
|
|
if (lb_policy_name_ == nullptr) { |
|
|
|
|
const grpc_arg* channel_arg = |
|
|
|
|
grpc_channel_args_find(resolver_result, GRPC_ARG_LB_POLICY_NAME); |
|
|
|
|
lb_policy_name = grpc_channel_arg_get_string(channel_arg); |
|
|
|
|
lb_policy_name_.reset(gpr_strdup(grpc_channel_arg_get_string(channel_arg))); |
|
|
|
|
} |
|
|
|
|
// Special case: If at least one balancer address is present, we use
|
|
|
|
|
// the grpclb policy, regardless of what the resolver has returned.
|
|
|
|
@ -119,20 +105,21 @@ void ProcessedResolverResult::ProcessLbPolicyName( |
|
|
|
|
grpc_lb_addresses* addresses = |
|
|
|
|
static_cast<grpc_lb_addresses*>(channel_arg->value.pointer.p); |
|
|
|
|
if (grpc_lb_addresses_contains_balancer_address(*addresses)) { |
|
|
|
|
if (lb_policy_name != nullptr && |
|
|
|
|
gpr_stricmp(lb_policy_name, "grpclb") != 0) { |
|
|
|
|
if (lb_policy_name_ != nullptr && |
|
|
|
|
strcmp(lb_policy_name_.get(), "grpclb") != 0) { |
|
|
|
|
gpr_log(GPR_INFO, |
|
|
|
|
"resolver requested LB policy %s but provided at least one " |
|
|
|
|
"balancer address -- forcing use of grpclb LB policy", |
|
|
|
|
lb_policy_name); |
|
|
|
|
lb_policy_name_.get()); |
|
|
|
|
} |
|
|
|
|
lb_policy_name = "grpclb"; |
|
|
|
|
lb_policy_name_.reset(gpr_strdup("grpclb")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Use pick_first if nothing was specified and we didn't select grpclb
|
|
|
|
|
// above.
|
|
|
|
|
if (lb_policy_name == nullptr) lb_policy_name = "pick_first"; |
|
|
|
|
lb_policy_name_.reset(gpr_strdup(lb_policy_name)); |
|
|
|
|
if (lb_policy_name_ == nullptr) { |
|
|
|
|
lb_policy_name_.reset(gpr_strdup("pick_first")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ProcessedResolverResult::ParseServiceConfig( |
|
|
|
@ -175,15 +162,13 @@ void ProcessedResolverResult::ParseLbConfigFromServiceConfig( |
|
|
|
|
if (policy_content != nullptr) return; // Violate "oneof" type.
|
|
|
|
|
policy_content = field; |
|
|
|
|
} |
|
|
|
|
grpc_core::UniquePtr<char> lb_policy_name = |
|
|
|
|
ConvertCamelToSnake(policy_content->key); |
|
|
|
|
if (!grpc_core::LoadBalancingPolicyRegistry::LoadBalancingPolicyExists( |
|
|
|
|
lb_policy_name.get())) { |
|
|
|
|
continue; |
|
|
|
|
// If we support this policy, then select it.
|
|
|
|
|
if (grpc_core::LoadBalancingPolicyRegistry::LoadBalancingPolicyExists( |
|
|
|
|
policy_content->key)) { |
|
|
|
|
lb_policy_name_.reset(gpr_strdup(policy_content->key)); |
|
|
|
|
lb_policy_config_ = policy_content->child; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
lb_policy_name_ = std::move(lb_policy_name); |
|
|
|
|
lb_policy_config_ = policy_content->child; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|