Ensure sparse files on windows during download

The file.Truncate call on windows will write the whole file
unless you set the sparse flag, leading to heavy I/O at the
beginning of download.  This should improve our
I/O behavior on windows and put less stress on the users disk.
This commit is contained in:
Daniel Hiltgen 2024-08-06 10:46:31 -07:00
parent 86b907f82a
commit fc85f50a2b
3 changed files with 28 additions and 0 deletions

View file

@ -216,6 +216,9 @@ func (b *blobDownload) run(ctx context.Context, requestURL *url.URL, opts *regis
return err
}
defer file.Close()
if err := setSparse(file); err != nil {
return err
}
_ = file.Truncate(b.Total)

9
server/sparse_common.go Normal file
View file

@ -0,0 +1,9 @@
//go:build !windows
package server
import "os"
func setSparse(file *os.File) error {
return nil
}

16
server/sparse_windows.go Normal file
View file

@ -0,0 +1,16 @@
package server
import (
"os"
"golang.org/x/sys/windows"
)
func setSparse(file *os.File) error {
return windows.DeviceIoControl(
windows.Handle(file.Fd()), windows.FSCTL_SET_SPARSE,
nil, 0,
nil, 0,
nil, nil,
)
}