Skip to content

Commit 89e4f3e

Browse files
Ensure bufferWriter is always closed and error is returned in Buffer()
1 parent 2788339 commit 89e4f3e

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

migration.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ func (m *Migration) Buffer() error {
127127

128128
b := bufio.NewReaderSize(m.Body, int(m.BufferSize))
129129

130+
var bufferWriterCloseErr error
131+
// Always close bufferWriter, even on error, to prevent deadlocks.
132+
// This lets Buffer know that there is no more data coming.
133+
defer func() {
134+
if err := m.bufferWriter.Close(); err != nil {
135+
bufferWriterCloseErr = err
136+
}
137+
}()
138+
130139
// start reading from body, peek won't move the read pointer though
131140
// poor man's solution?
132141
if _, err := b.Peek(int(m.BufferSize)); err != nil && err != io.EOF {
@@ -145,16 +154,14 @@ func (m *Migration) Buffer() error {
145154
m.FinishedReading = time.Now()
146155
m.BytesRead = n
147156

148-
// close bufferWriter so Buffer knows that there is no
149-
// more data coming
150-
if err := m.bufferWriter.Close(); err != nil {
151-
return err
152-
}
153-
154157
// it's safe to close the Body too
155158
if err := m.Body.Close(); err != nil {
156159
return err
157160
}
158161

162+
if bufferWriterCloseErr != nil {
163+
return bufferWriterCloseErr
164+
}
165+
159166
return nil
160167
}

0 commit comments

Comments
 (0)