Make initial connect retry backoff configurable

pull/8235/head
Craig Tiller 9 years ago
parent b97f867b39
commit 10d13f6c90
  1. 3
      include/grpc/impl/codegen/grpc_types.h
  2. 48
      src/core/ext/client_config/subchannel.c

@ -186,6 +186,9 @@ typedef struct {
#define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent" #define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent"
/** The maximum time between subsequent connection attempts, in ms */ /** The maximum time between subsequent connection attempts, in ms */
#define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms" #define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms"
/** The time between the first and second connection attempts, in ms */
#define GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS \
"grpc.initial_reconnect_backoff_ms"
/* The caller of the secure_channel_create functions may override the target /* The caller of the secure_channel_create functions may override the target
name used for SSL host name checking using this channel argument which is of name used for SSL host name checking using this channel argument which is of
type \a GRPC_ARG_STRING. This *should* be used for testing only. type \a GRPC_ARG_STRING. This *should* be used for testing only.

@ -332,36 +332,40 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx,
grpc_closure_init(&c->connected, subchannel_connected, c); grpc_closure_init(&c->connected, subchannel_connected, c);
grpc_connectivity_state_init(&c->state_tracker, GRPC_CHANNEL_IDLE, grpc_connectivity_state_init(&c->state_tracker, GRPC_CHANNEL_IDLE,
"subchannel"); "subchannel");
gpr_backoff_init(&c->backoff_state, int initial_backoff_ms =
GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER, GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS * 1000;
GRPC_SUBCHANNEL_RECONNECT_JITTER, int max_backoff_ms = GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS * 1000;
GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS * 1000, bool fixed_reconnect_backoff = false;
GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS * 1000);
if (c->args) { if (c->args) {
for (size_t i = 0; i < c->args->num_args; i++) { for (size_t i = 0; i < c->args->num_args; i++) {
if (0 == strcmp(c->args->args[i].key, if (0 == strcmp(c->args->args[i].key,
"grpc.testing.fixed_reconnect_backoff")) { "grpc.testing.fixed_reconnect_backoff")) {
GPR_ASSERT(c->args->args[i].type == GRPC_ARG_INTEGER); GPR_ASSERT(c->args->args[i].type == GRPC_ARG_INTEGER);
gpr_backoff_init(&c->backoff_state, 1.0, 0.0, fixed_reconnect_backoff = true;
c->args->args[i].value.integer, initial_backoff_ms = max_backoff_ms = grpc_channel_arg_get_integer(
c->args->args[i].value.integer); &c->args->args[i],
} (grpc_integer_options){initial_backoff_ms, 100, INT_MAX});
if (0 == } else if (0 == strcmp(c->args->args[i].key,
strcmp(c->args->args[i].key, GRPC_ARG_MAX_RECONNECT_BACKOFF_MS)) { GRPC_ARG_MAX_RECONNECT_BACKOFF_MS)) {
const grpc_integer_options options = {-1, 0, INT_MAX}; fixed_reconnect_backoff = false;
const int value = max_backoff_ms = grpc_channel_arg_get_integer(
grpc_channel_arg_get_integer(&c->args->args[i], options); &c->args->args[i],
if (value >= 0) { (grpc_integer_options){max_backoff_ms, 100, INT_MAX});
gpr_backoff_init( } else if (0 == strcmp(c->args->args[i].key,
&c->backoff_state, GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER, GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS)) {
GRPC_SUBCHANNEL_RECONNECT_JITTER, fixed_reconnect_backoff = false;
GPR_MIN(value, max_backoff_ms = grpc_channel_arg_get_integer(
GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS * 1000), &c->args->args[i],
value); (grpc_integer_options){initial_backoff_ms, 100, INT_MAX});
}
} }
} }
} }
gpr_backoff_init(
&c->backoff_state,
fixed_reconnect_backoff ? 1.0
: GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER,
fixed_reconnect_backoff ? 0.0 : GRPC_SUBCHANNEL_RECONNECT_JITTER,
initial_backoff_ms, max_backoff_ms);
gpr_mu_init(&c->mu); gpr_mu_init(&c->mu);
return grpc_subchannel_index_register(exec_ctx, key, c); return grpc_subchannel_index_register(exec_ctx, key, c);

Loading…
Cancel
Save