import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import javax.annotation.concurrent.GuardedBy;
import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
import org.opendaylight.controller.config.yang.pcep.topology.provider.PCEPTopologyProviderRuntimeRegistrator;
public class PCEPTopologyDeployerImpl implements PCEPTopologyDeployer, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyDeployerImpl.class);
+ private static final long TIMEOUT_NS = TimeUnit.SECONDS.toNanos(5);
@GuardedBy("this")
private final Map<TopologyId, PCEPTopologyProviderBean> pcepTopologyServices = new HashMap<>();
public synchronized void removeTopologyProvider(final TopologyId topologyID) {
final PCEPTopologyProviderBean service = this.pcepTopologyServices.remove(topologyID);
if (service != null) {
+ try {
+ service.closeServiceInstance().get(TIMEOUT_NS, TimeUnit.NANOSECONDS);
+ } catch (final InterruptedException | ExecutionException | TimeoutException e) {
+ LOG.error("Failed to close Topology Provider {}.", topologyID.getValue(), e);
+ }
+
service.close();
}
}
@Override
public synchronized void close() throws Exception {
+ this.pcepTopologyServices.values().forEach(PCEPTopologyProviderBean::closeServiceInstance);
this.pcepTopologyServices.values().forEach(PCEPTopologyProviderBean::close);
}
}
private final RpcProviderRegistry rpcProviderRegistry;
private final BundleContext bundleContext;
private final ClusterSingletonServiceProvider cssp;
+ @GuardedBy("this")
private PCEPTopologyProviderBeanCSS pcepTopoProviderCSS;
public PCEPTopologyProviderBean(final ClusterSingletonServiceProvider cssp, final BundleContext bundleContext,
}
}
+ synchronized ListenableFuture<Void> closeServiceInstance() {
+ if (this.pcepTopoProviderCSS != null) {
+ return this.pcepTopoProviderCSS.closeServiceInstance();
+ }
+ return Futures.immediateFuture(null);
+ }
+
@Override
- public void close() {
+ public synchronized void close() {
if (this.pcepTopoProviderCSS != null) {
this.pcepTopoProviderCSS.close();
+ this.pcepTopoProviderCSS = null;
}
}
- public void start(final PCEPTopologyConfigDependencies configDependencies) {
+ synchronized void start(final PCEPTopologyConfigDependencies configDependencies) {
Preconditions.checkState(this.pcepTopoProviderCSS == null,
"Previous instance %s was not closed.", this);
try {
@Override
public synchronized void instantiateServiceInstance() {
- LOG.info("Topology Provider Singleton Service {} instantiated", getIdentifier().getValue());
+ LOG.info("PCEP Topology Provider Singleton Service {} instantiated", getIdentifier().getValue());
if (this.pcepTopoProvider != null) {
this.pcepTopoProvider.instantiateServiceInstance();
this.serviceInstantiated = true;
@Override
public synchronized ListenableFuture<Void> closeServiceInstance() {
- LOG.info("Close Topology Provider Singleton Service {}", getIdentifier().getValue());
+ LOG.info("Close PCEP Topology Provider Singleton Service {}", getIdentifier().getValue());
if (this.pcepTopoProvider != null && this.serviceInstantiated) {
this.serviceInstantiated = false;
return this.pcepTopoProvider.closeServiceInstance();
}
@Override
- public void close() {
+ public synchronized void close() {
if (this.cssRegistration != null) {
try {
this.cssRegistration.close();