From 32bc9a86562353372968bdf45e13bfeed57b00e8 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 30 Aug 2022 13:40:49 -0700 Subject: [PATCH] [chttp2] Inform endpoint of min progress size (#30720) --- .../chttp2/transport/chttp2_transport.cc | 2 +- .../ext/transport/chttp2/transport/internal.h | 2 + .../ext/transport/chttp2/transport/parsing.cc | 44 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 2c758f9a5cc..f2d4e6fb322 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.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 diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index ee7048c1d4a..4a2f4261d83 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -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 */ diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc index 6a45381e542..980f13543f6 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.cc +++ b/src/core/ext/transport/chttp2/transport/parsing.cc @@ -79,6 +79,50 @@ static char get_utf8_safe_char(char c) { return static_cast(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);