Bug fixes, spam cleanup
diff --git a/src/core/transport/chttp2/frame_settings.c b/src/core/transport/chttp2/frame_settings.c
index 119c25b..d42bc00 100644
--- a/src/core/transport/chttp2/frame_settings.c
+++ b/src/core/transport/chttp2/frame_settings.c
@@ -154,6 +154,7 @@
         if (cur == end) {
           parser->state = GRPC_CHTTP2_SPS_ID0;
           if (is_last) {
+            transport_parsing->settings_updated = 1;
             memcpy(parser->target_settings, parser->incoming_settings,
                    GRPC_CHTTP2_NUM_SETTINGS * sizeof(gpr_uint32));
             gpr_slice_buffer_add(&transport_parsing->qbuf,
@@ -231,7 +232,8 @@
           }
           parser->incoming_settings[parser->id] = parser->value;
           if (grpc_http_trace) {
-            gpr_log(GPR_DEBUG, "CHTTP2: got setting %d = %d", parser->id,
+            gpr_log(GPR_DEBUG, "CHTTP2:%s: got setting %d = %d",
+                    transport_parsing->is_client ? "CLI" : "SVR", parser->id,
                     parser->value);
           }
         } else {
diff --git a/src/core/transport/chttp2/internal.h b/src/core/transport/chttp2/internal.h
index 2b4dc5e..7f50e71 100644
--- a/src/core/transport/chttp2/internal.h
+++ b/src/core/transport/chttp2/internal.h
@@ -334,6 +334,8 @@
 
   /** closure to execute writing */
   grpc_iomgr_closure writing_action;
+  /** closure to start reading from the endpoint */
+  grpc_iomgr_closure reading_action;
 
   /** address to place a newly accepted stream - set and unset by
       grpc_chttp2_parsing_accept_stream; used by init_stream to
diff --git a/src/core/transport/chttp2/parsing.c b/src/core/transport/chttp2/parsing.c
index 7276f8c..f675c03 100644
--- a/src/core/transport/chttp2/parsing.c
+++ b/src/core/transport/chttp2/parsing.c
@@ -194,7 +194,6 @@
       stream_global->outgoing_window += stream_parsing->outgoing_window_update;
       stream_parsing->outgoing_window_update = 0;
       is_zero = stream_global->outgoing_window <= 0;
-      gpr_log(GPR_DEBUG, "was=%d is=%d", was_zero, is_zero);
       if (was_zero && !is_zero) {
         grpc_chttp2_list_add_writable_stream(transport_global, stream_global);
       }
@@ -765,8 +764,6 @@
   }
   if (transport_parsing->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
     transport_parsing->settings_ack_received = 1;
-  } else {
-    transport_parsing->settings_updated = 1;
   }
   transport_parsing->parser = grpc_chttp2_settings_parser_parse;
   transport_parsing->parser_data = &transport_parsing->simple.settings;
diff --git a/src/core/transport/chttp2/stream_map.c b/src/core/transport/chttp2/stream_map.c
index baec29e..e137d6d 100644
--- a/src/core/transport/chttp2/stream_map.c
+++ b/src/core/transport/chttp2/stream_map.c
@@ -111,7 +111,7 @@
   if (dst->count + src->count > dst->capacity) {
     dst->capacity = GPR_MAX(dst->capacity * 3 / 2, dst->count + src->count);
     dst->keys = gpr_realloc(dst->keys, dst->capacity * sizeof(gpr_uint32));
-    dst->values = gpr_realloc(dst->values, dst->capacity * sizeof(gpr_uint32));
+    dst->values = gpr_realloc(dst->values, dst->capacity * sizeof(void *));
   }
   /* the first element of src must be greater than the last of dst */
   GPR_ASSERT(src->keys[0] > dst->keys[dst->count - 1]);
diff --git a/src/core/transport/chttp2/writing.c b/src/core/transport/chttp2/writing.c
index 5fbec8f..a8e87c3 100644
--- a/src/core/transport/chttp2/writing.c
+++ b/src/core/transport/chttp2/writing.c
@@ -84,11 +84,6 @@
     transport_global->outgoing_window -= window_delta;
     stream_global->outgoing_window -= window_delta;
 
-    gpr_log(GPR_DEBUG, "%s ws:%d nops:%d rc:%d",
-            transport_global->is_client ? "CLI" : "SVR",
-            stream_global->write_state, stream_global->outgoing_sopb->nops,
-            stream_global->read_closed);
-
     if (stream_global->write_state == WRITE_STATE_QUEUED_CLOSE &&
         stream_global->outgoing_sopb->nops == 0) {
       if (!transport_global->is_client && !stream_global->read_closed) {
@@ -178,9 +173,6 @@
 
   while (
       grpc_chttp2_list_pop_writing_stream(transport_writing, &stream_writing)) {
-    gpr_log(GPR_DEBUG, "%s write %d: sc=%d",
-            transport_writing->is_client ? "CLI" : "SVR", stream_writing->id,
-            stream_writing->send_closed);
     grpc_chttp2_encode(stream_writing->sopb.ops, stream_writing->sopb.nops,
                        stream_writing->send_closed != DONT_SEND_CLOSED,
                        stream_writing->id, &transport_writing->hpack_compressor,
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 2d3d720..47cb8f6 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -86,6 +86,7 @@
 
 /* forward declarations of various callbacks that we'll build closures around */
 static void writing_action(void *t, int iomgr_success_ignored);
+static void reading_action(void *t, int iomgr_success_ignored);
 static void notify_closed(void *t, int iomgr_success_ignored);
 
 /** Set a transport level setting, and push it to our peer */
@@ -237,6 +238,7 @@
   gpr_slice_buffer_init(&t->writing.outbuf);
   grpc_chttp2_hpack_compressor_init(&t->writing.hpack_compressor, mdctx);
   grpc_iomgr_closure_init(&t->writing_action, writing_action, t);
+  grpc_iomgr_closure_init(&t->reading_action, reading_action, t);
 
   gpr_slice_buffer_init(&t->parsing.qbuf);
   grpc_chttp2_goaway_parser_init(&t->parsing.goaway_parser);
@@ -560,7 +562,6 @@
     grpc_chttp2_transport_global *transport_global, gpr_uint32 goaway_error,
     gpr_slice goaway_text) {
   char *msg = gpr_hexdump((char*)GPR_SLICE_START_PTR(goaway_text), GPR_SLICE_LENGTH(goaway_text), GPR_HEXDUMP_PLAINTEXT);
-  gpr_log(GPR_DEBUG, "add goaway: st=%d err=%d text=%s", transport_global->goaway_state, goaway_error, msg);
   gpr_free(msg);
   if (transport_global->goaway_state == GRPC_CHTTP2_ERROR_STATE_NONE) {
     transport_global->goaway_state = GRPC_CHTTP2_ERROR_STATE_SEEN;
@@ -574,7 +575,6 @@
 static void maybe_start_some_streams(
     grpc_chttp2_transport_global *transport_global) {
   grpc_chttp2_stream_global *stream_global;
-  gpr_log(GPR_DEBUG, "nextid=%d count=%d", transport_global->next_stream_id, transport_global->concurrent_stream_count);
   /* start streams where we have free grpc_chttp2_stream ids and free
    * concurrency */
   while (transport_global->next_stream_id <= MAX_CLIENT_STREAM_ID &&
@@ -784,28 +784,18 @@
     if (stream_global->write_state == WRITE_STATE_SENT_CLOSE &&
         stream_global->read_closed && stream_global->in_stream_map) {
       if (t->parsing_active) {
-        gpr_log(GPR_DEBUG, "%s %d: queue wait for close",
-                transport_global->is_client ? "CLI" : "SVR", stream_global->id);
         grpc_chttp2_list_add_closed_waiting_for_parsing(transport_global,
                                                         stream_global);
       } else {
-        gpr_log(GPR_DEBUG, "%s %d: late removal from map",
-                transport_global->is_client ? "CLI" : "SVR", stream_global->id);
         remove_stream(t, stream_global->id);
       }
     }
     if (!stream_global->publish_sopb) {
-      gpr_log(GPR_DEBUG, "%s %d: skip rw update: no publish target",
-              transport_global->is_client ? "CLI" : "SVR", stream_global->id);
       continue;
     }
     state = compute_state(
         stream_global->write_state == WRITE_STATE_SENT_CLOSE,
         stream_global->read_closed && !stream_global->in_stream_map);
-    gpr_log(GPR_DEBUG, "%s %d: state=%d->%d; nops=%d",
-            transport_global->is_client ? "CLI" : "SVR", stream_global->id,
-            stream_global->published_state, state,
-            stream_global->incoming_sopb.nops);
     if (stream_global->incoming_sopb.nops == 0 &&
         state == stream_global->published_state) {
       continue;
@@ -1021,7 +1011,7 @@
         t->parsing_active = 0;
       }
       if (i == nslices) {
-        grpc_endpoint_notify_on_read(t->ep, recv_data, t);
+        grpc_chttp2_schedule_closure(&t->global, &t->reading_action, 1);
       }
       unlock(t);
       for (; i < nslices; i++) gpr_slice_unref(slices[i]);
@@ -1029,6 +1019,11 @@
   }
 }
 
+static void reading_action(void *pt, int iomgr_success_ignored) {
+  grpc_chttp2_transport *t = pt;
+  grpc_endpoint_notify_on_read(t->ep, recv_data, t);
+}
+
 /*
  * CALLBACK LOOP
  */
@@ -1144,7 +1139,7 @@
   } else {
     identifier = gpr_strdup(context_scope);
   }
-  gpr_log(GPR_DEBUG,
+  gpr_log(GPR_INFO,
           "FLOWCTL: %s %-10s %8s %-23s %8lld %c %8lld = %8lld %-10s [%s:%d]",
           is_client ? "client" : "server", identifier, context_thread, var,
           current_value, delta < 0 ? '-' : '+', delta < 0 ? -delta : delta,