[chttp2] Inform endpoint of min progress size (#30720)

pull/30611/head
Craig Tiller 3 years ago committed by GitHub
parent 004788af3d
commit 32bc9a8656
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  2. 2
      src/core/ext/transport/chttp2/transport/internal.h
  3. 44
      src/core/ext/transport/chttp2/transport/parsing.cc

@ -2464,7 +2464,7 @@ static void continue_read_action_locked(grpc_chttp2_transport* t) {
GRPC_CLOSURE_INIT(&t->read_action_locked, read_action, t,
grpc_schedule_on_exec_ctx);
grpc_endpoint_read(t->ep, &t->read_buffer, &t->read_action_locked, urgent,
/*min_progress_size=*/1);
grpc_chttp2_min_read_progress_size(t));
}
// t is reffed prior to calling the first time, and once the callback chain

@ -782,4 +782,6 @@ void grpc_chttp2_retry_initiate_ping(void* tp, grpc_error_handle error);
void schedule_bdp_ping_locked(grpc_chttp2_transport* t);
uint32_t grpc_chttp2_min_read_progress_size(grpc_chttp2_transport* t);
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_INTERNAL_H */

@ -79,6 +79,50 @@ static char get_utf8_safe_char(char c) {
return static_cast<unsigned char>(c) < 128 ? c : 32;
}
uint32_t grpc_chttp2_min_read_progress_size(grpc_chttp2_transport* t) {
switch (t->deframe_state) {
case GRPC_DTS_CLIENT_PREFIX_0:
case GRPC_DTS_CLIENT_PREFIX_1:
case GRPC_DTS_CLIENT_PREFIX_2:
case GRPC_DTS_CLIENT_PREFIX_3:
case GRPC_DTS_CLIENT_PREFIX_4:
case GRPC_DTS_CLIENT_PREFIX_5:
case GRPC_DTS_CLIENT_PREFIX_6:
case GRPC_DTS_CLIENT_PREFIX_7:
case GRPC_DTS_CLIENT_PREFIX_8:
case GRPC_DTS_CLIENT_PREFIX_9:
case GRPC_DTS_CLIENT_PREFIX_10:
case GRPC_DTS_CLIENT_PREFIX_11:
case GRPC_DTS_CLIENT_PREFIX_12:
case GRPC_DTS_CLIENT_PREFIX_13:
case GRPC_DTS_CLIENT_PREFIX_14:
case GRPC_DTS_CLIENT_PREFIX_15:
case GRPC_DTS_CLIENT_PREFIX_16:
case GRPC_DTS_CLIENT_PREFIX_17:
case GRPC_DTS_CLIENT_PREFIX_18:
case GRPC_DTS_CLIENT_PREFIX_19:
case GRPC_DTS_CLIENT_PREFIX_20:
case GRPC_DTS_CLIENT_PREFIX_21:
case GRPC_DTS_CLIENT_PREFIX_22:
case GRPC_DTS_CLIENT_PREFIX_23:
// Need the client prefix *and* the first fixed header to make progress.
return 9 + 24 - (t->deframe_state - GRPC_DTS_CLIENT_PREFIX_0);
case GRPC_DTS_FH_0:
case GRPC_DTS_FH_1:
case GRPC_DTS_FH_2:
case GRPC_DTS_FH_3:
case GRPC_DTS_FH_4:
case GRPC_DTS_FH_5:
case GRPC_DTS_FH_6:
case GRPC_DTS_FH_7:
case GRPC_DTS_FH_8:
return 9 - (t->deframe_state - GRPC_DTS_FH_0);
case GRPC_DTS_FRAME:
return t->incoming_frame_size;
}
GPR_UNREACHABLE_CODE(return 1);
}
grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
const grpc_slice& slice) {
const uint8_t* beg = GRPC_SLICE_START_PTR(slice);

Loading…
Cancel
Save