[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 13:07:58 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:

3 seconds is both a very long time to be waiting for a situation that isn't guaranteed to resolve (a file can be in a pending-delete state for an arbitrary length of time)... and also maybe not that long on a heavily loaded system, or a system with certain kinds of antivirus.  I'd much prefer to resolve the underlying condition in a deterministic way, and get rid of the loop.

Fixing the error code seems useful however we resolve this, though.

https://github.com/llvm/llvm-project/pull/90655


More information about the llvm-commits mailing list