[llvm] [Support] Handle delete_pending case for Windows fs::status (PR #90655)
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Tue May 14 16:02:52 PDT 2024
================
@@ -785,9 +785,20 @@ std::error_code status(const Twine &path, file_status &result, bool Follow) {
DWORD Flags = FILE_FLAG_BACKUP_SEMANTICS;
if (!Follow) {
- DWORD attr = ::GetFileAttributesW(path_utf16.begin());
- if (attr == INVALID_FILE_ATTRIBUTES)
- return getStatus(INVALID_HANDLE_VALUE, result);
+ DWORD attr;
+
+ // If getting file attributes fails due to a pending deletion, try
+ // again in a loop to avoid returning a misleading permission denied
+ // error.
+ for (int Retry = 200; Retry >= 0; --Retry) {
+ attr = ::GetFileAttributesW(path_utf16.begin());
+ if (attr != INVALID_FILE_ATTRIBUTES)
+ break;
+ std::error_code code = getStatus(INVALID_HANDLE_VALUE, result);
+ if (code != llvm::errc::delete_pending || !Retry)
+ return code;
+ ::Sleep(15);
----------------
efriedma-quic wrote:
Whether uses would want the loop probably depends on your assumptions. I mean, for most inputs/outputs of compilers, nothing else should be accessing the inputs/outputs in parallel. So spitting out an error doesn't seem like a big deal, and waiting a few seconds is unlikely to actually resolve any issue. You only run into this issue when you're intentionally racing with other processes... making such uses explicitly opt-in to doing something special seems fine.
https://github.com/llvm/llvm-project/pull/90655
More information about the llvm-commits
mailing list