|
|
|
@ -56,6 +56,8 @@ typedef struct { |
|
|
|
|
gpr_refcount refs; |
|
|
|
|
/** subchannel factory */ |
|
|
|
|
grpc_subchannel_factory *subchannel_factory; |
|
|
|
|
/** workqueue */ |
|
|
|
|
grpc_workqueue *workqueue; |
|
|
|
|
/** load balancing policy name */ |
|
|
|
|
char *lb_policy_name; |
|
|
|
|
|
|
|
|
@ -96,8 +98,7 @@ static void sockaddr_shutdown(grpc_resolver *resolver) { |
|
|
|
|
gpr_mu_lock(&r->mu); |
|
|
|
|
if (r->next_completion != NULL) { |
|
|
|
|
*r->target_config = NULL; |
|
|
|
|
/* TODO(ctiller): add delayed callback */ |
|
|
|
|
grpc_iomgr_add_callback(r->next_completion); |
|
|
|
|
grpc_workqueue_push(r->workqueue, r->next_completion, 1); |
|
|
|
|
r->next_completion = NULL; |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&r->mu); |
|
|
|
@ -145,7 +146,7 @@ static void sockaddr_maybe_finish_next_locked(sockaddr_resolver *r) { |
|
|
|
|
GRPC_LB_POLICY_UNREF(lb_policy, "unix"); |
|
|
|
|
r->published = 1; |
|
|
|
|
*r->target_config = cfg; |
|
|
|
|
grpc_iomgr_add_callback(r->next_completion); |
|
|
|
|
grpc_workqueue_push(r->workqueue, r->next_completion, 1); |
|
|
|
|
r->next_completion = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -154,6 +155,7 @@ static void sockaddr_destroy(grpc_resolver *gr) { |
|
|
|
|
sockaddr_resolver *r = (sockaddr_resolver *)gr; |
|
|
|
|
gpr_mu_destroy(&r->mu); |
|
|
|
|
grpc_subchannel_factory_unref(r->subchannel_factory); |
|
|
|
|
grpc_workqueue_unref(r->workqueue); |
|
|
|
|
gpr_free(r->addrs); |
|
|
|
|
gpr_free(r->addrs_len); |
|
|
|
|
gpr_free(r->lb_policy_name); |
|
|
|
@ -278,8 +280,7 @@ done: |
|
|
|
|
|
|
|
|
|
static void do_nothing(void *ignored) {} |
|
|
|
|
static grpc_resolver *sockaddr_create( |
|
|
|
|
grpc_uri *uri, const char *lb_policy_name, |
|
|
|
|
grpc_subchannel_factory *subchannel_factory, |
|
|
|
|
grpc_resolver_args *args, const char *lb_policy_name, |
|
|
|
|
int parse(grpc_uri *uri, struct sockaddr_storage *dst, size_t *len)) { |
|
|
|
|
size_t i; |
|
|
|
|
int errors_found = 0; /* GPR_FALSE */ |
|
|
|
@ -287,7 +288,7 @@ static grpc_resolver *sockaddr_create( |
|
|
|
|
gpr_slice path_slice; |
|
|
|
|
gpr_slice_buffer path_parts; |
|
|
|
|
|
|
|
|
|
if (0 != strcmp(uri->authority, "")) { |
|
|
|
|
if (0 != strcmp(args->uri->authority, "")) { |
|
|
|
|
gpr_log(GPR_ERROR, "authority based uri's not supported"); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
@ -295,7 +296,8 @@ static grpc_resolver *sockaddr_create( |
|
|
|
|
r = gpr_malloc(sizeof(sockaddr_resolver)); |
|
|
|
|
memset(r, 0, sizeof(*r)); |
|
|
|
|
|
|
|
|
|
path_slice = gpr_slice_new(uri->path, strlen(uri->path), do_nothing); |
|
|
|
|
path_slice = |
|
|
|
|
gpr_slice_new(args->uri->path, strlen(args->uri->path), do_nothing); |
|
|
|
|
gpr_slice_buffer_init(&path_parts); |
|
|
|
|
|
|
|
|
|
gpr_slice_split(path_slice, ",", &path_parts); |
|
|
|
@ -304,7 +306,7 @@ static grpc_resolver *sockaddr_create( |
|
|
|
|
r->addrs_len = gpr_malloc(sizeof(*r->addrs_len) * r->num_addrs); |
|
|
|
|
|
|
|
|
|
for(i = 0; i < r->num_addrs; i++) { |
|
|
|
|
grpc_uri ith_uri = *uri; |
|
|
|
|
grpc_uri ith_uri = *args->uri; |
|
|
|
|
char* part_str = gpr_dump_slice(path_parts.slices[i], GPR_DUMP_ASCII); |
|
|
|
|
ith_uri.path = part_str; |
|
|
|
|
if (!parse(&ith_uri, &r->addrs[i], &r->addrs_len[i])) { |
|
|
|
@ -324,10 +326,12 @@ static grpc_resolver *sockaddr_create( |
|
|
|
|
gpr_ref_init(&r->refs, 1); |
|
|
|
|
gpr_mu_init(&r->mu); |
|
|
|
|
grpc_resolver_init(&r->base, &sockaddr_resolver_vtable); |
|
|
|
|
r->subchannel_factory = subchannel_factory; |
|
|
|
|
r->subchannel_factory = args->subchannel_factory; |
|
|
|
|
grpc_subchannel_factory_ref(r->subchannel_factory); |
|
|
|
|
r->workqueue = args->workqueue; |
|
|
|
|
grpc_workqueue_ref(r->workqueue); |
|
|
|
|
r->lb_policy_name = gpr_strdup(lb_policy_name); |
|
|
|
|
|
|
|
|
|
grpc_subchannel_factory_ref(subchannel_factory); |
|
|
|
|
return &r->base; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -341,10 +345,8 @@ static void sockaddr_factory_unref(grpc_resolver_factory *factory) {} |
|
|
|
|
|
|
|
|
|
#define DECL_FACTORY(name) \ |
|
|
|
|
static grpc_resolver *name##_factory_create_resolver( \
|
|
|
|
|
grpc_resolver_factory *factory, grpc_uri *uri, \
|
|
|
|
|
grpc_subchannel_factory *subchannel_factory) { \
|
|
|
|
|
return sockaddr_create(uri, "pick_first", \
|
|
|
|
|
subchannel_factory, parse_##name); \
|
|
|
|
|
grpc_resolver_factory *factory, grpc_resolver_args *args) { \
|
|
|
|
|
return sockaddr_create(args, "pick_first", parse_##name); \
|
|
|
|
|
} \
|
|
|
|
|
static const grpc_resolver_factory_vtable name##_factory_vtable = { \
|
|
|
|
|
sockaddr_factory_ref, sockaddr_factory_unref, \
|
|
|
|
|