[ntcore] Limit buffer pool size to 64KB per connection (#5485)

Previously this was unlimited, which could result in holding on to a
large amount of memory if the connection got backlogged or a burst of
data transmission occurred.
This commit is contained in:
Peter Johnson
2023-08-20 13:53:52 -07:00
committed by GitHub
parent 96f7fa662e
commit 89e738262c
2 changed files with 17 additions and 2 deletions

View File

@@ -16,6 +16,7 @@ using namespace nt::net;
static constexpr size_t kAllocSize = 4096;
static constexpr size_t kTextFrameRolloverSize = 4096;
static constexpr size_t kBinaryFrameRolloverSize = 8192;
static constexpr size_t kMaxPoolSize = 16;
WebSocketConnection::WebSocketConnection(wpi::WebSocket& ws)
: m_ws{ws},
@@ -53,7 +54,13 @@ void WebSocketConnection::Flush() {
++m_sendsActive;
m_ws.SendFrames(m_ws_frames, [selfweak = weak_from_this()](auto bufs, auto) {
if (auto self = selfweak.lock()) {
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(), bufs.end());
size_t numToPool =
(std::min)(bufs.size(), kMaxPoolSize - self->m_buf_pool.size());
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(),
bufs.begin() + numToPool);
for (auto&& buf : bufs.subspan(numToPool)) {
buf.Deallocate();
}
if (self->m_sendsActive > 0) {
--self->m_sendsActive;
}

View File

@@ -10,6 +10,8 @@
using namespace nt;
using namespace nt::net3;
static constexpr size_t kMaxPoolSize = 16;
UvStreamConnection3::UvStreamConnection3(wpi::uv::Stream& stream)
: m_stream{stream}, m_os{m_buffers, [this] { return AllocBuf(); }} {}
@@ -26,7 +28,13 @@ void UvStreamConnection3::Flush() {
++m_sendsActive;
m_stream.Write(m_buffers, [selfweak = weak_from_this()](auto bufs, auto) {
if (auto self = selfweak.lock()) {
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(), bufs.end());
size_t numToPool =
(std::min)(bufs.size(), kMaxPoolSize - self->m_buf_pool.size());
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(),
bufs.begin() + numToPool);
for (auto&& buf : bufs.subspan(numToPool)) {
buf.Deallocate();
}
if (self->m_sendsActive > 0) {
--self->m_sendsActive;
}