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 <[email protected]>
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 <[email protected]>
    Co-authored-by: Tommy Setiawan <[email protected]>
    Signed-off-by: Matt Topol <[email protected]>
---
 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())
+}

Reply via email to