diff options
author | Mickael Istria | 2018-11-19 09:29:40 +0000 |
---|---|---|
committer | Mickael Istria | 2019-05-13 08:48:35 +0000 |
commit | c345d47d4ac0d9e2335a0bb65e55ec02062acd60 (patch) | |
tree | 6e788584013c5e1a8ad1c165a8be7ed13ba8d23a | |
parent | fe5d8590794dc4a35a2eb12d9a1d694e7fb8bb10 (diff) | |
download | m2e-core-c345d47d4ac0d9e2335a0bb65e55ec02062acd60.tar.gz m2e-core-c345d47d4ac0d9e2335a0bb65e55ec02062acd60.tar.xz m2e-core-c345d47d4ac0d9e2335a0bb65e55ec02062acd60.zip |
Bug 515668 - Group operations in ProjectRegistryRefreshJob
Grouping instead of iterating usually enables better performances.
Change-Id: I4b80a2dfd951c55e8739ff85e55bfec7a7f90754
Signed-off-by: Mickael Istria <mistria@redhat.com>
2 files changed, 71 insertions, 24 deletions
diff --git a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java index 56022c08..7572fb30 100644 --- a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java +++ b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java @@ -57,7 +57,6 @@ public class RegistryTest extends AbstractMavenProjectTestCase { assertEquals(Collections.singleton(project.getFile("pom.xml")), registry.getDependents(parentCapability, false)); } - @Test public void testMultiRefreshKeepsCapabilities() throws IOException, CoreException, InterruptedException { IProject dependentProject = createExisting("dependent", "resources/projects/dependency/dependent", true); IProject dependencyProject = createExisting("dependency", "resources/projects/dependency/dependency", true); diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java index 4e07e96e..ebb9a928 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008-2010 Sonatype, Inc. + * Copyright (c) 2008-2018 Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,17 +7,20 @@ * * Contributors: * Sonatype, Inc. - initial API and implementation + * Mickael Istria (Red Hat Inc.) - Group operations to save CPU & RAM *******************************************************************************/ package org.eclipse.m2e.core.internal.project.registry; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; @@ -33,9 +36,7 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; -import org.eclipse.m2e.core.embedder.ICallable; import org.eclipse.m2e.core.embedder.IMavenConfiguration; -import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.m2e.core.internal.Messages; import org.eclipse.m2e.core.internal.jobs.IBackgroundProcessingQueue; @@ -78,29 +79,76 @@ public class ProjectRegistryRefreshJob extends Job implements IResourceChangeLis try { final MutableProjectRegistry newState = manager.newMutableProjectRegistry(); try { - manager.getMaven().execute(new ICallable<Void>() { - public Void call(IMavenExecutionContext context, IProgressMonitor monitor) throws CoreException { - for(final MavenUpdateRequest request : requests) { - if(monitor.isCanceled()) { - throw new OperationCanceledException(); - } - manager.getMaven().execute(request.isOffline(), request.isForceDependencyUpdate(), new ICallable<Void>() { - public Void call(IMavenExecutionContext context, IProgressMonitor monitor) throws CoreException { - manager.refresh(newState, request.getPomFiles(), monitor); - return null; - } - }, monitor); + manager.getMaven().execute((context, theMonitor) -> { + // group requests + Set<IFile> offlineForceDependencyUpdate = new HashSet<>(); + Set<IFile> offlineNotForceDependencyUpdate = new HashSet<>(); + Set<IFile> notOfflineForceDependencyUpdate = new HashSet<>(); + Set<IFile> notOfflineNotForceDependencyUpdate = new HashSet<>(); + for(MavenUpdateRequest request : requests) { + if(theMonitor.isCanceled()) { + throw new OperationCanceledException(); } - - ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRoot(); - getJobManager().beginRule(rule, monitor); - try { - manager.applyMutableProjectRegistry(newState, monitor); - } finally { - getJobManager().endRule(rule); + if(request.isOffline() && request.isForceDependencyUpdate()) { + offlineForceDependencyUpdate.addAll(request.getPomFiles()); + } else if(request.isOffline() && !request.isForceDependencyUpdate()) { + offlineNotForceDependencyUpdate.addAll(request.getPomFiles()); + } else if(!request.isOffline() && request.isForceDependencyUpdate()) { + notOfflineForceDependencyUpdate.addAll(request.getPomFiles()); + } else if(!request.isOffline() && !request.isForceDependencyUpdate()) { + notOfflineNotForceDependencyUpdate.addAll(request.getPomFiles()); } - return null; } + // process requests + // true * true + if(theMonitor.isCanceled()) { + throw new OperationCanceledException(); + } + if(!offlineForceDependencyUpdate.isEmpty()) { + manager.getMaven().execute(true, true, (aContext, aMonitor) -> { + manager.refresh(newState, offlineForceDependencyUpdate, aMonitor); + return null; + }, theMonitor); + } + // true*false + if(theMonitor.isCanceled()) { + throw new OperationCanceledException(); + } + if(!offlineNotForceDependencyUpdate.isEmpty()) { + manager.getMaven().execute(true, false, (aContext, aMonitor) -> { + manager.refresh(newState, offlineNotForceDependencyUpdate, aMonitor); + return null; + }, theMonitor); + } + // false*true + if(theMonitor.isCanceled()) { + throw new OperationCanceledException(); + } + if(!notOfflineForceDependencyUpdate.isEmpty()) { + manager.getMaven().execute(false, true, (aContext, aMonitor) -> { + manager.refresh(newState, notOfflineForceDependencyUpdate, aMonitor); + return null; + }, theMonitor); + } + // false*false + if(theMonitor.isCanceled()) { + throw new OperationCanceledException(); + } + if(!notOfflineNotForceDependencyUpdate.isEmpty()) { + manager.getMaven().execute(false, false, (aContext, aMonitor) -> { + manager.refresh(newState, notOfflineNotForceDependencyUpdate, aMonitor); + return null; + }, theMonitor); + } + + ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRoot(); + getJobManager().beginRule(rule, monitor); + try { + manager.applyMutableProjectRegistry(newState, monitor); + } finally { + getJobManager().endRule(rule); + } + return null; }, monitor); } finally { newState.close(); |