Repository: karaf Updated Branches: refs/heads/master 668db818b -> f566a8b84
[KARAF-522] Download from provisioning server retry Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/f566a8b8 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f566a8b8 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f566a8b8 Branch: refs/heads/master Commit: f566a8b84b856fba919212ad79b7b2077c733de0 Parents: 668db81 Author: Guillaume Nodet <[email protected]> Authored: Tue Mar 10 15:58:18 2015 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Tue Mar 10 15:58:18 2015 +0100 ---------------------------------------------------------------------- .../apache/karaf/features/FeaturesService.java | 5 ++++ .../internal/download/DownloadManagers.java | 6 ++++- .../impl/AbstractRetryableDownloadTask.java | 19 ++++++++++++++- .../download/impl/MavenDownloadManager.java | 25 ++++++++++++++++++-- .../karaf/features/internal/osgi/Activator.java | 9 +++++-- .../internal/service/FeaturesServiceImpl.java | 21 ++++++++++++---- .../karaf/features/FeaturesServiceTest.java | 8 +++---- .../service/FeaturesServiceImplTest.java | 8 +++---- .../profile/assembly/CustomDownloadManager.java | 3 ++- 9 files changed, 85 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java index 9c52c3c..7bee1ef 100644 --- a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java +++ b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java @@ -39,6 +39,11 @@ public interface FeaturesService { String UPDATEABLE_URIS = "mvn:.*SNAPSHOT|(?!mvn:).*"; + int DEFAULT_DOWNLOAD_THREADS = 8; + long DEFAULT_SCHEDULE_DELAY = 250; + int DEFAULT_SCHEDULE_MAX_RUN = 9; + + enum Option { NoFailOnFeatureNotFound, NoAutoRefreshManagedBundles, http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/internal/download/DownloadManagers.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/download/DownloadManagers.java b/features/core/src/main/java/org/apache/karaf/features/internal/download/DownloadManagers.java index 3808bd3..b2bdfc0 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/download/DownloadManagers.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/download/DownloadManagers.java @@ -29,7 +29,11 @@ public final class DownloadManagers { * Creates a DownloadManager */ public static DownloadManager createDownloadManager(MavenResolver resolver, ScheduledExecutorService executorService) { - return new MavenDownloadManager(resolver, executorService); + return createDownloadManager(resolver, executorService, 0, 0); } + public static DownloadManager createDownloadManager(MavenResolver resolver, ScheduledExecutorService executorService, + long scheduleDelay, int scheduleMaxRun) { + return new MavenDownloadManager(resolver, executorService, scheduleDelay, scheduleMaxRun); + } } http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java index ccde347..d324b23 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java @@ -29,19 +29,36 @@ public abstract class AbstractRetryableDownloadTask extends AbstractDownloadTask private static final Logger LOGGER = LoggerFactory.getLogger(AbstractRetryableDownloadTask.class); private long scheduleDelay = 250; + private int scheduleMaxRun = 9; private int scheduleNbRun = 0; public AbstractRetryableDownloadTask(ScheduledExecutorService executorService, String url) { super(executorService, url); } + public long getScheduleDelay() { + return scheduleDelay; + } + + public void setScheduleDelay(long scheduleDelay) { + this.scheduleDelay = scheduleDelay; + } + + public int getScheduleMaxRun() { + return scheduleMaxRun; + } + + public void setScheduleMaxRun(int scheduleMaxRun) { + this.scheduleMaxRun = scheduleMaxRun; + } + public void run() { try { try { File file = download(); setFile(file); } catch (IOException e) { - if (++scheduleNbRun < 9) { + if (++scheduleNbRun < scheduleMaxRun) { long delay = (long)(scheduleDelay * 3 / 2 + Math.random() * scheduleDelay / 2); LOGGER.debug("Error downloading " + url + ": " + e.getMessage() + ". Retrying in approx " + delay + " ms."); executorService.schedule(this, delay, TimeUnit.MILLISECONDS); http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/MavenDownloadManager.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/MavenDownloadManager.java b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/MavenDownloadManager.java index 99dec02..482c431 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/MavenDownloadManager.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/MavenDownloadManager.java @@ -37,6 +37,10 @@ public class MavenDownloadManager implements DownloadManager { protected final ScheduledExecutorService executorService; + protected final long scheduleDelay; + + protected final int scheduleMaxRun; + protected File tmpPath; private final Map<String, AbstractDownloadTask> downloaded = new HashMap<>(); @@ -47,9 +51,12 @@ public class MavenDownloadManager implements DownloadManager { private volatile int allPending = 0; - public MavenDownloadManager(MavenResolver mavenResolver, ScheduledExecutorService executorService) { + public MavenDownloadManager(MavenResolver mavenResolver, ScheduledExecutorService executorService, + long scheduleDelay, int scheduleMaxRun) { this.mavenResolver = mavenResolver; this.executorService = executorService; + this.scheduleDelay = scheduleDelay; + this.scheduleMaxRun = scheduleMaxRun; String karafRoot = System.getProperty("karaf.home", "karaf"); String karafData = System.getProperty("karaf.data", karafRoot + "/data"); @@ -143,7 +150,21 @@ public class MavenDownloadManager implements DownloadManager { }); } - protected AbstractDownloadTask createDownloadTask(final String url) { + protected AbstractDownloadTask createDownloadTask(String url) { + AbstractDownloadTask task = doCreateDownloadTask(url); + if (task instanceof AbstractRetryableDownloadTask) { + AbstractRetryableDownloadTask rt = (AbstractRetryableDownloadTask) task; + if (scheduleDelay > 0) { + rt.setScheduleDelay(scheduleDelay); + } + if (scheduleMaxRun > 0) { + rt.setScheduleMaxRun(scheduleMaxRun); + } + } + return task; + } + + protected AbstractDownloadTask doCreateDownloadTask(final String url) { final String mvnUrl = DownloadManagerHelper.stripUrl(url); if (mvnUrl.startsWith("mvn:")) { if (!mvnUrl.equals(url)) { http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java index 46ebfae..c904722 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java @@ -170,11 +170,13 @@ public class Activator extends BaseActivator { break; } - FeatureConfigInstaller configInstaller = new FeatureConfigInstaller(configurationAdmin); String overrides = getString("overrides", new File(System.getProperty("karaf.etc"), "overrides.properties").toURI().toString()); String featureResolutionRange = getString("featureResolutionRange", FeaturesService.DEFAULT_FEATURE_RESOLUTION_RANGE); String bundleUpdateRange = getString("bundleUpdateRange", FeaturesService.DEFAULT_BUNDLE_UPDATE_RANGE); String updateSnapshots = getString("updateSnapshots", FeaturesService.DEFAULT_UPDATE_SNAPSHOTS); + int downloadThreads = getInt("downloadThreads", FeaturesService.DEFAULT_DOWNLOAD_THREADS); + long scheduleDelay = getLong("scheduleDelay", FeaturesService.DEFAULT_SCHEDULE_DELAY); + int scheduleMaxRun = getInt("scheduleMaxRun", FeaturesService.DEFAULT_SCHEDULE_MAX_RUN); StateStorage stateStorage = new StateStorage() { @Override protected InputStream getInputStream() throws IOException { @@ -210,7 +212,10 @@ public class Activator extends BaseActivator { featureResolutionRange, bundleUpdateRange, updateSnapshots, - globalRepository); + globalRepository, + downloadThreads, + scheduleDelay, + scheduleMaxRun); register(FeaturesService.class, featuresService); featuresListenerTracker = new ServiceTracker<>( http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java index ceadf51..7079b1b 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java @@ -43,7 +43,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -148,6 +148,12 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall */ private final String updateSnaphots; + private final int downloadThreads; + + private final long scheduleDelay; + + private final int scheduleMaxRun; + /** * Optional global repository */ @@ -173,7 +179,10 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall String featureResolutionRange, String bundleUpdateRange, String updateSnaphots, - org.osgi.service.repository.Repository globalRepository) { + org.osgi.service.repository.Repository globalRepository, + int downloadThreads, + long scheduleDelay, + int scheduleMaxRun) { this.bundle = bundle; this.systemBundleContext = systemBundleContext; this.storage = storage; @@ -187,6 +196,9 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall this.bundleUpdateRange = bundleUpdateRange; this.updateSnaphots = updateSnaphots; this.globalRepository = globalRepository; + this.downloadThreads = downloadThreads > 0 ? downloadThreads : 1; + this.scheduleDelay = scheduleDelay; + this.scheduleMaxRun = scheduleMaxRun; loadState(); checkResolve(); @@ -1031,8 +1043,9 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall Dictionary<String, String> props = getMavenConfig(); MavenResolver resolver = MavenResolvers.createMavenResolver(props, "org.ops4j.pax.url.mvn"); - ScheduledExecutorService executor = Executors.newScheduledThreadPool(8); - DownloadManager manager = DownloadManagers.createDownloadManager(resolver, executor); + ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(downloadThreads); + executor.setMaximumPoolSize(downloadThreads); + DownloadManager manager = DownloadManagers.createDownloadManager(resolver, executor, scheduleDelay, scheduleMaxRun); try { Set<String> prereqs = new HashSet<>(); while (true) { http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java ---------------------------------------------------------------------- diff --git a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java index 5feb9f9..6de10d5 100644 --- a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java +++ b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java @@ -344,7 +344,7 @@ public class FeaturesServiceTest extends TestBase { + " <feature name='f2' version='0.2'><bundle>bundle2</bundle></feature>" + "</features>"); - FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null); + FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0); svc.addRepository(uri); assertEquals(feature("f2", "0.2"), svc.getFeatures("f2", "[0.1,0.3)")[0]); @@ -370,7 +370,7 @@ public class FeaturesServiceTest extends TestBase { expect(fsl.getStartLevel()).andReturn(100); replay(bundleContext, bundle, fsl); - FeaturesServiceImpl svc = new FeaturesServiceImpl(null, bundleContext, new Storage(), null, null, null, null, null, null, null, null, null); + FeaturesServiceImpl svc = new FeaturesServiceImpl(null, bundleContext, new Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0); svc.addRepository(uri); try { List<String> features = new ArrayList<String>(); @@ -395,7 +395,7 @@ public class FeaturesServiceTest extends TestBase { URI uri = createTempRepo("<features name='test' xmlns='http://karaf.apache.org/xmlns/features/v1.0.0'>" + " <featur><bundle>somebundle</bundle></featur></features>"); - FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null); + FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0); try { svc.addRepository(uri); fail("exception expected"); @@ -413,7 +413,7 @@ public class FeaturesServiceTest extends TestBase { + " <feature name='f1'><bundle>file:bundle1</bundle><bundle>file:bundle2</bundle></feature>" + "</features>"); - FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null); + FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0); svc.addRepository(uri); Feature[] features = svc.getFeatures("f1"); Assert.assertEquals(1, features.length); http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java ---------------------------------------------------------------------- diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java index a0920b6..b0a56e6 100644 --- a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java +++ b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java @@ -49,7 +49,7 @@ public class FeaturesServiceImplTest extends TestBase { public void testGetFeature() throws Exception { Feature transactionFeature = feature("transaction", "1.0.0"); final Map<String, Map<String, Feature>> features = features(transactionFeature); - final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null) { + final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) { protected Map<String,Map<String,Feature>> getFeatures() throws Exception { return features; } @@ -60,7 +60,7 @@ public class FeaturesServiceImplTest extends TestBase { @Test public void testGetFeatureStripVersion() throws Exception { - final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null) { + final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) { protected Map<String,Map<String,Feature>> getFeatures() throws Exception { return features(feature("transaction", "1.0.0")); } @@ -74,7 +74,7 @@ public class FeaturesServiceImplTest extends TestBase { @Test public void testGetFeatureNotAvailable() throws Exception { - final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null) { + final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) { protected Map<String,Map<String,Feature>> getFeatures() throws Exception { return features(feature("transaction", "1.0.0")); } @@ -88,7 +88,7 @@ public class FeaturesServiceImplTest extends TestBase { feature("transaction", "1.0.0"), feature("transaction", "2.0.0") ); - final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null) { + final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) { protected Map<String,Map<String,Feature>> getFeatures() throws Exception { return features; } http://git-wip-us.apache.org/repos/asf/karaf/blob/f566a8b8/profile/src/main/java/org/apache/karaf/profile/assembly/CustomDownloadManager.java ---------------------------------------------------------------------- diff --git a/profile/src/main/java/org/apache/karaf/profile/assembly/CustomDownloadManager.java b/profile/src/main/java/org/apache/karaf/profile/assembly/CustomDownloadManager.java index 824d435..6c7ae95 100644 --- a/profile/src/main/java/org/apache/karaf/profile/assembly/CustomDownloadManager.java +++ b/profile/src/main/java/org/apache/karaf/profile/assembly/CustomDownloadManager.java @@ -18,6 +18,7 @@ package org.apache.karaf.profile.assembly; import java.util.concurrent.ScheduledExecutorService; +import org.apache.karaf.features.FeaturesService; import org.apache.karaf.features.internal.download.impl.AbstractDownloadTask; import org.apache.karaf.features.internal.download.impl.MavenDownloadManager; import org.apache.karaf.profile.Profile; @@ -32,7 +33,7 @@ public class CustomDownloadManager extends MavenDownloadManager { } public CustomDownloadManager(MavenResolver resolver, ScheduledExecutorService executor, Profile profile) { - super(resolver, executor); + super(resolver, executor, 0, 1); this.profile = profile; }
