From e9d069bbbbb94a3d4df7ea2500137a4c33dbc518 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nicolas.pope@utu.fi>
Date: Wed, 8 Jun 2022 11:28:14 +0000
Subject: [PATCH] #18 Increase msgpack buffer if needed

---
 src/peer.cpp | 15 +++++++++------
 src/peer.hpp |  4 +++-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/peer.cpp b/src/peer.cpp
index 3aac02d..7cb2217 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 fb1a2ba..7541d89 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
-- 
GitLab