Dealing with short writes. A more clean implementation of SynchronizeStreams to give a higher guarantee that all data will be written before the connections are closed.
28 lines
380 B
Go
28 lines
380 B
Go
package ioutils
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
type RetryWriter struct {
|
|
io.Writer
|
|
}
|
|
|
|
func (w *RetryWriter) Write(p []byte) (int, error) {
|
|
ntotal := 0
|
|
var err error
|
|
for len(p) > 0 {
|
|
n, err := w.Writer.Write(p)
|
|
p = p[n:]
|
|
ntotal += n
|
|
if err != nil && err != io.ErrShortWrite {
|
|
break
|
|
}
|
|
if len(p) > 0 {
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
}
|
|
return ntotal, err
|
|
}
|