diff --git a/src/peer.cpp b/src/peer.cpp index 3aac02dcb7633f0bcf8440d0de8230ca9abeb608..7cb221793d3b1a1f42594f590b46448717c166db 100644 --- a/src/peer.cpp +++ b/src/peer.cpp @@ -288,21 +288,24 @@ void Peer::data() { int rc = 0; // Only need to lock and reserve buffer if there isn't enough - if (recv_buf_.buffer_capacity() < kMaxMessage) { + if (recv_buf_.buffer_capacity() < recv_buf_max_) { UNIQUE_LOCK(recv_mtx_, lk); - recv_buf_.reserve_buffer(kMaxMessage); + recv_buf_.reserve_buffer(recv_buf_max_); } - int cap = static_cast<int>(recv_buf_.buffer_capacity()); + size_t cap = recv_buf_.buffer_capacity(); try { rc = sock_->recv(recv_buf_.buffer(), recv_buf_.buffer_capacity()); - if (rc >= cap - 1) { + if (rc >= static_cast<int>(cap - 1)) { net_->_notifyError(this, Error::kBufferSize, "Too much data received"); - // TODO(Nick): Increase the buffer size next time + // Increase buffer size + if (recv_buf_max_ < kMaxMessage) { + recv_buf_max_ += 512 * 1024; + } } - if (cap < (kMaxMessage / 10)) { + if (cap < (recv_buf_max_ / 10)) { net_->_notifyError(this, Error::kBufferSize, "Buffer is at capacity"); } } catch (std::exception& ex) { diff --git a/src/peer.hpp b/src/peer.hpp index fb1a2ba283ae9f7cbe9d23f89f4201f052c53664..7541d896e8d39ab4c7ff08b9c188c4ca9e0b7d53 100644 --- a/src/peer.hpp +++ b/src/peer.hpp @@ -213,7 +213,8 @@ class Peer { void data(); public: - static const int kMaxMessage = 2*1024*1024; // 10Mb currently + static const int kMaxMessage = 4*1024*1024; // 4Mb currently + static const int kDefaultMessage = 512*1024; // 0.5Mb currently private: // Functions bool socketError(); // Process one error from socket @@ -266,6 +267,7 @@ class Peer { std::atomic_flag recv_checked_ = ATOMIC_FLAG_INIT; msgpack::unpacker recv_buf_; + size_t recv_buf_max_ = kDefaultMessage; MUTEX recv_mtx_; // Send buffers