aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2018-06-11 06:00:36 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-11 06:01:34 -0700
commit4cf2ebdcef7b5d4c46e533a560642b89eb3f02a5 (patch)
treecf2b64cf0f82827955cb34ce7b188fc641b946d6 /src/main/java/com/google/devtools
parentc720152ec1936a537c9519d522d3cb41d19cff77 (diff)
Add AutoProfiler-like API to Profiler
- migrate all startTask/completeTask pairs to the new API PiperOrigin-RevId: 200038703
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/exec/BlazeExecutor.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/profiler/AutoProfiler.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/profiler/Profiler.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/profiler/SilentCloseable.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java35
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java7
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java7
17 files changed, 110 insertions, 96 deletions
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 8b3d866fff..a149b1aa7f 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
@@ -67,6 +67,7 @@ import com.google.devtools.build.lib.profiler.AutoProfiler;
import com.google.devtools.build.lib.profiler.ProfilePhase;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.BlazeRuntime;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
@@ -369,7 +370,7 @@ public class ExecutionTool {
env.getEventBus()
.post(new ExecutionPhaseCompleteEvent(timer.stop().elapsed(TimeUnit.MILLISECONDS)));
- try (AutoProfiler p = AutoProfiler.profiled("Show results", ProfilerTask.INFO)) {
+ try (SilentCloseable c = Profiler.instance().profile(ProfilerTask.INFO, "Show results")) {
buildResult.setSuccessfulTargets(
determineSuccessfulTargets(configuredTargets, builtTargets));
buildResult.setSuccessfulAspects(determineSuccessfulAspects(aspects, builtAspects));
@@ -379,7 +380,7 @@ public class ExecutionTool {
analysisResult.getTargetsToSkip(), analysisResult.getAspects());
}
- try (AutoProfiler p = AutoProfiler.profiled("Show artifacts", ProfilerTask.INFO)) {
+ try (SilentCloseable c = Profiler.instance().profile(ProfilerTask.INFO, "Show artifacts")) {
if (request.getBuildOptions().showArtifacts) {
BuildResultPrinter buildResultPrinter = new BuildResultPrinter(env);
buildResultPrinter.showArtifacts(
@@ -444,7 +445,8 @@ public class ExecutionTool {
* Prepare for a local output build.
*/
private void startLocalOutputBuild() throws ExecutorInitException {
- try (AutoProfiler p = AutoProfiler.profiled("Starting local output build", ProfilerTask.INFO)) {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.INFO, "Starting local output build")) {
Path outputPath = env.getDirectories().getOutputPath(env.getWorkspaceName());
Path localOutputPath = env.getDirectories().getLocalOutputPath();
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 afd04483b0..5786a48bb9 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
@@ -24,8 +24,6 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
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.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.common.options.OptionsClassProvider;
@@ -135,8 +133,6 @@ public final class BlazeExecutor implements Executor {
*/
public void executionPhaseStarting() {
Preconditions.checkState(!inExecutionPhase.getAndSet(true));
- Profiler.instance().startTask(ProfilerTask.INFO, "Initializing executors");
- Profiler.instance().completeTask(ProfilerTask.INFO);
}
/**
@@ -147,9 +143,6 @@ public final class BlazeExecutor implements Executor {
if (!inExecutionPhase.get()) {
return;
}
-
- Profiler.instance().startTask(ProfilerTask.INFO, "Shutting down executors");
- Profiler.instance().completeTask(ProfilerTask.INFO);
inExecutionPhase.set(false);
}
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/AutoProfiler.java b/src/main/java/com/google/devtools/build/lib/profiler/AutoProfiler.java
index a181cce069..b5fa838e16 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/AutoProfiler.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/AutoProfiler.java
@@ -58,7 +58,7 @@ import javax.annotation.Nullable;
* }
* </pre>
*/
-public class AutoProfiler implements AutoCloseable {
+public class AutoProfiler implements SilentCloseable {
private static final AtomicReference<Clock> CLOCK_REF = new AtomicReference<>(null);
private static final AtomicReference<LoggingElapsedTimeReceiverFactory>
LOGGING_ELAPSED_TIME_RECEIVER_FACTORY_REF = new AtomicReference<>(
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
index 69da2de947..0bf0e4117b 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
@@ -806,17 +806,26 @@ public final class Profiler {
}
/**
- * Records the beginning of the task specified by the parameters. This method should always be
- * followed by completeTask() invocation to mark the end of task execution (usually ensured by try
- * {} finally {} block). Failure to do so will result in task stack corruption.
+ * Records the beginning of a task as specified, and returns a {@link SilentCloseable} instance
+ * that ends the task. This lets the system do the work of ending the task, with the compiler
+ * giving a warning if the returned instance is not closed.
*
* <p>Use of this method allows to support nested task monitoring. For tasks that are known to not
* have any subtasks, logSimpleTask() should be used instead.
*
+ * <p>Use like this:
+ * <pre>
+ * {@code
+ * try (SilentCloseable c = Profiler.instance().profile(type, "description")) {
+ * // Your code here.
+ * }
+ * }
+ * </pre>
+ *
* @param type predefined task type - see ProfilerTask for available types.
* @param description task description. May be stored until the end of the build.
*/
- public void startTask(ProfilerTask type, String description) {
+ public SilentCloseable profile(ProfilerTask type, String description) {
// ProfilerInfo.allTasksById is supposed to be an id -> Task map, but it is in fact a List,
// which means that we cannot drop tasks to which we had already assigned ids. Therefore,
// non-leaf tasks must not have a minimum duration. However, we don't quite consistently
@@ -825,6 +834,9 @@ public final class Profiler {
Preconditions.checkNotNull(description);
if (isActive() && isProfiling(type)) {
taskStack.push(type, description);
+ return () -> completeTask(type);
+ } else {
+ return () -> {};
}
}
@@ -835,7 +847,7 @@ public final class Profiler {
*
* @param type task type.
*/
- public void completeTask(ProfilerTask type) {
+ private void completeTask(ProfilerTask type) {
if (isActive() && isProfiling(type)) {
long endTime = clock.nanoTime();
TaskData data = taskStack.pop();
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/SilentCloseable.java b/src/main/java/com/google/devtools/build/lib/profiler/SilentCloseable.java
new file mode 100644
index 0000000000..81c65fee8b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/profiler/SilentCloseable.java
@@ -0,0 +1,22 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.profiler;
+
+/**
+ * An {@link AutoCloseable} sub-interface that declares no exceptions thrown.
+ */
+public interface SilentCloseable extends AutoCloseable {
+ @Override
+ void close();
+}
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 9c7e837e4c..3c541e8eec 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
@@ -53,6 +53,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppCompileActionContext.Reply;
@@ -923,14 +924,11 @@ public class CppCompileAction extends AbstractAction
@ThreadCompatible
public final void updateActionInputs(NestedSet<Artifact> discoveredInputs) {
NestedSetBuilder<Artifact> inputs = NestedSetBuilder.stableOrder();
- Profiler.instance().startTask(ProfilerTask.ACTION_UPDATE, describe());
- try {
+ try (SilentCloseable c = Profiler.instance().profile(ProfilerTask.ACTION_UPDATE, describe())) {
inputs.addTransitive(mandatoryInputs);
inputs.addAll(inputsForInvalidation);
inputs.addTransitive(discoveredInputs);
updateInputs(inputs.build());
- } finally {
- Profiler.instance().completeTask(ProfilerTask.ACTION_UPDATE);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
index 957a87349e..d6d46dfec4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.ExecException;
import com.google.devtools.build.lib.actions.UserExecException;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
@@ -109,9 +110,7 @@ public interface IncludeScanner {
includes.addAll(action.getBuiltInIncludeFiles());
Profiler profiler = Profiler.instance();
- try {
- profiler.startTask(ProfilerTask.SCANNER, profilerTaskName);
-
+ try (SilentCloseable c = profiler.profile(ProfilerTask.SCANNER, profilerTaskName)) {
// We need to scan the action itself, but also the auxiliary scannables
// (for LIPO). There is no need to call getAuxiliaryScannables
// recursively.
@@ -148,8 +147,6 @@ public interface IncludeScanner {
}
} catch (IOException e) {
throw new EnvironmentalExecException(e.getMessage());
- } finally {
- profiler.completeTask(ProfilerTask.SCANNER);
}
// Collect inputs and output
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
index 4d2cdcef78..86f11476ee 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
@@ -30,6 +30,7 @@ import com.google.devtools.build.lib.exec.ExecutionOptions;
import com.google.devtools.build.lib.exec.ExecutorBuilder;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.util.Pair;
import com.google.protobuf.ByteString;
import java.time.Duration;
@@ -101,27 +102,29 @@ public class BuildSummaryStatsModule extends BlazeModule {
String.format("%f", event.getResult().getElapsedSeconds()))));
if (criticalPathComputer != null) {
- Profiler.instance().startTask(ProfilerTask.CRITICAL_PATH, "Critical path");
- AggregatedCriticalPath<SimpleCriticalPathComponent> criticalPath =
- criticalPathComputer.aggregate();
- items.add(criticalPath.toStringSummary());
- statistics.add(Pair.of("critical path", ByteString.copyFromUtf8(criticalPath.toString())));
- logger.info(criticalPath.toString());
- logger.info(
- "Slowest actions:\n "
- + Joiner.on("\n ").join(criticalPathComputer.getSlowestComponents()));
- // We reverse the critical path because the profiler expect events ordered by the time
- // when the actions were executed while critical path computation is stored in the reverse
- // way.
- for (SimpleCriticalPathComponent stat : criticalPath.components().reverse()) {
- Profiler.instance()
- .logSimpleTaskDuration(
- stat.getStartNanos(),
- Duration.ofNanos(stat.getElapsedTimeNanos()),
- ProfilerTask.CRITICAL_PATH_COMPONENT,
- stat.prettyPrintAction());
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.CRITICAL_PATH, "Critical path")) {
+ AggregatedCriticalPath<SimpleCriticalPathComponent> criticalPath =
+ criticalPathComputer.aggregate();
+ items.add(criticalPath.toStringSummary());
+ statistics.add(
+ Pair.of("critical path", ByteString.copyFromUtf8(criticalPath.toString())));
+ logger.info(criticalPath.toString());
+ logger.info(
+ "Slowest actions:\n "
+ + Joiner.on("\n ").join(criticalPathComputer.getSlowestComponents()));
+ // We reverse the critical path because the profiler expect events ordered by the time
+ // when the actions were executed while critical path computation is stored in the reverse
+ // way.
+ for (SimpleCriticalPathComponent stat : criticalPath.components().reverse()) {
+ Profiler.instance()
+ .logSimpleTaskDuration(
+ stat.getStartNanos(),
+ Duration.ofNanos(stat.getElapsedTimeNanos()),
+ ProfilerTask.CRITICAL_PATH_COMPONENT,
+ stat.prettyPrintAction());
+ }
}
- Profiler.instance().completeTask(ProfilerTask.CRITICAL_PATH);
}
reporter.handle(Event.info(Joiner.on(", ").join(items)));
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 22ef333350..2ad145d1a3 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
@@ -14,8 +14,6 @@
package com.google.devtools.build.lib.runtime;
-import static com.google.devtools.build.lib.profiler.AutoProfiler.profiled;
-
import com.google.common.base.Preconditions;
import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.actions.PackageRootResolver;
@@ -34,8 +32,9 @@ import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.PackageCacheOptions;
import com.google.devtools.build.lib.pkgcache.PackageManager;
import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
-import com.google.devtools.build.lib.profiler.AutoProfiler;
+import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
import com.google.devtools.build.lib.skyframe.OutputService;
import com.google.devtools.build.lib.skyframe.SkyframeBuildView;
@@ -640,7 +639,8 @@ public final class CommandEnvironment {
// and so we need to compute it freshly. Otherwise, we can used the immutable value that's
// precomputed by our BlazeWorkspace.
if (getOutputService() != null) {
- try (AutoProfiler p = profiled("Finding output file system", ProfilerTask.INFO)) {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.INFO, "Finding output file system")) {
return getOutputService().getFilesSystemName();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java
index fb4ead3947..6fe598d282 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java
@@ -35,6 +35,7 @@ import com.google.devtools.build.lib.actions.FileStateType;
import com.google.devtools.build.lib.actions.MetadataProvider;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.vfs.FileStatus;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
@@ -100,8 +101,8 @@ final class ActionFileSystem extends FileSystem implements MetadataProvider, Inj
ActionInputMap inputArtifactData,
Iterable<Artifact> allowedInputs,
Iterable<Artifact> outputArtifacts) {
- try {
- Profiler.instance().startTask(ProfilerTask.ACTION_FS_STAGING, "staging");
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.ACTION_FS_STAGING, "staging")) {
this.delegate = delegate;
this.execRootFragment = execRoot.asFragment();
@@ -133,8 +134,6 @@ final class ActionFileSystem extends FileSystem implements MetadataProvider, Inj
.collect(ImmutableMap.toImmutableMap(Artifact::getExecPath, a -> a));
this.outputs = CacheBuilder.newBuilder().build(
CacheLoader.from(path -> new OutputMetadata(outputsMapping.get(path))));
- } finally {
- Profiler.instance().completeTask(ProfilerTask.ACTION_FS_STAGING);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 635040e66f..05189fb12c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -51,6 +51,7 @@ import com.google.devtools.build.lib.packages.RuleVisibility;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
import com.google.devtools.build.lib.skyframe.SkylarkImportLookupFunction.SkylarkImportFailedException;
import com.google.devtools.build.lib.syntax.BuildFileAST;
@@ -1177,11 +1178,11 @@ public class PackageFunction implements SkyFunction {
throws InterruptedException, PackageFunctionException {
LoadedPackageCacheEntry packageCacheEntry = packageFunctionCache.getIfPresent(packageId);
if (packageCacheEntry == null) {
- profiler.startTask(ProfilerTask.CREATE_PACKAGE, packageId.toString());
if (packageProgress != null) {
packageProgress.startReadPackage(packageId);
}
- try {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.CREATE_PACKAGE, packageId.toString())) {
AstParseResult astParseResult = astCache.getIfPresent(packageId);
if (astParseResult == null) {
if (showLoadingProgress.get()) {
@@ -1267,8 +1268,6 @@ public class PackageFunction implements SkyFunction {
packageProgress.doneReadPackage(packageId);
}
packageFunctionCache.put(packageId, packageCacheEntry);
- } finally {
- profiler.completeTask(ProfilerTask.CREATE_PACKAGE);
}
}
return packageCacheEntry;
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 bdff840056..bcf26a7c53 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
@@ -76,6 +76,7 @@ import com.google.devtools.build.lib.events.ExtendedEventHandler;
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.profiler.SilentCloseable;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.io.FileOutErr;
import com.google.devtools.build.lib.util.io.OutErr;
@@ -546,11 +547,16 @@ public final class SkyframeActionExecutor {
long actionStartTime,
Iterable<Artifact> resolvedCacheArtifacts,
Map<String, String> clientEnv) {
- startProfileAction(ProfilerTask.ACTION_CHECK, action);
- Token token =
- actionCacheChecker.getTokenIfNeedToExecute(
- action, resolvedCacheArtifacts, clientEnv, explain ? reporter : null, metadataHandler);
- profiler.completeTask(ProfilerTask.ACTION_CHECK);
+ Token token;
+ try (SilentCloseable c = profiler.profile(ProfilerTask.ACTION_CHECK, action.describe())) {
+ token =
+ actionCacheChecker.getTokenIfNeedToExecute(
+ action,
+ resolvedCacheArtifacts,
+ clientEnv,
+ explain ? reporter : null,
+ metadataHandler);
+ }
if (token == null) {
boolean eventPosted = false;
// Notify BlazeRuntimeStatistics about the action middleman 'execution'.
@@ -702,10 +708,6 @@ public final class SkyframeActionExecutor {
this.actionInputPrefetcher = actionInputPrefetcher;
}
- private void startProfileAction(ProfilerTask task, Action action) {
- profiler.startTask(task, action.describe());
- }
-
private class ActionRunner implements Callable<ActionExecutionValue> {
private final ExtendedEventHandler eventHandler;
private final Action action;
@@ -731,8 +733,7 @@ public final class SkyframeActionExecutor {
@Override
public ActionExecutionValue call() throws ActionExecutionException, InterruptedException {
- startProfileAction(ProfilerTask.ACTION, action);
- try {
+ try (SilentCloseable c = profiler.profile(ProfilerTask.ACTION, action.describe())) {
if (actionCacheChecker.isActionExecutionProhibited(action)) {
// We can't execute an action (e.g. because --check_???_up_to_date option was used). Fail
// the build instead.
@@ -766,8 +767,6 @@ public final class SkyframeActionExecutor {
metadataHandler.getOutputTreeArtifactData(),
metadataHandler.getAdditionalOutputData(),
actionExecutionContext.getOutputSymlinks());
- } finally {
- profiler.completeTask(ProfilerTask.ACTION);
}
}
}
@@ -960,12 +959,11 @@ public final class SkyframeActionExecutor {
Action action,
ActionExecutionContext actionExecutionContext)
throws ActionExecutionException, InterruptedException {
- startProfileAction(ProfilerTask.ACTION_EXECUTE, action);
// ActionExecutionExceptions that occur as the thread is interrupted are
// assumed to be a result of that, so we throw InterruptedException
// instead.
FileOutErr outErrBuffer = actionExecutionContext.getFileOutErr();
- try {
+ try (SilentCloseable c = profiler.profile(ProfilerTask.ACTION_EXECUTE, action.describe())) {
ActionResult actionResult = action.execute(actionExecutionContext);
if (actionResult != ActionResult.EMPTY) {
eventHandler.post(new ActionResultReceivedEvent(action, actionResult));
@@ -983,8 +981,6 @@ public final class SkyframeActionExecutor {
// Defer reporting action success until outputs are checked
} catch (ActionExecutionException e) {
throw processAndThrow(eventHandler, e, action, outErrBuffer, ErrorTiming.AFTER_EXECUTION);
- } finally {
- profiler.completeTask(ProfilerTask.ACTION_EXECUTE);
}
return false;
}
@@ -999,14 +995,11 @@ public final class SkyframeActionExecutor {
Preconditions.checkState(action.inputsDiscovered(),
"Action %s successfully executed, but inputs still not known", action);
- startProfileAction(ProfilerTask.ACTION_COMPLETE, action);
- try {
+ try (SilentCloseable c = profiler.profile(ProfilerTask.ACTION_COMPLETE, action.describe())) {
if (!checkOutputs(action, metadataHandler)) {
reportError("not all outputs were created or valid", null, action,
outputAlreadyDumped ? null : fileOutErr);
}
- } finally {
- profiler.completeTask(ProfilerTask.ACTION_COMPLETE);
}
if (outputService != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
index 8419e7fc64..27bf364385 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
@@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.syntax.Environment.LexicalFrame;
import com.google.devtools.build.lib.syntax.FuncallExpression.MethodDescriptor;
@@ -123,14 +124,12 @@ public class BuiltinCallable extends BaseFunction {
index++;
}
- Profiler.instance().startTask(ProfilerTask.SKYLARK_BUILTIN_FN, getName());
-
- try {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.SKYLARK_BUILTIN_FN, getName())) {
env.enterScope(this, SHARED_LEXICAL_FRAME_FOR_BUILTIN_METHOD_CALLS, ast, env.getGlobals());
return FuncallExpression.callMethod(
descriptor, getName(), obj, args, ast.getLocation(), env);
} finally {
- Profiler.instance().completeTask(ProfilerTask.SKYLARK_BUILTIN_FN);
env.exitScope();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
index 10a14a6631..03d24bd0a6 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
@@ -18,6 +18,7 @@ import com.google.common.base.Throwables;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
import com.google.devtools.build.lib.syntax.Environment.LexicalFrame;
@@ -166,9 +167,9 @@ public class BuiltinFunction extends BaseFunction {
}
}
- Profiler.instance().startTask(ProfilerTask.SKYLARK_BUILTIN_FN, getName());
// Last but not least, actually make an inner call to the function with the resolved arguments.
- try {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.SKYLARK_BUILTIN_FN, getName())) {
env.enterScope(this, SHARED_LEXICAL_FRAME_FOR_BUILTIN_FUNCTION_CALLS, ast, env.getGlobals());
return invokeMethod.invoke(this, args);
} catch (InvocationTargetException x) {
@@ -208,7 +209,6 @@ public class BuiltinFunction extends BaseFunction {
} catch (IllegalAccessException e) {
throw badCallException(loc, e, args);
} finally {
- Profiler.instance().completeTask(ProfilerTask.SKYLARK_BUILTIN_FN);
env.exitScope();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
index 4db184eceb..a892bda51b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
@@ -18,6 +18,7 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.syntax.Environment.LexicalFrame;
@@ -66,8 +67,7 @@ public class UserDefinedFunction extends BaseFunction {
ImmutableList<String> names = signature.getSignature().getNames();
LexicalFrame lexicalFrame =
LexicalFrame.createForUserDefinedFunctionCall(env.mutability(), /*numArgs=*/ names.size());
- try {
- Profiler.instance().startTask(ProfilerTask.SKYLARK_USER_FN, getName());
+ try (SilentCloseable c = Profiler.instance().profile(ProfilerTask.SKYLARK_USER_FN, getName())) {
env.enterScope(this, lexicalFrame, ast, definitionGlobals);
// Registering the functions's arguments as variables in the local Environment
@@ -96,7 +96,6 @@ public class UserDefinedFunction extends BaseFunction {
}
return Runtime.NONE;
} finally {
- Profiler.instance().completeTask(ProfilerTask.SKYLARK_USER_FN);
env.exitScope();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java b/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
index c70270c6a2..24cdeaeb3e 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
@@ -35,6 +35,7 @@ import com.google.common.util.concurrent.SettableFuture;
import com.google.common.util.concurrent.Uninterruptibles;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
@@ -606,8 +607,8 @@ public final class UnixGlob {
new Runnable() {
@Override
public void run() {
- Profiler.instance().startTask(ProfilerTask.VFS_GLOB, base.getPathString());
- try {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.VFS_GLOB, base.getPathString())) {
reallyGlob(base, baseIsDir, idx, context);
} catch (IOException e) {
ioException.set(e);
@@ -615,8 +616,6 @@ public final class UnixGlob {
runtimeException.set(e);
} catch (Error e) {
error.set(e);
- } finally {
- Profiler.instance().completeTask(ProfilerTask.VFS_GLOB);
}
}
diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
index 7771d833ec..9d7bf274f9 100644
--- a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.ProfilerTask;
+import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.util.GroupedList;
import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState;
import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationSuccessState;
@@ -211,11 +212,9 @@ public abstract class AbstractExceptionalParallelEvaluator<E extends Exception>
}
}
- Profiler.instance().startTask(ProfilerTask.SKYFRAME_EVAL, "Parallel Evaluator evaluation");
- try {
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.SKYFRAME_EVAL, "Parallel Evaluator evaluation")) {
return doMutatingEvaluation(skyKeySet);
- } finally {
- Profiler.instance().completeTask(ProfilerTask.SKYFRAME_EVAL);
}
}