diff --git a/client/object_put.go b/client/object_put.go index 213ec7f..bf27f4c 100644 --- a/client/object_put.go +++ b/client/object_put.go @@ -4,6 +4,7 @@ import ( "context" "crypto/ecdsa" + buffPool "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/pool" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" @@ -36,6 +37,8 @@ type PrmObjectPutInit struct { WithoutHomomorphHash bool Key *ecdsa.PrivateKey + + Pool *buffPool.BufferPool } // SetCopiesNumber sets number of object copies that is enough to consider put successful. diff --git a/client/object_put_transformer.go b/client/object_put_transformer.go index c671b55..397ac50 100644 --- a/client/object_put_transformer.go +++ b/client/object_put_transformer.go @@ -3,6 +3,7 @@ package client import ( "context" + buffPool "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/pool" apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/transformer" @@ -26,6 +27,7 @@ func (c *Client) objectPutInitTransformer(prm PrmObjectPutInit) (*objectWriterTr MaxSize: prm.MaxSize, WithoutHomomorphicHash: prm.WithoutHomomorphHash, NetworkState: prm.EpochSource, + Pool: prm.Pool, }) return &w, nil } @@ -110,6 +112,7 @@ func (it *internalTarget) tryPutSingle(ctx context.Context, o *object.Object) (b } if err == nil { + it.returnBuffPool(o.Payload()) id, _ := o.ID() it.res = &ResObjectPut{ statusRes: res.statusRes, @@ -122,3 +125,12 @@ func (it *internalTarget) tryPutSingle(ctx context.Context, o *object.Object) (b } return true, err } + +func (it *internalTarget) returnBuffPool(playback []byte) { + if it.prm.Pool == nil { + return + } + var buffer buffPool.Buffer + buffer.Data = playback + it.prm.Pool.Put(&buffer) +} diff --git a/object/transformer/transformer.go b/object/transformer/transformer.go index 4b27de8..93fc02e 100644 --- a/object/transformer/transformer.go +++ b/object/transformer/transformer.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "fmt" + buffPool "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/pool" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" @@ -45,6 +46,7 @@ type Params struct { // functionality. Primary usecases are providing file size when putting an object // with the frostfs-cli or using Content-Length header in gateways. SizeHint uint64 + Pool *buffPool.BufferPool } // NewPayloadSizeLimiter returns ObjectTarget instance that restricts payload length @@ -137,7 +139,17 @@ func (s *payloadSizeLimiter) initializeCurrent() { payloadSize = remaining % s.MaxSize } } - s.payload = make([]byte, 0, payloadSize) + + if s.Pool == nil { + s.payload = make([]byte, 0, payloadSize) + } else { + if payloadSize == 0 { + payloadSize = s.MaxSize + } + + buffer := s.Pool.Get(uint32(payloadSize)) + s.payload = buffer.Data[:0] + } } func (s *payloadSizeLimiter) initPayloadHashers() {