diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java index a46d92d7ded829..1137d9d9bc8c5f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java @@ -147,7 +147,14 @@ public RepositoryDirectoryValue.Builder fetch( Map markerData, SkyKey key) throws RepositoryFunctionException, InterruptedException { - if (workerExecutorService == null) { + if (workerExecutorService == null + || env.inErrorBubblingForSkyFunctionsThatCanFullyRecoverFromErrors()) { + // Don't use the worker thread if we're in Skyframe error bubbling. For some reason, using a + // worker thread during error bubbling very frequently causes deadlocks on Linux platforms. + // The deadlock is rather elusive and this is just the immediate thing that seems to help. + // Fortunately, no Skyframe restarts should happen during error bubbling anyway, so this + // shouldn't be a performance concern. See https://github.com/bazelbuild/bazel/issues/21238 + // for more context. return fetchInternal(rule, outputDirectory, directories, env, markerData, key); } var state = env.getState(RepoFetchingSkyKeyComputeState::new); diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java index dd02762ff3c70b..97596273e2b184 100644 --- a/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java +++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java @@ -380,6 +380,7 @@ default void injectVersionForNonHermeticFunction(Version version) {} * may be called upon to transform a lower-level exception. This method can tell it whether to * transform a dependency's exception or ignore it and return a value as usual. */ + // TODO: Rename this as it can be called for other purposes. boolean inErrorBubblingForSkyFunctionsThatCanFullyRecoverFromErrors(); /**