Trip through transient failure on disconnection
diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h
index a24506a..1473430 100644
--- a/include/grpc/grpc.h
+++ b/include/grpc/grpc.h
@@ -120,14 +120,14 @@
 
 /** 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;
diff --git a/src/core/client_config/subchannel.c b/src/core/client_config/subchannel.c
index b5e991a..19ec1c0 100644
--- a/src/core/client_config/subchannel.c
+++ b/src/core/client_config/subchannel.c
@@ -142,9 +142,15 @@
 #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 @@
     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 @@
   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 @@
     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 @@
         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 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 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);
 }
 
diff --git a/src/core/client_config/subchannel.h b/src/core/client_config/subchannel.h
index 03bd4f6..5435ef7 100644
--- a/src/core/client_config/subchannel.h
+++ b/src/core/client_config/subchannel.h
@@ -43,8 +43,6 @@
 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))