Add basic profiling for StarlarkRepositoryFunction.
Doesn't exactly address #9425 but should give more insight.
RELNOTES: None
Closes #11131.
PiperOrigin-RevId: 306828768
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index 9b35a71..0762485 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -43,6 +43,7 @@
import com.google.devtools.build.lib.packages.StructProvider;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
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.repository.RepositoryFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
@@ -504,7 +505,10 @@
uncheckedEnvironment.getContents(String.class, String.class, "environment");
if (canExecuteRemote()) {
- return executeRemote(arguments, timeout, environment, quiet, workingDirectory);
+ try (SilentCloseable c =
+ Profiler.instance().profile(ProfilerTask.STARLARK_REPOSITORY_FN, "executeRemote")) {
+ return executeRemote(arguments, timeout, environment, quiet, workingDirectory);
+ }
}
// Execute on the local/host machine
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 6d29b9d..41a2245 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -27,6 +27,9 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.SymbolGenerator;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
+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.repository.RepositoryDelegatorFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
@@ -196,12 +199,17 @@
// Also we do a lot of stuff in there, maybe blocking operations and we should certainly make
// it possible to return null and not block but it doesn't seem to be easy with Skylark
// structure as it is.
- Object result =
- Starlark.call(
- thread,
- function,
- /*args=*/ ImmutableList.of(skylarkRepositoryContext),
- /*kwargs=*/ ImmutableMap.of());
+ Object result;
+ try (SilentCloseable c =
+ Profiler.instance()
+ .profile(ProfilerTask.STARLARK_REPOSITORY_FN, rule.getLabel().toString())) {
+ result =
+ Starlark.call(
+ thread,
+ function,
+ /*args=*/ ImmutableList.of(skylarkRepositoryContext),
+ /*kwargs=*/ ImmutableMap.of());
+ }
RepositoryResolvedEvent resolved =
new RepositoryResolvedEvent(
rule, skylarkRepositoryContext.getAttr(), outputDirectory, result);
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java b/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java
index 7b81d72..7438689 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java
@@ -69,6 +69,7 @@
STARLARK_USER_FN("Starlark user function call", Threshold.FIFTY_MILLIS),
STARLARK_BUILTIN_FN("Starlark builtin function call", Threshold.FIFTY_MILLIS),
STARLARK_USER_COMPILED_FN("Starlark compiled user function call", Threshold.FIFTY_MILLIS),
+ STARLARK_REPOSITORY_FN("Starlark repository function call", Threshold.FIFTY_MILLIS),
ACTION_FS_STAGING("Staging per-action file system"),
REMOTE_CACHE_CHECK("remote action cache check"),
REMOTE_DOWNLOAD("remote output download"),