Trip through transient failure on disconnection

pull/2303/head
Craig Tiller 10 years ago
parent abf36389d4
commit 11bf14ec33
  1. 4
      include/grpc/grpc.h
  2. 28
      src/core/client_config/subchannel.c
  3. 2
      src/core/client_config/subchannel.h

@ -120,14 +120,14 @@ typedef struct {
/** Connectivity state of a channel. */
typedef enum {
/** channel is idle */
GRPC_CHANNEL_IDLE,
/** channel is connecting */
GRPC_CHANNEL_CONNECTING,
/** channel is ready for work */
GRPC_CHANNEL_READY,
/** channel has seen a failure but expects to recover */
GRPC_CHANNEL_TRANSIENT_FAILURE,
/** channel is idle */
GRPC_CHANNEL_IDLE,
/** channel has seen a failure that it cannot recover from */
GRPC_CHANNEL_FATAL_FAILURE
} grpc_connectivity_state;

@ -142,9 +142,15 @@ static void subchannel_destroy(grpc_subchannel *c);
#else
#define SUBCHANNEL_REF_LOCKED(p, r) subchannel_ref_locked((p))
#define SUBCHANNEL_UNREF_LOCKED(p, r) subchannel_unref_locked((p))
#define CONNECTION_REF_LOCKED(p, r) connection_ref_locked((p), __FILE__, __LINE__, (r))
#define CONNECTION_UNREF_LOCKED(p, r) connection_unref_locked((p), __FILE__, __LINE__, (r))
#define CONNECTION_REF_LOCKED(p, r) connection_ref_locked((p))
#define CONNECTION_UNREF_LOCKED(p, r) connection_unref_locked((p))
#define REF_PASS_ARGS
#define REF_LOG(name, p) \
do { \
} while (0)
#define UNREF_LOG(name, p) \
do { \
} while (0)
#endif
/*
@ -332,8 +338,7 @@ void grpc_subchannel_notify_on_state_change(grpc_subchannel *c,
c->connecting = 1;
/* released by connection */
SUBCHANNEL_REF_LOCKED(c, "connecting");
grpc_connectivity_state_set(&c->state_tracker,
compute_connectivity_locked(c));
connectivity_state_changed_locked(c);
}
gpr_mu_unlock(&c->mu);
if (do_connect) {
@ -348,8 +353,7 @@ void grpc_subchannel_process_transport_op(grpc_subchannel *c,
gpr_mu_lock(&c->mu);
if (op->disconnect) {
c->disconnected = 1;
grpc_connectivity_state_set(&c->state_tracker,
compute_connectivity_locked(c));
connectivity_state_changed_locked(c);
}
if (c->active != NULL) {
con = c->active;
@ -389,6 +393,8 @@ static void on_state_changed(void *p, int iomgr_success) {
goto done;
}
gpr_log(GPR_DEBUG, "TRANSPORT STATE: %d", sw->connectivity_state);
switch (sw->connectivity_state) {
case GRPC_CHANNEL_CONNECTING:
case GRPC_CHANNEL_READY:
@ -409,19 +415,22 @@ static void on_state_changed(void *p, int iomgr_success) {
destroy_connection = sw->subchannel->active;
}
sw->subchannel->active = NULL;
grpc_connectivity_state_set(&c->state_tracker,
GRPC_CHANNEL_TRANSIENT_FAILURE);
break;
case GRPC_CHANNEL_TRANSIENT_FAILURE:
/* things are starting to go wrong, reconnect but don't deactivate */
/* released by connection */
SUBCHANNEL_REF_LOCKED(c, "connecting");
grpc_connectivity_state_set(&c->state_tracker,
GRPC_CHANNEL_TRANSIENT_FAILURE);
do_connect = 1;
c->connecting = 1;
break;
}
done:
grpc_connectivity_state_set(&c->state_tracker,
compute_connectivity_locked(c));
connectivity_state_changed_locked(c);
destroy = SUBCHANNEL_UNREF_LOCKED(c, "state_watcher");
gpr_free(sw);
gpr_mu_unlock(mu);
@ -521,7 +530,7 @@ static void publish_transport(grpc_subchannel *c) {
static void subchannel_connected(void *arg, int iomgr_success) {
grpc_subchannel *c = arg;
if (c->connecting_result.transport) {
if (c->connecting_result.transport != NULL) {
publish_transport(c);
} else {
int destroy;
@ -553,6 +562,7 @@ static grpc_connectivity_state compute_connectivity_locked(grpc_subchannel *c) {
static void connectivity_state_changed_locked(grpc_subchannel *c) {
grpc_connectivity_state current = compute_connectivity_locked(c);
gpr_log(GPR_DEBUG, "SUBCHANNEL constate=%d", current);
grpc_connectivity_state_set(&c->state_tracker, current);
}

@ -43,8 +43,6 @@ typedef struct grpc_subchannel grpc_subchannel;
typedef struct grpc_subchannel_call grpc_subchannel_call;
typedef struct grpc_subchannel_args grpc_subchannel_args;
#define GRPC_SUBCHANNEL_REFCOUNT_DEBUG
#ifdef GRPC_SUBCHANNEL_REFCOUNT_DEBUG
#define GRPC_SUBCHANNEL_REF(p, r) grpc_subchannel_ref((p), __FILE__, __LINE__, (r))
#define GRPC_SUBCHANNEL_UNREF(p, r) grpc_subchannel_unref((p), __FILE__, __LINE__, (r))

Loading…
Cancel
Save