Cache Windows mount point info (#8572)

It seems like every upload creates a new StorageInfo object.

This makes it very sensitive to slow code paths.

A particular slow function is `IsLikelyMountPoint` on Windows since `windows.GetVolumePathName` is slow.

We cache the result of this operation.

Before:

```
Operation: PUT - Concurrency: 12
* Average: 70.46 MB/s, 70.46 obj/s, 70.46 ops ended/s (59.58s)

Aggregated, split into 59 x 1s time segments:
* Fastest: 77.67 MB/s, 77.67 obj/s, 79.00 ops ended/s (1s)
* 50% Median: 70.84 MB/s, 70.84 obj/s, 70.00 ops ended/s (1s)
* Slowest: 61.51 MB/s, 61.51 obj/s, 61.00 ops ended/s (1s)
```

After:
```
Operation: PUT - Concurrency: 12
* Average: 166.80 MB/s, 166.80 obj/s, 166.74 ops ended/s (59.8s)

Aggregated, split into 59 x 1s time segments:
* Fastest: 183.83 MB/s, 183.83 obj/s, 186.00 ops ended/s (1s)
* 50% Median: 167.47 MB/s, 167.47 obj/s, 166.00 ops ended/s (1s)
* Slowest: 139.30 MB/s, 139.30 obj/s, 141.00 ops ended/s (1s)
```
master
Klaus Post 5 years ago committed by Nitish Tiwari
parent 5d65428b29
commit 87443af49e
  1. 13
      pkg/mountinfo/mountinfo_windows.go

@ -19,6 +19,9 @@
package mountinfo package mountinfo
import ( import (
"path/filepath"
"sync"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
) )
@ -28,12 +31,20 @@ func CheckCrossDevice(paths []string) error {
return nil return nil
} }
// mountPointCache contains results of IsLikelyMountPoint
var mountPointCache sync.Map
// IsLikelyMountPoint determines if a directory is a mountpoint. // IsLikelyMountPoint determines if a directory is a mountpoint.
func IsLikelyMountPoint(path string) bool { func IsLikelyMountPoint(path string) bool {
path = filepath.Dir(path)
if v, ok := mountPointCache.Load(path); ok {
return v.(bool)
}
wpath, _ := windows.UTF16PtrFromString(path) wpath, _ := windows.UTF16PtrFromString(path)
wvolume := make([]uint16, len(path)+1) wvolume := make([]uint16, len(path)+1)
if err := windows.GetVolumePathName(wpath, &wvolume[0], uint32(len(wvolume))); err != nil { if err := windows.GetVolumePathName(wpath, &wvolume[0], uint32(len(wvolume))); err != nil {
mountPointCache.Store(path, false)
return false return false
} }
@ -42,7 +53,9 @@ func IsLikelyMountPoint(path string) bool {
// Recognize "fixed", "removable", "remote" and "ramdisk" drives as proper drives // Recognize "fixed", "removable", "remote" and "ramdisk" drives as proper drives
// which can be treated as an actual mount-point, rest can be ignored. // which can be treated as an actual mount-point, rest can be ignored.
// https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getdrivetypew // https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getdrivetypew
mountPointCache.Store(path, true)
return true return true
} }
mountPointCache.Store(path, false)
return false return false
} }

Loading…
Cancel
Save