diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
31 files changed, 146 insertions, 89 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java index 477baa15da..0ace01b68b 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Symlinks; @@ -369,23 +370,22 @@ public abstract class AbstractAction implements Action, SkylarkValue { } /** - * Deletes all of the action's output files, if they exist. If any of the - * Artifacts refers to a directory recursively removes the contents of the - * directory. + * Deletes all of the action's output files, if they exist. If any of the Artifacts refers to a + * directory recursively removes the contents of the directory. * * @param execRoot the exec root in which this action is executed */ - protected void deleteOutputs(Path execRoot) throws IOException { + protected void deleteOutputs(FileSystem fileSystem, Path execRoot) throws IOException { for (Artifact output : getOutputs()) { - deleteOutput(output); + deleteOutput(fileSystem, output); } } /** - * Helper method to remove an Artifact. If the Artifact refers to a directory - * recursively removes the contents of the directory. + * Helper method to remove an Artifact. If the Artifact refers to a directory recursively removes + * the contents of the directory. */ - protected void deleteOutput(Artifact output) throws IOException { + protected void deleteOutput(FileSystem fileSystem, Artifact output) throws IOException { Path path = output.getPath(); try { // Optimize for the common case: output artifacts are files. @@ -405,7 +405,7 @@ public abstract class AbstractAction implements Action, SkylarkValue { if (!parentDir.isWritable() && parentDir.getPathString().startsWith(outputRootDir)) { // Retry deleting after making the parent writable. parentDir.setWritable(true); - deleteOutput(output); + deleteOutput(fileSystem, output); } else if (path.isDirectory(Symlinks.NOFOLLOW)) { FileSystemUtils.deleteTree(path); } else { @@ -465,8 +465,8 @@ public abstract class AbstractAction implements Action, SkylarkValue { } @Override - public void prepare(Path execRoot) throws IOException { - deleteOutputs(execRoot); + public void prepare(FileSystem fileSystem, Path execRoot) throws IOException { + deleteOutputs(fileSystem, execRoot); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java index e87d79edcf..524c20aa94 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Action.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.actions; import com.google.devtools.build.lib.actions.extra.ExtraActionInfo; import com.google.devtools.build.lib.concurrent.ThreadSafety.ConditionallyThreadCompatible; import com.google.devtools.build.lib.profiler.Describable; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.skyframe.SkyFunction; import java.io.IOException; @@ -77,16 +78,14 @@ import javax.annotation.Nullable; public interface Action extends ActionExecutionMetadata, Describable { /** - * Prepares for executing this action; called by the Builder prior to - * executing the Action itself. This method should prepare the file system, so - * that the execution of the Action can write the output files. At a minimum - * any pre-existing and write protected output files should be removed or the - * permissions should be changed, so that they can be safely overwritten by - * the action. + * Prepares for executing this action; called by the Builder prior to executing the Action itself. + * This method should prepare the file system, so that the execution of the Action can write the + * output files. At a minimum any pre-existing and write protected output files should be removed + * or the permissions should be changed, so that they can be safely overwritten by the action. * * @throws IOException if there is an error deleting the outputs. */ - void prepare(Path execRoot) throws IOException; + void prepare(FileSystem fileSystem, Path execRoot) throws IOException; /** * Executes this action; called by the Builder when all of this Action's inputs have been diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java index d48da8f6dc..9898b658a7 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.EventKind; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.util.io.FileOutErr; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunction.Environment; @@ -118,6 +119,10 @@ public class ActionExecutionContext implements Closeable { return metadataHandler; } + public FileSystem getFileSystem() { + return executor.getFileSystem(); + } + public Path getExecRoot() { return executor.getExecRoot(); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/Executor.java b/src/main/java/com/google/devtools/build/lib/actions/Executor.java index 673c7bedae..292e78fcf5 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Executor.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Executor.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.actions; import com.google.common.eventbus.EventBus; import com.google.devtools.build.lib.clock.Clock; import com.google.devtools.build.lib.events.EventHandler; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.common.options.OptionsClassProvider; @@ -36,6 +37,10 @@ import com.google.devtools.common.options.OptionsClassProvider; * they both provide services to actions being executed and are passed to almost the same places. */ public interface Executor { + + /** Returns the file system of blaze. */ + FileSystem getFileSystem(); + /** * Returns the execution root. This is the directory underneath which Blaze builds its entire * output working tree, including the source symlink forest. All build actions are executed diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java index 60071469f5..ac4a005e0a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.skyframe.serialization.PathCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs; import com.google.devtools.build.lib.util.StringCanonicalizer; -import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedOutputStream; @@ -90,14 +89,6 @@ public final class BlazeDirectories { this.localOutputPath = outputBase.getRelative(relativeOutputPath); } - /** - * Returns the Filesystem that all of our directories belong to. Handy for - * resolving absolute paths. - */ - public FileSystem getFileSystem() { - return serverDirectories.getFileSystem(); - } - public ServerDirectories getServerDirectories() { return serverDirectories; } 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 48a05c9a9a..27cf1dddc8 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 @@ -21,7 +21,6 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.PathCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.util.Preconditions; -import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedOutputStream; @@ -69,14 +68,6 @@ public final class ServerDirectories { } /** - * Returns the Filesystem that all of our directories belong to. Handy for - * resolving absolute paths. - */ - public FileSystem getFileSystem() { - return installBase.getFileSystem(); - } - - /** * Returns the installation base directory. Currently used by info command only. */ public Path getInstallBase() { diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java index a3525e5501..e7eb515698 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java @@ -40,6 +40,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.LoggingUtil; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -349,13 +350,13 @@ public class TestRunnerAction extends AbstractAction implements NotifyOnActionCa /** * Deletes <b>all</b> possible test outputs. * - * TestRunnerAction potentially can create many more non-declared outputs - xml output, - * coverage data file and logs for failed attempts. All those outputs are uniquely - * identified by the test log base name with arbitrary prefix and extension. + * <p>TestRunnerAction potentially can create many more non-declared outputs - xml output, + * coverage data file and logs for failed attempts. All those outputs are uniquely identified by + * the test log base name with arbitrary prefix and extension. */ @Override - protected void deleteOutputs(Path execRoot) throws IOException { - super.deleteOutputs(execRoot); + protected void deleteOutputs(FileSystem fileSystem, Path execRoot) throws IOException { + super.deleteOutputs(fileSystem, execRoot); // We do not rely on globs, as it causes quadratic behavior in --runs_per_test and test // shard count. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index e84cd647e4..0ff341fa27 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -170,7 +170,7 @@ public class BazelRepositoryModule extends BlazeModule { clientEnvironmentSupplier, directories)); builder.addSkyFunction(MavenServerFunction.NAME, new MavenServerFunction(directories)); - filesystem = directories.getFileSystem(); + filesystem = runtime.getFileSystem(); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java index 3bdb6d48ed..e1df684cfc 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java @@ -51,6 +51,7 @@ import com.google.devtools.build.lib.shell.CommandResult; import com.google.devtools.build.lib.util.CommandBuilder; import com.google.devtools.build.lib.util.NetUtil; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -170,11 +171,11 @@ public class BazelWorkspaceStatusModule extends BlazeModule { } @Override - public void prepare(Path execRoot) throws IOException { + public void prepare(FileSystem fileSystem, Path execRoot) throws IOException { // The default implementation of this method deletes all output files; override it to keep // the old stableStatus around. This way we can reuse the existing file (preserving its mtime) // if the contents haven't changed. - deleteOutput(volatileStatus); + deleteOutput(fileSystem, volatileStatus); } @Override 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 241084782e..e07656c919 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 @@ -229,7 +229,7 @@ public class ExecutionTool { // client. cache = new SingleBuildFileCache( - env.getExecRoot().getPathString(), env.getDirectories().getFileSystem()); + env.getExecRoot().getPathString(), env.getRuntime().getFileSystem()); } this.fileCache = cache; this.prefetcher = builder.getActionInputPrefetcher(); @@ -302,6 +302,7 @@ public class ExecutionTool { private BlazeExecutor createExecutor() throws ExecutorInitException { return new BlazeExecutor( + runtime.getFileSystem(), env.getExecRoot(), getReporter(), env.getEventBus(), diff --git a/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java b/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java index 134bd7660c..8b43388150 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.ProfilerTask; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.common.options.OptionsClassProvider; import java.util.HashMap; @@ -54,6 +55,7 @@ public final class BlazeExecutor implements Executor { private final boolean verboseFailures; private final boolean showSubcommands; + private final FileSystem fileSystem; private final Path execRoot; private final Reporter reporter; private final EventBus eventBus; @@ -77,6 +79,7 @@ public final class BlazeExecutor implements Executor { * shutdown() when you're done with this executor. */ public BlazeExecutor( + FileSystem fileSystem, Path execRoot, Reporter reporter, EventBus eventBus, @@ -89,6 +92,7 @@ public final class BlazeExecutor implements Executor { ExecutionOptions executionOptions = options.getOptions(ExecutionOptions.class); this.verboseFailures = executionOptions.verboseFailures; this.showSubcommands = executionOptions.showSubcommands; + this.fileSystem = fileSystem; this.execRoot = execRoot; this.reporter = reporter; this.eventBus = eventBus; @@ -141,6 +145,11 @@ public final class BlazeExecutor implements Executor { } @Override + public FileSystem getFileSystem() { + return fileSystem; + } + + @Override public Path getExecRoot() { return execRoot; } diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java index 4a503e44ba..72f1fe1413 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.runtime.BlazeModule; import com.google.devtools.build.lib.runtime.BlazeRuntime; import com.google.devtools.build.lib.runtime.WorkspaceBuilder; import com.google.devtools.build.lib.syntax.Callstack; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.common.options.OptionsProvider; import java.util.UUID; @@ -57,6 +58,7 @@ public class AllocationTrackerModule extends BlazeModule { OptionsProvider startupOptions, BlazeVersionInfo versionInfo, UUID instanceId, + FileSystem fileSystem, ServerDirectories directories, Clock clock) { String memoryTrackerPropery = System.getProperty("RULE_MEMORY_TRACKER"); diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD b/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD index e4d909f0bc..01f77455e2 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD +++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD @@ -19,6 +19,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:runtime", "//src/main/java/com/google/devtools/build/lib:syntax", "//src/main/java/com/google/devtools/build/lib:util", + "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party/allocation_instrumenter", diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 3d93900fa6..947db2268f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -420,8 +420,8 @@ public class CppCompileAction extends AbstractAction /** * Returns the list of additional inputs found by dependency discovery, during action preparation, - * and clears the stored list. {@link #prepare} must be called before this method is called, on - * each action execution. + * and clears the stored list. {@link Action#prepare} must be called before this method is called, + * on each action execution. */ public Iterable<Artifact> getAdditionalInputs() { Iterable<Artifact> result = Preconditions.checkNotNull(additionalInputs); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java index c0da518642..4ef967709c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.util.Fingerprint; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Symlinks; @@ -54,11 +55,11 @@ public final class CreateIncSymlinkAction extends AbstractAction { } @Override - public void prepare(Path execRoot) throws IOException { + public void prepare(FileSystem fileSystem, Path execRoot) throws IOException { if (includePath.isDirectory(Symlinks.NOFOLLOW)) { FileSystemUtils.deleteTree(includePath); } - super.prepare(execRoot); + super.prepare(fileSystem, execRoot); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java index 26b0276488..2c014f917b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; /** @@ -59,7 +60,7 @@ public final class FdoStubAction extends AbstractAction { } @Override - public void prepare(Path execRoot) { + public void prepare(FileSystem fileSystem, Path execRoot) { // The superclass would delete the output files here. We can't let that happen, since this // action does not in fact create those files; it is only a placeholder and the actual files // are created *before* the execution phase in FdoSupport.extractFdoZip() diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java index 01aeaf1757..683a5243f4 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java @@ -85,21 +85,25 @@ public abstract class BlazeModule { } /** - * Called when Bazel starts up after {@link #getStartupOptions}, {@link #globalInit}, and - * {@link #getFileSystem}. + * Called when Bazel starts up after {@link #getStartupOptions}, {@link #globalInit}, and {@link + * #getFileSystem}. * * @param startupOptions the server's startup options * @param versionInfo the Bazel version currently running * @param instanceId the id of the current Bazel server + * @param fileSystem * @param directories the install directory * @param clock the clock - * * @throws AbruptExitException to shut down the server immediately */ - public void blazeStartup(OptionsProvider startupOptions, - BlazeVersionInfo versionInfo, UUID instanceId, ServerDirectories directories, - Clock clock) throws AbruptExitException { - } + public void blazeStartup( + OptionsProvider startupOptions, + BlazeVersionInfo versionInfo, + UUID instanceId, + FileSystem fileSystem, + ServerDirectories directories, + Clock clock) + throws AbruptExitException {} /** * Called to initialize a new server ({@link BlazeRuntime}). Modules can override this method to 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 29b9e45650..8eb5ffbb47 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 @@ -122,6 +122,7 @@ public final class BlazeRuntime { private static final Logger logger = Logger.getLogger(BlazeRuntime.class.getName()); + private final FileSystem fileSystem; private final Iterable<BlazeModule> blazeModules; private final Map<String, BlazeCommand> commandMap = new LinkedHashMap<>(); private final Clock clock; @@ -153,6 +154,7 @@ public final class BlazeRuntime { private BlazeWorkspace workspace; private BlazeRuntime( + FileSystem fileSystem, QueryEnvironmentFactory queryEnvironmentFactory, ImmutableList<QueryFunction> queryFunctions, ImmutableList<OutputFormatter> queryOutputFormatters, @@ -171,6 +173,7 @@ public final class BlazeRuntime { String productName, PathConverter pathToUriConverter) { // Server state + this.fileSystem = fileSystem; this.blazeModules = blazeModules; overrideCommands(commands); @@ -283,6 +286,10 @@ public final class BlazeRuntime { return false; } + public FileSystem getFileSystem() { + return fileSystem; + } + public BlazeWorkspace getWorkspace() { return workspace; } @@ -959,18 +966,21 @@ public final class BlazeRuntime { ServerDirectories serverDirectories = new ServerDirectories(installBasePath, outputBasePath, startupOptions.installMD5); Clock clock = BlazeClock.instance(); - BlazeRuntime.Builder runtimeBuilder = new BlazeRuntime.Builder() - .setProductName(productName) - .setServerDirectories(serverDirectories) - .setStartupOptionsProvider(options) - .setClock(clock) - .setAbruptShutdownHandler(abruptShutdownHandler) - // TODO(bazel-team): Make BugReportingExceptionHandler the default. - // See bug "Make exceptions in EventBus subscribers fatal" - .setEventBusExceptionHandler( - startupOptions.fatalEventBusExceptions || !BlazeVersionInfo.instance().isReleasedBlaze() - ? new BlazeRuntime.BugReportingExceptionHandler() - : new BlazeRuntime.RemoteExceptionHandler()); + BlazeRuntime.Builder runtimeBuilder = + new BlazeRuntime.Builder() + .setProductName(productName) + .setFileSystem(fs) + .setServerDirectories(serverDirectories) + .setStartupOptionsProvider(options) + .setClock(clock) + .setAbruptShutdownHandler(abruptShutdownHandler) + // TODO(bazel-team): Make BugReportingExceptionHandler the default. + // See bug "Make exceptions in EventBus subscribers fatal" + .setEventBusExceptionHandler( + startupOptions.fatalEventBusExceptions + || !BlazeVersionInfo.instance().isReleasedBlaze() + ? new BlazeRuntime.BugReportingExceptionHandler() + : new BlazeRuntime.RemoteExceptionHandler()); if (System.getenv("TEST_TMPDIR") != null && System.getenv("NO_CRASH_ON_LOGGING_IN_TEST") == null) { @@ -1103,6 +1113,7 @@ public final class BlazeRuntime { * an exception. Please plan appropriately. */ public static class Builder { + private FileSystem fileSystem; private ServerDirectories serverDirectories; private Clock clock; private Runnable abruptShutdownHandler; @@ -1122,8 +1133,13 @@ public final class BlazeRuntime { Preconditions.checkNotNull(clock); for (BlazeModule module : blazeModules) { - module.blazeStartup(startupOptionsProvider, - BlazeVersionInfo.instance(), instanceId, serverDirectories, clock); + module.blazeStartup( + startupOptionsProvider, + BlazeVersionInfo.instance(), + instanceId, + fileSystem, + serverDirectories, + clock); } ServerBuilder serverBuilder = new ServerBuilder(); serverBuilder.addQueryOutputFormatters(OutputFormatter.getDefaultFormatters()); @@ -1142,7 +1158,7 @@ public final class BlazeRuntime { Package.Builder.Helper packageBuilderHelper = null; for (BlazeModule module : blazeModules) { Package.Builder.Helper candidateHelper = - module.getPackageBuilderHelper(ruleClassProvider, serverDirectories.getFileSystem()); + module.getPackageBuilderHelper(ruleClassProvider, fileSystem); if (candidateHelper != null) { Preconditions.checkState(packageBuilderHelper == null, "more than one module defines a package builder helper"); @@ -1173,6 +1189,7 @@ public final class BlazeRuntime { } return new BlazeRuntime( + fileSystem, serverBuilder.getQueryEnvironmentFactory(), serverBuilder.getQueryFunctions(), serverBuilder.getQueryOutputFormatters(), @@ -1197,6 +1214,11 @@ public final class BlazeRuntime { return this; } + public Builder setFileSystem(FileSystem fileSystem) { + this.fileSystem = fileSystem; + return this; + } + public Builder setServerDirectories(ServerDirectories serverDirectories) { this.serverDirectories = serverDirectories; return this; 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 6329ee1a05..a36f3afaba 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 @@ -612,7 +612,7 @@ public final class CommandEnvironment { if (inWorkspace()) { workingDirectory = workspace.getRelative(commonOptions.clientCwd); } else { - workspace = FileSystemUtils.getWorkingDirectory(getDirectories().getFileSystem()); + workspace = FileSystemUtils.getWorkingDirectory(getRuntime().getFileSystem()); workingDirectory = workspace; } this.relativeWorkingDirectory = workingDirectory.relativeTo(workspace); diff --git a/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java b/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java index 882f6f03e2..6b9266702b 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/WorkspaceBuilder.java @@ -78,6 +78,7 @@ public final class WorkspaceBuilder { SkyframeExecutor skyframeExecutor = skyframeExecutorFactory.create( packageFactory, + runtime.getFileSystem(), directories, workspaceStatusActionFactory, ruleClassProvider.getBuildInfoFactories(), 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 cbfdb5e277..0badadd258 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 @@ -498,7 +498,7 @@ public abstract class InfoItem { return print("unknown"); } // Tunnel through a Path object in order to normalize the representation of the path. - Path javaHomePath = env.getDirectories().getFileSystem().getPath(javaHome); + Path javaHomePath = env.getRuntime().getFileSystem().getPath(javaHome); return print(javaHomePath.getPathString()); } } diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java index b538fed1c6..5fffec536e 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java @@ -60,7 +60,7 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner { this.sandboxOptions = cmdEnv.getOptions().getOptions(SandboxOptions.class); this.verboseFailures = cmdEnv.getOptions().getOptions(ExecutionOptions.class).verboseFailures; this.inaccessiblePaths = - sandboxOptions.getInaccessiblePaths(cmdEnv.getDirectories().getFileSystem()); + sandboxOptions.getInaccessiblePaths(cmdEnv.getRuntime().getFileSystem()); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java index cc3150db9f..7cc54c31a7 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java @@ -105,7 +105,7 @@ final class DarwinSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { this.execRoot = cmdEnv.getExecRoot(); this.allowNetwork = SandboxHelpers.shouldAllowNetwork(cmdEnv.getOptions()); this.productName = productName; - this.alwaysWritableDirs = getAlwaysWritableDirs(cmdEnv.getDirectories().getFileSystem()); + this.alwaysWritableDirs = getAlwaysWritableDirs(cmdEnv.getRuntime().getFileSystem()); this.processWrapper = ProcessWrapperRunner.getProcessWrapper(cmdEnv); this.localEnvProvider = new XCodeLocalEnvProvider(); this.timeoutGraceSeconds = timeoutGraceSeconds; diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java index 4246735919..aee389713a 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java @@ -81,6 +81,7 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { return execPath != null ? cmdEnv.getExecRoot().getRelative(execPath) : null; } + private final FileSystem fileSystem; private final BlazeDirectories blazeDirs; private final Path execRoot; private final boolean allowNetwork; @@ -99,6 +100,7 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { Path inaccessibleHelperDir, int timeoutGraceSeconds) { super(cmdEnv, sandboxBase); + this.fileSystem = cmdEnv.getRuntime().getFileSystem(); this.blazeDirs = cmdEnv.getDirectories(); this.execRoot = cmdEnv.getExecRoot(); this.productName = productName; @@ -242,14 +244,14 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { private ImmutableSet<Path> getTmpfsPaths() { ImmutableSet.Builder<Path> tmpfsPaths = ImmutableSet.builder(); for (String tmpfsPath : getSandboxOptions().sandboxTmpfsPath) { - tmpfsPaths.add(blazeDirs.getFileSystem().getPath(tmpfsPath)); + tmpfsPaths.add(fileSystem.getPath(tmpfsPath)); } return tmpfsPaths.build(); } private SortedMap<Path, Path> getReadOnlyBindMounts( BlazeDirectories blazeDirs, Path sandboxExecRoot) throws UserExecException { - Path tmpPath = blazeDirs.getFileSystem().getPath("/tmp"); + Path tmpPath = fileSystem.getPath("/tmp"); final SortedMap<Path, Path> bindMounts = Maps.newTreeMap(); if (blazeDirs.getWorkspace().startsWith(tmpPath)) { bindMounts.put(blazeDirs.getWorkspace(), blazeDirs.getWorkspace()); @@ -260,7 +262,7 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { for (ImmutableMap.Entry<String, String> additionalMountPath : getSandboxOptions().sandboxAdditionalMounts) { try { - final Path mountTarget = blazeDirs.getFileSystem().getPath(additionalMountPath.getValue()); + final Path mountTarget = fileSystem.getPath(additionalMountPath.getValue()); // If source path is relative, treat it as a relative path inside the execution root final Path mountSource = sandboxExecRoot.getRelative(additionalMountPath.getKey()); // If a target has more than one source path, the latter one will take effect. diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java index 5003b698d9..bdb1269c4b 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java @@ -48,7 +48,7 @@ public final class SandboxModule extends BlazeModule { BlazeDirectories blazeDirs = cmdEnv.getDirectories(); String productName = cmdEnv.getRuntime().getProductName(); SandboxOptions sandboxOptions = request.getOptions(SandboxOptions.class); - FileSystem fs = blazeDirs.getFileSystem(); + FileSystem fs = cmdEnv.getRuntime().getFileSystem(); if (sandboxOptions.sandboxBase.isEmpty()) { sandboxBase = blazeDirs.getOutputBase().getRelative(productName + "-sandbox"); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java index fdddbd9192..364f9957b3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java @@ -58,6 +58,7 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.util.ResourceUsage; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.BatchStat; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.ModifiedFileSet; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -120,6 +121,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { private SequencedSkyframeExecutor( EvaluatorSupplier evaluatorSupplier, PackageFactory pkgFactory, + FileSystem fileSystem, BlazeDirectories directories, Factory workspaceStatusActionFactory, ImmutableList<BuildInfoFactory> buildInfoFactories, @@ -134,6 +136,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { super( evaluatorSupplier, pkgFactory, + fileSystem, directories, workspaceStatusActionFactory, buildInfoFactories, @@ -150,6 +153,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { public static SequencedSkyframeExecutor create( PackageFactory pkgFactory, + FileSystem fileSystem, BlazeDirectories directories, Factory workspaceStatusActionFactory, ImmutableList<BuildInfoFactory> buildInfoFactories, @@ -165,6 +169,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { new SequencedSkyframeExecutor( InMemoryMemoizingEvaluator.SUPPLIER, pkgFactory, + fileSystem, directories, workspaceStatusActionFactory, buildInfoFactories, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java index fe1706d3bf..0b645fb34b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.packages.PackageFactory; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -32,6 +33,7 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory @Override public SkyframeExecutor create( PackageFactory pkgFactory, + FileSystem fileSystem, BlazeDirectories directories, Factory workspaceStatusActionFactory, ImmutableList<BuildInfoFactory> buildInfoFactories, @@ -41,6 +43,7 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory Iterable<SkyValueDirtinessChecker> customDirtinessCheckers) { return SequencedSkyframeExecutor.create( pkgFactory, + fileSystem, directories, workspaceStatusActionFactory, buildInfoFactories, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java index 9b0f1a5dda..622f1c3c4a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java @@ -781,7 +781,7 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto // Delete the outputs before executing the action, just to ensure that // the action really does produce the outputs. try { - action.prepare(context.getExecRoot()); + action.prepare(context.getFileSystem(), context.getExecRoot()); createOutputDirectories(action); } catch (IOException e) { reportError("failed to delete output files before executing action", e, action, null); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 089fc65fdb..7145a1d23c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -184,6 +184,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { new MemoizingEvaluator.EmittedEventState(); private final PackageFactory pkgFactory; private final WorkspaceStatusAction.Factory workspaceStatusActionFactory; + private final FileSystem fileSystem; private final BlazeDirectories directories; protected final ExternalFilesHelper externalFilesHelper; @Nullable protected OutputService outputService; @@ -290,6 +291,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { protected SkyframeExecutor( EvaluatorSupplier evaluatorSupplier, PackageFactory pkgFactory, + FileSystem fileSystem, BlazeDirectories directories, Factory workspaceStatusActionFactory, ImmutableList<BuildInfoFactory> buildInfoFactories, @@ -311,6 +313,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { syscalls, cyclesReporter, pkgLocator, numPackagesLoaded, this); this.resourceManager = ResourceManager.instance(); this.skyframeActionExecutor = new SkyframeActionExecutor(eventBus, statusReporterRef); + this.fileSystem = fileSystem; this.directories = Preconditions.checkNotNull(directories); ImmutableMap.Builder<BuildInfoKey, BuildInfoFactory> factoryMapBuilder = ImmutableMap.builder(); for (BuildInfoFactory factory : buildInfoFactories) { @@ -1840,7 +1843,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { @VisibleForTesting public FileSystem getFileSystemForTesting() { - return directories.getFileSystem(); + return fileSystem; } @VisibleForTesting diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java index cce86103ca..246c6831bd 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.util.AbruptExitException; +import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -35,6 +36,7 @@ public interface SkyframeExecutorFactory { * * @param tsgm timestamp granularity monitor * @param pkgFactory the package factory + * @param fileSystem the Blaze file system * @param directories Blaze directories * @param workspaceStatusActionFactory a factory for creating WorkspaceStatusAction objects * @param buildInfoFactories list of BuildInfoFactories @@ -47,6 +49,7 @@ public interface SkyframeExecutorFactory { */ SkyframeExecutor create( PackageFactory pkgFactory, + FileSystem fileSystem, BlazeDirectories directories, Factory workspaceStatusActionFactory, ImmutableList<BuildInfoFactory> buildInfoFactories, diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java index 81b7ac083f..132f6ea6ba 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java @@ -994,17 +994,23 @@ public class Path implements Comparable<Path>, Serializable { return fileSystem.getFileSize(this, followSymlinks.toBoolean()); } + /** Please prefer to use {@link #delete(FileSystem)}. */ + public boolean delete() throws IOException { + return fileSystem.delete(this); + } + /** - * Deletes the file denoted by this path, not following symbolic links. - * Returns normally iff the file doesn't exist after the call: true if this - * call deleted the file, false if the file already didn't exist. Throws an - * exception if the file could not be deleted for any reason. + * Deletes the file denoted by this path, not following symbolic links. Returns normally iff the + * file doesn't exist after the call: true if this call deleted the file, false if the file + * already didn't exist. Throws an exception if the file could not be deleted for any reason. + * + * <p>This is a migration method. The method (and its FileSystem-less counterpart) will be deleted + * once the FileSystem instance is removed from Path. * * @return true iff the file was actually deleted by this call - * @throws IOException if the deletion failed but the file was present prior - * to the call + * @throws IOException if the deletion failed but the file was present prior to the call */ - public boolean delete() throws IOException { + public boolean delete(FileSystem fileSystem) throws IOException { return fileSystem.delete(this); } |