diff --git a/manifest.go b/manifest.go index 532660b7b..07f6b5e54 100644 --- a/manifest.go +++ b/manifest.go @@ -1261,9 +1261,10 @@ func constructPartitionSummaries(spec PartitionSpec, schema *Schema, partitions } type ManifestWriter struct { - closed bool - version int - impl writerImpl + closed bool + closeErr error + version int + impl writerImpl output io.Writer writer *ocf.Writer @@ -1358,16 +1359,18 @@ func NewManifestWriter(version int, out io.Writer, spec PartitionSpec, schema *S func (w *ManifestWriter) Close() error { if w.closed { - return nil + return w.closeErr } + w.closed = true + var emptyErr error if w.addedFiles+w.existingFiles+w.deletedFiles == 0 { - return errors.New("empty manifest file has been written") + emptyErr = errors.New("empty manifest file has been written") } - w.closed = true + w.closeErr = errors.Join(emptyErr, w.writer.Close()) - return w.writer.Close() + return w.closeErr } type ManifestFileOption func(mf *manifestFile) diff --git a/manifest_test.go b/manifest_test.go index ffb163699..c90ff3c11 100644 --- a/manifest_test.go +++ b/manifest_test.go @@ -2091,6 +2091,20 @@ func (m *ManifestTestSuite) TestManifestWriterMeta() { m.Equal("[]", string(md["partition-spec"])) } +func (m *ManifestTestSuite) TestEmptyManifestWriterCloseIsTerminal() { + var out bytes.Buffer + writer, err := NewManifestWriter(2, &out, *UnpartitionedSpec, testSchema, snapshotID) + m.Require().NoError(err) + + firstErr := writer.Close() + m.Require().EqualError(firstErr, "empty manifest file has been written") + m.ErrorContains(writer.Add(manifestEntryV2Records[0]), "closed manifest writer") + m.Equal(firstErr, writer.Close()) + + _, err = writer.ToManifestFile("manifest.avro", int64(out.Len())) + m.Equal(firstErr, err) +} + func TestReadManifestDecodesNilLogicalPartitionValueFromNullableUnion(t *testing.T) { schema := NewSchema( 0,