]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Avoid buffering to write zeroes
authorMatt Joiner <anacrolix@gmail.com>
Wed, 20 Aug 2025 01:41:25 +0000 (11:41 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 21 Aug 2025 01:41:40 +0000 (11:41 +1000)
storage/file-piece.go
storage/io.go [new file with mode: 0644]

index f9b73c253dede6b2f2bcbe307f351d0e3c02f23a..b753de9bfb6ae2b587f629672553c68fd56c09f3 100644 (file)
@@ -367,7 +367,7 @@ func (me *filePieceImpl) writeFileTo(w io.Writer, fileIndex int, extent segments
                // Write zeroes until the end of the hole we're in.
                var n1 int64
                n := min(dataOffset-extent.Start, extent.Length)
-               n1, err = io.CopyN(w, zeroReader{}, n)
+               n1, err = writeZeroes(w, n)
                packageExpvarMap.Add("bytesReadSkippedHole", n1)
                written += n1
                if err != nil {
diff --git a/storage/io.go b/storage/io.go
new file mode 100644 (file)
index 0000000..947be81
--- /dev/null
@@ -0,0 +1,20 @@
+package storage
+
+import (
+       "io"
+)
+
+var zeroes [4 << 10]byte
+
+func writeZeroes(w io.Writer, n int64) (written int64, err error) {
+       for n > 0 {
+               var w1 int
+               w1, err = w.Write(zeroes[:min(int64(len(zeroes)), n)][:])
+               written += int64(w1)
+               if err != nil {
+                       break
+               }
+               n -= int64(w1)
+       }
+       return
+}