Skip to content
Snippets Groups Projects
Commit f1021031 authored by Yang Gao's avatar Yang Gao
Browse files

Proof of concept fix for flow control error

parent 3bb40596
No related branches found
No related tags found
No related merge requests found
...@@ -54,6 +54,7 @@ typedef struct { ...@@ -54,6 +54,7 @@ typedef struct {
gpr_uint8 process_ping_reply; gpr_uint8 process_ping_reply;
gpr_uint8 goaway; gpr_uint8 goaway;
gpr_uint32 initial_window_update;
gpr_uint32 window_update; gpr_uint32 window_update;
gpr_uint32 goaway_last_stream_index; gpr_uint32 goaway_last_stream_index;
gpr_uint32 goaway_error; gpr_uint32 goaway_error;
......
...@@ -218,6 +218,10 @@ grpc_chttp2_parse_error grpc_chttp2_settings_parser_parse( ...@@ -218,6 +218,10 @@ grpc_chttp2_parse_error grpc_chttp2_settings_parser_parse(
return GRPC_CHTTP2_CONNECTION_ERROR; return GRPC_CHTTP2_CONNECTION_ERROR;
} }
} }
if (parser->id == 4 && parser->incoming_settings[parser->id] != parser->value) {
state->initial_window_update = parser->value - parser->incoming_settings[parser->id];
gpr_log(GPR_DEBUG, "adding %d for initial_window change", state->window_update);
}
parser->incoming_settings[parser->id] = parser->value; parser->incoming_settings[parser->id] = parser->value;
if (grpc_http_trace) { if (grpc_http_trace) {
gpr_log(GPR_DEBUG, "CHTTP2: got setting %d = %d", parser->id, gpr_log(GPR_DEBUG, "CHTTP2: got setting %d = %d", parser->id,
......
...@@ -1485,6 +1485,18 @@ static int parse_frame_slice(transport *t, gpr_slice slice, int is_last) { ...@@ -1485,6 +1485,18 @@ static int parse_frame_slice(transport *t, gpr_slice slice, int is_last) {
} }
} }
} }
if (st.initial_window_update) {
for (i = 0; i < t->stream_map.count; i++) {
stream *s = (stream*)(t->stream_map.values[i]);
/* TODO there are other scenarios */
if (s->outgoing_window == 0) {
s->outgoing_window += st.initial_window_update;
if (s->outgoing_sopb.nops) {
stream_list_join(t, s, WRITABLE);
}
}
}
}
if (st.window_update) { if (st.window_update) {
if (t->incoming_stream_id) { if (t->incoming_stream_id) {
/* if there was a stream id, this is for some stream */ /* if there was a stream id, this is for some stream */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment