apple / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. This fork is used to manage Apple’s stable releases of Clang as well as support the Swift project.
https://llvm.org
Other
1.1k stars 320 forks source link

[🍒 stable/20230725] Handle new `delete_pending` error code when stating index unit files #8848

Closed z2oh closed 3 weeks ago

z2oh commented 4 weeks ago

Explanation: Fixes a common compiler crash on Windows when generating the index while building. Scope: This crash happens frequently when building large projects on Windows when indexing while building. The delete_pending error code is only generated on Windows when the status function is called against a path that has been marked for deletion. Issue: This issue tracked the addition of the new error code, which was done in support of the fix here: https://github.com/llvm/llvm-project/issues/89137 Risk: Very low risk, this change introduces handling for a new error code that can only be generated under specific conditions on Windows. Testing: Tested through LLVM CI and locally. Reviewer: @compnerd

Multiple clang processes race to write out the same index file via renaming a newly generated index file ontop of the stale one. On Windows, there is a small window where the destination path is marked for deletion, and querying the file at this time would return a misleading permission_denied error (which is the Win32 error mapping from the underlying NTSTATUS code STATUS_DELETE_PENDING). An upstream change has modified the fs::status function on Windows to detect this case and return a more accurate delete_pending error code, which can be handled here as if the file is already deleted (i.e. no_such_file_or_directory)

(cherry picked from commit dd2cc940551f22c732803ccedda467bbf7228de6)

compnerd commented 4 weeks ago

CC: @bnbarham

compnerd commented 4 weeks ago

@swift-ci please test

bnbarham commented 4 weeks ago

Seems like this might need another cherry-pick too?

llvm-project/clang/lib/Index/IndexUnitWriter.cpp:245:74: error: no member named 'delete_pending' in 'llvm::errc'
    if (EC != llvm::errc::no_such_file_or_directory && EC != llvm::errc::delete_pending) {
z2oh commented 4 weeks ago

Thanks for the quick review! Yeah, I just noticed that CI failure. Cherry-pick for the other change is here: https://github.com/apple/llvm-project/pull/8850

compnerd commented 4 weeks ago

@swift-ci please test