|
|
|
@ -288,8 +288,7 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( |
|
|
|
|
if (sent_initial_metadata) { |
|
|
|
|
/* send any body bytes, if allowed by flow control */ |
|
|
|
|
if (s->flow_controlled_buffer.length > 0 || |
|
|
|
|
(s->stream_compression_send_enabled && |
|
|
|
|
s->compressed_data_buffer->length > 0)) { |
|
|
|
|
s->compressed_data_buffer.length > 0) { |
|
|
|
|
uint32_t stream_remote_window = (uint32_t)GPR_MAX( |
|
|
|
|
0, |
|
|
|
|
s->flow_control.remote_window_delta + |
|
|
|
@ -302,56 +301,40 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( |
|
|
|
|
if (max_outgoing > 0) { |
|
|
|
|
bool is_last_data_frame = false; |
|
|
|
|
bool is_last_frame = false; |
|
|
|
|
if (s->stream_compression_send_enabled) { |
|
|
|
|
while ((s->flow_controlled_buffer.length > 0 || |
|
|
|
|
s->compressed_data_buffer->length > 0) && |
|
|
|
|
max_outgoing > 0) { |
|
|
|
|
if (s->compressed_data_buffer->length > 0) { |
|
|
|
|
uint32_t send_bytes = (uint32_t)GPR_MIN( |
|
|
|
|
max_outgoing, s->compressed_data_buffer->length); |
|
|
|
|
is_last_data_frame = |
|
|
|
|
(send_bytes == s->compressed_data_buffer->length && |
|
|
|
|
s->flow_controlled_buffer.length == 0 && |
|
|
|
|
s->fetching_send_message == NULL); |
|
|
|
|
is_last_frame = |
|
|
|
|
is_last_data_frame && s->send_trailing_metadata != NULL && |
|
|
|
|
grpc_metadata_batch_is_empty(s->send_trailing_metadata); |
|
|
|
|
grpc_chttp2_encode_data(s->id, s->compressed_data_buffer, |
|
|
|
|
send_bytes, is_last_frame, |
|
|
|
|
&s->stats.outgoing, &t->outbuf); |
|
|
|
|
grpc_chttp2_flowctl_sent_data(&t->flow_control, |
|
|
|
|
&s->flow_control, send_bytes); |
|
|
|
|
max_outgoing -= send_bytes; |
|
|
|
|
if (s->compressed_data_buffer->length == 0) { |
|
|
|
|
s->sending_bytes += s->uncompressed_data_size; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (s->stream_compression_ctx == NULL) { |
|
|
|
|
s->stream_compression_ctx = |
|
|
|
|
grpc_stream_compression_context_create( |
|
|
|
|
GRPC_STREAM_COMPRESSION_GZIP_COMPRESS); |
|
|
|
|
} |
|
|
|
|
s->uncompressed_data_size = s->flow_controlled_buffer.length; |
|
|
|
|
GPR_ASSERT(grpc_stream_compress( |
|
|
|
|
s->stream_compression_ctx, &s->flow_controlled_buffer, |
|
|
|
|
s->compressed_data_buffer, NULL, MAX_SIZE_T, |
|
|
|
|
GRPC_STREAM_COMPRESSION_FLUSH_SYNC)); |
|
|
|
|
while ((s->flow_controlled_buffer.length > 0 || |
|
|
|
|
s->compressed_data_buffer.length > 0) && |
|
|
|
|
max_outgoing > 0) { |
|
|
|
|
if (s->compressed_data_buffer.length > 0) { |
|
|
|
|
uint32_t send_bytes = (uint32_t)GPR_MIN( |
|
|
|
|
max_outgoing, s->compressed_data_buffer.length); |
|
|
|
|
is_last_data_frame = |
|
|
|
|
(send_bytes == s->compressed_data_buffer.length && |
|
|
|
|
s->flow_controlled_buffer.length == 0 && |
|
|
|
|
s->fetching_send_message == NULL); |
|
|
|
|
is_last_frame = |
|
|
|
|
is_last_data_frame && s->send_trailing_metadata != NULL && |
|
|
|
|
grpc_metadata_batch_is_empty(s->send_trailing_metadata); |
|
|
|
|
grpc_chttp2_encode_data(s->id, &s->compressed_data_buffer, |
|
|
|
|
send_bytes, is_last_frame, |
|
|
|
|
&s->stats.outgoing, &t->outbuf); |
|
|
|
|
grpc_chttp2_flowctl_sent_data(&t->flow_control, |
|
|
|
|
&s->flow_control, send_bytes); |
|
|
|
|
max_outgoing -= send_bytes; |
|
|
|
|
if (s->compressed_data_buffer.length == 0) { |
|
|
|
|
s->sending_bytes += s->uncompressed_data_size; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (s->stream_compression_ctx == NULL) { |
|
|
|
|
s->stream_compression_ctx = |
|
|
|
|
grpc_stream_compression_context_create( |
|
|
|
|
s->stream_compression_method); |
|
|
|
|
} |
|
|
|
|
s->uncompressed_data_size = s->flow_controlled_buffer.length; |
|
|
|
|
GPR_ASSERT(grpc_stream_compress( |
|
|
|
|
s->stream_compression_ctx, &s->flow_controlled_buffer, |
|
|
|
|
&s->compressed_data_buffer, NULL, MAX_SIZE_T, |
|
|
|
|
GRPC_STREAM_COMPRESSION_FLUSH_SYNC)); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
uint32_t send_bytes = (uint32_t)GPR_MIN( |
|
|
|
|
max_outgoing, s->flow_controlled_buffer.length); |
|
|
|
|
is_last_data_frame = s->fetching_send_message == NULL && |
|
|
|
|
send_bytes == s->flow_controlled_buffer.length; |
|
|
|
|
is_last_frame = |
|
|
|
|
is_last_data_frame && s->send_trailing_metadata != NULL && |
|
|
|
|
grpc_metadata_batch_is_empty(s->send_trailing_metadata); |
|
|
|
|
grpc_chttp2_encode_data(s->id, &s->flow_controlled_buffer, |
|
|
|
|
send_bytes, is_last_frame, |
|
|
|
|
&s->stats.outgoing, &t->outbuf); |
|
|
|
|
grpc_chttp2_flowctl_sent_data(&t->flow_control, &s->flow_control, |
|
|
|
|
send_bytes); |
|
|
|
|
s->sending_bytes += send_bytes; |
|
|
|
|
} |
|
|
|
|
t->ping_state.pings_before_data_required = |
|
|
|
|
t->ping_policy.max_pings_without_data; |
|
|
|
@ -371,8 +354,7 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( |
|
|
|
|
} |
|
|
|
|
now_writing = true; |
|
|
|
|
if (s->flow_controlled_buffer.length > 0 || |
|
|
|
|
(s->stream_compression_send_enabled && |
|
|
|
|
s->compressed_data_buffer->length > 0)) { |
|
|
|
|
s->compressed_data_buffer.length > 0) { |
|
|
|
|
GRPC_CHTTP2_STREAM_REF(s, "chttp2_writing:fork"); |
|
|
|
|
grpc_chttp2_list_add_writable_stream(t, s); |
|
|
|
|
} |
|
|
|
@ -387,8 +369,7 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( |
|
|
|
|
if (s->send_trailing_metadata != NULL && |
|
|
|
|
s->fetching_send_message == NULL && |
|
|
|
|
s->flow_controlled_buffer.length == 0 && |
|
|
|
|
(!s->stream_compression_send_enabled || |
|
|
|
|
s->compressed_data_buffer->length == 0)) { |
|
|
|
|
s->compressed_data_buffer.length == 0) { |
|
|
|
|
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "sending trailing_metadata")); |
|
|
|
|
if (grpc_metadata_batch_is_empty(s->send_trailing_metadata)) { |
|
|
|
|
grpc_chttp2_encode_data(s->id, &s->flow_controlled_buffer, 0, true, |
|
|
|
|