diff --git a/include/seastar/net/posix-stack.hh b/include/seastar/net/posix-stack.hh index 803f6db626..8377acac3b 100644 --- a/include/seastar/net/posix-stack.hh +++ b/include/seastar/net/posix-stack.hh @@ -109,7 +109,7 @@ class posix_data_source_impl final : public data_source_impl { size_t _buf_size; public: explicit posix_data_source_impl(lw_shared_ptr fd, compat::polymorphic_allocator* allocator=memory::malloc_allocator, - size_t buf_size = 8192) : _buffer_allocator(allocator), _fd(std::move(fd)), + size_t buf_size = 1 << 13) : _buffer_allocator(allocator), _fd(std::move(fd)), _buf(make_temporary_buffer(_buffer_allocator, buf_size)), _buf_size(buf_size) {} future> get() override; future<> close() override; diff --git a/src/net/posix-stack.cc b/src/net/posix-stack.cc index 758deb0b32..c3fde04a4b 100644 --- a/src/net/posix-stack.cc +++ b/src/net/posix-stack.cc @@ -315,11 +315,19 @@ posix_ap_server_socket_impl::move_connected_socket(socket_address sa, } } +static constexpr size_t min_buf_size = 1 << 9; +static constexpr size_t max_buf_size = 1 << 19; + future> posix_data_source_impl::get() { return _fd->read_some(_buf.get_write(), _buf_size).then([this] (size_t size) { _buf.trim(size); auto ret = std::move(_buf); + if (_buf_size == size) { + _buf_size = std::min(max_buf_size, _buf_size << 2); + } else if (size < (_buf_size >> 2)) { + _buf_size = std::max(min_buf_size, _buf_size >> 2); + } _buf = make_temporary_buffer(_buffer_allocator, _buf_size); return make_ready_future>(std::move(ret)); });