]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Specialize the limited write for hashing in file storage
authorMatt Joiner <anacrolix@gmail.com>
Tue, 19 Aug 2025 07:44:37 +0000 (17:44 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 19 Aug 2025 07:49:34 +0000 (17:49 +1000)
storage/file-io-classic.go
storage/file-io-mmap.go
storage/file-io.go
storage/file-piece.go

index 5c5ea7a65d8511f54a691e5a88cbb3402904efd1..56c5e9e19b5f352aa6d44c1a2872add2c5a0ffdf 100644 (file)
@@ -28,6 +28,14 @@ type classicFileReader struct {
        *os.File
 }
 
+func (c classicFileReader) writeToN(w io.Writer, n int64) (written int64, err error) {
+       lw := limitWriter{
+               rem: n,
+               w:   w,
+       }
+       return c.File.WriteTo(&lw)
+}
+
 func (c classicFileReader) seekDataOrEof(offset int64) (ret int64, err error) {
        ret, err = seekData(c.File, offset)
        if err == io.EOF {
index 3e1d1277f6d12c71eb915aaab08cf78cdc600d0a..ec060712d3be0265fb6e21d302c659e6312bfbde 100644 (file)
@@ -210,6 +210,19 @@ func (me *mmapFileHandle) WriteTo(w io.Writer) (n int64, err error) {
        return
 }
 
+func (me *mmapFileHandle) writeToN(w io.Writer, n int64) (written int64, err error) {
+       b := me.shared.f.m
+       if me.pos >= int64(len(b)) {
+               return
+       }
+       b = b[me.pos:]
+       b = b[:min(int64(len(b)), n)]
+       i, err := w.Write(b)
+       written = int64(i)
+       me.pos += written
+       return
+}
+
 func (me *mmapFileHandle) Close() error {
        return me.shared.Close()
 }
index 0f86f0f6879dfd1bd4d3eb4e365db8b3ba3ea1af..437ccc9570e5c3ff4fefa3de2c990a6c2e1fa948 100644 (file)
@@ -12,7 +12,7 @@ type fileWriter interface {
 type fileReader interface {
        // Seeks to the next data in the file. If there is no more data, seeks to the end of the file.
        seekDataOrEof(offset int64) (ret int64, err error)
-       io.WriterTo
+       writeToN(w io.Writer, n int64) (written int64, err error)
        io.ReadCloser
 }
 
index 5173bb79d35812d196edd8d17f321963165ed426..f9b73c253dede6b2f2bcbe307f351d0e3c02f23a 100644 (file)
@@ -376,19 +376,7 @@ func (me *filePieceImpl) writeFileTo(w io.Writer, fileIndex int, extent segments
                panicif.NotEq(n1, n)
                extentRemaining -= n1
        }
-       var n1 int64
-       if true {
-               n1, err = f.WriteTo(&limitWriter{
-                       rem: extentRemaining,
-                       w:   w,
-               })
-               // limitWriter will block f from writing too much.
-               if n1 == extentRemaining {
-                       err = nil
-               }
-       } else {
-               n1, err = io.CopyN(w, f, extentRemaining)
-       }
+       n1, err := f.writeToN(w, extentRemaining)
        packageExpvarMap.Add("bytesReadNotSkipped", n1)
        written += n1
        return