Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions manifest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading