From 87443af49e843745855e64cc193bd82c610b9abb Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Wed, 27 Nov 2019 06:40:13 -0800 Subject: [PATCH] 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) ``` --- pkg/mountinfo/mountinfo_windows.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pkg/mountinfo/mountinfo_windows.go b/pkg/mountinfo/mountinfo_windows.go index 961a4f4d6..dc8ef340b 100644 --- a/pkg/mountinfo/mountinfo_windows.go +++ b/pkg/mountinfo/mountinfo_windows.go @@ -19,6 +19,9 @@ package mountinfo import ( + "path/filepath" + "sync" + "golang.org/x/sys/windows" ) @@ -28,12 +31,20 @@ func CheckCrossDevice(paths []string) error { return nil } +// mountPointCache contains results of IsLikelyMountPoint +var mountPointCache sync.Map + // IsLikelyMountPoint determines if a directory is a mountpoint. func IsLikelyMountPoint(path string) bool { + path = filepath.Dir(path) + if v, ok := mountPointCache.Load(path); ok { + return v.(bool) + } wpath, _ := windows.UTF16PtrFromString(path) wvolume := make([]uint16, len(path)+1) if err := windows.GetVolumePathName(wpath, &wvolume[0], uint32(len(wvolume))); err != nil { + mountPointCache.Store(path, false) return false } @@ -42,7 +53,9 @@ func IsLikelyMountPoint(path string) bool { // Recognize "fixed", "removable", "remote" and "ramdisk" drives as proper drives // 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 + mountPointCache.Store(path, true) return true } + mountPointCache.Store(path, false) return false }