From 72264416fc76615c0733e809e91e8c72fbf26c2b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:38:52 +0000 Subject: [PATCH 1/2] Initial plan From b645f79c842ba69ae25a6b7d5833243115e3381c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:43:07 +0000 Subject: [PATCH 2/2] Fix partsReader WriteTo to close readers on success --- pkg/iobuf/part_reader.go | 13 +++++++------ pkg/iobuf/part_reader_test.go | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pkg/iobuf/part_reader.go b/pkg/iobuf/part_reader.go index 58ce292..083d2a3 100644 --- a/pkg/iobuf/part_reader.go +++ b/pkg/iobuf/part_reader.go @@ -68,18 +68,19 @@ func (r *partsReader) WriteTo(w io.Writer) (n int64, err error) { for _, reader := range rrs { nn, err = io.Copy(w, reader) n += nn - if err != nil { - r.index++ - if closeErr := reader.Close(); closeErr != nil { - return n, closeErr - } + r.index++ + if closeErr := reader.Close(); closeErr != nil { + return n, closeErr + } + + if err != nil { if err != io.EOF { return n, err } return } - r.index++ + if r.index == len(r.R) { err = io.EOF } diff --git a/pkg/iobuf/part_reader_test.go b/pkg/iobuf/part_reader_test.go index c3e23f1..c5170e9 100644 --- a/pkg/iobuf/part_reader_test.go +++ b/pkg/iobuf/part_reader_test.go @@ -162,4 +162,18 @@ func TestPartsReader_WriteTo_AllSuccess(t *testing.T) { if buf.String() != "helloworld" { t.Fatalf("expected 'helloworld', got %q", buf.String()) } + if r1Closes != 1 { + t.Fatalf("r1 was closed %d times, expected 1", r1Closes) + } + if r2Closes != 1 { + t.Fatalf("r2 was closed %d times, expected 1", r2Closes) + } + + _ = pr.Close() + if r1Closes != 1 { + t.Fatalf("r1 was closed %d times after outer Close, expected 1", r1Closes) + } + if r2Closes != 1 { + t.Fatalf("r2 was closed %d times after outer Close, expected 1", r2Closes) + } }