git-lfs/tools
Marat Radchenko 0c8edfc097 Stop replacing files in LFS storage when downloading them concurrently on Windows
On Windows, there is no way to replace file atomically. Instead, MoveFileExA:

1. Calls CreateFileA(access=Delete, shareMode=Delete)
2. Calls SetRenameInformationFile to rename file
3. Calls CloseFile

The problem is that if parallel process attempts to open destination file for reading between
steps 2 and 3, it will try to do that without shareMode=Delete and will hit a SHARING_VIOLATION error.

In practice, this race condition results in:

  Smudge error: Error opening media file.: open .git\lfs\objects\<sha>: The process cannot access the file because it is being used by another process.

There are two solutions here:

 1. Do not overwrite file if it already exists
 2. Retry reading from file if got a SHARING_VIOLATION

This commit implements option 1.

Fixes #2825 (for Windows, other OSes are race-free already). Also see #3813 and #3826.
2019-10-25 10:54:25 +03:00
..
humanize Fix humanize's FormatByteRate() to work with 0s duration 2018-10-24 15:02:40 +00:00
kv Fix error strings to follow Go guidelines 2019-10-22 17:33:49 +03:00
channels.go extract base channel wrapper to tools 2016-11-18 12:02:38 -07:00
copycallback_test.go progress,tools: move CopyCallback (and related) to 'tools' 2017-11-22 14:08:33 -08:00
copycallback.go progress,tools: move CopyCallback (and related) to 'tools' 2017-11-22 14:08:33 -08:00
cygwin_windows.go tools: detect MINGW as Cygwin 2019-08-02 17:23:46 +00:00
cygwin.go tools: wrap os.Getwd with cygwin support 2017-02-20 15:25:43 -07:00
filetools_test.go Use git-ls-files to enumerate repo contents 2019-09-17 17:41:00 -07:00
filetools.go Fix error strings to follow Go guidelines 2019-10-22 17:33:49 +03:00
iotools_test.go update package imports 2016-11-15 10:01:18 -07:00
iotools.go Tidy files 2019-10-02 19:17:28 +00:00
math_test.go tools/math: teach tools.ClampInt to clamp integers 2017-06-09 17:56:21 -06:00
math.go tools/math: teach tools.ClampInt to clamp integers 2017-06-09 17:56:21 -06:00
ordered_set_test.go tools: introduce tools.OrderedSet 2017-06-21 16:50:19 -06:00
ordered_set.go tools: introduce tools.OrderedSet 2017-06-21 16:50:19 -06:00
os_tools.go Fix error strings to follow Go guidelines 2019-10-22 17:33:49 +03:00
str_tools_test.go tools: move ShellQuote to subprocess 2018-09-14 21:50:09 +00:00
str_tools.go tools: move ShellQuote to subprocess 2018-09-14 21:50:09 +00:00
stringset.go Fix Typos 2019-07-24 07:17:40 +00:00
sync_writer.go tools: add empty functions when missing in *SyncWriter 2017-12-01 09:39:02 -08:00
time_tools_test.go tools/time_tools: test tools.IsExpiredAtOrIn 2017-04-06 13:38:31 -06:00
time_tools.go tools: compare expiration to "time.Now" instead of "from" 2017-08-25 14:48:33 -04:00
umask_nix.go tools: add function to make directories honoring core.sharedRepository 2018-12-13 17:51:02 +00:00
umask_windows.go tools: add function to make directories honoring core.sharedRepository 2018-12-13 17:51:02 +00:00
util_darwin_test.go Add new command git lfs dedup for file system level deduplication. 2019-08-19 10:44:37 +09:00
util_darwin.go Stop replacing files in LFS storage when downloading them concurrently on Windows 2019-10-25 10:54:25 +03:00
util_generic.go Stop replacing files in LFS storage when downloading them concurrently on Windows 2019-10-25 10:54:25 +03:00
util_linux.go Stop replacing files in LFS storage when downloading them concurrently on Windows 2019-10-25 10:54:25 +03:00
util_test.go Add new command git lfs dedup for file system level deduplication. 2019-08-19 10:44:37 +09:00
util_windows_test.go Stop replacing files in LFS storage when downloading them concurrently on Windows 2019-10-25 10:54:25 +03:00
util_windows.go Stop replacing files in LFS storage when downloading them concurrently on Windows 2019-10-25 10:54:25 +03:00