You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ze...@apache.org on 2023/07/13 14:14:42 UTC
[arrow] branch main updated: GH-36645: [Go] returns writer.Close error to caller when writing parquet (#36646)
This is an automated email from the ASF dual-hosted git repository.
zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new 7690409568 GH-36645: [Go] returns writer.Close error to caller when writing parquet (#36646)
7690409568 is described below
commit 7690409568e8a4b51946f292b109075629ed1ee7
Author: Tommy Setiawan <om...@gmail.com>
AuthorDate: Thu Jul 13 10:14:35 2023 -0400
GH-36645: [Go] returns writer.Close error to caller when writing parquet (#36646)
### Rationale for this change
### What changes are included in this PR?
adding handler for `sink.Close()` error, chaining it with other reported error (if any) via `error.Join`
### Are these changes tested?
Unit test included in the change
### Are there any user-facing changes?
No
* Closes: #36645
Lead-authored-by: Tommy Setiawan <om...@gmail.com>
Co-authored-by: Tommy Setiawan <ts...@factset.com>
Signed-off-by: Matt Topol <zo...@gmail.com>
---
go/parquet/file/file_writer.go | 16 +++++++++++++---
go/parquet/file/file_writer_test.go | 23 +++++++++++++++++++++++
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/go/parquet/file/file_writer.go b/go/parquet/file/file_writer.go
index c931377323..cd0445f418 100644
--- a/go/parquet/file/file_writer.go
+++ b/go/parquet/file/file_writer.go
@@ -18,6 +18,7 @@ package file
import (
"encoding/binary"
+ "fmt"
"io"
"github.com/apache/arrow/go/v13/parquet"
@@ -155,7 +156,7 @@ func (fw *Writer) startFile() {
// Close closes any open row group writer and writes the file footer. Subsequent
// calls to close will have no effect.
-func (fw *Writer) Close() error {
+func (fw *Writer) Close() (err error) {
if fw.open {
// if any functions here panic, we set open to be false so
// that this doesn't get called again
@@ -165,11 +166,20 @@ func (fw *Writer) Close() error {
fw.rowGroupWriter.Close()
}
fw.rowGroupWriter = nil
- defer fw.sink.Close()
+ defer func() {
+ ierr := fw.sink.Close()
+ if err != nil {
+ if ierr != nil {
+ err = fmt.Errorf("error on close:%w, %s", err, ierr)
+ }
+ return
+ }
+
+ err = ierr
+ }()
fileEncryptProps := fw.props.FileEncryptionProperties()
if fileEncryptProps == nil { // non encrypted file
- var err error
if fw.FileMetadata, err = fw.metadata.Finish(); err != nil {
return err
}
diff --git a/go/parquet/file/file_writer_test.go b/go/parquet/file/file_writer_test.go
index bba0d2be28..2cbdb91072 100644
--- a/go/parquet/file/file_writer_test.go
+++ b/go/parquet/file/file_writer_test.go
@@ -18,6 +18,7 @@ package file_test
import (
"bytes"
+ "fmt"
"reflect"
"testing"
@@ -395,3 +396,25 @@ func TestSerialize(t *testing.T) {
})
}
}
+
+type errCloseWriter struct {
+ sink *encoding.BufferWriter
+}
+
+func (c *errCloseWriter) Write(p []byte) (n int, err error) {
+ return c.sink.Write(p)
+}
+func (c *errCloseWriter) Close() error {
+ return fmt.Errorf("error during close")
+}
+func (c *errCloseWriter) Bytes() []byte {
+ return c.sink.Bytes()
+}
+
+func TestCloseError(t *testing.T) {
+ fields := schema.FieldList{schema.NewInt32Node("col", parquet.Repetitions.Required, 1)}
+ sc, _ := schema.NewGroupNode("schema", parquet.Repetitions.Required, fields, 0)
+ sink := &errCloseWriter{sink: encoding.NewBufferWriter(0, memory.DefaultAllocator)}
+ writer := file.NewParquetWriter(sink, sc)
+ assert.Error(t, writer.Close())
+}