aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar hlopko <hlopko@google.com>2017-04-04 13:53:14 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-04-04 18:38:24 +0200
commitc4134802dd15d6ef5cca6521f6bf6aac395ee2ad (patch)
treebcb3f28c5a4357f0089c2c71b738d63a748ef788 /src/main/java/com/google/devtools/build/lib
parent64f80799ed5c6369ffb6814f939a7964b0fa7c49 (diff)
Automated g4 rollback of commit 1d9e1ac90197b1d3d7b137ba3c1ada67bb9ba31b.
*** Reason for rollback *** Breaks //src/test/shell/integration:force_delete_output_test *** Original change description *** Symlink output directories to the correct directory name If the workspace directory is /path/to/my/proj and the name in the WORKSPACE file is "floop", this will symlink the output directories to output_base/execroot/floop instead of output_base/execroot/proj. More prep for #1262, fixes #1681. PiperOrigin-RevId: 152126545
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Root.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java45
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Rule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java5
37 files changed, 172 insertions, 218 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Root.java b/src/main/java/com/google/devtools/build/lib/actions/Root.java
index a814560d5d..859a8b6344 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Root.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Root.java
@@ -137,12 +137,14 @@ public final class Root implements Comparable<Root>, Serializable {
@Nullable private final Path execRoot;
private final Path path;
private final boolean isMiddlemanRoot;
+ private final boolean isMainRepo;
private final PathFragment execPath;
private Root(@Nullable Path execRoot, Path path, boolean isMiddlemanRoot, boolean isMainRepo) {
this.execRoot = execRoot;
this.path = Preconditions.checkNotNull(path);
this.isMiddlemanRoot = isMiddlemanRoot;
+ this.isMainRepo = isMainRepo;
this.execPath = isSourceRoot() ? PathFragment.EMPTY_FRAGMENT : path.relativeTo(execRoot);
}
@@ -181,6 +183,10 @@ public final class Root implements Comparable<Root>, Serializable {
return isMiddlemanRoot;
}
+ public boolean isMainRepo() {
+ return isMainRepo;
+ }
+
@Override
public int compareTo(Root o) {
return path.compareTo(o.path);
@@ -188,7 +194,7 @@ public final class Root implements Comparable<Root>, Serializable {
@Override
public int hashCode() {
- return Objects.hash(execRoot, path.hashCode());
+ return Objects.hash(execRoot, path.hashCode(), isMainRepo);
}
@Override
@@ -200,7 +206,8 @@ public final class Root implements Comparable<Root>, Serializable {
return false;
}
Root r = (Root) o;
- return path.equals(r.path) && Objects.equals(execRoot, r.execRoot);
+ return path.equals(r.path) && Objects.equals(execRoot, r.execRoot)
+ && Objects.equals(isMainRepo, r.isMainRepo);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
index 25e95947e0..48b746c655 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseStartedEvent.java
@@ -15,7 +15,6 @@
package com.google.devtools.build.lib.analysis;
import com.google.common.base.Function;
-import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Target;
@@ -27,22 +26,14 @@ import java.util.Collection;
*/
public class AnalysisPhaseStartedEvent {
- private final ImmutableSet<Target> targets;
+ private final Iterable<Label> labels;
/**
* Construct the event.
* @param targets The set of active targets that remain.
*/
public AnalysisPhaseStartedEvent(Collection<Target> targets) {
- this.targets = ImmutableSet.copyOf(targets);
- }
-
- /**
- * @return The set of active targets remaining, which is a subset
- * of the targets we attempted to load.
- */
- public Iterable<Label> getLabels() {
- return Iterables.transform(targets, new Function<Target, Label>() {
+ this.labels = Iterables.transform(targets, new Function<Target, Label>() {
@Override
public Label apply(Target input) {
return input.getLabel();
@@ -50,7 +41,11 @@ public class AnalysisPhaseStartedEvent {
});
}
- public ImmutableSet<Target> getTargets() {
- return targets;
+ /**
+ * @return The set of active targets remaining, which is a subset
+ * of the targets we attempted to load.
+ */
+ public Iterable<Label> getLabels() {
+ return labels;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
index ae209c9495..75ac3a0d53 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationCollectionFactory.java
@@ -39,7 +39,6 @@ public interface ConfigurationCollectionFactory {
* @param loadedPackageProvider the package provider
* @param buildOptions top-level build options representing the command-line
* @param errorEventListener the event listener for errors
- * @param mainRepositoryName the workspace name of the main repository
* @return the top-level configuration
* @throws InvalidConfigurationException
*/
@@ -49,8 +48,7 @@ public interface ConfigurationCollectionFactory {
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- EventHandler errorEventListener,
- String mainRepositoryName)
+ EventHandler errorEventListener)
throws InvalidConfigurationException, InterruptedException;
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 7c9e921aa0..a54befb9e3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -253,7 +253,7 @@ public final class RuleContext extends TargetContext
* Returns the workspace name for the rule.
*/
public String getWorkspaceName() {
- return rule.getRepository().strippedName();
+ return rule.getPackage().getWorkspaceName();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
index 2363624388..73cc667034 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
@@ -37,14 +37,12 @@ import java.io.IOException;
*/
public final class BinTools {
private final BlazeDirectories directories;
- private final Path execrootParent;
+ private final Path binDir; // the working bin directory under execRoot
private final ImmutableList<String> embeddedTools;
- private Path binDir; // the working bin directory under execRoot
-
private BinTools(BlazeDirectories directories, ImmutableList<String> tools) {
this.directories = directories;
- this.execrootParent = directories.getExecRoot().getParentDirectory();
+ this.binDir = directories.getExecRoot().getRelative("_bin");
ImmutableList.Builder<String> builder = ImmutableList.builder();
// Files under embedded_tools shouldn't be copied to under _bin dir
// They won't be used during action execution time.
@@ -54,7 +52,6 @@ public final class BinTools {
}
}
this.embeddedTools = builder.build();
- this.binDir = null;
}
/**
@@ -72,8 +69,7 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools empty(BlazeDirectories directories) {
- return new BinTools(directories, ImmutableList.<String>of()).setBinDir(
- directories.getWorkspace().getBaseName());
+ return new BinTools(directories, ImmutableList.<String>of());
}
/**
@@ -83,8 +79,7 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools forUnitTesting(BlazeDirectories directories, Iterable<String> tools) {
- return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir(
- directories.getWorkspace().getBaseName());
+ return new BinTools(directories, ImmutableList.copyOf(tools));
}
/**
@@ -93,7 +88,7 @@ public final class BinTools {
*/
@VisibleForTesting
public static BinTools forIntegrationTesting(
- BlazeDirectories directories, String srcDir, Iterable<String> tools, String repositoryName)
+ BlazeDirectories directories, String srcDir, Iterable<String> tools)
throws IOException {
Path srcPath = directories.getOutputBase().getFileSystem().getPath(srcDir);
for (String embedded : tools) {
@@ -106,7 +101,7 @@ public final class BinTools {
// much point in creating a symlink to a non-existent binary here.
continue;
}
- Path outputPath = directories.getExecRoot(repositoryName).getChild("_bin").getChild(embedded);
+ Path outputPath = directories.getExecRoot().getChild("_bin").getChild(embedded);
if (outputPath.exists()) {
outputPath.delete();
}
@@ -114,7 +109,7 @@ public final class BinTools {
outputPath.createSymbolicLink(runfilesPath);
}
- return new BinTools(directories, ImmutableList.copyOf(tools)).setBinDir(repositoryName);
+ return new BinTools(directories, ImmutableList.copyOf(tools));
}
private static void scanDirectoryRecursively(
@@ -148,7 +143,6 @@ public final class BinTools {
}
public Artifact getEmbeddedArtifact(String embedPath, ArtifactFactory artifactFactory) {
- Preconditions.checkNotNull(binDir);
PathFragment path = getExecPath(embedPath);
Preconditions.checkNotNull(path, embedPath + " not found in embedded tools");
return artifactFactory.getDerivedArtifact(path, binDir.getParentDirectory());
@@ -162,17 +156,11 @@ public final class BinTools {
return builder.build();
}
- private BinTools setBinDir(String workspaceName) {
- binDir = execrootParent.getRelative(workspaceName).getRelative("_bin");
- return this;
- }
-
/**
* Initializes the build tools not available at absolute paths. Note that
* these must be constant across all configurations.
*/
- public void setupBuildTools(String workspaceName) throws ExecException {
- setBinDir(workspaceName);
+ public void setupBuildTools() throws ExecException {
try {
FileSystemUtils.createDirectoryAndParents(binDir);
} catch (IOException e) {
@@ -185,7 +173,6 @@ public final class BinTools {
}
private void setupTool(String embeddedPath) throws ExecException {
- Preconditions.checkNotNull(binDir);
Path sourcePath = directories.getEmbeddedBinariesRoot().getRelative(embeddedPath);
Path linkPath = binDir.getRelative(new PathFragment(embeddedPath).getBaseName());
linkTool(sourcePath, linkPath);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 60c0e207da..c38cfc2e5e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -1037,7 +1037,6 @@ public final class BuildConfiguration {
private final ImmutableMap<Class<? extends Fragment>, Fragment> fragments;
private final ImmutableMap<String, Class<? extends Fragment>> skylarkVisibleFragments;
- private final String mainRepositoryName;
/**
* Directories in the output tree.
@@ -1107,21 +1106,18 @@ public final class BuildConfiguration {
}
Root getRoot(
- RepositoryName repositoryName, String outputDirName, BlazeDirectories directories,
- String mainRepositoryName) {
+ RepositoryName repositoryName, String outputDirName, BlazeDirectories directories) {
// e.g., execroot/repo1
- Path execRoot = directories.getExecRoot(mainRepositoryName);
+ Path execRoot = directories.getExecRoot();
// e.g., execroot/repo1/bazel-out/config/bin
Path outputDir = execRoot.getRelative(directories.getRelativeOutputPath())
.getRelative(outputDirName);
if (middleman) {
- return INTERNER.intern(Root.middlemanRoot(execRoot, outputDir,
- repositoryName.strippedName().equals(mainRepositoryName)));
+ return INTERNER.intern(Root.middlemanRoot(execRoot, outputDir, repositoryName.isMain()));
}
// e.g., [[execroot/repo1]/bazel-out/config/bin]
return INTERNER.intern(
- Root.asDerivedRoot(execRoot, outputDir.getRelative(name),
- repositoryName.strippedName().equals(mainRepositoryName)));
+ Root.asDerivedRoot(execRoot, outputDir.getRelative(name), repositoryName.isMain()));
}
}
@@ -1336,8 +1332,7 @@ public final class BuildConfiguration {
public BuildConfiguration(BlazeDirectories directories,
Map<Class<? extends Fragment>, Fragment> fragmentsMap,
BuildOptions buildOptions,
- boolean actionsDisabled,
- String repositoryName) {
+ boolean actionsDisabled) {
this.directories = directories;
this.actionsEnabled = !actionsDisabled;
this.fragments = ImmutableSortedMap.copyOf(fragmentsMap, lexicalFragmentSorter);
@@ -1346,7 +1341,6 @@ public final class BuildConfiguration {
this.buildOptions = buildOptions;
this.options = buildOptions.get(Options.class);
- this.mainRepositoryName = repositoryName;
Map<String, String> testEnv = new TreeMap<>();
for (Map.Entry<String, String> entry : this.options.testEnvironment) {
@@ -1416,8 +1410,8 @@ public final class BuildConfiguration {
}
BuildOptions options = buildOptions.trim(
getOptionsClasses(fragmentsMap.keySet(), ruleClassProvider));
- BuildConfiguration newConfig = new BuildConfiguration(
- directories, fragmentsMap, options, !actionsEnabled, mainRepositoryName);
+ BuildConfiguration newConfig =
+ new BuildConfiguration(directories, fragmentsMap, options, !actionsEnabled);
newConfig.setConfigurationTransitions(this.transitions);
return newConfig;
}
@@ -1993,8 +1987,7 @@ public final class BuildConfiguration {
* Returns the output directory for this build configuration.
*/
public Root getOutputDirectory(RepositoryName repositoryName) {
- return OutputDirectory.OUTPUT.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.OUTPUT.getRoot(repositoryName, outputDirName, directories);
}
/**
@@ -2013,8 +2006,7 @@ public final class BuildConfiguration {
* repositories (external) but will need to be fixed.
*/
public Root getBinDirectory(RepositoryName repositoryName) {
- return OutputDirectory.BIN.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.BIN.getRoot(repositoryName, outputDirName, directories);
}
/**
@@ -2028,8 +2020,7 @@ public final class BuildConfiguration {
* Returns the include directory for this build configuration.
*/
public Root getIncludeDirectory(RepositoryName repositoryName) {
- return OutputDirectory.INCLUDE.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.INCLUDE.getRoot(repositoryName, outputDirName, directories);
}
/**
@@ -2042,8 +2033,7 @@ public final class BuildConfiguration {
}
public Root getGenfilesDirectory(RepositoryName repositoryName) {
- return OutputDirectory.GENFILES.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.GENFILES.getRoot(repositoryName, outputDirName, directories);
}
/**
@@ -2052,16 +2042,14 @@ public final class BuildConfiguration {
* needed for Jacoco's coverage reporting tools.
*/
public Root getCoverageMetadataDirectory(RepositoryName repositoryName) {
- return OutputDirectory.COVERAGE.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.COVERAGE.getRoot(repositoryName, outputDirName, directories);
}
/**
* Returns the testlogs directory for this build configuration.
*/
public Root getTestLogsDirectory(RepositoryName repositoryName) {
- return OutputDirectory.TESTLOGS.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.TESTLOGS.getRoot(repositoryName, outputDirName, directories);
}
/**
@@ -2088,8 +2076,7 @@ public final class BuildConfiguration {
* Returns the internal directory (used for middlemen) for this build configuration.
*/
public Root getMiddlemanDirectory(RepositoryName repositoryName) {
- return OutputDirectory.MIDDLEMAN.getRoot(
- repositoryName, outputDirName, directories, mainRepositoryName);
+ return OutputDirectory.MIDDLEMAN.getRoot(repositoryName, outputDirName, directories);
}
public boolean getAllowRuntimeDepsOnNeverLink() {
@@ -2104,10 +2091,6 @@ public final class BuildConfiguration {
return options.pluginList;
}
- public String getMainRepositoryName() {
- return mainRepositoryName;
- }
-
/**
* Returns the configuration-dependent string for this configuration. This is also the name of the
* configuration's base output directory unless {@link Options#outputDirectoryName} overrides it.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
index 2478d404d8..595f5271d2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFactory.java
@@ -69,11 +69,10 @@ public final class ConfigurationFactory {
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- EventHandler errorEventListener,
- String mainRepositoryName)
+ EventHandler errorEventListener)
throws InvalidConfigurationException, InterruptedException {
return configurationCollectionFactory.createConfigurations(this, cache,
- loadedPackageProvider, buildOptions, errorEventListener, mainRepositoryName);
+ loadedPackageProvider, buildOptions, errorEventListener);
}
/**
@@ -87,8 +86,7 @@ public final class ConfigurationFactory {
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
boolean actionsDisabled,
- Cache<String, BuildConfiguration> cache,
- String repositoryName)
+ Cache<String, BuildConfiguration> cache)
throws InvalidConfigurationException, InterruptedException {
String cacheKey = buildOptions.computeCacheKey();
@@ -111,8 +109,7 @@ public final class ConfigurationFactory {
return null;
}
- result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled,
- repositoryName);
+ result = new BuildConfiguration(directories, fragments, buildOptions, actionsDisabled);
cache.put(cacheKey, result);
return result;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
index 8a5e781c16..696f581150 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
@@ -57,12 +57,11 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
Cache<String, BuildConfiguration> cache,
PackageProviderForConfigurations packageProvider,
BuildOptions buildOptions,
- EventHandler eventHandler,
- String mainRepositoryName)
+ EventHandler eventHandler)
throws InvalidConfigurationException, InterruptedException {
// Target configuration
BuildConfiguration targetConfiguration = configurationFactory.getConfiguration(
- packageProvider, buildOptions, false, cache, mainRepositoryName);
+ packageProvider, buildOptions, false, cache);
if (targetConfiguration == null) {
return null;
}
@@ -73,7 +72,7 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
// Note that this passes in the dataConfiguration, not the target
// configuration. This is intentional.
BuildConfiguration hostConfiguration = getHostConfigurationFromRequest(configurationFactory,
- packageProvider, dataConfiguration, buildOptions, cache, mainRepositoryName);
+ packageProvider, dataConfiguration, buildOptions, cache);
if (hostConfiguration == null) {
return null;
}
@@ -83,7 +82,7 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
for (SplitTransition<BuildOptions> transition : buildOptions.getPotentialSplitTransitions()) {
for (BuildOptions splitOptions : transition.split(buildOptions)) {
BuildConfiguration splitConfig = configurationFactory.getConfiguration(
- packageProvider, splitOptions, false, cache, mainRepositoryName);
+ packageProvider, splitOptions, false, cache);
splitTransitionsTable.put(transition, splitConfig);
}
}
@@ -157,16 +156,14 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact
PackageProviderForConfigurations loadedPackageProvider,
BuildConfiguration requestConfig,
BuildOptions buildOptions,
- Cache<String, BuildConfiguration> cache,
- String repositoryName)
+ Cache<String, BuildConfiguration> cache)
throws InvalidConfigurationException, InterruptedException {
BuildConfiguration.Options commonOptions = buildOptions.get(BuildConfiguration.Options.class);
if (!commonOptions.useDistinctHostConfiguration) {
return requestConfig;
} else {
BuildConfiguration hostConfig = configurationFactory.getConfiguration(
- loadedPackageProvider, buildOptions.createHostOptions(false), false, cache,
- repositoryName);
+ loadedPackageProvider, buildOptions.createHostOptions(false), false, cache);
if (hostConfig == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
index 89778536da..a913927f8f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
@@ -201,7 +201,7 @@ public class BazelPythonSemantics implements PythonSemantics {
}
private static boolean isUnderWorkspace(PathFragment path) {
- return !path.startsWith(new PathFragment(Label.EXTERNAL_PATH_PREFIX));
+ return !path.startsWith(Label.EXTERNAL_PACKAGE_NAME);
}
private static String getZipRunfilesPath(PathFragment path, PathFragment workspaceName) {
@@ -211,7 +211,7 @@ public class BazelPythonSemantics implements PythonSemantics {
zipRunfilesPath = workspaceName.getRelative(path).normalize().toString();
} else {
// If the file is in external package, strip "external"
- zipRunfilesPath = path.relativeTo(Label.EXTERNAL_PATH_PREFIX).normalize().toString();
+ zipRunfilesPath = path.relativeTo(Label.EXTERNAL_PACKAGE_NAME).normalize().toString();
}
// We put the whole runfiles tree under the ZIP_RUNFILES_DIRECTORY_NAME directory, by doing this
// , we avoid the conflict between default workspace name "__main__" and __main__.py file.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index a516a53e98..a45a907e30 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -141,6 +141,12 @@ public final class BuildTool {
try {
env.getEventBus().post(new BuildStartingEvent(env, request));
LOG.info("Build identifier: " + request.getId());
+ executionTool = new ExecutionTool(env, request);
+ if (needsExecutionPhase(request.getBuildOptions())) {
+ // Initialize the execution tool early if we need it. This hides the latency of setting up
+ // the execution backends.
+ executionTool.init();
+ }
// Error out early if multi_cpus is set, but we're not in build or test command.
if (!request.getMultiCpus().isEmpty()) {
@@ -160,11 +166,6 @@ public final class BuildTool {
// Target pattern evaluation.
LoadingResult loadingResult = evaluateTargetPatterns(request, validator);
- env.setWorkspaceName(loadingResult.getWorkspaceName());
- executionTool = new ExecutionTool(env, request);
- if (needsExecutionPhase(request.getBuildOptions())) {
- executionTool.init();
- }
// Exit if there are any pending exceptions from modules.
env.throwPendingException();
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 7e11859c38..59e447eecd 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -184,6 +184,7 @@ public class ExecutionTool {
this.runtime = env.getRuntime();
this.request = request;
+
// Create tools before getting the strategies from the modules as some of them need tools to
// determine whether the host actually supports certain strategies (e.g. sandboxing).
createToolsSymlinks();
@@ -332,7 +333,7 @@ public class ExecutionTool {
TopLevelArtifactContext topLevelArtifactContext)
throws BuildFailedException, InterruptedException, TestExecException, AbruptExitException {
Stopwatch timer = Stopwatch.createStarted();
- prepare(packageRoots);
+ prepare(packageRoots, analysisResult.getWorkspaceName());
ActionGraph actionGraph = analysisResult.getActionGraph();
@@ -346,7 +347,7 @@ public class ExecutionTool {
request.getBuildOptions().finalizeActions);
} else {
// TODO(bazel-team): this could be just another OutputService
- startLocalOutputBuild();
+ startLocalOutputBuild(analysisResult.getWorkspaceName());
}
List<BuildConfiguration> targetConfigurations = configurations.getTargetConfigurations();
@@ -354,9 +355,10 @@ public class ExecutionTool {
? targetConfigurations.get(0) : null;
if (targetConfigurations.size() == 1) {
String productName = runtime.getProductName();
- String workspaceName = env.getWorkspaceName();
+ String dirName = env.getWorkspaceName();
+ String workspaceName = analysisResult.getWorkspaceName();
OutputDirectoryLinksUtils.createOutputDirectoryLinks(
- workspaceName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName),
+ dirName, env.getWorkspace(), env.getDirectories().getExecRoot(workspaceName),
env.getDirectories().getOutputPath(workspaceName), getReporter(), targetConfiguration,
request.getBuildOptions().getSymlinkPrefix(productName), productName);
}
@@ -489,7 +491,7 @@ public class ExecutionTool {
}
}
- private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots)
+ private void prepare(ImmutableMap<PackageIdentifier, Path> packageRoots, String workspaceName)
throws ExecutorInitException {
// Prepare for build.
Profiler.instance().markPhase(ProfilePhase.PREPARE);
@@ -500,7 +502,7 @@ public class ExecutionTool {
// Plant the symlink forest.
try {
new SymlinkForest(
- packageRoots, getExecRoot(), runtime.getProductName(), env.getWorkspaceName())
+ packageRoots, getExecRoot(), runtime.getProductName(), workspaceName)
.plantSymlinkForest();
} catch (IOException e) {
throw new ExecutorInitException("Source forest creation failed", e);
@@ -509,7 +511,7 @@ public class ExecutionTool {
private void createToolsSymlinks() throws ExecutorInitException {
try {
- env.getBlazeWorkspace().getBinTools().setupBuildTools(env.getWorkspaceName());
+ env.getBlazeWorkspace().getBinTools().setupBuildTools();
} catch (ExecException e) {
throw new ExecutorInitException("Tools symlink creation failed", e);
}
@@ -530,9 +532,9 @@ public class ExecutionTool {
/**
* Prepare for a local output build.
*/
- private void startLocalOutputBuild() throws ExecutorInitException {
+ private void startLocalOutputBuild(String workspaceName) throws ExecutorInitException {
try (AutoProfiler p = AutoProfiler.profiled("Starting local output build", ProfilerTask.INFO)) {
- Path outputPath = env.getDirectories().getOutputPath(env.getWorkspaceName());
+ Path outputPath = env.getDirectories().getOutputPath(workspaceName);
Path localOutputPath = env.getDirectories().getLocalOutputPath();
if (outputPath.isSymbolicLink()) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
index 838f3bad1e..0ae420a20c 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
@@ -78,16 +78,15 @@ public class OutputDirectoryLinksUtils {
}
// Points to execroot
- createLink(workspace, execRootSymlink(
- symlinkPrefix, workspace.getBaseName()), execRoot, failures);
- RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(workspaceName);
+ createLink(workspace, execRootSymlink(symlinkPrefix, workspaceName), execRoot, failures);
+
if (targetConfig != null) {
createLink(workspace, symlinkPrefix + "bin",
- targetConfig.getBinDirectory(repositoryName).getPath(), failures);
+ targetConfig.getBinDirectory(RepositoryName.MAIN).getPath(), failures);
createLink(workspace, symlinkPrefix + "testlogs",
- targetConfig.getTestLogsDirectory(repositoryName).getPath(), failures);
+ targetConfig.getTestLogsDirectory(RepositoryName.MAIN).getPath(), failures);
createLink(workspace, symlinkPrefix + "genfiles",
- targetConfig.getGenfilesDirectory(repositoryName).getPath(), failures);
+ targetConfig.getGenfilesDirectory(RepositoryName.MAIN).getPath(), failures);
}
if (!failures.isEmpty()) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index 246ff07550..0a9bd9c82e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -728,6 +728,6 @@ public final class Rule implements Target, DependencyFilter.AttributeInfoProvide
* @return The repository name.
*/
public RepositoryName getRepository() {
- return RepositoryName.createFromValidStrippedName(pkg.getWorkspaceName());
+ return getLabel().getPackageIdentifier().getRepository();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index 0e5f0e4c1b..abe66c67bb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -141,6 +141,8 @@ public class WorkspaceFactory {
/**
* Parses the given WORKSPACE file without resolving skylark imports.
+ *
+ * <p>Called by com.google.devtools.build.workspace.Resolver from //src/tools/generate_workspace.
*/
public void parse(ParserInputSource source)
throws BuildFileContainsErrorsException, InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
index d4c838969e..4a1cbe2a18 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportFunction.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.rules.cpp.FdoSupport.FdoException;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
-import com.google.devtools.build.lib.skyframe.WorkspaceNameValue;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -47,13 +46,12 @@ public class FdoSupportFunction implements SkyFunction {
public SkyValue compute(SkyKey skyKey, Environment env)
throws FdoSkyException, InterruptedException {
BlazeDirectories blazeDirectories = PrecomputedValue.BLAZE_DIRECTORIES.get(env);
- WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env.getValue(
- WorkspaceNameValue.key());
if (env.valuesMissing()) {
return null;
}
- Path execRoot = blazeDirectories.getExecRoot(workspaceNameValue.getName());
+ // TODO(kchodorow): create a SkyFunction to get the main repository name and pass it in here.
+ Path execRoot = blazeDirectories.getExecRoot();
FdoSupportValue.Key key = (FdoSupportValue.Key) skyKey.argument();
FdoSupport fdoSupport;
try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
index 57bf9fa505..8b6015d9da 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestResult.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.rules.test.TestRunnerAction.ResolvedPaths;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
import com.google.devtools.build.lib.view.test.TestStatus.TestResultData;
import java.util.Collection;
@@ -92,9 +93,9 @@ public class TestResult {
/**
* @return Coverage data artifact, if available and null otherwise.
*/
- public Path getCoverageData() {
+ public PathFragment getCoverageData() {
if (data.getHasCoverage()) {
- return testAction.getCoverageData().getPath();
+ return testAction.getCoverageData().getExecPath();
}
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
index 3246f2fe26..98c56c48c8 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
@@ -150,6 +150,15 @@ public final class BlazeWorkspace {
}
/**
+ * Returns the execution root directory associated with this Blaze server
+ * process. This is where all input and output files visible to the actual
+ * build reside.
+ */
+ public Path getExecRoot() {
+ return directories.getExecRoot();
+ }
+
+ /**
* Returns path to the cache directory. Path must be inside output base to
* ensure that users can run concurrent instances of blaze in different
* clients without attempting to concurrently write to the same action cache
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index 00a69dc5d0..0014eac0be 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -92,7 +92,6 @@ public final class CommandEnvironment {
private long commandStartTime;
private OutputService outputService;
private Path workingDirectory;
- private String workspaceName;
private String commandName;
private OptionsProvider options;
@@ -145,7 +144,6 @@ public final class CommandEnvironment {
// TODO(ulfjack): We don't call beforeCommand() in tests, but rely on workingDirectory being set
// in setupPackageCache(). This leads to NPE if we don't set it here.
this.workingDirectory = directories.getWorkspace();
- this.workspaceName = null;
workspace.getSkyframeExecutor().setEventBus(eventBus);
}
@@ -295,14 +293,13 @@ public final class CommandEnvironment {
}
public String getWorkspaceName() {
- Preconditions.checkNotNull(workspaceName);
- return workspaceName;
+ Path workspace = getDirectories().getWorkspace();
+ if (workspace == null) {
+ return "";
+ }
+ return workspace.getBaseName();
}
- public void setWorkspaceName(String workspaceName) {
- Preconditions.checkState(this.workspaceName == null, "workspace name can only be set once");
- this.workspaceName = workspaceName;
- }
/**
* Returns if the client passed a valid workspace to be used for the build.
*/
@@ -325,8 +322,7 @@ public final class CommandEnvironment {
* build reside.
*/
public Path getExecRoot() {
- Preconditions.checkNotNull(workspaceName);
- return getDirectories().getExecRoot(workspaceName);
+ return getDirectories().getExecRoot();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
index d23b7e5b5a..8206527d4f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAnalyzer.java
@@ -30,7 +30,9 @@ import com.google.devtools.build.lib.rules.test.TestResult;
import com.google.devtools.build.lib.runtime.TerminalTestResultNotifier.TestSummaryOptions;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -43,6 +45,7 @@ import java.util.Set;
*/
@ThreadCompatible
public class TestResultAnalyzer {
+ private final Path execRoot;
private final TestSummaryOptions summaryOptions;
private final ExecutionOptions executionOptions;
private final EventBus eventBus;
@@ -56,9 +59,11 @@ public class TestResultAnalyzer {
* @param executionOptions Parsed build/test execution options.
* @param eventBus For reporting failed to build and cached tests.
*/
- public TestResultAnalyzer(TestSummaryOptions summaryOptions,
+ public TestResultAnalyzer(Path execRoot,
+ TestSummaryOptions summaryOptions,
ExecutionOptions executionOptions,
EventBus eventBus) {
+ this.execRoot = execRoot;
this.summaryOptions = summaryOptions;
this.executionOptions = executionOptions;
this.eventBus = eventBus;
@@ -206,9 +211,10 @@ public class TestResultAnalyzer {
numLocalActionCached++;
}
- Path coverageData = result.getCoverageData();
+ PathFragment coverageData = result.getCoverageData();
if (coverageData != null) {
- summaryBuilder.addCoverageFiles(Collections.singletonList(coverageData));
+ summaryBuilder.addCoverageFiles(
+ Collections.singletonList(execRoot.getRelative(coverageData)));
}
if (!executionOptions.runsPerTestDetectsFlakes) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 2a92e42cbb..368529e804 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -202,7 +202,6 @@ public final class CleanCommand implements BlazeCommand {
private void actuallyClean(CommandEnvironment env,
Path outputBase, Options cleanOptions, String symlinkPrefix) throws IOException,
ShutdownBlazeServerException, CommandException, ExecException, InterruptedException {
- String workspaceDirectory = env.getWorkspace().getBaseName();
if (env.getOutputService() != null) {
env.getOutputService().clean();
}
@@ -225,7 +224,8 @@ public final class CleanCommand implements BlazeCommand {
env.getBlazeWorkspace().clearCaches();
// In order to be sure that we delete everything, delete the workspace directory both for
// --deep_execroot and for --nodeep_execroot.
- for (String directory : new String[] {workspaceDirectory, "execroot"}) {
+ for (String directory : new String[] {
+ env.getWorkspaceName(), "execroot/" + env.getWorkspaceName() }) {
Path child = outputBase.getRelative(directory);
if (child.exists()) {
LOG.finest("Cleaning " + child + (cleanOptions.async ? " asynchronously..." : ""));
@@ -239,8 +239,8 @@ public final class CleanCommand implements BlazeCommand {
}
// remove convenience links
OutputDirectoryLinksUtils.removeOutputDirectoryLinks(
- workspaceDirectory, env.getWorkspace(), env.getReporter(),
- symlinkPrefix, env.getRuntime().getProductName());
+ env.getWorkspaceName(), env.getWorkspace(), env.getReporter(), symlinkPrefix,
+ env.getRuntime().getProductName());
// shutdown on expunge cleans
if (cleanOptions.expunge || cleanOptions.expunge_async) {
throw new ShutdownBlazeServerException(0);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index bf47b1487d..3f0ba6202f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -181,7 +181,7 @@ public abstract class InfoItem {
public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
throws AbruptExitException {
checkNotNull(env);
- return print(env.getDirectories().getExecRoot());
+ return print(env.getRuntime().getWorkspace().getExecRoot());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
index bbc7a02c4d..970cb5c007 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
@@ -192,7 +192,7 @@ public final class ProfileCommand implements BlazeCommand {
MultiProfileStatistics statistics =
new MultiProfileStatistics(
env.getWorkingDirectory(),
- env.getWorkspace().getBaseName(),
+ env.getWorkspaceName(),
options.getResidue(),
getInfoListener(env),
opts.vfsStatsLimit > 0);
@@ -248,7 +248,7 @@ public final class ProfileCommand implements BlazeCommand {
phaseStatistics.put(
phase,
new PhaseStatistics(
- phase, info, env.getWorkspace().getBaseName(), opts.vfsStatsLimit > 0));
+ phase, info, env.getWorkspaceName(), opts.vfsStatsLimit > 0));
}
CriticalPathStatistics critPathStats = new CriticalPathStatistics(info);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
index 94b71d8df3..cd31c7d396 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
@@ -85,6 +85,7 @@ public class TestCommand implements BlazeCommand {
@Override
public ExitCode exec(CommandEnvironment env, OptionsProvider options) {
TestResultAnalyzer resultAnalyzer = new TestResultAnalyzer(
+ env.getDirectories().getExecRoot(),
options.getOptions(TestSummaryOptions.class),
options.getOptions(ExecutionOptions.class),
env.getEventBus());
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
index bb529e9a16..2eff7c45cc 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
@@ -76,7 +76,6 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
private final UUID uuid = UUID.randomUUID();
private final AtomicInteger execCounter = new AtomicInteger();
- private final String workspaceName;
private DarwinSandboxedStrategy(
BuildRequest buildRequest,
@@ -85,23 +84,20 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
boolean verboseFailures,
String productName,
ImmutableList<Path> confPaths,
- SpawnHelpers spawnHelpers,
- String workspaceName) {
+ SpawnHelpers spawnHelpers) {
super(
buildRequest,
blazeDirs,
verboseFailures,
- buildRequest.getOptions(SandboxOptions.class),
- workspaceName);
+ buildRequest.getOptions(SandboxOptions.class));
this.clientEnv = ImmutableMap.copyOf(clientEnv);
this.blazeDirs = blazeDirs;
- this.execRoot = blazeDirs.getExecRoot(workspaceName);
+ this.execRoot = blazeDirs.getExecRoot();
this.sandboxDebug = buildRequest.getOptions(SandboxOptions.class).sandboxDebug;
this.verboseFailures = verboseFailures;
this.productName = productName;
this.confPaths = confPaths;
this.spawnHelpers = spawnHelpers;
- this.workspaceName = workspaceName;
}
public static DarwinSandboxedStrategy create(
@@ -109,8 +105,7 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
Map<String, String> clientEnv,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName,
- String workspaceName)
+ String productName)
throws IOException {
// On OS X, in addition to what is specified in $TMPDIR, two other temporary directories may be
// written to by processes. We have to get their location by calling "getconf".
@@ -130,8 +125,7 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
verboseFailures,
productName,
writablePaths.build(),
- new SpawnHelpers(blazeDirs.getExecRoot(workspaceName)),
- workspaceName);
+ new SpawnHelpers(blazeDirs.getExecRoot()));
}
/**
@@ -334,8 +328,8 @@ public class DarwinSandboxedStrategy extends SandboxStrategy {
Path mount;
if (sourceFragment.isAbsolute()) {
mount = blazeDirs.getFileSystem().getPath(sourceFragment);
- } else if (blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment).exists()) {
- mount = blazeDirs.getExecRoot(workspaceName).getRelative(sourceFragment);
+ } else if (blazeDirs.getExecRoot().getRelative(sourceFragment).exists()) {
+ mount = blazeDirs.getExecRoot().getRelative(sourceFragment);
} else {
List<Path> searchPath =
SearchPath.parse(blazeDirs.getFileSystem(), clientEnv.get("PATH"));
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
index 65cbab9c0e..71ff1fc482 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedStrategy.java
@@ -64,17 +64,15 @@ public class LinuxSandboxedStrategy extends SandboxStrategy {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName,
- String workspaceName) {
+ String productName) {
super(
buildRequest,
blazeDirs,
verboseFailures,
- buildRequest.getOptions(SandboxOptions.class),
- workspaceName);
+ buildRequest.getOptions(SandboxOptions.class));
this.sandboxOptions = buildRequest.getOptions(SandboxOptions.class);
this.blazeDirs = blazeDirs;
- this.execRoot = blazeDirs.getExecRoot(workspaceName);
+ this.execRoot = blazeDirs.getExecRoot();
this.verboseFailures = verboseFailures;
this.productName = productName;
}
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
index df05bb7551..f7b310a2fe 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedStrategy.java
@@ -59,11 +59,8 @@ public class ProcessWrapperSandboxedStrategy extends SandboxStrategy {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- String productName,
- String workspaceName) {
- super(
- buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class),
- workspaceName);
+ String productName) {
+ super(buildRequest, blazeDirs, verboseFailures, buildRequest.getOptions(SandboxOptions.class));
this.sandboxOptions = buildRequest.getOptions(SandboxOptions.class);
this.blazeDirs = blazeDirs;
this.execRoot = blazeDirs.getExecRoot();
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
index caef3a34d6..26bf01ec69 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
@@ -54,8 +54,7 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName(),
- env.getWorkspaceName()));
+ env.getRuntime().getProductName()));
} else {
if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) {
env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE));
@@ -65,8 +64,7 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName(),
- env.getWorkspaceName()));
+ env.getRuntime().getProductName()));
}
break;
case DARWIN:
@@ -77,8 +75,7 @@ final class SandboxActionContextProvider extends ActionContextProvider {
env.getClientEnv(),
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName(),
- env.getWorkspaceName()));
+ env.getRuntime().getProductName()));
} else {
if (!buildRequest.getOptions(SandboxOptions.class).ignoreUnsupportedSandboxing) {
env.getReporter().handle(Event.warn(SANDBOX_NOT_SUPPORTED_MESSAGE));
@@ -91,8 +88,7 @@ final class SandboxActionContextProvider extends ActionContextProvider {
buildRequest,
env.getDirectories(),
verboseFailures,
- env.getRuntime().getProductName(),
- env.getWorkspaceName()));
+ env.getRuntime().getProductName()));
break;
default:
// No sandboxing available.
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
index 64533150bf..80f0501afa 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxStrategy.java
@@ -62,10 +62,9 @@ abstract class SandboxStrategy implements SandboxedSpawnActionContext {
BuildRequest buildRequest,
BlazeDirectories blazeDirs,
boolean verboseFailures,
- SandboxOptions sandboxOptions,
- String workspaceName) {
+ SandboxOptions sandboxOptions) {
this.buildRequest = buildRequest;
- this.execRoot = blazeDirs.getExecRoot(workspaceName);
+ this.execRoot = blazeDirs.getExecRoot();
this.verboseFailures = verboseFailures;
this.sandboxOptions = sandboxOptions;
this.spawnInputExpander = new SpawnInputExpander(/*strict=*/false);
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
index 5e1d3fc7b6..d8bb0a7f58 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
@@ -75,7 +75,7 @@ public final class SpawnHelpers {
targetDirectory,
manifestFile,
true,
- execRoot.getBaseName());
+ filesetContext.getWorkspaceName());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
index 71c5f0ac2c..3f18f8502b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
@@ -53,12 +53,6 @@ public class BuildConfigurationFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws InterruptedException, BuildConfigurationFunctionException {
- WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env
- .getValue(WorkspaceNameValue.key());
- if (workspaceNameValue == null) {
- return null;
- }
-
BuildConfigurationValue.Key key = (BuildConfigurationValue.Key) skyKey.argument();
Set<Fragment> fragments;
try {
@@ -76,7 +70,7 @@ public class BuildConfigurationFunction implements SkyFunction {
}
BuildConfiguration config = new BuildConfiguration(directories, fragmentsMap,
- key.getBuildOptions(), !key.actionsEnabled(), workspaceNameValue.getName());
+ key.getBuildOptions(), !key.actionsEnabled());
// Unlike static configurations, dynamic configurations don't need to embed transition logic
// within the configuration itself. However we still use this interface to provide a mapping
// between Transition types (e.g. HOST) and the dynamic transitions that apply those
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index 79011a82a9..4e91031903 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -64,7 +64,7 @@ public class BuildInfoCollectionFunction implements SkyFunction {
return null;
}
RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(
- nameValue.getName());
+ nameValue.maybeGetName());
final ArtifactFactory factory = artifactFactory.get();
BuildInfoContext context = new BuildInfoContext() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
index 3c252f8886..7326fb1855 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java
@@ -55,17 +55,11 @@ public class ConfigurationCollectionFunction implements SkyFunction {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException,
ConfigurationCollectionFunctionException {
- WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env
- .getValue(WorkspaceNameValue.key());
- if (workspaceNameValue == null) {
- return null;
- }
ConfigurationCollectionKey collectionKey = (ConfigurationCollectionKey) skyKey.argument();
try {
BuildConfigurationCollection result = getConfigurations(env,
new SkyframePackageLoaderWithValueEnvironment(env, ruleClassProvider),
- collectionKey.getBuildOptions(), collectionKey.getMultiCpu(),
- workspaceNameValue.getName());
+ collectionKey.getBuildOptions(), collectionKey.getMultiCpu());
// BuildConfigurationCollection can be created, but dependencies to some files might be
// missing. In that case we need to build configurationCollection again.
@@ -84,8 +78,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
Environment env,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- ImmutableSet<String> multiCpu,
- String repositoryName)
+ ImmutableSet<String> multiCpu)
throws InvalidConfigurationException, InterruptedException {
// We cache all the related configurations for this target configuration in a cache that is
// dropped at the end of this method call. We instead rely on the cache for entire collections
@@ -98,7 +91,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
if (!multiCpu.isEmpty()) {
for (String cpu : multiCpu) {
BuildConfiguration targetConfiguration = createConfiguration(
- cache, env.getListener(), loadedPackageProvider, buildOptions, cpu, repositoryName);
+ cache, env.getListener(), loadedPackageProvider, buildOptions, cpu);
if (targetConfiguration == null || targetConfigurations.contains(targetConfiguration)) {
continue;
}
@@ -109,7 +102,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
}
} else {
BuildConfiguration targetConfiguration = createConfiguration(
- cache, env.getListener(), loadedPackageProvider, buildOptions, null, repositoryName);
+ cache, env.getListener(), loadedPackageProvider, buildOptions, null);
if (targetConfiguration == null) {
return null;
}
@@ -165,8 +158,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
ExtendedEventHandler originalEventListener,
PackageProviderForConfigurations loadedPackageProvider,
BuildOptions buildOptions,
- String cpuOverride,
- String repositoryName)
+ String cpuOverride)
throws InvalidConfigurationException, InterruptedException {
ErrorSensingEventHandler eventHandler = new ErrorSensingEventHandler(originalEventListener);
if (cpuOverride != null) {
@@ -178,7 +170,7 @@ public class ConfigurationCollectionFunction implements SkyFunction {
}
BuildConfiguration targetConfig = configurationFactory.get().createConfigurations(
- cache, loadedPackageProvider, buildOptions, eventHandler, repositoryName);
+ cache, loadedPackageProvider, buildOptions, eventHandler);
if (targetConfig == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 370c69f595..1941489a77 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -453,7 +453,13 @@ public class PackageFunction implements SkyFunction {
if (workspaceNameValue == null) {
return null;
}
- String workspaceName = workspaceNameValue.getName();
+ String workspaceName = workspaceNameValue.maybeGetName();
+ if (workspaceName == null) {
+ throw new PackageFunctionException(
+ new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER),
+ Transience.PERSISTENT);
+ }
+
RootedPath buildFileRootedPath = packageLookupValue.getRootedPath(packageId);
FileValue buildFileValue = null;
Path buildFilePath = buildFileRootedPath.asPath();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
index 9284f5c2e9..f6dc151dfe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java
@@ -14,11 +14,9 @@
package com.google.devtools.build.lib.skyframe;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.skyframe.SkyFunction;
-import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import javax.annotation.Nullable;
@@ -26,24 +24,22 @@ import javax.annotation.Nullable;
/**
* {@link SkyFunction} for {@link WorkspaceNameValue}s.
*
- * <p>All errors (e.g. parsing errors or a symlink cycle encountered when consuming the WORKSPACE
- * file) result in a {@link NoSuchPackageException}.
+ * <p>All transitive errors (e.g. a symlink cycle encountered when consuming the WORKSPACE file)
+ * result in a {@link NoSuchPackageException}.
*/
public class WorkspaceNameFunction implements SkyFunction {
@Override
@Nullable
- public SkyValue compute(SkyKey skyKey, Environment env)
- throws InterruptedException, WorkspaceNameFunctionException {
+ public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException {
SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER);
PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey);
if (externalPackageValue == null) {
return null;
}
Package externalPackage = externalPackageValue.getPackage();
- if (externalPackage.containsErrors()) {
- throw new WorkspaceNameFunctionException();
- }
- return WorkspaceNameValue.withName(externalPackage.getWorkspaceName());
+ return externalPackage.containsErrors()
+ ? WorkspaceNameValue.withError()
+ : WorkspaceNameValue.withName(externalPackage.getWorkspaceName());
}
@Override
@@ -51,11 +47,4 @@ public class WorkspaceNameFunction implements SkyFunction {
public String extractTag(SkyKey skyKey) {
return null;
}
-
- private class WorkspaceNameFunctionException extends SkyFunctionException {
- WorkspaceNameFunctionException() {
- super(new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER),
- Transience.PERSISTENT);
- }
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
index bbcebba5f4..1fccf6d4da 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java
@@ -17,6 +17,7 @@ import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import java.util.Objects;
+import javax.annotation.Nullable;
/**
* A value that solely represents the 'name' of a Bazel workspace, as defined in the WORKSPACE file.
@@ -29,17 +30,20 @@ import java.util.Objects;
public class WorkspaceNameValue implements SkyValue {
private static final SkyKey KEY =
SkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE);
+ private static final WorkspaceNameValue ERROR = new WorkspaceNameValue(null);
+ @Nullable
private final String workspaceName;
- private WorkspaceNameValue(String workspaceName) {
+ private WorkspaceNameValue(@Nullable String workspaceName) {
this.workspaceName = workspaceName;
}
/**
- * Returns the name of the workspace.
+ * Returns the name of the workspace, or {@code null} if there was an error in the WORKSPACE file.
*/
- public String getName() {
+ @Nullable
+ public String maybeGetName() {
return workspaceName;
}
@@ -48,6 +52,11 @@ public class WorkspaceNameValue implements SkyValue {
return KEY;
}
+ /** Returns a {@link WorkspaceNameValue} for a workspace whose WORKSPACE file is in error. */
+ public static WorkspaceNameValue withError() {
+ return WorkspaceNameValue.ERROR;
+ }
+
/** Returns a {@link WorkspaceNameValue} for a workspace with the given name. */
public static WorkspaceNameValue withName(String workspaceName) {
return new WorkspaceNameValue(Preconditions.checkNotNull(workspaceName));
@@ -74,7 +83,7 @@ public class WorkspaceNameValue implements SkyValue {
/** Singleton class used as the {@link SkyKey#argument} for {@link WorkspaceNameValue#key}. */
public static final class DummyArgument {
- static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode();
+ public static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode();
public static final DummyArgument INSTANCE = new DummyArgument();
private DummyArgument() {
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
index 584f0867aa..8f2fda7acb 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
@@ -36,7 +36,7 @@ final class WorkerActionContextProvider extends ActionContextProvider {
WorkerSpawnStrategy workerSpawnStrategy =
new WorkerSpawnStrategy(
- env.getExecRoot(),
+ env.getDirectories(),
workers,
buildRequest.getOptions(ExecutionOptions.class).verboseFailures,
maxRetries,
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
index a80f542ec8..a81ef6eb52 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnStrategy.java
@@ -39,6 +39,7 @@ import com.google.devtools.build.lib.actions.SandboxedSpawnActionContext;
import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.actions.SpawnActionContext;
import com.google.devtools.build.lib.actions.UserExecException;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.sandbox.SandboxHelpers;
@@ -183,7 +184,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext {
private final boolean workerVerbose;
public WorkerSpawnStrategy(
- Path execRoot,
+ BlazeDirectories blazeDirs,
WorkerPool workers,
boolean verboseFailures,
int maxRetries,
@@ -191,7 +192,7 @@ public final class WorkerSpawnStrategy implements SandboxedSpawnActionContext {
Multimap<String, String> extraFlags) {
Preconditions.checkNotNull(workers);
this.workers = Preconditions.checkNotNull(workers);
- this.execRoot = execRoot;
+ this.execRoot = blazeDirs.getExecRoot();
this.verboseFailures = verboseFailures;
this.maxRetries = maxRetries;
this.workerVerbose = workerVerbose;