From 826e26544e0be309c55e4a1c9be688914ab134ed Mon Sep 17 00:00:00 2001 From: Roman Loginov Date: Mon, 27 Jan 2025 16:03:31 +0300 Subject: [PATCH] [#605] Fix panic when payload discard Signed-off-by: Roman Loginov --- api/layer/object.go | 13 +++++++++---- api/layer/object_test.go | 13 +++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/api/layer/object.go b/api/layer/object.go index 571a120e..c76c91e9 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -525,10 +525,7 @@ func (n *Layer) objectPutAndHash(ctx context.Context, prm frostfs.PrmObjectCreat }) res, err := n.frostFS.CreateObject(ctx, prm) if err != nil { - if _, errDiscard := io.Copy(io.Discard, prm.Payload); errDiscard != nil { - n.reqLogger(ctx).Warn(logs.FailedToDiscardPutPayloadProbablyGoroutineLeaks, zap.Error(errDiscard)) - } - + n.payloadDiscard(ctx, prm.Payload) return nil, err } return &data.CreatedObjectInfo{ @@ -540,6 +537,14 @@ func (n *Layer) objectPutAndHash(ctx context.Context, prm frostfs.PrmObjectCreat }, nil } +func (n *Layer) payloadDiscard(ctx context.Context, payload io.Reader) { + if payload != nil { + if _, errDiscard := io.Copy(io.Discard, payload); errDiscard != nil { + n.reqLogger(ctx).Warn(logs.FailedToDiscardPutPayloadProbablyGoroutineLeaks, zap.Error(errDiscard)) + } + } +} + type logWrapper struct { log *zap.Logger } diff --git a/api/layer/object_test.go b/api/layer/object_test.go index d94fec86..848e17dd 100644 --- a/api/layer/object_test.go +++ b/api/layer/object_test.go @@ -49,3 +49,16 @@ func TestGoroutinesDontLeakInPutAndHash(t *testing.T) { require.ErrorIs(t, err, expErr) require.Empty(t, payload.Len(), "body must be read out otherwise goroutines can leak in wrapReader") } + +func TestNilPayloadPutAndHash(t *testing.T) { + tc := prepareContext(t) + prm := frostfs.PrmObjectCreate{ + Filepath: tc.obj, + Payload: nil, + } + + expErr := errors.New("some error") + tc.testFrostFS.SetObjectPutError(tc.obj, expErr) + _, err := tc.layer.objectPutAndHash(tc.ctx, prm, tc.bktInfo) + require.ErrorIs(t, err, expErr) +}