From: Ed Warnicke Date: Tue, 23 Sep 2014 17:08:42 +0000 (-0500) Subject: Bug 2019: Have FeatureConfigPusher retry installedFeature check X-Git-Tag: release/helium~12^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=97bee2f1f1ba00cb4413b1e7e67e300dbc773d2e Bug 2019: Have FeatureConfigPusher retry installedFeature check until it succeeds (or 100ms pass). Karaf reports FeatureEvents before it marks the features installed. It also only guarantees complete info about the features when you read the installed ones. This is causing a race condition that is at the root of 2019. So this patch retries at 1ms intervals until we see Change-Id: I67080475fc4b2dc2f053a286424f676f89164b6e Signed-off-by: Ed Warnicke --- diff --git a/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigFeaturesListener.java b/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigFeaturesListener.java index f5f1b856ac..b8f18960d1 100644 --- a/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigFeaturesListener.java +++ b/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigFeaturesListener.java @@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory; public class ConfigFeaturesListener implements FeaturesListener, AutoCloseable { private static final Logger logger = LoggerFactory.getLogger(ConfigFeaturesListener.class); - private static final int QUEUE_SIZE = 100; + private static final int QUEUE_SIZE = 1000; private BlockingQueue queue = new LinkedBlockingQueue(QUEUE_SIZE); Thread pushingThread = null; diff --git a/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/FeatureConfigPusher.java b/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/FeatureConfigPusher.java index 57052f9d60..17099f9d33 100644 --- a/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/FeatureConfigPusher.java +++ b/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/FeatureConfigPusher.java @@ -27,6 +27,7 @@ import com.google.common.collect.LinkedHashMultimap; public class FeatureConfigPusher { private static final Logger logger = LoggerFactory.getLogger(FeatureConfigPusher.class); private static final int MAX_RETRIES=100; + private static final int RETRY_PAUSE_MILLIS=1; private FeaturesService featuresService = null; private ConfigPusher pusher = null; /* @@ -83,30 +84,30 @@ public class FeatureConfigPusher { } private boolean isInstalled(Feature feature) { - List installedFeatures= null; - boolean cont = true; - int retries = 0; - while(cont) { + for(int retries=0;retries installedFeatures = Arrays.asList(featuresService.listInstalledFeatures()); + if(installedFeatures.contains(feature)) { + return true; + } else { + logger.warn("Karaf featuresService.listInstalledFeatures() has not yet finished installing feature (retry {}) {} {}",retries,feature.getName(),feature.getVersion()); + } } catch (Exception e) { if(retries < MAX_RETRIES) { logger.warn("Karaf featuresService.listInstalledFeatures() has thrown an exception, retry {}, Exception {}", retries,e); - try { - Thread.sleep(1); - } catch (InterruptedException e1) { - throw new IllegalStateException(e1); - } - retries++; - continue; } else { logger.error("Giving up on Karaf featuresService.listInstalledFeatures() which has thrown an exception, retry {}, Exception {}", retries,e); throw e; } } + try { + Thread.sleep(RETRY_PAUSE_MILLIS); + } catch (InterruptedException e1) { + throw new IllegalStateException(e1); + } } - return installedFeatures.contains(feature); + logger.error("Giving up (after {} retries) on Karaf featuresService.listInstalledFeatures() which has not yet finished installing feature {} {}",MAX_RETRIES,feature.getName(),feature.getVersion()); + return false; } private LinkedHashSet pushConfig(LinkedHashSet configs) throws InterruptedException {