[9.0.0] Compensate for Windows filesystems lacking junction support#27695
Merged
iancha1992 merged 1 commit intobazelbuild:release-9.0.0from Nov 18, 2025
Merged
[9.0.0] Compensate for Windows filesystems lacking junction support#27695iancha1992 merged 1 commit intobazelbuild:release-9.0.0from
iancha1992 merged 1 commit intobazelbuild:release-9.0.0from
Conversation
**Problem**: Bazel fails completely on Windows when using filesystems that don't support junction/reparse point operations (e.g., virtiofs, VirtualBox shared folders, network drives, RAM disks). The fatal error occurs when `ReadSymlinkOrJunction` fails during path resolution (e.g., when Starlark code calls `.realpath`): "Cannot read link: DeviceIoControl: Incorrect function". This causes build analysis to abort completely. Additionally, `CreateJunction` failures when creating convenience symlinks produce cryptic error messages, though these were already non-fatal warnings. Both fail because `DeviceIoControl` returns `ERROR_INVALID_FUNCTION` when the filesystem doesn't implement `FSCTL_GET_REPARSE_POINT` or `FSCTL_SET_REPARSE_POINT` operations. **Proposed solution:** Handle `ERROR_INVALID_FUNCTION` gracefully by treating it as a "not supported" condition rather than a fatal error: 1. in `ReadSymlinkOrJunction` (`file.cc`:592): return `kNotALink` instead of `kError` when `ERROR_INVALID_FUNCTION` occurs. This allows path resolution to continue for non-symlink paths on unsupported filesystems. 2. in `CreateJunction` (`file.cc`:461): return new `kNotSupported` result code when `ERROR_INVALID_FUNCTION` occurs. This produces clear "filesystem does not support junctions" warnings instead of cryptic "Incorrect function" messages. This improves UX but doesn't change behavior (these failures were already non-fatal). This follows the try-first, fallback-on-error pattern (EAFP) used by other major projects when handling unsupported filesystem operations. **Prior art:** - Rust (rust-lang/rust#138133): checks `ERROR_INVALID_FUNCTION`, `ERROR_NOT_SUPPORTED`, and `ERROR_INVALID_PARAMETER` for filesystem operation fallbacks in `std::fs::rename`. - Microsoft STL (microsoft/STL#2077): handles junctions and reparse point errors including `ERROR_INVALID_PARAMETER` with robust fallback logic in `filesystem.cpp`. - Go (golang/go#20506): uses fallback strategies when symlink APIs are unavailable on different Windows versions. - WinFsp (winfsp/winfsp#88): documents that `ERROR_INVALID_FUNCTION` indicates `STATUS_NOT_IMPLEMENTED` for unsupported operations. - Microsoft Learn: recommends checking `FILE_SUPPORTS_REPARSE_POINTS` flag via `GetVolumeInformation`, but try-catch approach is simpler and handles edge cases where detection succeeds but operations fail. **Impact**: - enables Bazel to work on virtiofs, VirtualBox shared folders, RAM disks, and other filesystems that don't support Windows junction operations. - convenience symlinks (bazel-bin, bazel-out, etc.) still won't be created, but now with clearer error messages. **Limitations**: Full junction support would require filesystem-level changes (e.g., virtiofs driver improvements). **Testing:** Tested on Windows 11 VM with host directory mounted via virtiofs, with [rules_pkg](https://github.com/bazelbuild/rules_pkg/blob/6cdaba69ee76463b2b8e97e8d243dbb6115c3aee/toolchains/git/git_configure.bzl#L40). Before change: build analysis aborted with "Cannot read link" fatal error. After change: builds complete successfully with clearer warnings about unsupported junctions for convenience symlinks. Closes bazelbuild#27598. PiperOrigin-RevId: 833360316 Change-Id: I3751602b2bd793c1cee75b7b66fa73c955a72517
tjgq
approved these changes
Nov 18, 2025
Merged
via the queue into
bazelbuild:release-9.0.0
with commit Nov 18, 2025
eb2d6eb
46 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem:
Bazel fails completely on Windows when using filesystems that don't support junction/reparse point operations (e.g., virtiofs, VirtualBox shared folders, network drives, RAM disks).
The fatal error occurs when
ReadSymlinkOrJunctionfails during path resolution (e.g., when Starlark code calls.realpath): "Cannot read link: DeviceIoControl: Incorrect function".This causes build analysis to abort completely.
Additionally,
CreateJunctionfailures when creating convenience symlinks produce cryptic error messages, though these were already non-fatal warnings.Both fail because
DeviceIoControlreturnsERROR_INVALID_FUNCTIONwhen the filesystem doesn't implementFSCTL_GET_REPARSE_POINTorFSCTL_SET_REPARSE_POINToperations.Proposed solution:
Handle
ERROR_INVALID_FUNCTIONgracefully by treating it as a "not supported" condition rather than a fatal error:ReadSymlinkOrJunction(file.cc:592): returnkNotALinkinstead ofkErrorwhenERROR_INVALID_FUNCTIONoccurs. This allows path resolution to continue for non-symlink paths on unsupported filesystems.CreateJunction(file.cc:461): return newkNotSupportedresult code whenERROR_INVALID_FUNCTIONoccurs. This produces clear "filesystem does not support junctions" warnings instead of cryptic "Incorrect function" messages. This improves UX but doesn't change behavior (these failures were already non-fatal).This follows the try-first, fallback-on-error pattern (EAFP) used by other major projects when handling unsupported filesystem operations.
Prior art:
ERROR_INVALID_FUNCTION,ERROR_NOT_SUPPORTED, andERROR_INVALID_PARAMETERfor filesystem operation fallbacks instd::fs::rename.<filesystem>:read_symlinkdoes not work with junctions microsoft/STL#2077): handles junctions and reparse point errors includingERROR_INVALID_PARAMETERwith robust fallback logic infilesystem.cpp.ERROR_INVALID_FUNCTIONindicatesSTATUS_NOT_IMPLEMENTEDfor unsupported operations.FILE_SUPPORTS_REPARSE_POINTSflag viaGetVolumeInformation, but try-catch approach is simpler and handles edge cases where detection succeeds but operations fail.Impact:
Limitations:
Full junction support would require filesystem-level changes (e.g., virtiofs driver improvements).
Testing:
Tested on Windows 11 VM with host directory mounted via virtiofs, with rules_pkg. Before change: build analysis aborted with "Cannot read link" fatal error. After change: builds complete successfully with clearer warnings about unsupported junctions for convenience symlinks.
Closes #27598.
PiperOrigin-RevId: 833360316
Change-Id: I3751602b2bd793c1cee75b7b66fa73c955a72517
Commit dab96fc