@@ -315,9 +315,17 @@ posix_ap_server_socket_impl<Transport>::move_connected_socket(socket_address sa,
315315 }
316316}
317317
318+ static constexpr size_t min_buf_size = 1 << 9 ;
319+ static constexpr size_t max_buf_size = 1 << 15 ;
320+
318321future<temporary_buffer<char >>
319322posix_data_source_impl::get () {
320323 return _fd->read_some (_buf.get_write (), _buf_size).then ([this ] (size_t size) {
324+ if (_buf_size == size) {
325+ _buf_size = std::min (max_buf_size, _buf_size << 2 );
326+ } else if (size < (_buf_size >> 2 )) {
327+ _buf_size = std::max (min_buf_size, _buf_size >> 2 );
328+ }
321329 _buf.trim (size);
322330 auto ret = std::move (_buf);
323331 _buf = make_temporary_buffer<char >(_buffer_allocator, _buf_size);
@@ -329,7 +337,12 @@ future<size_t, temporary_buffer<char>>
329337posix_data_source_impl::get_direct (char * buf, size_t size) {
330338 if (size > _buf_size / 2 ) {
331339 // this was a large read, we don't prefetch
332- return _fd->read_some (buf, size).then ([] (auto read_size) {
340+ return _fd->read_some (buf, size).then ([this ] (auto read_size) {
341+ if (_buf_size == read_size) {
342+ _buf_size = std::min (max_buf_size, _buf_size << 2 );
343+ } else if (read_size < (_buf_size >> 2 )) {
344+ _buf_size = std::max (min_buf_size, _buf_size >> 2 );
345+ }
333346 return make_ready_future<size_t , temporary_buffer<char >>(
334347 read_size, temporary_buffer<char >());
335348 });
0 commit comments