Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Have rust_test put its compilation outputs in a subdirectory #1438

Closed
wants to merge 8 commits into from

Conversation

scentini
Copy link
Collaborator

@scentini scentini commented Jul 7, 2022

This is supposed to fix the long standing Windows flakiness as described in #1427 (comment)

Initially I thought it's an issue with rustdoc_test, however the actual issue is that rust_binary and its rust_test have the same crate name and generate the same intermediary .o files. For sandboxed builds this is not an issue, as the actions are isolated, however, we have a race condition in non-sandboxed builds (Windows):

Let's consider the following build:

bazel build --spawn_strategy=standalone \
    //test/unit/rustdoc:bin_with_transitive_proc_macro \
    //test/unit/rustdoc:bin_with_transitive_proc_macro_test

The bin_with_transitive_proc_macro compile action will create the following intermediate file: bazel-out/k8-fastbuild/bin/test/unit/rustdoc/bin_with_transitive_proc_macro.bin_with_transitive_proc_macro.573369dc-cgu.2.rcgu.o, as will the bin_with_transitive_proc_macro_test action. These two files differ slightly (as the second action is for a test), namely the bin_with_transitive_proc_macro output has the following symbols:

0000000000000000 T main
0000000000000000 t _ZN30bin_with_transitive_proc_macro4main17hfc292cc42314e131E
                 U _ZN3std2rt10lang_start17h1dbc829c47cd61d9E

while the bin_with_transitive_proc_macro_test .o output looks like this:

0000000000000000 T main
0000000000000000 t _ZN30bin_with_transitive_proc_macro4main17h28726504dc060f8dE
                 U _ZN3std2rt10lang_start17h1dbc829c47cd61d9E
                 U _ZN4test16test_main_static17h37e3d88407f5b40fE

Now, when the two actions run in parallel, it can happen that bin_with_transitive_proc_macro creates the output, and bin_with_transitive_proc_macro_test overwrites it. Then, at linking time for bin_with_transitive_proc_macro, rustc will complain:

note: ld.lld: error: undefined symbol: test::test_main_static::h37e3d88407f5b40f

This is because bin_with_transitive_proc_macro is not a test and as such is not linked against libtest.

This PR fixes the issue by directing the compilation outputs of rust_test to be under a test-{hash} directory.

@scentini scentini closed this Jul 7, 2022
@scentini scentini deleted the output_conflict_2 branch July 7, 2022 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant