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%2FConfigTransactionControllerImpl.java;h=186a7218bae75a8cf7c724b817f95b8f9d41be90;hp=3e231201821619d36c95b0cc481938b5eda042f4;hb=5c008222efa5c0af49cf8a52881a6299b1e249dc;hpb=d166f8ebd062f3a28a6ad7b7eb03988bb9052600 diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java index 3e23120182..186a7218ba 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java @@ -7,8 +7,10 @@ */ package org.opendaylight.controller.config.manager.impl; +import static com.google.common.base.Preconditions.checkNotNull; import static java.lang.String.format; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -43,8 +45,6 @@ import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import static com.google.common.base.Preconditions.checkNotNull; /** * This is a JMX bean representing current transaction. It contains * transaction identifier, unique version and parent version for @@ -54,7 +54,7 @@ class ConfigTransactionControllerImpl implements ConfigTransactionControllerInternal, ConfigTransactionControllerImplMXBean, Identifiable { - private static final Logger logger = LoggerFactory.getLogger(ConfigTransactionControllerImpl.class); + private static final Logger LOG = LoggerFactory.getLogger(ConfigTransactionControllerImpl.class); private final ConfigTransactionLookupRegistry txLookupRegistry; private final ObjectName controllerON; @@ -96,7 +96,7 @@ class ConfigTransactionControllerImpl implements this.factoriesHolder = new HierarchicalConfigMBeanFactoriesHolder(currentlyRegisteredFactories); this.transactionStatus = new TransactionStatus(); this.dependencyResolverManager = new DependencyResolverManager(txLookupRegistry.getTransactionIdentifier(), - transactionStatus, writableSRRegistry, codecRegistry); + transactionStatus, writableSRRegistry, codecRegistry, transactionsMBeanServer); this.transactionsMBeanServer = transactionsMBeanServer; this.configMBeanServer = configMBeanServer; this.blankTransaction = blankTransaction; @@ -227,7 +227,7 @@ class ConfigTransactionControllerImpl implements boolean isDefaultBean, BundleContext bundleContext) throws InstanceAlreadyExistsException { - logger.debug("Adding module {} to transaction {}", moduleIdentifier, this); + LOG.debug("Adding module {} to transaction {}", moduleIdentifier, this); if (moduleIdentifier.equals(module.getIdentifier()) == false) { throw new IllegalStateException("Incorrect name reported by module. Expected " + moduleIdentifier + ", got " + module.getIdentifier()); @@ -272,15 +272,13 @@ class ConfigTransactionControllerImpl implements } private synchronized void destroyModule(ModuleIdentifier moduleIdentifier) { - logger.debug("Destroying module {} in transaction {}", moduleIdentifier, this); + LOG.debug("Destroying module {} in transaction {}", moduleIdentifier, this); transactionStatus.checkNotAborted(); ModuleInternalTransactionalInfo found = dependencyResolverManager.findModuleInternalTransactionalInfo(moduleIdentifier); - if (blankTransaction == false) { - - if (found.isDefaultBean()) { - logger.warn("Warning: removing default bean. This will be forbidden in next version of config-subsystem"); - } + if (blankTransaction == false && + found.isDefaultBean()) { + LOG.warn("Warning: removing default bean. This will be forbidden in next version of config-subsystem"); } // first remove refNames, it checks for objectname existence @@ -288,7 +286,7 @@ class ConfigTransactionControllerImpl implements writableSRRegistry.removeServiceReferences( ObjectNameUtil.createTransactionModuleON(getTransactionName(), moduleIdentifier)); } catch (InstanceNotFoundException e) { - logger.error("Possible code error: cannot find {} in {}", moduleIdentifier, writableSRRegistry); + LOG.error("Possible code error: cannot find {} in {}", moduleIdentifier, writableSRRegistry); throw new IllegalStateException("Possible code error: cannot find " + moduleIdentifier, e); } @@ -314,15 +312,15 @@ class ConfigTransactionControllerImpl implements } configBeanModificationDisabled.set(true); try { - validate_noLocks(); + validateNoLocks(); } finally { configBeanModificationDisabled.set(false); } } - private void validate_noLocks() throws ValidationException { + private void validateNoLocks() throws ValidationException { transactionStatus.checkNotAborted(); - logger.trace("Validating transaction {}", getTransactionIdentifier()); + LOG.trace("Validating transaction {}", getTransactionIdentifier()); // call validate() List collectedExceptions = new ArrayList<>(); for (Entry entry : dependencyResolverManager @@ -332,17 +330,17 @@ class ConfigTransactionControllerImpl implements try { module.validate(); } catch (Exception e) { - logger.warn("Validation exception in {}", getTransactionName(), + LOG.warn("Validation exception in {}", getTransactionName(), e); collectedExceptions.add(ValidationException .createForSingleException(name, e)); } } - if (collectedExceptions.size() > 0) { + if (!collectedExceptions.isEmpty()) { throw ValidationException .createFromCollectedValidationExceptions(collectedExceptions); } - logger.trace("Validated transaction {}", getTransactionIdentifier()); + LOG.trace("Validated transaction {}", getTransactionIdentifier()); } /** @@ -359,9 +357,9 @@ class ConfigTransactionControllerImpl implements transactionStatus.checkNotCommitStarted(); configBeanModificationDisabled.set(true); try { - validate_noLocks(); + validateNoLocks(); } catch (ValidationException e) { - logger.trace("Commit failed on validation"); + LOG.trace("Commit failed on validation"); configBeanModificationDisabled.set(false); // recoverable error throw e; } @@ -384,34 +382,36 @@ class ConfigTransactionControllerImpl implements + "to obtain a lock"); } - logger.trace("Committing transaction {}", getTransactionIdentifier()); + LOG.trace("Committing transaction {}", getTransactionIdentifier()); + + Map allModules = dependencyResolverManager.getAllModules(); + + // call getInstance() on all Modules from top to bottom (from source to target of the dependency relation) + // The source of a dependency closes itself and calls getInstance recursively on the dependencies (in case of reconfiguration) + // This makes close() calls from top to bottom while createInstance() calls are performed bottom to top + List sortedModuleIdentifiers = Lists.reverse(dependencyResolverManager.getSortedModuleIdentifiers()); + for (ModuleIdentifier moduleIdentifier : sortedModuleIdentifiers) { + Module module = allModules.get(moduleIdentifier); - // call getInstance() - for (Entry entry : dependencyResolverManager - .getAllModules().entrySet()) { - Module module = entry.getValue(); - ModuleIdentifier name = entry.getKey(); try { - logger.debug("About to commit {} in transaction {}", - name, getTransactionIdentifier()); + LOG.debug("About to commit {} in transaction {}", + moduleIdentifier, getTransactionIdentifier()); AutoCloseable instance = module.getInstance(); - checkNotNull(instance, "Instance is null:{} in transaction {}", name, getTransactionIdentifier()); + checkNotNull(instance, "Instance is null:{} in transaction {}", moduleIdentifier, getTransactionIdentifier()); } catch (Exception e) { - logger.error("Commit failed on {} in transaction {}", name, + LOG.error("Commit failed on {} in transaction {}", moduleIdentifier, getTransactionIdentifier(), e); internalAbort(); throw new IllegalStateException( format("Error - getInstance() failed for %s in transaction %s", - name, getTransactionIdentifier()), e); + moduleIdentifier, getTransactionIdentifier()), e); } } - // count dependency order - - logger.trace("Committed configuration {}", getTransactionIdentifier()); + LOG.trace("Committed configuration {}", getTransactionIdentifier()); transactionStatus.setCommitted(); - return dependencyResolverManager.getSortedModuleIdentifiers(); + return sortedModuleIdentifiers; } @Override @@ -422,7 +422,7 @@ class ConfigTransactionControllerImpl implements } private void internalAbort() { - logger.trace("Aborting {}", this); + LOG.trace("Aborting {}", this); transactionStatus.setAborted(); close(); } @@ -482,6 +482,25 @@ class ConfigTransactionControllerImpl implements public void checkConfigBeanExists(ObjectName objectName) throws InstanceNotFoundException { txLookupRegistry.checkConfigBeanExists(objectName); } + + + /** + * {@inheritDoc} + */ + @Override + public Set lookupRuntimeBeans() { + return txLookupRegistry.lookupRuntimeBeans(); + } + + /** + * {@inheritDoc} + */ + @Override + public Set lookupRuntimeBeans(String moduleName, + String instanceName) { + return txLookupRegistry.lookupRuntimeBeans(moduleName, instanceName); + } + // -- /**