diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index fb72fd693a1..55688e36bb4 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -546,7 +546,8 @@ void grpc_chttp2_initiate_write(grpc_exec_ctx *exec_ctx, switch (t->write_state) { case GRPC_CHTTP2_WRITE_STATE_IDLE: t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING; - gpr_log(GPR_DEBUG, "W:%s:%p: IDLE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: IDLE -> WRITING", + t->is_client ? "CLIENT" : "SERVER", t); GRPC_CHTTP2_REF_TRANSPORT(t, "writing"); grpc_combiner_execute_finally(exec_ctx, t->combiner, &t->write_action_begin_locked, @@ -554,7 +555,8 @@ void grpc_chttp2_initiate_write(grpc_exec_ctx *exec_ctx, break; case GRPC_CHTTP2_WRITE_STATE_WRITING: t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME; - gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> WRITING_MORE", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> WRITING_MORE", + t->is_client ? "CLIENT" : "SERVER", t); break; case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME: break; @@ -579,10 +581,12 @@ static void write_action_begin_locked(grpc_exec_ctx *exec_ctx, void *gt, GPR_ASSERT(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE); if (!t->closed && grpc_chttp2_begin_write(exec_ctx, t)) { t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING; - gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> WRITING", + t->is_client ? "CLIENT" : "SERVER", t); grpc_exec_ctx_sched(exec_ctx, &t->write_action, GRPC_ERROR_NONE, NULL); } else { - gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> IDLE", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> IDLE", + t->is_client ? "CLIENT" : "SERVER", t); t->write_state = GRPC_CHTTP2_WRITE_STATE_IDLE; GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "writing"); } @@ -622,14 +626,17 @@ static void write_action_end_locked(grpc_exec_ctx *exec_ctx, void *tp, case GRPC_CHTTP2_WRITE_STATE_WRITING: GPR_TIMER_MARK("state=writing", 0); t->write_state = GRPC_CHTTP2_WRITE_STATE_IDLE; - gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> IDLE", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> IDLE", + t->is_client ? "CLIENT" : "SERVER", t); break; case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME: GPR_TIMER_MARK("state=writing_stale_with_poller", 0); t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING; - gpr_log(GPR_DEBUG, "W:%s:%p: WRITING_MORE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t); + gpr_log(GPR_DEBUG, "W:%s:%p: WRITING_MORE -> WRITING", + t->is_client ? "CLIENT" : "SERVER", t); GRPC_CHTTP2_REF_TRANSPORT(t, "writing"); - grpc_combiner_execute_finally(exec_ctx, t->combiner, &t->write_action_begin_locked, + grpc_combiner_execute_finally(exec_ctx, t->combiner, + &t->write_action_begin_locked, GRPC_ERROR_NONE); break; } @@ -1429,7 +1436,17 @@ static void fail_pending_writes(grpc_exec_ctx *exec_ctx, &s->send_trailing_metadata_finished, GRPC_ERROR_REF(error)); grpc_chttp2_complete_closure_step(exec_ctx, t, s, - &s->fetching_send_message_finished, error); + &s->fetching_send_message_finished, + GRPC_ERROR_REF(error)); + while (s->on_write_finished_cbs) { + grpc_chttp2_write_cb *cb = s->on_write_finished_cbs; + s->on_write_finished_cbs = cb->next; + grpc_chttp2_complete_closure_step(exec_ctx, t, s, &cb->closure, + GRPC_ERROR_REF(error)); + cb->next = t->write_cb_pool; + t->write_cb_pool = cb; + } + GRPC_ERROR_UNREF(error); } void grpc_chttp2_mark_stream_closed(grpc_exec_ctx *exec_ctx, @@ -1624,14 +1641,19 @@ static void update_global_window(void *args, uint32_t id, void *stream) { int is_zero; int64_t initial_window_update = t->initial_window_update; - was_zero = s->outgoing_window <= 0; - GRPC_CHTTP2_FLOW_CREDIT_STREAM("settings", t, s, outgoing_window, - initial_window_update); - is_zero = s->outgoing_window <= 0; + if (initial_window_update > 0) { + was_zero = s->outgoing_window <= 0; + GRPC_CHTTP2_FLOW_CREDIT_STREAM("settings", t, s, outgoing_window, + initial_window_update); + is_zero = s->outgoing_window <= 0; - if (was_zero && !is_zero) { - grpc_chttp2_become_writable(a->exec_ctx, t, s, true, - "update_global_window"); + if (was_zero && !is_zero) { + grpc_chttp2_become_writable(a->exec_ctx, t, s, true, + "update_global_window"); + } + } else { + GRPC_CHTTP2_FLOW_DEBIT_STREAM("settings", t, s, outgoing_window, + -initial_window_update); } }