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;
     }
 

Reply via email to