This is an automated email from the ASF dual-hosted git repository. cmcfarlen pushed a commit to branch 10.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 14924ed99f75e4d6e4e53366f222764137198842 Author: Masaori Koshiba <[email protected]> AuthorDate: Tue May 14 09:57:39 2024 +0900 Use large IOBufferBlock only on sending DATA frame (#11229) (cherry picked from commit 0d14ad2b18fde85eff69ba01a87d92940866c59f) --- include/proxy/http2/HTTP2.h | 1 + src/proxy/http2/HTTP2.cc | 3 +++ src/proxy/http2/Http2ClientSession.cc | 6 ++---- src/proxy/http2/Http2Frame.cc | 11 +++++++++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/proxy/http2/HTTP2.h b/include/proxy/http2/HTTP2.h index 5d73022fec..5cabf2b2cd 100644 --- a/include/proxy/http2/HTTP2.h +++ b/include/proxy/http2/HTTP2.h @@ -434,6 +434,7 @@ public: static uint32_t stream_slow_log_threshold; static uint32_t header_table_size_limit; static uint32_t write_buffer_block_size; + static int64_t write_buffer_block_size_index; static float write_size_threshold; static uint32_t write_time_threshold; static uint32_t buffer_water_mark; diff --git a/src/proxy/http2/HTTP2.cc b/src/proxy/http2/HTTP2.cc index 8fcb9d93d6..3de6bbab04 100644 --- a/src/proxy/http2/HTTP2.cc +++ b/src/proxy/http2/HTTP2.cc @@ -496,6 +496,7 @@ uint32_t Http2::con_slow_log_threshold = 0; uint32_t Http2::stream_slow_log_threshold = 0; uint32_t Http2::header_table_size_limit = 65536; uint32_t Http2::write_buffer_block_size = 262144; +int64_t Http2::write_buffer_block_size_index = BUFFER_SIZE_INDEX_256K; float Http2::write_size_threshold = 0.5; uint32_t Http2::write_time_threshold = 100; uint32_t Http2::buffer_water_mark = 0; @@ -556,6 +557,8 @@ Http2::init() REC_EstablishStaticConfigInt32U(write_time_threshold, "proxy.config.http2.write_time_threshold"); REC_EstablishStaticConfigInt32U(buffer_water_mark, "proxy.config.http2.default_buffer_water_mark"); + write_buffer_block_size_index = iobuffer_size_to_index(Http2::write_buffer_block_size, MAX_BUFFER_SIZE_INDEX); + // If any settings is broken, ATS should not start ink_release_assert(http2_settings_parameter_is_valid({HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, max_concurrent_streams_in})); ink_release_assert(http2_settings_parameter_is_valid({HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, min_concurrent_streams_in})); diff --git a/src/proxy/http2/Http2ClientSession.cc b/src/proxy/http2/Http2ClientSession.cc index 61da1fc9f5..5cd713e527 100644 --- a/src/proxy/http2/Http2ClientSession.cc +++ b/src/proxy/http2/Http2ClientSession.cc @@ -114,9 +114,7 @@ Http2ClientSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOB this->read_buffer->water_mark = connection_state.local_settings.get(HTTP2_SETTINGS_MAX_FRAME_SIZE); this->_read_buffer_reader = reader ? reader : this->read_buffer->alloc_reader(); - // This block size is the buffer size that we pass to SSLWriteBuffer - auto buffer_block_size_index = iobuffer_size_to_index(Http2::write_buffer_block_size, MAX_BUFFER_SIZE_INDEX); - this->write_buffer = new_MIOBuffer(buffer_block_size_index); + this->write_buffer = new_MIOBuffer(HTTP2_HEADER_BUFFER_SIZE_INDEX); uint32_t buffer_water_mark; if (auto snis = this->_vc->get_service<TLSSNISupport>(); snis && snis->hints_from_sni.http2_buffer_water_mark.has_value()) { @@ -127,7 +125,7 @@ Http2ClientSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOB this->write_buffer->water_mark = buffer_water_mark; this->_write_buffer_reader = this->write_buffer->alloc_reader(); - this->_write_size_threshold = index_to_buffer_size(buffer_block_size_index) * Http2::write_size_threshold; + this->_write_size_threshold = index_to_buffer_size(Http2::write_buffer_block_size_index) * Http2::write_size_threshold; this->_handle_if_ssl(new_vc); diff --git a/src/proxy/http2/Http2Frame.cc b/src/proxy/http2/Http2Frame.cc index 52482ab68b..b477b48d6b 100644 --- a/src/proxy/http2/Http2Frame.cc +++ b/src/proxy/http2/Http2Frame.cc @@ -22,6 +22,7 @@ */ #include "proxy/http2/Http2Frame.h" +#include "iocore/eventsystem/IOBuffer.h" // // Http2Frame @@ -60,8 +61,14 @@ Http2DataFrame::write_to(MIOBuffer *iobuffer) const int64_t written = 0; // Fill current IOBufferBlock as much as possible to reduce SSL_write() calls while (written < this->_payload_len) { - int64_t read_len = std::min(this->_payload_len - written, this->_reader->block_read_avail()); - written += iobuffer->write(this->_reader->start(), read_len); + int64_t read_len = std::min(this->_payload_len - written, this->_reader->block_read_avail()); + + if (iobuffer->block_write_avail() < read_len) { + // This block size is the buffer size that we pass to SSLWriteBuffer + iobuffer->append_block(Http2::write_buffer_block_size_index); + } + + written += iobuffer->write(this->_reader->start(), read_len); this->_reader->consume(read_len); } len += written;
