Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle Windows AV/EDR file locks during script installations (#9543)
Fixes #9531 ## Context While working with [uv](https://github.com/astral-sh/uv), I encountered issues with a python dependency, [httpx](https://www.python-httpx.org/) unable to be installed because of a **os error 5 permission denied**. The error occur when we try to persist a **.exe file** from a temporary folder into a persistent one. I only reproduce the issue in an enterprise **Windows** Jenkins Runner. In my virtual machines, I don't have any issues. So I think this is most probably coming from the system configuration. This windows runner **contains an AV/EDR**. And the fact that the file locked occured only once for an executable make me think that it's most probably the cause. While doing some research and speaking with some colleagues (hi @vmeurisse), it seems that the issue is a very recurrent one on Windows. In the Javascript ecosystem, there is this package, created by the @isaacs, `npm` inventor: https://www.npmjs.com/package/graceful-fs, used inside `npm`, allowing its package installations to be more resilient to filesystem errors: > The improvements are meant to normalize behavior across different platforms and environments, and to make filesystem access more resilient to errors. One of its core feature is this one: > On Windows, it retries renaming a file for up to one second if EACCESS or EPERM error occurs, likely because antivirus software has locked the directory. So I tried to implement the same algorithm on `uv`, **and it fixed my issue**! I can finally install `httpx`. Then, [as I mentionned in this issue](#9531 (comment)), I saw that you already implemented exactly the same algorithm in an asynchronous function for renames 😄 https://github.com/astral-sh/uv/blob/22fd9f7ff17adfbec6880c6d92c162e3acb6a41c/crates/uv-fs/src/lib.rs#L221 ## Summary of changes - I added a similar function for `persist` (was not easy to have the benediction of the borrow checker 😄) - I added a `sync` variant of `rename_with_retry` - I edited `install_script` to use the function including retries on Windows Let me know if I should change anything 🙂 Thanks!! ## Test Plan This pull-request should be totally iso-functional, so I think it should be covered by existing tests in case of regression. All tests are still passing on my side. Also, of course validated that my windows machines (windows 10 & windows 11) containing AV/EDR software are now able to install `httpx.exe` script. However, if you think any additional test is needed, feel free to tell me!
- Loading branch information