From f0c599d06d84002b0271e86865ac472f10203676 Mon Sep 17 00:00:00 2001 From: Airat Arifullin Date: Thu, 12 Sep 2024 15:09:01 +0300 Subject: [PATCH] [#268] client: Fix sequential `PayloadPatch` calls * The flag 'firstPayloadPatch' keeps its state after first `PatchPayload` that make other calls incorrectly set patch ranges. Signed-off-by: Airat Arifullin --- client/object_patch.go | 8 ++------ client/object_patch_test.go | 11 +++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/client/object_patch.go b/client/object_patch.go index b30bebe..7af0835 100644 --- a/client/object_patch.go +++ b/client/object_patch.go @@ -106,7 +106,6 @@ func (c *Client) ObjectPatchInit(ctx context.Context, prm PrmObjectPatch) (Objec } objectPatcher.client = c objectPatcher.stream = stream - objectPatcher.firstPatchPayload = true if prm.MaxChunkLength > 0 { objectPatcher.maxChunkLen = prm.MaxChunkLength @@ -154,8 +153,6 @@ type objectPatcher struct { respV2 v2object.PatchResponse maxChunkLen int - - firstPatchPayload bool } func (x *objectPatcher) PatchAttributes(_ context.Context, newAttrs []object.Attribute, replace bool) bool { @@ -171,7 +168,7 @@ func (x *objectPatcher) PatchPayload(_ context.Context, rng *object.Range, paylo buf := make([]byte, x.maxChunkLen) - for { + for patchIter := 0; ; patchIter++ { n, err := payloadReader.Read(buf) if err != nil && err != io.EOF { x.err = fmt.Errorf("read payload: %w", err) @@ -182,8 +179,7 @@ func (x *objectPatcher) PatchPayload(_ context.Context, rng *object.Range, paylo } rngPart := object.NewRange() - if x.firstPatchPayload { - x.firstPatchPayload = false + if patchIter == 0 { rngPart.SetOffset(offset) rngPart.SetLength(rng.GetLength()) } else { diff --git a/client/object_patch_test.go b/client/object_patch_test.go index 9c87820..2349602 100644 --- a/client/object_patch_test.go +++ b/client/object_patch_test.go @@ -170,12 +170,11 @@ func TestObjectPatcher(t *testing.T) { pk, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) patcher := objectPatcher{ - client: &Client{}, - stream: m, - addr: oidtest.Address(), - key: pk, - maxChunkLen: test.maxChunkLen, - firstPatchPayload: true, + client: &Client{}, + stream: m, + addr: oidtest.Address(), + key: pk, + maxChunkLen: test.maxChunkLen, } success := patcher.PatchAttributes(context.Background(), nil, false)