X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fosgi%2FBlankTransactionServiceTracker.java;h=b115f1acd94ef837c8b7309be87a86e41e1fd195;hp=ec1a290cd204dedaf2c744dbcc97dc4cfcb36ce5;hb=73e969cf365dd78772596c71e940ae44fe2f22d3;hpb=428c5b93a8f6c99cc81eab5bcb6809f1b809cb38 diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java index ec1a290cd2..b115f1acd9 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/BlankTransactionServiceTracker.java @@ -7,7 +7,10 @@ */ package org.opendaylight.controller.config.manager.impl.osgi; +import com.google.common.annotations.VisibleForTesting; +import javax.management.ObjectName; import org.opendaylight.controller.config.api.ConflictingVersionException; +import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl; import org.opendaylight.controller.config.spi.ModuleFactory; @@ -16,20 +19,37 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.management.ObjectName; - /** * Every time factory is added or removed, blank transaction is triggered to handle * {@link org.opendaylight.controller.config.spi.ModuleFactory#getDefaultModules(org.opendaylight.controller.config.api.DependencyResolverFactory, org.osgi.framework.BundleContext)} * functionality. */ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer { - private static final Logger logger = LoggerFactory.getLogger(BlankTransactionServiceTracker.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BlankTransactionServiceTracker.class); - private final ConfigRegistryImpl configRegistry; + public static final int DEFAULT_MAX_ATTEMPTS = 10; - public BlankTransactionServiceTracker(ConfigRegistryImpl configRegistry) { - this.configRegistry = configRegistry; + private final BlankTransaction blankTransaction; + private int maxAttempts; + + public BlankTransactionServiceTracker(final ConfigRegistryImpl configRegistry) { + this(new BlankTransaction() { + @Override + public CommitStatus hit() throws ValidationException, ConflictingVersionException { + ObjectName tx = configRegistry.beginConfig(true); + return configRegistry.commitConfig(tx); + } + }); + } + + public BlankTransactionServiceTracker(final BlankTransaction blankTransaction) { + this(blankTransaction, DEFAULT_MAX_ATTEMPTS); + } + + @VisibleForTesting + BlankTransactionServiceTracker(final BlankTransaction blankTx, final int maxAttempts) { + this.blankTransaction = blankTx; + this.maxAttempts = maxAttempts; } @Override @@ -38,16 +58,14 @@ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer< return null; } - private synchronized void blankTransaction() { + synchronized void blankTransaction() { // race condition check: config-persister might push new configuration while server is starting up. ConflictingVersionException lastException = null; - for (int i = 0; i < 10; i++) { + for (int i = 0; i < maxAttempts; i++) { try { // create transaction - boolean blankTransaction = true; - ObjectName tx = configRegistry.beginConfig(blankTransaction); - CommitStatus commitStatus = configRegistry.commitConfig(tx); - logger.debug("Committed blank transaction with status {}", commitStatus); + CommitStatus commitStatus = blankTransaction.hit(); + LOGGER.debug("Committed blank transaction with status {}", commitStatus); return; } catch (ConflictingVersionException e) { lastException = e; @@ -57,9 +75,13 @@ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer< Thread.currentThread().interrupt(); throw new IllegalStateException(interruptedException); } + } catch (ValidationException e) { + LOGGER.error("Validation exception while running blank transaction indicates programming error", e); + throw new RuntimeException("Validation exception while running blank transaction indicates programming error", e); } } - throw lastException; + throw new RuntimeException("Maximal number of attempts reached and still cannot get optimistic lock from " + + "config manager",lastException); } @Override @@ -71,4 +93,9 @@ public class BlankTransactionServiceTracker implements ServiceTrackerCustomizer< public void removedService(ServiceReference moduleFactoryServiceReference, Object o) { blankTransaction(); } + + @VisibleForTesting + static interface BlankTransaction { + CommitStatus hit() throws ValidationException, ConflictingVersionException; + } }