diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java index 6f92ae0a069b97..c4b1e5f30170f2 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java @@ -17,6 +17,7 @@ import static java.util.stream.Collectors.toList; import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.RuleClass; @@ -222,7 +223,7 @@ public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) } if (dumpOptions.dumpRules) { - dumpRuleStats(env.getBlazeWorkspace(), env.getSkyframeExecutor(), out); + dumpRuleStats(env.getReporter(), env.getBlazeWorkspace(), env.getSkyframeExecutor(), out); out.println(); } @@ -290,8 +291,12 @@ private void dumpRuleClasses(BlazeRuntime runtime, PrintStream out) { } } - private void dumpRuleStats(BlazeWorkspace workspace, SkyframeExecutor executor, PrintStream out) { - List ruleStats = executor.getRuleStats(); + private void dumpRuleStats( + ExtendedEventHandler eventHandler, + BlazeWorkspace workspace, + SkyframeExecutor executor, + PrintStream out) { + List ruleStats = executor.getRuleStats(eventHandler); if (ruleStats.isEmpty()) { out.print("No rules in Blaze server, please run a build command first."); return; 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 d32e94602f7dfd..20b05f0d465f3e 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 @@ -41,8 +41,11 @@ import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.AspectClass; import com.google.devtools.build.lib.packages.BuildFileName; +import com.google.devtools.build.lib.packages.NoSuchPackageException; +import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.PackageFactory; +import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.SkylarkSemanticsOptions; import com.google.devtools.build.lib.pkgcache.PackageCacheOptions; @@ -692,7 +695,7 @@ public void clearAnalysisCache( } @Override - public List getRuleStats() { + public List getRuleStats(ExtendedEventHandler eventHandler) { Map ruleStats = new HashMap<>(); for (Map.Entry skyKeyAndNodeEntry : memoizingEvaluator.getGraphMap().entrySet()) { @@ -707,8 +710,17 @@ public List getRuleStats() { ConfiguredTargetValue ctValue = (ConfiguredTargetValue) entry.getValue(); ConfiguredTarget configuredTarget = ctValue.getConfiguredTarget(); if (configuredTarget instanceof RuleConfiguredTarget) { + + Rule rule; + try { + rule = + (Rule) getPackageManager().getTarget(eventHandler, configuredTarget.getLabel()); + } catch (NoSuchPackageException | NoSuchTargetException | InterruptedException e) { + throw new IllegalStateException( + "Failed to get Rule target from package when calculating stats.", e); + } RuleConfiguredTarget ruleConfiguredTarget = (RuleConfiguredTarget) configuredTarget; - RuleClass ruleClass = ruleConfiguredTarget.getTarget().getRuleClassObject(); + RuleClass ruleClass = rule.getRuleClassObject(); RuleStat ruleStat = ruleStats.computeIfAbsent( ruleClass.getKey(), k -> new RuleStat(k, ruleClass.getName(), true)); 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 4cc660209af438..5677caad8d3272 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 @@ -686,7 +686,7 @@ public long getActionCount() { } /** Computes statistics on heap-resident rules and aspects. */ - public abstract List getRuleStats(); + public abstract List getRuleStats(ExtendedEventHandler eventHandler); /** * Removes ConfigurationFragmentValues from the cache. diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index 479cde386dca33..153e976c8da53e 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -1193,8 +1193,7 @@ protected Artifact getGenfilesArtifact( packageRelativePath, owner .getConfiguration() - .getGenfilesDirectory( - owner.getTarget().getLabel().getPackageIdentifier().getRepository()), + .getGenfilesDirectory(owner.getLabel().getPackageIdentifier().getRepository()), (AspectValue.AspectKey) AspectValue.createAspectKey( owner.getLabel(), @@ -1973,7 +1972,13 @@ protected Artifact getImplicitOutputArtifact( ConfiguredTarget target, BuildConfiguration configuration, SafeImplicitOutputsFunction outputFunction) { - Rule associatedRule = target.getTarget().getAssociatedRule(); + Rule rule; + try { + rule = (Rule) skyframeExecutor.getPackageManager().getTarget(reporter, target.getLabel()); + } catch (NoSuchPackageException | NoSuchTargetException | InterruptedException e) { + throw new IllegalStateException(e); + } + Rule associatedRule = rule.getAssociatedRule(); RepositoryName repository = associatedRule.getRepository(); ArtifactRoot root; @@ -1982,15 +1987,13 @@ protected Artifact getImplicitOutputArtifact( } else { root = configuration.getGenfilesDirectory(repository); } - ArtifactOwner owner = - ConfiguredTargetKey.of(target.getTarget().getLabel(), target.getConfiguration()); + ArtifactOwner owner = ConfiguredTargetKey.of(target.getLabel(), target.getConfiguration()); RawAttributeMapper attr = RawAttributeMapper.of(associatedRule); String path = Iterables.getOnlyElement(outputFunction.getImplicitOutputs(eventCollector, attr)); return view.getArtifactFactory() - .getDerivedArtifact( - target.getTarget().getLabel().getPackageFragment().getRelative(path), root, owner); + .getDerivedArtifact(target.getLabel().getPackageFragment().getRelative(path), root, owner); } } diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java index 61a09e273f9e6f..b1085bfcf35b35 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.packages.BuildFileNotFoundException; import com.google.devtools.build.lib.packages.util.ResourceLoader; import com.google.devtools.build.lib.rules.android.AndroidSdkProvider; +import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget; import com.google.devtools.build.lib.vfs.FileSystemUtils; import org.junit.Before; import org.junit.Test; @@ -91,8 +92,8 @@ public void testGeneratedAarImport() throws Exception { ")"); invalidatePackages(); - ConfiguredTarget aarImportTarget = - getConfiguredTarget("@androidsdk//com.google.android:foo-1.0.0"); + ConfiguredTargetAndTarget aarImportTarget = + getConfiguredTargetAndTarget("@androidsdk//com.google.android:foo-1.0.0"); assertThat(aarImportTarget).isNotNull(); assertThat(aarImportTarget.getTarget().getAssociatedRule().getRuleClass()) .isEqualTo("aar_import");