From 0c2b708484037e5aab1b829d4f073b859ccb39df Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 12 Sep 2018 09:29:41 -0700 Subject: [PATCH] for O_RDONLY mode hold shared locks on windows (#6454) Fixes #6401 --- pkg/lock/lock_windows.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/pkg/lock/lock_windows.go b/pkg/lock/lock_windows.go index 6a9210082..873401d3a 100644 --- a/pkg/lock/lock_windows.go +++ b/pkg/lock/lock_windows.go @@ -76,13 +76,25 @@ func lockedOpenFile(path string, flag int, perm os.FileMode, lockType uint32) (* // doesn't wait forever but instead returns if it cannot // acquire a write lock. func TryLockedOpenFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { - return lockedOpenFile(path, flag, perm, lockFileFailImmediately) + var lockType uint32 = lockFileFailImmediately | lockFileExclusiveLock + switch flag { + case syscall.O_RDONLY: + // https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-lockfileex + lockType = lockFileFailImmediately | 0 // Set this to enable shared lock and fail immediately. + } + return lockedOpenFile(path, flag, perm, lockType) } // LockedOpenFile - initializes a new lock and protects // the file from concurrent access. func LockedOpenFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { - return lockedOpenFile(path, flag, perm, 0) + var lockType uint32 = lockFileExclusiveLock + switch flag { + case syscall.O_RDONLY: + // https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-lockfileex + lockType = 0 // Set this to enable shared lock. + } + return lockedOpenFile(path, flag, perm, lockType) } // fixLongPath returns the extended-length (\\?\-prefixed) form of @@ -165,7 +177,7 @@ func fixLongPath(path string) string { return string(pathbuf[:w]) } -// perm param is ignored, on windows file perms/NT acls +// Open - perm param is ignored, on windows file perms/NT acls // are not octet combinations. Providing access to NT // acls is out of scope here. func Open(path string, flag int, perm os.FileMode) (*os.File, error) { @@ -217,14 +229,11 @@ func Open(path string, flag int, perm os.FileMode) (*os.File, error) { func lockFile(fd syscall.Handle, flags uint32) error { // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - var flag uint32 = lockFileExclusiveLock // Lockfile exlusive. - flag |= flags - if fd == syscall.InvalidHandle { return nil } - err := lockFileEx(fd, flag, 1, 0, &syscall.Overlapped{}) + err := lockFileEx(fd, flags, 1, 0, &syscall.Overlapped{}) if err == nil { return nil } else if err.Error() == "The process cannot access the file because another process has locked a portion of the file." {