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())
+}