]> git.r.bdr.sh - rbdr/mobius/commitdiff
Buffer file writes during upload
authorJeff Halter <redacted>
Tue, 31 May 2022 17:43:48 +0000 (10:43 -0700)
committerJeff Halter <redacted>
Tue, 31 May 2022 17:43:48 +0000 (10:43 -0700)
hotline/transfer.go

index 703dae0582b02c9457fa0ef35c802dd53cf77b58..706dea9c1d46da67a6dbb3c2b6b7170c6e3abefe 100644 (file)
@@ -1,6 +1,7 @@
 package hotline
 
 import (
 package hotline
 
 import (
+       "bufio"
        "bytes"
        "encoding/binary"
        "errors"
        "bytes"
        "encoding/binary"
        "errors"
@@ -28,6 +29,7 @@ func (tf *transfer) Write(b []byte) (int, error) {
        return len(b), nil
 }
 
        return len(b), nil
 }
 
+const fileCopyBufSize = 524288 // 512k
 func receiveFile(conn io.Reader, targetFile io.Writer, resForkFile io.Writer) error {
        ffhBuf := make([]byte, 24)
        if _, err := conn.Read(ffhBuf); err != nil {
 func receiveFile(conn io.Reader, targetFile io.Writer, resForkFile io.Writer) error {
        ffhBuf := make([]byte, 24)
        if _, err := conn.Read(ffhBuf); err != nil {
@@ -75,11 +77,14 @@ func receiveFile(conn io.Reader, targetFile io.Writer, resForkFile io.Writer) er
        // this will be zero if the file only has a resource fork
        fileSize := int(binary.BigEndian.Uint32(ffdfh.DataSize[:]))
 
        // this will be zero if the file only has a resource fork
        fileSize := int(binary.BigEndian.Uint32(ffdfh.DataSize[:]))
 
-       // Copy N bytes from conn to upload file
-       _, err = io.CopyN(targetFile, conn, int64(fileSize))
+       bw := bufio.NewWriterSize(targetFile, fileCopyBufSize)
+       _, err = io.CopyN(bw, conn, int64(fileSize))
        if err != nil {
                return err
        }
        if err != nil {
                return err
        }
+       if err := bw.Flush(); err != nil {
+               return err
+       }
 
        if ffh.ForkCount == [2]byte{0, 3} {
                var resForkHeader FlatFileDataForkHeader
 
        if ffh.ForkCount == [2]byte{0, 3} {
                var resForkHeader FlatFileDataForkHeader
@@ -95,10 +100,14 @@ func receiveFile(conn io.Reader, targetFile io.Writer, resForkFile io.Writer) er
 
                fileSize = int(binary.BigEndian.Uint32(resForkHeader.DataSize[:]))
 
 
                fileSize = int(binary.BigEndian.Uint32(resForkHeader.DataSize[:]))
 
+               bw = bufio.NewWriterSize(resForkFile, fileCopyBufSize)
                _, err = io.CopyN(resForkFile, conn, int64(fileSize))
                if err != nil {
                        return err
                }
                _, err = io.CopyN(resForkFile, conn, int64(fileSize))
                if err != nil {
                        return err
                }
+               if err := bw.Flush(); err != nil {
+                       return err
+               }
        }
        return nil
 }
        }
        return nil
 }