From 0400153b7d9974b80bb1d57f4f4ed243ffb6d4cd Mon Sep 17 00:00:00 2001
From: Dmitrii Stepanov <d.stepanov@yadro.com>
Date: Fri, 2 Jun 2023 17:33:51 +0300
Subject: [PATCH] [#424] object: Do not store large slices in pool

Dynamically growing an unbounded buffers can cause a large
amount of memory to be pinned and never be freed.

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
---
 pkg/services/object/put/pool.go | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/pkg/services/object/put/pool.go b/pkg/services/object/put/pool.go
index 5726856e5..ebe214caf 100644
--- a/pkg/services/object/put/pool.go
+++ b/pkg/services/object/put/pool.go
@@ -4,7 +4,10 @@ import (
 	"sync"
 )
 
-const defaultAllocSize = 1024
+const (
+	defaultAllocSize = 1024
+	poolSliceMaxSize = 128 * 1024
+)
 
 type payload struct {
 	Data []byte
@@ -19,6 +22,9 @@ func getPayload() *payload {
 }
 
 func putPayload(p *payload) {
+	if cap(p.Data) > poolSliceMaxSize {
+		return
+	}
 	p.Data = p.Data[:0]
 	putBytesPool.Put(p)
 }