}
// set RuntimeBeanRegistrators on beans implementing
- // RuntimeBeanRegistratorAwareModule, each module
- // should have exactly one runtime jmx registrator.
+ // RuntimeBeanRegistratorAwareModule
Map<ModuleIdentifier, RootRuntimeBeanRegistratorImpl> runtimeRegistrators = new HashMap<>();
for (ModuleInternalTransactionalInfo entry : commitInfo.getCommitted()
.values()) {
- // FIXME creating new Runtime bean registrator for each new instance might cause leaks if client
- // code doesn't close registration (and thus underlying registrator) in createInstance
- RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator = baseJMXRegistrator
- .createRuntimeBeanRegistrator(entry.getIdentifier());
// set runtime jmx registrator if required
Module module = entry.getProxiedModule();
+ RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator = null;
+
if (module instanceof RuntimeBeanRegistratorAwareModule) {
- ((RuntimeBeanRegistratorAwareModule) module)
- .setRuntimeBeanRegistrator(runtimeBeanRegistrator);
+
+ if(entry.hasOldModule()) {
+
+ if(module.canReuse(entry.getOldInternalInfo().getReadableModule().getModule())) {
+ runtimeBeanRegistrator = entry.getOldInternalInfo().getRuntimeBeanRegistrator();
+ ((RuntimeBeanRegistratorAwareModule) module).setRuntimeBeanRegistrator(runtimeBeanRegistrator);
+ } else {
+ runtimeBeanRegistrator = baseJMXRegistrator.createRuntimeBeanRegistrator(entry.getIdentifier());
+ entry.getOldInternalInfo().getRuntimeBeanRegistrator().close();
+ ((RuntimeBeanRegistratorAwareModule) module).setRuntimeBeanRegistrator(runtimeBeanRegistrator);
+ }
+ } else {
+ runtimeBeanRegistrator = baseJMXRegistrator.createRuntimeBeanRegistrator(entry.getIdentifier());
+ ((RuntimeBeanRegistratorAwareModule) module).setRuntimeBeanRegistrator(runtimeBeanRegistrator);
+ }
}
// save it to info so it is accessible afterwards
- runtimeRegistrators.put(entry.getIdentifier(), runtimeBeanRegistrator);
+ if(runtimeBeanRegistrator != null) {
+ runtimeRegistrators.put(entry.getIdentifier(), runtimeBeanRegistrator);
+ }
}
// can register runtime beans
public ModuleInternalInfo(ModuleIdentifier name,
@Nullable DynamicReadableWrapper readableModule,
OsgiRegistration osgiRegistration,
- RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator,
+ @Nullable RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator,
ModuleJMXRegistrator moduleJMXRegistrator, int orderingIdx,
boolean isDefaultBean, ModuleFactory moduleFactory, BundleContext bundleContext) {
throw new IllegalArgumentException(
"Parameter 'osgiRegistration' is missing");
}
- if (runtimeBeanRegistrator == null) {
- throw new IllegalArgumentException(
- "Parameter 'runtimeBeanRegistrator' is missing");
- }
this.readableModule = readableModule;
this.osgiRegistration = osgiRegistration;
this.runtimeBeanRegistrator = runtimeBeanRegistrator;
public DestroyedModule toDestroyedModule() {
return new DestroyedModule(getIdentifier(),
getReadableModule().getInstance(), getModuleJMXRegistrator(),
- getOsgiRegistration(), getOrderingIdx());
+ getOsgiRegistration(), getOrderingIdx(), runtimeBeanRegistrator);
}
@Override
import org.opendaylight.controller.config.api.ModuleIdentifier;
import org.opendaylight.controller.config.manager.impl.jmx.ModuleJMXRegistrator;
+import org.opendaylight.controller.config.manager.impl.jmx.RootRuntimeBeanRegistratorImpl;
import org.opendaylight.controller.config.manager.impl.osgi.BeanToOsgiServiceManager.OsgiRegistration;
import org.opendaylight.yangtools.concepts.Identifiable;
import org.slf4j.Logger;
private final ModuleJMXRegistrator oldJMXRegistrator;
private final OsgiRegistration osgiRegistration;
private final int orderingIdx;
+ private RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator;
public DestroyedModule(ModuleIdentifier identifier, AutoCloseable instance,
- ModuleJMXRegistrator oldJMXRegistrator,
- OsgiRegistration osgiRegistration, int orderingIdx) {
+ ModuleJMXRegistrator oldJMXRegistrator,
+ OsgiRegistration osgiRegistration, int orderingIdx,
+ final RootRuntimeBeanRegistratorImpl runtimeBeanRegistrator) {
this.identifier = identifier;
this.instance = instance;
this.oldJMXRegistrator = oldJMXRegistrator;
this.osgiRegistration = osgiRegistration;
this.orderingIdx = orderingIdx;
+ this.runtimeBeanRegistrator = runtimeBeanRegistrator;
}
@Override
} catch (Exception e) {
LOG.error("Error while closing jmx registrator of {}", identifier, e);
}
+ try {
+ if (runtimeBeanRegistrator != null) {
+ runtimeBeanRegistrator.close();
+ }
+ } catch (Exception e) {
+ LOG.error("Error while closing runtime bean jmx registrator of {}", identifier, e);
+ }
try {
osgiRegistration.close();
} catch (Exception e) {
return new DestroyedModule(name, oldModule.getInstance(),
maybeOldInternalInfo.getModuleJMXRegistrator(),
maybeOldInternalInfo.getOsgiRegistration(),
- maybeOldInternalInfo.getOrderingIdx());
+ maybeOldInternalInfo.getOrderingIdx(), maybeOldInternalInfo.getRuntimeBeanRegistrator());
}
@Override
public boolean canReuse(final Module oldModule) {
- return false;
+ return getClass().isInstance(oldModule) && getThreadCount() ==
+ ((TestingScheduledThreadPoolModule) oldModule).getThreadCount();
}
@Override