X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fosgi%2FConfigManagerActivator.java;h=eba7ad1a05314b572081fdd41c98b541f11f220c;hb=refs%2Fchanges%2F69%2F56469%2F3;hp=1f538e5c6dc848bb5f9ef334d8d12df0d50807c9;hpb=6998123adad9e88cd20f285dd48e433f71e90071;p=controller.git diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java index 1f538e5c6d..eba7ad1a05 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java @@ -7,8 +7,6 @@ */ package org.opendaylight.controller.config.manager.impl.osgi; -import static org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil.registerService; -import static org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil.wrap; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.Collection; @@ -16,6 +14,7 @@ import java.util.List; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; import org.opendaylight.controller.config.api.ConfigRegistry; +import org.opendaylight.controller.config.api.ConfigSystemService; import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl; import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator; import org.opendaylight.controller.config.manager.impl.jmx.JMXNotifierConfigRegistry; @@ -24,62 +23,64 @@ import org.opendaylight.controller.config.manager.impl.osgi.mapping.ModuleInfoBu import org.opendaylight.controller.config.manager.impl.osgi.mapping.RefreshingSCPModuleInfoRegistry; import org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil; import org.opendaylight.controller.config.spi.ModuleFactory; +import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; +import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.yangtools.concepts.ObjectRegistration; -import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.SynchronousBundleListener; import org.osgi.util.tracker.BundleTracker; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ConfigManagerActivator implements BundleActivator { +public class ConfigManagerActivator implements BundleActivator, SynchronousBundleListener, ConfigSystemService { private static final Logger LOG = LoggerFactory.getLogger(ConfigManagerActivator.class); + private static final long SYSTEM_BUNDLE_ID = 0; + private final MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer(); private AutoCloseable autoCloseable; + private ConfigRegistryImpl configRegistry; + @Override public void start(final BundleContext context) { + LOG.info("Config manager starting..."); try { - ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();// the inner strategy is backed by thread context cl? + // the inner strategy is backed by thread context cl? + final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create(); - BindingContextProvider bindingContextProvider = new BindingContextProvider(); + final BindingContextProvider bindingContextProvider = new BindingContextProvider(); - RefreshingSCPModuleInfoRegistry moduleInfoRegistryWrapper = new RefreshingSCPModuleInfoRegistry( - moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, bindingContextProvider, context); + final RefreshingSCPModuleInfoRegistry moduleInfoRegistryWrapper = new RefreshingSCPModuleInfoRegistry( + moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, moduleInfoBackedContext, + bindingContextProvider, context); - ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker(context, moduleInfoRegistryWrapper); + final ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker(moduleInfoRegistryWrapper); // start config registry - BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = new BundleContextBackedModuleFactoriesResolver( - context); - ConfigRegistryImpl configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer, - bindingContextProvider); + final BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = + new BundleContextBackedModuleFactoriesResolver(context); + this.configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, + this.configMBeanServer, bindingContextProvider); // track bundles containing factories - BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker( - configRegistry); - ModuleFactoryBundleTracker moduleFactoryTracker = new ModuleFactoryBundleTracker( + final BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker( + this.configRegistry); + final ModuleFactoryBundleTracker moduleFactoryTracker = new ModuleFactoryBundleTracker( blankTransactionServiceTracker); - boolean scanResolvedBundlesForModuleInfo = true; - BundleTracker>> moduleInfoResolvedBundleTracker = null; - ExtensibleBundleTracker moduleFactoryBundleTracker; - if(scanResolvedBundlesForModuleInfo) { - moduleInfoResolvedBundleTracker = new BundleTracker<>(context, Bundle.RESOLVED | Bundle.STARTING | - Bundle.STOPPING | Bundle.ACTIVE, moduleInfoBundleTracker); - moduleFactoryBundleTracker = new ExtensibleBundleTracker<>(context, moduleFactoryTracker); - } else { - moduleFactoryBundleTracker = new ExtensibleBundleTracker<>(context, - moduleFactoryTracker, moduleInfoBundleTracker); - } - + BundleTracker>> moduleInfoResolvedBundleTracker = + new BundleTracker<>(context, Bundle.RESOLVED | Bundle.STARTING | Bundle.STOPPING | Bundle.ACTIVE, + moduleInfoBundleTracker); + ExtensibleBundleTracker moduleFactoryBundleTracker = new ExtensibleBundleTracker<>(context, + moduleFactoryTracker); moduleInfoBundleTracker.open(moduleInfoResolvedBundleTracker); // start extensible tracker @@ -87,49 +88,87 @@ public class ConfigManagerActivator implements BundleActivator { // Wrap config registry with JMX notification publishing adapter final JMXNotifierConfigRegistry notifyingConfigRegistry = - new JMXNotifierConfigRegistry(configRegistry, configMBeanServer); + new JMXNotifierConfigRegistry(this.configRegistry, this.configMBeanServer); // register config registry to OSGi - AutoCloseable clsReg = registerService(context, moduleInfoBackedContext, GeneratedClassLoadingStrategy.class); - AutoCloseable configRegReg = registerService(context, notifyingConfigRegistry, ConfigRegistry.class); + final AutoCloseable clsReg = OsgiRegistrationUtil.registerService(context, moduleInfoBackedContext, + ClassLoadingStrategy.class); + final AutoCloseable configRegReg = OsgiRegistrationUtil.registerService(context, notifyingConfigRegistry, + ConfigRegistry.class); // register config registry to jmx - ConfigRegistryJMXRegistrator configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(configMBeanServer); + final ConfigRegistryJMXRegistrator configRegistryJMXRegistrator = + new ConfigRegistryJMXRegistrator(this.configMBeanServer); try { - configRegistryJMXRegistrator.registerToJMXNoNotifications(configRegistry); - } catch (InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.registerToJMXNoNotifications(this.configRegistry); + } catch (final InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); throw new IllegalStateException("Config Registry was already registered to JMX", e); } // register config registry to jmx - final ConfigRegistryJMXRegistrator configRegistryJMXRegistratorWithNotifications = new ConfigRegistryJMXRegistrator(configMBeanServer); + final ConfigRegistryJMXRegistrator configRegistryJMXRegistratorWithNotifications = + new ConfigRegistryJMXRegistrator(this.configMBeanServer); try { configRegistryJMXRegistrator.registerToJMX(notifyingConfigRegistry); - } catch (InstanceAlreadyExistsException e) { + } catch (final InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); + configRegistryJMXRegistratorWithNotifications.close(); throw new IllegalStateException("Config Registry was already registered to JMX", e); } // TODO wire directly via moduleInfoBundleTracker - ServiceTracker serviceTracker = new ServiceTracker<>(context, ModuleFactory.class, - blankTransactionServiceTracker); + final ServiceTracker serviceTracker = new ServiceTracker<>(context, + ModuleFactory.class, blankTransactionServiceTracker); serviceTracker.open(); - List list = Arrays.asList(bindingContextProvider, clsReg, configRegistry, - wrap(moduleFactoryBundleTracker), moduleInfoBundleTracker, - configRegReg, configRegistryJMXRegistrator, configRegistryJMXRegistratorWithNotifications, wrap(serviceTracker), moduleInfoRegistryWrapper, notifyingConfigRegistry); - autoCloseable = OsgiRegistrationUtil.aggregate(list); - } catch(Exception e) { - LOG.warn("Error starting config manager", e); - } catch(Error e) { + final AutoCloseable configMgrReg = OsgiRegistrationUtil.registerService(context, this, + ConfigSystemService.class); + + final List list = Arrays.asList(bindingContextProvider, clsReg, + OsgiRegistrationUtil.wrap(moduleFactoryBundleTracker), moduleInfoBundleTracker, + configRegReg, configRegistryJMXRegistrator, configRegistryJMXRegistratorWithNotifications, + OsgiRegistrationUtil.wrap(serviceTracker), moduleInfoRegistryWrapper, notifyingConfigRegistry, + configMgrReg); + this.autoCloseable = OsgiRegistrationUtil.aggregate(list); + + context.addBundleListener(this); + } catch(final Exception e) { + LOG.error("Error starting config manager", e); + } catch(final Error e) { // Log JVM Error and re-throw. The OSGi container may silently fail the bundle and not always log // the exception. This has been seen on initial feature install. LOG.error("Error starting config manager", e); throw e; } + + LOG.info("Config manager start complete"); } @Override public void stop(final BundleContext context) throws Exception { - autoCloseable.close(); + LOG.info("Config manager stopping"); + context.removeBundleListener(this); + this.autoCloseable.close(); + } + + @Override + public void bundleChanged(final BundleEvent event) { + if(this.configRegistry == null) { + return; + } + + // If the system bundle (id 0) is stopping close the ConfigRegistry so it destroys all modules. On + // shutdown the system bundle is stopped first. + if(event.getBundle().getBundleId() == SYSTEM_BUNDLE_ID && event.getType() == BundleEvent.STOPPING) { + this.configRegistry.close(); + } + } + + @Override + public void closeAllConfigModules() { + if(this.configRegistry != null) { + this.configRegistry.close(); + } } }