Skip to content

Commit

Permalink
Report TaskExecutionListener registrations as configuration cache pro…
Browse files Browse the repository at this point in the history
…blems

Signed-off-by: Paul Merlin <paul@gradle.com>
  • Loading branch information
eskatos committed May 25, 2020
1 parent 8ee3477 commit 45e31ba
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.gradle.api.execution.TaskExecutionGraph;
import org.gradle.api.execution.TaskExecutionGraphListener;
import org.gradle.api.execution.TaskExecutionListener;
import org.gradle.api.internal.BuildScopeListenerRegistrationListener;
import org.gradle.api.internal.GradleInternal;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.api.internal.project.ProjectStateRegistry;
Expand Down Expand Up @@ -79,6 +80,7 @@ private enum GraphState {
private final GradleInternal gradleInternal;
private final ListenerBroadcast<TaskExecutionGraphListener> graphListeners;
private final ListenerBroadcast<TaskExecutionListener> taskListeners;
private final BuildScopeListenerRegistrationListener buildScopeListenerRegistrationListener;
private final ProjectStateRegistry projectStateRegistry;
private final ServiceRegistry globalServices;
private final DefaultExecutionPlan executionPlan;
Expand All @@ -101,6 +103,7 @@ public DefaultTaskExecutionGraph(
TaskDependencyResolver dependencyResolver,
ListenerBroadcast<TaskExecutionGraphListener> graphListeners,
ListenerBroadcast<TaskExecutionListener> taskListeners,
BuildScopeListenerRegistrationListener buildScopeListenerRegistrationListener,
ProjectStateRegistry projectStateRegistry,
ServiceRegistry globalServices
) {
Expand All @@ -112,6 +115,7 @@ public DefaultTaskExecutionGraph(
this.gradleInternal = gradleInternal;
this.graphListeners = graphListeners;
this.taskListeners = taskListeners;
this.buildScopeListenerRegistrationListener = buildScopeListenerRegistrationListener;
this.projectStateRegistry = projectStateRegistry;
this.globalServices = globalServices;
this.executionPlan = new DefaultExecutionPlan(gradleInternal, taskNodeFactory, dependencyResolver);
Expand Down Expand Up @@ -215,6 +219,7 @@ public void whenReady(final Action<TaskExecutionGraph> action) {

@Override
public void addTaskExecutionListener(TaskExecutionListener listener) {
notifyListenerRegistration("TaskExecutionGraph.addTaskExecutionListener", listener);
taskListeners.add(listener);
}

Expand All @@ -225,11 +230,13 @@ public void removeTaskExecutionListener(TaskExecutionListener listener) {

@Override
public void beforeTask(final Closure closure) {
notifyListenerRegistration("TaskExecutionGraph.beforeTask", closure);
taskListeners.add(new ClosureBackedMethodInvocationDispatch("beforeExecute", closure));
}

@Override
public void beforeTask(final Action<Task> action) {
notifyListenerRegistration("TaskExecutionGraph.beforeTask", action);
taskListeners.add(new TaskExecutionAdapter() {
@Override
public void beforeExecute(Task task) {
Expand All @@ -240,11 +247,13 @@ public void beforeExecute(Task task) {

@Override
public void afterTask(final Closure closure) {
notifyListenerRegistration("TaskExecutionGraph.afterTask", closure);
taskListeners.add(new ClosureBackedMethodInvocationDispatch("afterExecute", closure));
}

@Override
public void afterTask(final Action<Task> action) {
notifyListenerRegistration("TaskExecutionGraph.afterTask", action);
taskListeners.add(new TaskExecutionAdapter() {
@Override
public void afterExecute(Task task, TaskState state) {
Expand All @@ -253,6 +262,14 @@ public void afterExecute(Task task, TaskState state) {
});
}

private void notifyListenerRegistration(String registrationPoint, Object listener) {
buildScopeListenerRegistrationListener.onBuildScopeListenerRegistration(
listener,
registrationPoint,
this
);
}

@Override
public boolean hasTask(Task task) {
ensurePopulated();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import org.gradle.api.execution.TaskExecutionGraphListener;
import org.gradle.api.execution.TaskExecutionListener;
import org.gradle.api.internal.BuildScopeListenerRegistrationListener;
import org.gradle.api.internal.CollectionCallbackActionDecorator;
import org.gradle.api.internal.GradleInternal;
import org.gradle.api.internal.artifacts.dsl.dependencies.ProjectFinder;
Expand Down Expand Up @@ -242,10 +243,25 @@ TaskExecutionGraphInternal createTaskExecutionGraph(
TaskDependencyResolver dependencyResolver,
ListenerBroadcast<TaskExecutionListener> taskListeners,
ListenerBroadcast<TaskExecutionGraphListener> graphListeners,
ListenerManager listenerManager,
ProjectStateRegistry projectStateRegistry,
ServiceRegistry gradleScopedServices
) {
return new DefaultTaskExecutionGraph(planExecutor, nodeExecutors, buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, gradleInternal, taskNodeFactory, dependencyResolver, graphListeners, taskListeners, projectStateRegistry, gradleScopedServices);
return new DefaultTaskExecutionGraph(
planExecutor,
nodeExecutors,
buildOperationExecutor,
listenerBuildOperationDecorator,
coordinationService,
gradleInternal,
taskNodeFactory,
dependencyResolver,
graphListeners,
taskListeners,
listenerManager.getBroadcaster(BuildScopeListenerRegistrationListener.class),
projectStateRegistry,
gradleScopedServices
);
}

ServiceRegistryFactory createServiceRegistryFactory(final ServiceRegistry services) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.execution.TaskExecutionGraphListener
import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.internal.BuildScopeListenerRegistrationListener
import org.gradle.api.internal.TaskInputsInternal
import org.gradle.api.internal.TaskInternal
import org.gradle.api.internal.TaskOutputsInternal
Expand Down Expand Up @@ -63,6 +64,7 @@ class DefaultTaskExecutionGraphSpec extends AbstractExecutionPlanSpec {
def listenerManager = new DefaultListenerManager(Scopes.Build)
def graphListeners = listenerManager.createAnonymousBroadcaster(TaskExecutionGraphListener.class)
def taskExecutionListeners = listenerManager.createAnonymousBroadcaster(TaskExecutionListener.class)
def listenerRegistrationListener = listenerManager.getBroadcaster(BuildScopeListenerRegistrationListener.class)
def nodeExecutor = Mock(NodeExecutor)
def buildOperationExecutor = new TestBuildOperationExecutor()
def listenerBuildOperationDecorator = new TestListenerBuildOperationDecorator()
Expand All @@ -73,7 +75,7 @@ class DefaultTaskExecutionGraphSpec extends AbstractExecutionPlanSpec {
def taskNodeFactory = new TaskNodeFactory(thisBuild, Stub(IncludedBuildTaskGraph))
def dependencyResolver = new TaskDependencyResolver([new TaskNodeDependencyResolver(taskNodeFactory)])
def projectStateRegistry = Stub(ProjectStateRegistry)
def taskGraph = new DefaultTaskExecutionGraph(new DefaultPlanExecutor(parallelismConfiguration, executorFactory, workerLeases, cancellationToken, coordinationService), [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, projectStateRegistry, Stub(ServiceRegistry))
def taskGraph = new DefaultTaskExecutionGraph(new DefaultPlanExecutor(parallelismConfiguration, executorFactory, workerLeases, cancellationToken, coordinationService), [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, listenerRegistrationListener, projectStateRegistry, Stub(ServiceRegistry))
WorkerLeaseRegistry.WorkerLeaseCompletion parentWorkerLease
def executedTasks = []
def failures = []
Expand Down Expand Up @@ -361,7 +363,7 @@ class DefaultTaskExecutionGraphSpec extends AbstractExecutionPlanSpec {

def "notifies graph listener before first execute"() {
def planExecutor = Mock(PlanExecutor)
def taskGraph = new DefaultTaskExecutionGraph(planExecutor, [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, projectStateRegistry, Stub(ServiceRegistry))
def taskGraph = new DefaultTaskExecutionGraph(planExecutor, [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, listenerRegistrationListener, projectStateRegistry, Stub(ServiceRegistry))
TaskExecutionGraphListener listener = Mock(TaskExecutionGraphListener)
Task a = task("a")

Expand All @@ -386,7 +388,7 @@ class DefaultTaskExecutionGraphSpec extends AbstractExecutionPlanSpec {

def "executes whenReady listener before first execute"() {
def planExecutor = Mock(PlanExecutor)
def taskGraph = new DefaultTaskExecutionGraph(planExecutor, [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, projectStateRegistry, Stub(ServiceRegistry))
def taskGraph = new DefaultTaskExecutionGraph(planExecutor, [nodeExecutor], buildOperationExecutor, listenerBuildOperationDecorator, coordinationService, thisBuild, taskNodeFactory, dependencyResolver, graphListeners, taskExecutionListeners, listenerRegistrationListener, projectStateRegistry, Stub(ServiceRegistry))
def closure = Mock(Closure)
def action = Mock(Action)
Task a = task("a")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -604,11 +604,14 @@ class InstantExecutionProblemReportingIntegrationTest extends AbstractInstantExe
}

where:
registrationPoint | code
"Gradle.addBuildListener" | "gradle.addBuildListener(new BuildAdapter())"
"Gradle.addListener" | "gradle.addListener(new BuildAdapter())"
"Gradle.buildStarted" | "gradle.buildStarted {}"
"Gradle.buildFinished" | "gradle.buildFinished {}"
registrationPoint | code
"Gradle.addBuildListener" | "gradle.addBuildListener(new BuildAdapter())"
"Gradle.addListener" | "gradle.addListener(new BuildAdapter())"
"Gradle.buildStarted" | "gradle.buildStarted {}"
"Gradle.buildFinished" | "gradle.buildFinished {}"
"TaskExecutionGraph.addTaskExecutionListener" | "gradle.taskGraph.addTaskExecutionListener(new TaskExecutionAdapter())"
"TaskExecutionGraph.beforeTask" | "gradle.taskGraph.beforeTask {}"
"TaskExecutionGraph.afterTask" | "gradle.taskGraph.afterTask {}"
}

@Unroll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ public void graphPopulated(TaskExecutionGraph graph) {
}
}

private static class TaskListenerImpl implements TaskExecutionListener {
private static class TaskListenerImpl implements TaskExecutionListener, InternalListener {
private final List<Task> planned;
private final List<String> executedTasks;
private final Set<String> skippedTasks;
Expand Down

0 comments on commit 45e31ba

Please sign in to comment.