aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2016-03-23 09:18:13 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-03-23 12:21:08 +0000
commitc73051c6baad0aaaf1fdf34d5ad19602b8df628a (patch)
tree29bfc153be8f0cc80c99bf29cff264c97cf0a70d /src/main/java/com/google
parent8a5f5c7a9174222c13f5546e3c467309e19534d7 (diff)
Move TimestampGranularityMonitor to CommandEnvironment.
This is one of the last pieces of state in BlazeRuntime that isn't safe to share across command invocations. -- MOS_MIGRATED_REVID=117910631
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java2
11 files changed, 59 insertions, 76 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index 76b182af4f..422e289f83 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -209,16 +209,10 @@ public class BlazeCommandDispatcher {
*/
int exec(List<String> args, OutErr outErr, long firstContactTime)
throws ShutdownBlazeServerException {
- // Record the start time for the profiler and the timestamp granularity monitor. Do not put
- // anything before this!
+ // Record the start time for the profiler. Do not put anything before this!
long execStartTimeNanos = runtime.getClock().nanoTime();
- // Record the command's starting time again, for use by
- // TimestampGranularityMonitor.waitForTimestampGranularity().
- // This should be done as close as possible to the start of
- // the command's execution - that's why we do this separately,
- // rather than in runtime.beforeCommand().
- runtime.getTimestampGranularityMonitor().setCommandStartTime();
+ // The initCommand call also records the start time for the timestamp granularity monitor.
CommandEnvironment env = runtime.initCommand();
// Record the command's starting time for use by the commands themselves.
env.recordCommandStartTime(firstContactTime);
@@ -400,7 +394,7 @@ public class BlazeCommandDispatcher {
reporter.removeHandler(ansiAllowingHandler);
releaseHandler(ansiAllowingHandler);
}
- runtime.getTimestampGranularityMonitor().waitForTimestampGranularity(outErr);
+ env.getTimestampGranularityMonitor().waitForTimestampGranularity(outErr);
}
}
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 e1e82f89ee..c28b697c57 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
@@ -92,7 +92,6 @@ import com.google.devtools.build.lib.util.OsUtils;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.ThreadUtils;
import com.google.devtools.build.lib.util.io.OutErr;
-import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.JavaIoFileSystem;
@@ -159,7 +158,6 @@ public final class BlazeRuntime {
private final PackageFactory packageFactory;
private final ConfigurationFactory configurationFactory;
private final ConfiguredRuleClassProvider ruleClassProvider;
- private final TimestampGranularityMonitor timestampGranularityMonitor;
private final AtomicInteger storedExitCode = new AtomicInteger();
@@ -190,7 +188,6 @@ public final class BlazeRuntime {
PackageFactory pkgFactory, ConfiguredRuleClassProvider ruleClassProvider,
ConfigurationFactory configurationFactory, Clock clock,
OptionsProvider startupOptionsProvider, Iterable<BlazeModule> blazeModules,
- TimestampGranularityMonitor timestampGranularityMonitor,
SubscriberExceptionHandler eventBusExceptionHandler,
BinTools binTools, ProjectFile.Provider projectFileProvider,
InvocationPolicy invocationPolicy, Iterable<BlazeCommand> commands) {
@@ -207,7 +204,6 @@ public final class BlazeRuntime {
this.ruleClassProvider = ruleClassProvider;
this.configurationFactory = configurationFactory;
this.clock = clock;
- this.timestampGranularityMonitor = Preconditions.checkNotNull(timestampGranularityMonitor);
this.startupOptionsProvider = startupOptionsProvider;
this.eventBusExceptionHandler = eventBusExceptionHandler;
this.queryEnvironmentFactory = queryEnvironmentFactory;
@@ -578,15 +574,6 @@ public final class BlazeRuntime {
}
/**
- * Returns the TimestampGranularityMonitor. The same monitor object is used
- * across multiple Blaze commands, but it doesn't hold any persistent state
- * across different commands.
- */
- public TimestampGranularityMonitor getTimestampGranularityMonitor() {
- return timestampGranularityMonitor;
- }
-
- /**
* 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
@@ -1342,7 +1329,6 @@ public final class BlazeRuntime {
UUID instanceId = (this.instanceId == null) ? UUID.randomUUID() : this.instanceId;
Preconditions.checkNotNull(clock);
- TimestampGranularityMonitor timestampMonitor = new TimestampGranularityMonitor(clock);
Preprocessor.Factory.Supplier preprocessorFactorySupplier = null;
SkyframeExecutorFactory skyframeExecutorFactory = null;
@@ -1466,7 +1452,6 @@ public final class BlazeRuntime {
SkyframeExecutor skyframeExecutor =
skyframeExecutorFactory.create(
pkgFactory,
- timestampMonitor,
directories,
binTools,
workspaceStatusActionFactory,
@@ -1499,8 +1484,7 @@ public final class BlazeRuntime {
return new BlazeRuntime(directories, workspaceStatusActionFactory, skyframeExecutor,
queryEnvironmentFactory, pkgFactory, ruleClassProvider, configurationFactory,
clock, startupOptionsProvider, ImmutableList.copyOf(blazeModules),
- timestampMonitor, eventBusExceptionHandler, binTools, projectFileProvider,
- invocationPolicy, commands);
+ eventBusExceptionHandler, binTools, projectFileProvider, invocationPolicy, commands);
}
public Builder setBinTools(BinTools binTools) {
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 952b71e082..f0dc73c00e 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
@@ -46,6 +46,7 @@ import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.util.AbruptExitException;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.Preconditions;
+import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -77,6 +78,7 @@ public final class CommandEnvironment {
private final EventBus eventBus;
private final BlazeModule.ModuleEnvironment blazeModuleEnvironment;
private final Map<String, String> clientEnv = new HashMap<>();
+ private final TimestampGranularityMonitor timestampGranularityMonitor;
private final BuildView view;
@@ -110,6 +112,12 @@ public final class CommandEnvironment {
this.reporter = new Reporter();
this.eventBus = eventBus;
this.blazeModuleEnvironment = new BlazeModuleEnvironment();
+ this.timestampGranularityMonitor = new TimestampGranularityMonitor(runtime.getClock());
+ // Record the command's starting time again, for use by
+ // TimestampGranularityMonitor.waitForTimestampGranularity().
+ // This should be done as close as possible to the start of
+ // the command's execution.
+ timestampGranularityMonitor.setCommandStartTime();
this.view = new BuildView(runtime.getDirectories(), runtime.getRuleClassProvider(),
runtime.getSkyframeExecutor(), runtime.getCoverageReportActionFactory());
@@ -161,6 +169,10 @@ public final class CommandEnvironment {
}
}
+ public TimestampGranularityMonitor getTimestampGranularityMonitor() {
+ return timestampGranularityMonitor;
+ }
+
public PackageManager getPackageManager() {
return runtime.getPackageManager();
}
@@ -297,7 +309,8 @@ public final class CommandEnvironment {
skyframeExecutor.resetEvaluator();
}
skyframeExecutor.sync(reporter, packageCacheOptions, runtime.getOutputBase(),
- getWorkingDirectory(), defaultsPackageContents, commandId);
+ getWorkingDirectory(), defaultsPackageContents, commandId,
+ timestampGranularityMonitor);
}
public void recordLastExecutionTime() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index ba4c70aeb3..963fe1dce0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -59,6 +59,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import javax.annotation.Nullable;
@@ -78,11 +79,11 @@ import javax.annotation.Nullable;
*/
public class ActionExecutionFunction implements SkyFunction, CompletionReceiver {
private final SkyframeActionExecutor skyframeActionExecutor;
- private final TimestampGranularityMonitor tsgm;
+ private final AtomicReference<TimestampGranularityMonitor> tsgm;
private ConcurrentMap<Action, ContinuationState> stateMap;
public ActionExecutionFunction(SkyframeActionExecutor skyframeActionExecutor,
- TimestampGranularityMonitor tsgm) {
+ AtomicReference<TimestampGranularityMonitor> tsgm) {
this.skyframeActionExecutor = skyframeActionExecutor;
this.tsgm = tsgm;
stateMap = Maps.newConcurrentMap();
@@ -334,7 +335,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver
}
// This may be recreated if we discover inputs.
ActionMetadataHandler metadataHandler = new ActionMetadataHandler(state.inputArtifactData,
- action.getOutputs(), tsgm);
+ action.getOutputs(), tsgm.get());
long actionStartTime = System.nanoTime();
// We only need to check the action cache if we haven't done it on a previous run.
if (!state.hasCheckedActionCache()) {
@@ -376,7 +377,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver
state.inputArtifactData = inputArtifactData;
perActionFileCache = new PerActionFileCache(state.inputArtifactData);
metadataHandler =
- new ActionMetadataHandler(state.inputArtifactData, action.getOutputs(), tsgm);
+ new ActionMetadataHandler(state.inputArtifactData, action.getOutputs(), tsgm.get());
}
}
actionExecutionContext =
@@ -414,7 +415,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver
inputArtifactData.putAll(metadataFoundDuringActionExecution);
state.inputArtifactData = inputArtifactData;
metadataHandler =
- new ActionMetadataHandler(state.inputArtifactData, action.getOutputs(), tsgm);
+ new ActionMetadataHandler(state.inputArtifactData, action.getOutputs(), tsgm.get());
}
} else if (!metadataFoundDuringActionExecution.isEmpty()) {
// The action has run and discovered more inputs. This is a bug, probably the result of
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
index 0f2fb63fdc..cf8f6680e7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
@@ -568,7 +568,7 @@ public class ActionMetadataHandler implements MetadataHandler {
@VisibleForTesting
static FileValue fileValueFromArtifactFile(ArtifactFile file,
- @Nullable FileStatusWithDigest statNoFollow, TimestampGranularityMonitor tsgm)
+ @Nullable FileStatusWithDigest statNoFollow, @Nullable TimestampGranularityMonitor tsgm)
throws IOException {
Path path = file.getPath();
RootedPath rootedPath =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
index 3e1033075c..d77f7e3fc3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
+import java.util.concurrent.atomic.AtomicReference;
/**
* A {@link SkyFunction} for {@link FileStateValue}s.
@@ -30,10 +31,10 @@ import java.io.IOException;
*/
public class FileStateFunction implements SkyFunction {
- private final TimestampGranularityMonitor tsgm;
+ private final AtomicReference<TimestampGranularityMonitor> tsgm;
private final ExternalFilesHelper externalFilesHelper;
- public FileStateFunction(TimestampGranularityMonitor tsgm,
+ public FileStateFunction(AtomicReference<TimestampGranularityMonitor> tsgm,
ExternalFilesHelper externalFilesHelper) {
this.tsgm = tsgm;
this.externalFilesHelper = externalFilesHelper;
@@ -48,7 +49,7 @@ public class FileStateFunction implements SkyFunction {
if (env.valuesMissing()) {
return null;
}
- return FileStateValue.create(rootedPath, tsgm);
+ return FileStateValue.create(rootedPath, tsgm.get());
} catch (FileOutsidePackageRootsException e) {
throw new FileStateFunctionException(e);
} catch (IOException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
index 833306dd70..63a3800b4f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
@@ -371,8 +371,7 @@ public class FilesystemValueChecker {
FileValue lastKnownData = entry.getValue();
if (shouldCheckFile(knownModifiedOutputFiles, file)) {
try {
- FileValue fileValue = ActionMetadataHandler.fileValueFromArtifactFile(file, null,
- tsgm);
+ FileValue fileValue = ActionMetadataHandler.fileValueFromArtifactFile(file, null, tsgm);
if (!fileValue.equals(lastKnownData)) {
updateIntraBuildModifiedCounter(fileValue.exists()
? fileValue.realRootedPath().asPath().getLastModifiedTime()
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 3b393a9bac..0a612f89e2 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
@@ -100,7 +100,6 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
private SequencedSkyframeExecutor(
EvaluatorSupplier evaluatorSupplier,
PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm,
BlazeDirectories directories,
BinTools binTools,
Factory workspaceStatusActionFactory,
@@ -114,7 +113,6 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
super(
evaluatorSupplier,
pkgFactory,
- tsgm,
directories,
binTools,
workspaceStatusActionFactory,
@@ -130,7 +128,6 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
public static SequencedSkyframeExecutor create(
PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm,
BlazeDirectories directories,
BinTools binTools,
Factory workspaceStatusActionFactory,
@@ -145,7 +142,6 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
new SequencedSkyframeExecutor(
InMemoryMemoizingEvaluator.SUPPLIER,
pkgFactory,
- tsgm,
directories,
binTools,
workspaceStatusActionFactory,
@@ -162,13 +158,12 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
@VisibleForTesting
public static SequencedSkyframeExecutor create(PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm, BlazeDirectories directories, BinTools binTools,
+ BlazeDirectories directories, BinTools binTools,
WorkspaceStatusAction.Factory workspaceStatusActionFactory,
ImmutableList<BuildInfoFactory> buildInfoFactories,
Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories) {
return create(
pkgFactory,
- tsgm,
directories,
binTools,
workspaceStatusActionFactory,
@@ -217,11 +212,12 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
@Override
public void sync(EventHandler eventHandler, PackageCacheOptions packageCacheOptions,
- Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId)
+ Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId,
+ TimestampGranularityMonitor tsgm)
throws InterruptedException, AbruptExitException {
this.valueCacheEvictionLimit = packageCacheOptions.minLoadedPkgCountForCtNodeEviction;
super.sync(eventHandler, packageCacheOptions, outputBase, workingDirectory,
- defaultsPackageContents, commandId);
+ defaultsPackageContents, commandId, tsgm);
handleDiffs(eventHandler);
}
@@ -283,6 +279,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
dropConfiguredTargetsNow(eventHandler);
lastAnalysisDiscarded = false;
}
+ TimestampGranularityMonitor tsgm = this.tsgm.get();
modifiedFiles = 0;
Map<Path, DiffAwarenessManager.ProcessableModifiedFileSet> modifiedFilesByPathEntry =
Maps.newHashMap();
@@ -297,8 +294,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
modifiedFilesByPathEntry.put(pathEntry, modifiedFileSet);
}
}
- handleDiffsWithCompleteDiffInformation(modifiedFilesByPathEntry);
- handleDiffsWithMissingDiffInformation(eventHandler, pathEntriesWithoutDiffInformation);
+ handleDiffsWithCompleteDiffInformation(tsgm, modifiedFilesByPathEntry);
+ handleDiffsWithMissingDiffInformation(eventHandler, tsgm, pathEntriesWithoutDiffInformation);
}
/**
@@ -306,7 +303,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
* diff. Removes entries from the given map as they are processed. All of the files need to be
* invalidated, so the map should be empty upon completion of this function.
*/
- private void handleDiffsWithCompleteDiffInformation(
+ private void handleDiffsWithCompleteDiffInformation(TimestampGranularityMonitor tsgm,
Map<Path, DiffAwarenessManager.ProcessableModifiedFileSet> modifiedFilesByPathEntry)
throws InterruptedException {
for (Path pathEntry : ImmutableSet.copyOf(modifiedFilesByPathEntry.keySet())) {
@@ -315,7 +312,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
ModifiedFileSet modifiedFileSet = processableModifiedFileSet.getModifiedFileSet();
Preconditions.checkState(!modifiedFileSet.treatEverythingAsModified(), pathEntry);
handleChangedFiles(ImmutableList.of(pathEntry),
- getDiff(modifiedFileSet.modifiedSourceFiles(), pathEntry));
+ getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry));
processableModifiedFileSet.markProcessed();
}
}
@@ -325,6 +322,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
* {@link DiffAwareness} said all files may have been modified.
*/
private void handleDiffsWithMissingDiffInformation(EventHandler eventHandler,
+ TimestampGranularityMonitor tsgm,
Set<Pair<Path, DiffAwarenessManager.ProcessableModifiedFileSet>>
pathEntriesWithoutDiffInformation) throws InterruptedException {
if (pathEntriesWithoutDiffInformation.isEmpty()
@@ -447,12 +445,13 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor {
dropConfiguredTargetsNow(eventHandler);
lastAnalysisDiscarded = false;
}
+ TimestampGranularityMonitor tsgm = this.tsgm.get();
Differencer.Diff diff;
if (modifiedFileSet.treatEverythingAsModified()) {
diff = new FilesystemValueChecker(tsgm, null).getDirtyKeys(memoizingEvaluator.getValues(),
new BasicFilesystemDirtinessChecker());
} else {
- diff = getDiff(modifiedFileSet.modifiedSourceFiles(), pathEntry);
+ diff = getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry);
}
syscalls.set(newPerBuildSyscallCache(/*concurrencyLevel=*/42));
recordingDiffer.invalidate(diff.changedKeysWithoutNewValues());
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 5b6484d57a..3dbeb2ed09 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
@@ -22,7 +22,6 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
import com.google.devtools.build.lib.analysis.config.BinTools;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.Preprocessor;
-import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -35,7 +34,6 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory
@Override
public SkyframeExecutor create(
PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm,
BlazeDirectories directories,
BinTools binTools,
Factory workspaceStatusActionFactory,
@@ -48,7 +46,6 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory
Iterable<SkyValueDirtinessChecker> customDirtinessCheckers) {
return SequencedSkyframeExecutor.create(
pkgFactory,
- tsgm,
directories,
binTools,
workspaceStatusActionFactory,
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 7bcb2e3ac0..c21541185c 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
@@ -215,6 +215,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
protected final AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages =
new AtomicReference<>(ImmutableSet.<PackageIdentifier>of());
private final AtomicReference<EventBus> eventBus = new AtomicReference<>();
+ protected final AtomicReference<TimestampGranularityMonitor> tsgm =
+ new AtomicReference<>();
private final ImmutableList<BuildInfoFactory> buildInfoFactories;
// Under normal circumstances, the artifact factory persists for the life of a Blaze server, but
@@ -233,8 +235,6 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
private final Preprocessor.Factory.Supplier preprocessorFactorySupplier;
private Preprocessor.Factory preprocessorFactory;
- protected final TimestampGranularityMonitor tsgm;
-
private final ResourceManager resourceManager;
/** Used to lock evaluator on legacy calls to get existing values. */
@@ -270,7 +270,6 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
protected SkyframeExecutor(
EvaluatorSupplier evaluatorSupplier,
PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm,
BlazeDirectories directories,
BinTools binTools,
Factory workspaceStatusActionFactory,
@@ -285,7 +284,6 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
this.evaluatorSupplier = evaluatorSupplier;
this.pkgFactory = pkgFactory;
this.pkgFactory.setSyscalls(syscalls);
- this.tsgm = tsgm;
this.workspaceStatusActionFactory = workspaceStatusActionFactory;
this.packageManager = new SkyframePackageManager(
new SkyframePackageLoader(), new SkyframeTransitivePackageLoader(),
@@ -804,8 +802,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
|| (oldType.equals(Dirent.Type.SYMLINK) && newType.equals(FileStateValue.Type.SYMLINK));
}
- protected Differencer.Diff getDiff(Iterable<PathFragment> modifiedSourceFiles,
- final Path pathEntry) throws InterruptedException {
+ protected Differencer.Diff getDiff(TimestampGranularityMonitor tsgm,
+ Iterable<PathFragment> modifiedSourceFiles, final Path pathEntry)
+ throws InterruptedException {
if (Iterables.isEmpty(modifiedSourceFiles)) {
return new ImmutableDiff(ImmutableList.<SkyKey>of(), ImmutableMap.<SkyKey, SkyValue>of());
}
@@ -901,10 +900,13 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
@VisibleForTesting // productionVisibility = Visibility.PRIVATE
public void preparePackageLoading(PathPackageLocator pkgLocator, RuleVisibility defaultVisibility,
boolean showLoadingProgress, int globbingThreads,
- String defaultsPackageContents, UUID commandId) {
+ String defaultsPackageContents, UUID commandId,
+ TimestampGranularityMonitor tsgm) {
Preconditions.checkNotNull(pkgLocator);
+ Preconditions.checkNotNull(tsgm);
setActive(true);
+ this.tsgm.set(tsgm);
maybeInjectPrecomputedValuesForAnalysis();
setCommandId(commandId);
setBlacklistedPackagePrefixesFile(getBlacklistedPackagePrefixesFile());
@@ -1358,11 +1360,6 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
*/
public abstract void invalidateTransientErrors();
- @VisibleForTesting
- public TimestampGranularityMonitor getTimestampGranularityMonitorForTesting() {
- return tsgm;
- }
-
/** Configures a given set of configured targets. */
public EvaluationResult<ActionLookupValue> configureTargets(
EventHandler eventHandler,
@@ -1592,16 +1589,15 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
public abstract void updateLoadedPackageSet(Set<PackageIdentifier> loadedPackages);
public void sync(EventHandler eventHandler, PackageCacheOptions packageCacheOptions,
- Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId)
- throws InterruptedException,
- AbruptExitException{
-
+ Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId,
+ TimestampGranularityMonitor tsgm)
+ throws InterruptedException, AbruptExitException{
preparePackageLoading(
createPackageLocator(
eventHandler, packageCacheOptions, outputBase, directories.getWorkspace(),
workingDirectory),
packageCacheOptions.defaultVisibility, packageCacheOptions.showLoadingProgress,
- packageCacheOptions.globbingThreads, defaultsPackageContents, commandId);
+ packageCacheOptions.globbingThreads, defaultsPackageContents, commandId, tsgm);
setDeletedPackages(packageCacheOptions.getDeletedPackages());
incrementalBuildMonitor = new SkyframeIncrementalBuildMonitor();
@@ -1643,12 +1639,13 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
}
public void prepareExecution(ModifiedFileSet modifiedOutputFiles,
- @Nullable Range<Long> lastExecutionTimeRange) throws AbruptExitException,
- InterruptedException {
+ @Nullable Range<Long> lastExecutionTimeRange)
+ throws AbruptExitException, InterruptedException {
maybeInjectEmbeddedArtifacts();
// Detect external modifications in the output tree.
- FilesystemValueChecker fsvc = new FilesystemValueChecker(tsgm, lastExecutionTimeRange);
+ FilesystemValueChecker fsvc =
+ new FilesystemValueChecker(Preconditions.checkNotNull(tsgm.get()), lastExecutionTimeRange);
BatchStat batchStatter = outputService == null ? null : outputService.getBatchStatter();
invalidateDirtyActions(fsvc.getDirtyActionValues(memoizingEvaluator.getValues(),
batchStatter, modifiedOutputFiles));
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 ddfdd237b5..8e3cea4d2e 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
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.config.BinTools;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.Preprocessor;
import com.google.devtools.build.lib.util.AbruptExitException;
-import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -53,7 +52,6 @@ public interface SkyframeExecutorFactory {
*/
SkyframeExecutor create(
PackageFactory pkgFactory,
- TimestampGranularityMonitor tsgm,
BlazeDirectories directories,
BinTools binTools,
Factory workspaceStatusActionFactory,