Improve tracing of subchannel_list code.

pull/12878/head
Mark D. Roth 7 years ago
parent 0c11ebaa6c
commit 901bb4f5bc
  1. 3
      src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
  2. 3
      src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
  3. 103
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc
  4. 5
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.h

@ -265,7 +265,8 @@ static void pf_update_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy,
(void *)p, (unsigned long)addresses->num_addresses);
}
grpc_lb_subchannel_list *subchannel_list = grpc_lb_subchannel_list_create(
exec_ctx, &p->base, addresses, args, pf_connectivity_changed_locked);
exec_ctx, &p->base, &grpc_lb_pick_first_trace, addresses, args,
pf_connectivity_changed_locked);
if (subchannel_list->num_subchannels == 0) {
// Empty update or no valid subchannels. Unsubscribe from all current
// subchannels and put the channel in TRANSIENT_FAILURE.

@ -586,7 +586,8 @@ static void rr_update_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy,
}
grpc_lb_addresses *addresses = (grpc_lb_addresses *)arg->value.pointer.p;
grpc_lb_subchannel_list *subchannel_list = grpc_lb_subchannel_list_create(
exec_ctx, &p->base, addresses, args, rr_connectivity_changed_locked);
exec_ctx, &p->base, &grpc_lb_round_robin_trace, addresses, args,
rr_connectivity_changed_locked);
if (subchannel_list->num_subchannels == 0) {
grpc_connectivity_state_set(
exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,

@ -28,19 +28,16 @@
#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/transport/connectivity_state.h"
extern grpc_tracer_flag grpc_lb_round_robin_trace;
extern grpc_tracer_flag grpc_lb_pick_first_trace;
void grpc_lb_subchannel_data_unref_subchannel(grpc_exec_ctx *exec_ctx,
grpc_lb_subchannel_data *sd,
const char *reason) {
if (sd->subchannel != NULL) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*sd->subchannel_list->tracer)) {
gpr_log(GPR_DEBUG,
"[LB %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
"[%s %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
" (subchannel %p): unreffing subchannel",
sd->subchannel_list->policy, sd->subchannel_list,
sd->subchannel_list->tracer->name, sd->subchannel_list->policy,
sd->subchannel_list,
(size_t)(sd - sd->subchannel_list->subchannels),
sd->subchannel_list->num_subchannels, sd->subchannel);
}
@ -61,12 +58,12 @@ void grpc_lb_subchannel_data_unref_subchannel(grpc_exec_ctx *exec_ctx,
void grpc_lb_subchannel_data_start_connectivity_watch(
grpc_exec_ctx *exec_ctx, grpc_lb_subchannel_data *sd) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*sd->subchannel_list->tracer)) {
gpr_log(GPR_DEBUG,
"[LB %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
"[%s %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
" (subchannel %p): requesting connectivity change notification",
sd->subchannel_list->policy, sd->subchannel_list,
sd->subchannel_list->tracer->name, sd->subchannel_list->policy,
sd->subchannel_list,
(size_t)(sd - sd->subchannel_list->subchannels),
sd->subchannel_list->num_subchannels, sd->subchannel);
}
@ -79,12 +76,12 @@ void grpc_lb_subchannel_data_start_connectivity_watch(
void grpc_lb_subchannel_data_stop_connectivity_watch(
grpc_exec_ctx *exec_ctx, grpc_lb_subchannel_data *sd) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*sd->subchannel_list->tracer)) {
gpr_log(GPR_DEBUG,
"[LB %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
"[%s %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
" (subchannel %p): stopping connectivity watch",
sd->subchannel_list->policy, sd->subchannel_list,
sd->subchannel_list->tracer->name, sd->subchannel_list->policy,
sd->subchannel_list,
(size_t)(sd - sd->subchannel_list->subchannels),
sd->subchannel_list->num_subchannels, sd->subchannel);
}
@ -93,18 +90,18 @@ void grpc_lb_subchannel_data_stop_connectivity_watch(
}
grpc_lb_subchannel_list *grpc_lb_subchannel_list_create(
grpc_exec_ctx *exec_ctx, grpc_lb_policy *p,
grpc_exec_ctx *exec_ctx, grpc_lb_policy *p, grpc_tracer_flag *tracer,
const grpc_lb_addresses *addresses, const grpc_lb_policy_args *args,
grpc_iomgr_cb_func connectivity_changed_cb) {
grpc_lb_subchannel_list *subchannel_list =
(grpc_lb_subchannel_list *)gpr_zalloc(sizeof(*subchannel_list));
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*tracer)) {
gpr_log(GPR_DEBUG,
"[LB %p] Creating subchannel list %p for %" PRIdPTR " subchannels",
p, subchannel_list, addresses->num_addresses);
"[%s %p] Creating subchannel list %p for %" PRIdPTR " subchannels",
tracer->name, p, subchannel_list, addresses->num_addresses);
}
subchannel_list->policy = p;
subchannel_list->tracer = tracer;
gpr_ref_init(&subchannel_list->refcount, 1);
subchannel_list->subchannels = (grpc_lb_subchannel_data *)gpr_zalloc(
sizeof(grpc_lb_subchannel_data) * addresses->num_addresses);
@ -131,14 +128,13 @@ grpc_lb_subchannel_list *grpc_lb_subchannel_list_create(
grpc_channel_args_destroy(exec_ctx, new_args);
if (subchannel == NULL) {
// Subchannel could not be created.
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*tracer)) {
char *address_uri =
grpc_sockaddr_to_uri(&addresses->addresses[i].address);
gpr_log(GPR_DEBUG,
"[LB %p] could not create subchannel for address uri %s, "
"[%s %p] could not create subchannel for address uri %s, "
"ignoring",
subchannel_list->policy, address_uri);
tracer->name, subchannel_list->policy, address_uri);
gpr_free(address_uri);
}
continue;
@ -150,27 +146,26 @@ grpc_lb_subchannel_list *grpc_lb_subchannel_list_create(
grpc_subchannel_check_connectivity(subchannel, &error);
if (error != GRPC_ERROR_NONE) {
// The subchannel is in error (e.g. shutting down). Ignore it.
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*tracer)) {
char *address_uri =
grpc_sockaddr_to_uri(&addresses->addresses[i].address);
gpr_log(GPR_DEBUG,
"[LB %p] subchannel for address uri %s shutting down, ignoring",
subchannel_list->policy, address_uri);
"[%s %p] subchannel for address uri %s shutting down, ignoring",
tracer->name, subchannel_list->policy, address_uri);
gpr_free(address_uri);
}
GRPC_SUBCHANNEL_UNREF(exec_ctx, subchannel, "new_sc_connectivity_error");
GRPC_ERROR_UNREF(error);
continue;
}
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*tracer)) {
char *address_uri =
grpc_sockaddr_to_uri(&addresses->addresses[i].address);
gpr_log(GPR_DEBUG, "[LB %p] subchannel list %p index %" PRIdPTR
gpr_log(GPR_DEBUG, "[%s %p] subchannel list %p index %" PRIdPTR
": Created subchannel %p for address uri %s; "
"initial connectivity state: %s",
p, subchannel_list, subchannel_index, subchannel, address_uri,
tracer->name, p, subchannel_list, subchannel_index, subchannel,
address_uri,
grpc_connectivity_state_name(subchannel_connectivity_state));
gpr_free(address_uri);
}
@ -199,10 +194,10 @@ grpc_lb_subchannel_list *grpc_lb_subchannel_list_create(
static void subchannel_list_destroy(grpc_exec_ctx *exec_ctx,
grpc_lb_subchannel_list *subchannel_list) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
gpr_log(GPR_DEBUG, "[LB %p] Destroying subchannel_list %p",
subchannel_list->policy, subchannel_list);
if (GRPC_TRACER_ON(*subchannel_list->tracer)) {
gpr_log(GPR_DEBUG, "[%s %p] Destroying subchannel_list %p",
subchannel_list->tracer->name, subchannel_list->policy,
subchannel_list);
}
for (size_t i = 0; i < subchannel_list->num_subchannels; i++) {
grpc_lb_subchannel_data *sd = &subchannel_list->subchannels[i];
@ -216,12 +211,12 @@ static void subchannel_list_destroy(grpc_exec_ctx *exec_ctx,
void grpc_lb_subchannel_list_ref(grpc_lb_subchannel_list *subchannel_list,
const char *reason) {
gpr_ref_non_zero(&subchannel_list->refcount);
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*subchannel_list->tracer)) {
const gpr_atm count = gpr_atm_acq_load(&subchannel_list->refcount.count);
gpr_log(GPR_DEBUG, "[LB %p] subchannel_list %p REF %lu->%lu (%s)",
subchannel_list->policy, subchannel_list,
(unsigned long)(count - 1), (unsigned long)count, reason);
gpr_log(GPR_DEBUG, "[%s %p] subchannel_list %p REF %lu->%lu (%s)",
subchannel_list->tracer->name, subchannel_list->policy,
subchannel_list, (unsigned long)(count - 1),
(unsigned long)count, reason);
}
}
@ -229,12 +224,12 @@ void grpc_lb_subchannel_list_unref(grpc_exec_ctx *exec_ctx,
grpc_lb_subchannel_list *subchannel_list,
const char *reason) {
const bool done = gpr_unref(&subchannel_list->refcount);
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*subchannel_list->tracer)) {
const gpr_atm count = gpr_atm_acq_load(&subchannel_list->refcount.count);
gpr_log(GPR_DEBUG, "[LB %p] subchannel_list %p UNREF %lu->%lu (%s)",
subchannel_list->policy, subchannel_list,
(unsigned long)(count + 1), (unsigned long)count, reason);
gpr_log(GPR_DEBUG, "[%s %p] subchannel_list %p UNREF %lu->%lu (%s)",
subchannel_list->tracer->name, subchannel_list->policy,
subchannel_list, (unsigned long)(count + 1),
(unsigned long)count, reason);
}
if (done) {
subchannel_list_destroy(exec_ctx, subchannel_list);
@ -256,12 +251,12 @@ void grpc_lb_subchannel_list_unref_for_connectivity_watch(
static void grpc_lb_subchannel_data_cancel_connectivity_watch(
grpc_exec_ctx *exec_ctx, grpc_lb_subchannel_data *sd, const char *reason) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
if (GRPC_TRACER_ON(*sd->subchannel_list->tracer)) {
gpr_log(GPR_DEBUG,
"[LB %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
"[%s %p] subchannel list %p index %" PRIdPTR " of %" PRIdPTR
" (subchannel %p): canceling connectivity watch (%s)",
sd->subchannel_list->policy, sd->subchannel_list,
sd->subchannel_list->tracer->name, sd->subchannel_list->policy,
sd->subchannel_list,
(size_t)(sd - sd->subchannel_list->subchannels),
sd->subchannel_list->num_subchannels, sd->subchannel, reason);
}
@ -272,10 +267,10 @@ static void grpc_lb_subchannel_data_cancel_connectivity_watch(
void grpc_lb_subchannel_list_shutdown_and_unref(
grpc_exec_ctx *exec_ctx, grpc_lb_subchannel_list *subchannel_list,
const char *reason) {
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace) ||
GRPC_TRACER_ON(grpc_lb_pick_first_trace)) {
gpr_log(GPR_DEBUG, "[LB %p] Shutting down subchannel_list %p (%s)",
subchannel_list->policy, subchannel_list, reason);
if (GRPC_TRACER_ON(*subchannel_list->tracer)) {
gpr_log(GPR_DEBUG, "[%s %p] Shutting down subchannel_list %p (%s)",
subchannel_list->tracer->name, subchannel_list->policy,
subchannel_list, reason);
}
GPR_ASSERT(!subchannel_list->shutting_down);
subchannel_list->shutting_down = true;

@ -21,6 +21,7 @@
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
#include "src/core/ext/filters/client_channel/subchannel.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/transport/connectivity_state.h"
// TODO(roth): This code is intended to be shared between pick_first and
@ -87,6 +88,8 @@ struct grpc_lb_subchannel_list {
/** backpointer to owning policy */
grpc_lb_policy *policy;
grpc_tracer_flag *tracer;
/** all our subchannels */
size_t num_subchannels;
grpc_lb_subchannel_data *subchannels;
@ -118,7 +121,7 @@ struct grpc_lb_subchannel_list {
};
grpc_lb_subchannel_list *grpc_lb_subchannel_list_create(
grpc_exec_ctx *exec_ctx, grpc_lb_policy *p,
grpc_exec_ctx *exec_ctx, grpc_lb_policy *p, grpc_tracer_flag *tracer,
const grpc_lb_addresses *addresses, const grpc_lb_policy_args *args,
grpc_iomgr_cb_func connectivity_changed_cb);

Loading…
Cancel
Save