aboutsummaryrefslogtreecommitdiff
path: root/weed/util
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-12-01 15:32:27 -0800
committerChris Lu <chris.lu@gmail.com>2020-12-01 15:32:27 -0800
commit04062c56c74591c32380bbdfb589a9c641e05fa5 (patch)
treeb309756f284bd347c90fbe0a90403f3c70868f56 /weed/util
parent005a6123e98170b2bdf99eb5b8a67ca3cea94190 (diff)
downloadseaweedfs-04062c56c74591c32380bbdfb589a9c641e05fa5.tar.xz
seaweedfs-04062c56c74591c32380bbdfb589a9c641e05fa5.zip
webdav: improve webdav upload speed
Diffstat (limited to 'weed/util')
-rw-r--r--weed/util/buffered_writer/buffered_writer.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/weed/util/buffered_writer/buffered_writer.go b/weed/util/buffered_writer/buffered_writer.go
new file mode 100644
index 000000000..73d9f4995
--- /dev/null
+++ b/weed/util/buffered_writer/buffered_writer.go
@@ -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
+}