Close the open file object inside ReadSeeker
diff --git a/go/pkg/reader/reader.go b/go/pkg/reader/reader.go
index bbdcbca..57acec5 100644
--- a/go/pkg/reader/reader.go
+++ b/go/pkg/reader/reader.go
@@ -6,6 +6,7 @@
"fmt"
"io"
"os"
+ "sync"
)
type Initializable interface {
@@ -17,6 +18,7 @@
io.Reader
Initializable
SeekOffset(offset int64)
+ Close() error
}
type fileSeeker struct {
@@ -27,6 +29,8 @@
buffSize int
seekOffset int64
initialized bool
+
+ mu sync.Mutex
}
// NewFileReadSeeker wraps a buffered file reader with Seeking functionality.
@@ -54,6 +58,9 @@
// Seek is a simplified version of io.Seeker. It only supports offsets from the
// beginning of the file, and it errors lazily at the next Initialize.
func (fio *fileSeeker) SeekOffset(offset int64) {
+ fio.mu.Lock()
+ defer fio.mu.Unlock()
+
fio.seekOffset = offset
fio.initialized = false
fio.reader = nil
@@ -62,11 +69,17 @@
// IsInitialized indicates whether this reader is ready. If false, Read calls
// will fail.
func (fio *fileSeeker) IsInitialized() bool {
+ fio.mu.Lock()
+ defer fio.mu.Unlock()
+
return fio.initialized
}
// Initialize does the required IO pre-work for Read calls to function.
func (fio *fileSeeker) Initialize() error {
+ fio.mu.Lock()
+ defer fio.mu.Unlock()
+
if fio.initialized {
return errors.New("Already initialized")
}
@@ -95,3 +108,18 @@
fio.initialized = true
return nil
}
+
+// Close closes the open file handle if it hasn't been closed yet.
+func (fio *fileSeeker) Close() error {
+ fio.mu.Lock()
+ defer fio.mu.Unlock()
+
+ if fio.f == nil {
+ return nil
+ }
+ if err := fio.f.Close(); err != nil {
+ return fio.f.Close()
+ }
+ fio.initialized = false
+ return nil
+}
diff --git a/go/pkg/reader/reader_test.go b/go/pkg/reader/reader_test.go
index 5dfba4e..ef93632 100644
--- a/go/pkg/reader/reader_test.go
+++ b/go/pkg/reader/reader_test.go
@@ -47,6 +47,7 @@
data := make([]byte, tc.dataBuffSize)
r := NewFileReadSeeker(path, tc.IOBuffSize)
+ defer r.Close()
if _, err := r.Read(data); err == nil {
t.Errorf("Read() = should have err'd on unitialized reader")
}
@@ -100,6 +101,7 @@
}
r := NewFileReadSeeker(path, 10)
+ defer r.Close()
// Past Offset
r.SeekOffset(10)
if err := r.Initialize(); err != nil {