aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2018-02-27 05:47:21 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-27 05:48:54 -0800
commitc2499c406d0727853ea0ddc5372a50be95de5515 (patch)
tree16a06cfd31ae66c6a32155071b8dfc3d8a8b090d
parent4c763e8ff61884952953b7bca8793796f282cdc0 (diff)
Expose --output_user_base to the Bazel server process
...so that it can use that path to compute other directories in the output user base, in particular the default location for caches. The first cache we will add is the hash-index cache for downloads of external archives, but a spawn cache might be added later in the output user base as well. Change-Id: I24b1c33235c8f76ec008ecb1789163de2b2a45be PiperOrigin-RevId: 187164275
-rwxr-xr-xscripts/bootstrap/compile.sh1
-rw-r--r--src/main/cpp/blaze.cc2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/BlazeOptionHandlerTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java4
36 files changed, 101 insertions, 53 deletions
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index 3fbd6333a8..665165c705 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -333,6 +333,7 @@ function run_bazel_jar() {
--batch \
--install_base=${ARCHIVE_DIR} \
--output_base=${OUTPUT_DIR}/out \
+ --output_user_root=${OUTPUT_DIR}/user_root \
--install_md5= \
--workspace_directory="$(get_cwd)" \
--nofatal_event_bus_exceptions \
diff --git a/src/main/cpp/blaze.cc b/src/main/cpp/blaze.cc
index 7035472d94..0b6ec47b9e 100644
--- a/src/main/cpp/blaze.cc
+++ b/src/main/cpp/blaze.cc
@@ -494,6 +494,8 @@ static vector<string> GetArgumentArray(
result.push_back("--connect_timeout_secs=" +
ToString(globals->options->connect_timeout_secs));
+ result.push_back("--output_user_root=" +
+ blaze::ConvertPath(globals->options->output_user_root));
result.push_back("--install_base=" +
blaze::ConvertPath(globals->options->install_base));
result.push_back("--install_md5=" + globals->install_md5);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index 0e34cf3067..9b25f7a997 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -26,17 +26,16 @@ import java.util.Objects;
import javax.annotation.Nullable;
/**
- * Represents the server install directory, which contains the Bazel installation and embedded
- * binaries.
- *
- * <p>The <code>installBase</code> is the directory where the Blaze binary has been installed. The
- * <code>outputBase</code> is the directory below which Blaze puts all its state.
+ * Represents the relevant directories for the server: the location of the embedded binaries
+ * and the output directories.
*/
@AutoCodec
@Immutable
public final class ServerDirectories {
public static final ObjectCodec<ServerDirectories> CODEC = new ServerDirectories_AutoCodec();
+ /** Top-level user output directory; used, e.g., as default location for caches. */
+ private final Path outputUserRoot;
/** Where Blaze gets unpacked. */
private final Path installBase;
/** The content hash of everything in installBase. */
@@ -44,22 +43,25 @@ public final class ServerDirectories {
/** The root of the temp and output trees. */
private final Path outputBase;
- public ServerDirectories(Path installBase, Path outputBase, @Nullable String installMD5) {
+ public ServerDirectories(
+ Path installBase, Path outputBase, Path outputUserRoot, @Nullable String installMD5) {
this(
installBase,
outputBase,
+ outputUserRoot,
Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5)));
}
@AutoCodec.Instantiator
- ServerDirectories(Path installBase, Path outputBase, HashCode installMD5) {
+ ServerDirectories(Path installBase, Path outputBase, Path outputUserRoot, HashCode installMD5) {
+ this.outputUserRoot = outputUserRoot;
this.installBase = installBase;
this.outputBase = outputBase;
this.installMD5 = installMD5;
}
- public ServerDirectories(Path installBase, Path outputBase) {
- this(installBase, outputBase, (HashCode) null);
+ public ServerDirectories(Path installBase, Path outputBase, Path outputUserRoot) {
+ this(installBase, outputBase, outputUserRoot, (HashCode) null);
}
private static HashCode checkMD5(HashCode hash) {
@@ -81,6 +83,13 @@ public final class ServerDirectories {
return outputBase;
}
+ /**
+ * Returns the root directory for user output. In particular default caches will be located here.
+ */
+ public Path getOutputUserRoot() {
+ return outputUserRoot;
+ }
+
/** Returns the installed embedded binaries directory, under the shared installBase location. */
public Path getEmbeddedBinariesRoot() {
return installBase.getChild("_embedded_binaries");
@@ -96,7 +105,7 @@ public final class ServerDirectories {
@Override
public int hashCode() {
- return Objects.hash(installBase, installMD5, outputBase);
+ return Objects.hash(installBase, installMD5, outputBase, outputUserRoot);
}
@Override
@@ -110,6 +119,7 @@ public final class ServerDirectories {
ServerDirectories that = (ServerDirectories) obj;
return this.installBase.equals(that.installBase)
&& Objects.equals(this.installMD5, that.installMD5)
- && this.outputBase.equals(that.outputBase);
+ && this.outputBase.equals(that.outputBase)
+ && this.outputUserRoot.equals(that.outputUserRoot);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index a27b9b6078..df1692fdd5 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -977,17 +977,22 @@ public final class BlazeRuntime {
String productName = startupOptions.productName.toLowerCase(Locale.US);
PathFragment workspaceDirectory = startupOptions.workspaceDirectory;
+ PathFragment outputUserRoot = startupOptions.outputUserRoot;
PathFragment installBase = startupOptions.installBase;
PathFragment outputBase = startupOptions.outputBase;
maybeForceJNIByGettingPid(installBase); // Must be before first use of JNI.
- // From the point of view of the Java program --install_base and --output_base
- // are mandatory options, despite the comment in their declarations.
+ // From the point of view of the Java program --install_base, --output_base, and
+ // --output_user_root are mandatory options, despite the comment in their declarations.
if (installBase == null || !installBase.isAbsolute()) { // (includes "" default case)
throw new IllegalArgumentException(
"Bad --install_base option specified: '" + installBase + "'");
}
+ if (outputUserRoot != null && !outputUserRoot.isAbsolute()) { // (includes "" default case)
+ throw new IllegalArgumentException(
+ "Bad --output_user_root option specified: '" + outputUserRoot + "'");
+ }
if (outputBase != null && !outputBase.isAbsolute()) { // (includes "" default case)
throw new IllegalArgumentException(
"Bad --output_base option specified: '" + outputBase + "'");
@@ -1009,6 +1014,7 @@ public final class BlazeRuntime {
Path.setFileSystemForSerialization(fs);
SubprocessBuilder.setSubprocessFactory(subprocessFactoryImplementation());
+ Path outputUserRootPath = fs.getPath(outputUserRoot);
Path installBasePath = fs.getPath(installBase);
Path outputBasePath = fs.getPath(outputBase);
Path workspaceDirectoryPath = null;
@@ -1017,7 +1023,8 @@ public final class BlazeRuntime {
}
ServerDirectories serverDirectories =
- new ServerDirectories(installBasePath, outputBasePath, startupOptions.installMD5);
+ new ServerDirectories(
+ installBasePath, outputBasePath, outputUserRootPath, startupOptions.installMD5);
Clock clock = BlazeClock.instance();
BlazeRuntime.Builder runtimeBuilder =
new BlazeRuntime.Builder()
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
index 8cccbacbfe..e8eafbc667 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptions.java
@@ -128,10 +128,6 @@ public class BlazeServerStartupOptions extends OptionsBase {
)
public PathFragment outputBase;
- /* Note: This option is only used by the C++ client, never by the Java server.
- * It is included here to make sure that the option is documented in the help
- * output, which is auto-generated by Java code.
- */
@Option(
name = "output_user_root",
defaultValue = "null", // NOTE: purely decorative! See class docstring.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 850687dcc1..5613c87ab1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -143,7 +143,8 @@ public abstract class AbstractPackageLoader implements PackageLoader {
// TODO(nharmata): Refactor WorkspaceFileFunction to make this a non-issue.
Path devNull = workspaceDir.getFileSystem().getPath("/dev/null");
directories =
- new BlazeDirectories(new ServerDirectories(devNull, devNull), workspaceDir, "blaze");
+ new BlazeDirectories(
+ new ServerDirectories(devNull, devNull, devNull), workspaceDir, "blaze");
}
public Builder setRuleClassProvider(RuleClassProvider ruleClassProvider) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
index 06ffcd07ae..930a2a5730 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
@@ -33,20 +33,24 @@ public class BlazeDirectoriesTest extends FoundationTestCase {
FileSystem fs = scratch.getFileSystem();
Path installBase = fs.getPath("/my/install");
Path outputBase = fs.getPath("/my/output");
+ Path userRoot = fs.getPath("/home/user/root");
Path workspace = fs.getPath("/my/ws");
BlazeDirectories directories =
- new BlazeDirectories(new ServerDirectories(installBase, outputBase), workspace, "foo");
+ new BlazeDirectories(
+ new ServerDirectories(installBase, outputBase, userRoot), workspace, "foo");
assertThat(outputBase.getRelative("execroot/ws")).isEqualTo(directories.getExecRoot());
workspace = null;
directories =
- new BlazeDirectories(new ServerDirectories(installBase, outputBase), workspace, "foo");
+ new BlazeDirectories(
+ new ServerDirectories(installBase, outputBase, userRoot), workspace, "foo");
assertThat(outputBase.getRelative("execroot/" + BlazeDirectories.DEFAULT_EXEC_ROOT))
.isEqualTo(directories.getExecRoot());
workspace = fs.getPath("/");
directories =
- new BlazeDirectories(new ServerDirectories(installBase, outputBase), workspace, "foo");
+ new BlazeDirectories(
+ new ServerDirectories(installBase, outputBase, userRoot), workspace, "foo");
assertThat(outputBase.getRelative("execroot/" + BlazeDirectories.DEFAULT_EXEC_ROOT))
.isEqualTo(directories.getExecRoot());
}
@@ -58,20 +62,23 @@ public class BlazeDirectoriesTest extends FoundationTestCase {
new BlazeDirectories(
new ServerDirectories(
FsUtils.TEST_FILESYSTEM.getPath("/install_base"),
- FsUtils.TEST_FILESYSTEM.getPath("/output_base")),
+ FsUtils.TEST_FILESYSTEM.getPath("/output_base"),
+ FsUtils.TEST_FILESYSTEM.getPath("/user_root")),
FsUtils.TEST_FILESYSTEM.getPath("/workspace"),
"Blaze"),
new BlazeDirectories(
new ServerDirectories(
FsUtils.TEST_FILESYSTEM.getPath("/install_base"),
FsUtils.TEST_FILESYSTEM.getPath("/output_base"),
+ FsUtils.TEST_FILESYSTEM.getPath("/user_root"),
"1234abcd1234abcd1234abcd1234abcd"),
FsUtils.TEST_FILESYSTEM.getPath("/workspace"),
"Blaze"),
new BlazeDirectories(
new ServerDirectories(
FsUtils.TEST_FILESYSTEM.getPath("/install_base"),
- FsUtils.TEST_FILESYSTEM.getPath("/output_base")),
+ FsUtils.TEST_FILESYSTEM.getPath("/output_base"),
+ FsUtils.TEST_FILESYSTEM.getPath("/user_root")),
FsUtils.TEST_FILESYSTEM.getPath("/workspace"),
"Bazel"))
.addDependency(FileSystem.class, FsUtils.TEST_FILESYSTEM)
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
index c38437b99a..470909c5b5 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
@@ -71,7 +71,10 @@ public class TemplateExpansionActionTest extends FoundationTestCase {
substitutions.add(Substitution.of("%value%", "bar"));
directories =
new BlazeDirectories(
- new ServerDirectories(scratch.resolve("/install"), scratch.resolve("/base")),
+ new ServerDirectories(
+ scratch.resolve("/install"),
+ scratch.resolve("/base"),
+ scratch.resolve("/userRoot")),
scratch.resolve("/workspace"),
"mock-product-name");
binTools = BinTools.empty(directories);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 279675f12c..6e1c0634a7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -154,7 +154,7 @@ public abstract class AnalysisTestCase extends FoundationTestCase {
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY);
directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
workspaceStatusActionFactory =
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index b749ec40f2..e3f69f50d6 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -208,7 +208,7 @@ public abstract class BuildViewTestCase extends FoundationTestCase {
analysisMock = getAnalysisMock();
directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
actionKeyContext = new ActionKeyContext();
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index b7dd9ba6e4..ab725a9223 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -106,7 +106,7 @@ public abstract class ConfigurationTestCase extends FoundationTestCase {
final PackageFactory pkgFactory;
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
pkgFactory =
diff --git a/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
index f520cc484f..ec724b2c0c 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
@@ -50,7 +50,10 @@ public class BlazeExecutorTest {
fileSystem = new InMemoryFileSystem();
directories =
new BlazeDirectories(
- new ServerDirectories(fileSystem.getPath("/install"), fileSystem.getPath("/base")),
+ new ServerDirectories(
+ fileSystem.getPath("/install"),
+ fileSystem.getPath("/base"),
+ fileSystem.getPath("/root")),
fileSystem.getPath("/workspace"),
"mock-product-name");
binTools = BinTools.empty(directories);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index eb35dd61bc..90578ed361 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -92,7 +92,7 @@ public abstract class PackageLoadingTestCase extends FoundationTestCase {
}
directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
loadingMock.getProductName());
packageFactory =
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
index aaf0c5f9b3..1f3354e8ce 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
@@ -75,7 +75,7 @@ public class BuildFileModificationTest extends FoundationTestCase {
ruleClassProvider = analysisMock.createRuleClassProvider();
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
skyframeExecutor =
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index d4373b4f5e..569230190c 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -466,7 +466,8 @@ public class IncrementalLoadingTest {
LoadingMock loadingMock = LoadingMock.get();
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(fs.getPath("/install"), fs.getPath("/output")),
+ new ServerDirectories(
+ fs.getPath("/install"), fs.getPath("/output"), fs.getPath("/userRoot")),
workspace,
loadingMock.getProductName());
skyframeExecutor =
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index 6814b89f4a..cf7c61bba0 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -661,7 +661,8 @@ public class LoadingPhaseRunnerTest {
analysisMock.setupMockClient(mockToolsConfig);
directories =
new BlazeDirectories(
- new ServerDirectories(fs.getPath("/install"), fs.getPath("/output")),
+ new ServerDirectories(
+ fs.getPath("/install"), fs.getPath("/output"), fs.getPath("/userRoot")),
workspace,
analysisMock.getProductName());
FileSystemUtils.deleteTree(workspace.getRelative("base"));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index 9134e4df79..b934efe85e 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -81,7 +81,7 @@ public class PackageCacheTest extends FoundationTestCase {
ruleClassProvider = analysisMock.createRuleClassProvider();
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
PackageFactory.BuilderForTesting packageFactoryBuilder =
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
index 02df4c6621..44808dee10 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
@@ -93,7 +93,7 @@ public class ExternalPackageUtilTest extends BuildViewTestCase {
new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, rootDirectory),
rootDirectory,
analysisMock.getProductName());
ExternalFilesHelper externalFilesHelper =
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index 0547078341..f3ab343655 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -75,7 +75,8 @@ public class RepositoryDelegatorTest extends FoundationTestCase {
public void setupDelegator() throws Exception {
Path root = scratch.dir("/outputbase");
BlazeDirectories directories =
- new BlazeDirectories(new ServerDirectories(root, root), root, TestConstants.PRODUCT_NAME);
+ new BlazeDirectories(
+ new ServerDirectories(root, root, root), root, TestConstants.PRODUCT_NAME);
delegatorFunction =
new RepositoryDelegatorFunction(
ImmutableMap.of(), null, new AtomicBoolean(true), ImmutableMap::of, directories);
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
index 0d9e7ba8fd..32a0879040 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
@@ -132,7 +132,10 @@ public class BlazeCommandDispatcherRcoptionsTest {
public final void initializeRuntime() throws Exception {
String productName = TestConstants.PRODUCT_NAME;
ServerDirectories serverDirectories =
- new ServerDirectories(scratch.dir("install_base"), scratch.dir("output_base"));
+ new ServerDirectories(
+ scratch.dir("install_base"),
+ scratch.dir("output_base"),
+ scratch.dir("user_output_root"));
this.runtime =
new BlazeRuntime.Builder()
.setFileSystem(scratch.getFileSystem())
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeOptionHandlerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeOptionHandlerTest.java
index ab601c2f05..2efebed15d 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeOptionHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeOptionHandlerTest.java
@@ -64,7 +64,8 @@ public class BlazeOptionHandlerTest {
parser.setAllowResidue(true);
String productName = TestConstants.PRODUCT_NAME;
ServerDirectories serverDirectories =
- new ServerDirectories(scratch.dir("install_base"), scratch.dir("output_base"));
+ new ServerDirectories(
+ scratch.dir("install_base"), scratch.dir("output_base"), scratch.dir("user_root"));
this.runtime =
new BlazeRuntime.Builder()
.setFileSystem(scratch.getFileSystem())
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
index 023ce8475a..3c0af6c31c 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
@@ -627,7 +627,9 @@ public class BuildEventStreamerTest extends FoundationTestCase {
BuildConfiguration configuration =
new BuildConfiguration(
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase), rootDirectory, "productName"),
+ new ServerDirectories(outputBase, outputBase, outputBase),
+ rootDirectory,
+ "productName"),
ImmutableMap
.<Class<? extends BuildConfiguration.Fragment>, BuildConfiguration.Fragment>of(),
BuildOptions.of(
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java b/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
index adf8a56775..de38e15cec 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
@@ -348,7 +348,8 @@ public final class CommandInterruptionTest {
isTestShuttingDown = new AtomicBoolean(false);
String productName = TestConstants.PRODUCT_NAME;
ServerDirectories serverDirectories =
- new ServerDirectories(scratch.dir("install"), scratch.dir("output"));
+ new ServerDirectories(
+ scratch.dir("install"), scratch.dir("output"), scratch.dir("user_root"));
BlazeRuntime runtime =
new BlazeRuntime.Builder()
.setFileSystem(scratch.getFileSystem())
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java b/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
index 7c0006caaa..4a45e7d10f 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
@@ -79,7 +79,8 @@ public class CleanCommandRecommendsAsyncTest {
String productName = TestConstants.PRODUCT_NAME;
Scratch scratch = new Scratch();
ServerDirectories serverDirectories =
- new ServerDirectories(scratch.dir("install"), scratch.dir("output"));
+ new ServerDirectories(
+ scratch.dir("install"), scratch.dir("output"), scratch.dir("user_root"));
BlazeRuntime runtime =
new BlazeRuntime.Builder()
.setFileSystem(scratch.getFileSystem())
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index 036becfdf0..3b83fa89cf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -77,7 +77,8 @@ abstract class ArtifactFunctionTestCase {
ImmutableList.of(Root.fromPath(root)),
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY));
BlazeDirectories directories =
- new BlazeDirectories(new ServerDirectories(root, root), root, TestConstants.PRODUCT_NAME);
+ new BlazeDirectories(
+ new ServerDirectories(root, root, root), root, TestConstants.PRODUCT_NAME);
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
pkgLocator,
ExternalFileAction.DEPEND_ON_EXTERNAL_PKG_FOR_EXTERNAL_REPO_PATHS,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index b6933600d0..7563137a58 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -83,7 +83,7 @@ public class ContainingPackageLookupFunctionTest extends FoundationTestCase {
deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, outputBase),
rootDirectory,
analysisMock.getProductName());
ExternalFilesHelper externalFilesHelper =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index c78eab0e2c..6a8543fd55 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -129,7 +129,7 @@ public class FileFunctionTest {
AtomicReference<PathPackageLocator> pkgLocatorRef = new AtomicReference<>(pkgLocator);
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(pkgRoot.asPath(), outputBase),
+ new ServerDirectories(pkgRoot.asPath(), outputBase, outputBase),
pkgRoot.asPath(),
TestConstants.PRODUCT_NAME);
ExternalFilesHelper externalFilesHelper =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 6fb3cd8f7a..bd1a1a0ba2 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -94,7 +94,7 @@ public final class FilesetEntryFunctionTest extends FoundationTestCase {
pkgLocator,
ExternalFileAction.DEPEND_ON_EXTERNAL_PKG_FOR_EXTERNAL_REPO_PATHS,
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase),
+ new ServerDirectories(outputBase, outputBase, outputBase),
rootDirectory,
TestConstants.PRODUCT_NAME));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index af372aea05..27a8fd02bf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -109,7 +109,7 @@ public class FilesystemValueCheckerTest {
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY));
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(pkgRoot, pkgRoot), pkgRoot, TestConstants.PRODUCT_NAME);
+ new ServerDirectories(pkgRoot, pkgRoot, pkgRoot), pkgRoot, TestConstants.PRODUCT_NAME);
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
pkgLocator, ExternalFileAction.DEPEND_ON_EXTERNAL_PKG_FOR_EXTERNAL_REPO_PATHS, directories);
skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index 546ef61bc2..02d5a0e901 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -132,7 +132,8 @@ public abstract class GlobFunctionTest {
AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
- new BlazeDirectories(new ServerDirectories(root, root), root, TestConstants.PRODUCT_NAME);
+ new BlazeDirectories(
+ new ServerDirectories(root, root, root), root, TestConstants.PRODUCT_NAME);
ExternalFilesHelper externalFilesHelper =
ExternalFilesHelper.createForTesting(
pkgLocator,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
index e2c8bb566d..b6eec17ee3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
@@ -75,7 +75,7 @@ public class LocalRepositoryLookupFunctionTest extends FoundationTestCase {
deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, rootDirectory),
rootDirectory,
analysisMock.getProductName());
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index cccb3ab81d..0613eed6c9 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -100,7 +100,7 @@ public abstract class PackageLookupFunctionTest extends FoundationTestCase {
deletedPackages = new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, rootDirectory),
rootDirectory,
analysisMock.getProductName());
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index fa745c6320..4c56419cc6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -67,7 +67,10 @@ public class PrepareDepsOfPatternsFunctionSmartNegationTest extends FoundationTe
public void setUp() throws Exception {
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(getScratch().dir("/install"), getScratch().dir("/output")),
+ new ServerDirectories(
+ getScratch().dir("/install"),
+ getScratch().dir("/output"),
+ getScratch().dir("/user_root")),
rootDirectory,
AnalysisMock.get().getProductName());
skyframeExecutor =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index ce40ea777f..0da51f8f50 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -101,7 +101,7 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe
new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, rootDirectory),
rootDirectory,
analysisMock.getProductName());
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index d2aca56fe9..6fc7684371 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -169,7 +169,7 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase {
AtomicReference<TimestampGranularityMonitor> tsgmRef = new AtomicReference<>(tsgm);
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(rootDirectory, outputBase),
+ new ServerDirectories(rootDirectory, outputBase, outputBase),
rootDirectory,
TestConstants.PRODUCT_NAME);
ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting(
diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
index d2502f8023..37fd18833c 100644
--- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
@@ -110,7 +110,9 @@ public class StandaloneSpawnStrategyTest {
BlazeDirectories directories =
new BlazeDirectories(
- new ServerDirectories(outputBase, outputBase), workspaceDir, "mock-product-name");
+ new ServerDirectories(outputBase, outputBase, outputBase),
+ workspaceDir,
+ "mock-product-name");
// This call implicitly symlinks the integration bin tools into the exec root.
IntegrationMock.get()
.getIntegrationBinTools(fileSystem, directories, TestConstants.WORKSPACE_NAME);