mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-10-21 10:07:24 +08:00
webdav: improve webdav upload speed
This commit is contained in:
52
weed/util/buffered_writer/buffered_writer.go
Normal file
52
weed/util/buffered_writer/buffered_writer.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package buffered_writer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
)
|
||||
|
||||
var _ = io.WriteCloser(&BufferedWriteCloser{})
|
||||
|
||||
type BufferedWriteCloser struct {
|
||||
buffer bytes.Buffer
|
||||
bufferLimit int
|
||||
position int64
|
||||
nextFlushOffset int64
|
||||
FlushFunc func([]byte, int64) error
|
||||
CloseFunc func() error
|
||||
}
|
||||
|
||||
func NewBufferedWriteCloser(bufferLimit int) *BufferedWriteCloser {
|
||||
return &BufferedWriteCloser{
|
||||
bufferLimit: bufferLimit,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *BufferedWriteCloser) Write(p []byte) (n int, err error) {
|
||||
|
||||
if b.buffer.Len()+len(p) >= b.bufferLimit {
|
||||
if err := b.FlushFunc(b.buffer.Bytes(), b.nextFlushOffset); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
b.nextFlushOffset += int64(b.buffer.Len())
|
||||
b.buffer.Reset()
|
||||
}
|
||||
|
||||
return b.buffer.Write(p)
|
||||
|
||||
}
|
||||
|
||||
func (b *BufferedWriteCloser) Close() error {
|
||||
if b.buffer.Len() > 0 {
|
||||
if err := b.FlushFunc(b.buffer.Bytes(), b.nextFlushOffset); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if b.CloseFunc != nil {
|
||||
if err := b.CloseFunc(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user