X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fnetconf-topology-singleton%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftopology%2Fsingleton%2Fimpl%2FNetconfTopologyContext.java;h=09e0fefc685871052a4c3e436258fec286a3293a;hb=f0b0a99508a36b2087b507ad1ab976255599f4af;hp=3d74d07d308efbf27b47c4731d4ef40842041829;hpb=5118ef40f4ac4cf64a2613c3b01cb90752b72071;p=netconf.git diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java index 3d74d07d30..09e0fefc68 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.topology.singleton.impl; import static org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils.DEFAULT_SCHEMA_REPOSITORY; @@ -18,7 +17,9 @@ import akka.util.Timeout; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nonnull; +import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; @@ -32,34 +33,35 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; -class NetconfTopologyContext implements ClusterSingletonService { +class NetconfTopologyContext implements ClusterSingletonService, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyContext.class); private final ServiceGroupIdentifier serviceGroupIdent; private final Timeout actorResponseWaitTime; + private final DOMMountPointService mountService; + private NetconfTopologySetup netconfTopologyDeviceSetup; private RemoteDeviceId remoteDeviceId; private RemoteDeviceConnector remoteDeviceConnector; private NetconfNodeManager netconfNodeManager; - private boolean finalClose = false; - private boolean closed = false; - private boolean isMaster; - private ActorRef masterActorRef; + private final AtomicBoolean closed = new AtomicBoolean(false); + private final AtomicBoolean stopped = new AtomicBoolean(false); + private volatile boolean isMaster; NetconfTopologyContext(final NetconfTopologySetup netconfTopologyDeviceSetup, final ServiceGroupIdentifier serviceGroupIdent, - final Timeout actorResponseWaitTime) { + final Timeout actorResponseWaitTime, final DOMMountPointService mountService) { this.netconfTopologyDeviceSetup = Preconditions.checkNotNull(netconfTopologyDeviceSetup); this.serviceGroupIdent = serviceGroupIdent; this.actorResponseWaitTime = actorResponseWaitTime; + this.mountService = mountService; remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(), - netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class)); + netconfTopologyDeviceSetup.getNode().augmentation(NetconfNode.class)); - remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId, - actorResponseWaitTime); + remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId); netconfNodeManager = createNodeDeviceManager(); } @@ -76,14 +78,15 @@ class NetconfTopologyContext implements ClusterSingletonService { netconfNodeManager = null; } - if (!finalClose) { - final String masterAddress = Cluster.get(netconfTopologyDeviceSetup.getActorSystem()).selfAddress().toString(); + if (!closed.get()) { + final String masterAddress = + Cluster.get(netconfTopologyDeviceSetup.getActorSystem()).selfAddress().toString(); masterActorRef = netconfTopologyDeviceSetup.getActorSystem().actorOf(NetconfNodeActor.props( netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_REPOSITORY, - actorResponseWaitTime), + actorResponseWaitTime, mountService), NetconfTopologyUtils.createMasterActorName(remoteDeviceId.getName(), masterAddress)); - remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef); + remoteDeviceConnector.startRemoteDeviceConnection(newMasterSalFacade()); } } @@ -92,13 +95,13 @@ class NetconfTopologyContext implements ClusterSingletonService { @Override public ListenableFuture closeServiceInstance() { - if (!finalClose) { + if (!closed.get()) { // in case that master changes role to slave, new NodeDeviceManager must be created and listener registered netconfNodeManager = createNodeDeviceManager(); } stopDeviceConnectorAndActor(); - return Futures.immediateCheckedFuture(null); + return Futures.immediateFuture(null); } @Override @@ -108,16 +111,18 @@ class NetconfTopologyContext implements ClusterSingletonService { private NetconfNodeManager createNodeDeviceManager() { final NetconfNodeManager ndm = - new NetconfNodeManager(netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY, - DEFAULT_SCHEMA_REPOSITORY, actorResponseWaitTime); + new NetconfNodeManager(netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime, mountService); ndm.registerDataTreeChangeListener(netconfTopologyDeviceSetup.getTopologyId(), - netconfTopologyDeviceSetup.getNode().getKey()); + netconfTopologyDeviceSetup.getNode().key()); return ndm; } - void closeFinal() throws Exception { - finalClose = true; + @Override + public void close() { + if (!closed.compareAndSet(false, true)) { + return; + } if (netconfNodeManager != null) { netconfNodeManager.close(); @@ -127,13 +132,13 @@ class NetconfTopologyContext implements ClusterSingletonService { } /** - * If configuration data was changed + * Refresh, if configuration data was changed. * @param setup new setup */ void refresh(@Nonnull final NetconfTopologySetup setup) { netconfTopologyDeviceSetup = Preconditions.checkNotNull(setup); remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(), - netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class)); + netconfTopologyDeviceSetup.getNode().augmentation(NetconfNode.class)); if (isMaster) { remoteDeviceConnector.stopRemoteDeviceConnection(); @@ -141,7 +146,7 @@ class NetconfTopologyContext implements ClusterSingletonService { if (!isMaster) { netconfNodeManager.refreshDevice(netconfTopologyDeviceSetup, remoteDeviceId); } - remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime); + remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId); if (isMaster) { final Future future = Patterns.ask(masterActorRef, new RefreshSetupMasterActorData( @@ -149,19 +154,19 @@ class NetconfTopologyContext implements ClusterSingletonService { future.onComplete(new OnComplete() { @Override - public void onComplete(final Throwable failure, final Object success) throws Throwable { + public void onComplete(final Throwable failure, final Object success) { if (failure != null) { - LOG.error("Failed to refresh master actor data: {}", failure); + LOG.error("Failed to refresh master actor data", failure); return; } - remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef); + remoteDeviceConnector.startRemoteDeviceConnection(newMasterSalFacade()); } }, netconfTopologyDeviceSetup.getActorSystem().dispatcher()); } } - private synchronized void stopDeviceConnectorAndActor() { - if (closed) { + private void stopDeviceConnectorAndActor() { + if (!stopped.compareAndSet(false, true)) { return; } if (remoteDeviceConnector != null) { @@ -172,6 +177,10 @@ class NetconfTopologyContext implements ClusterSingletonService { netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef); masterActorRef = null; } - closed = true; + } + + protected MasterSalFacade newMasterSalFacade() { + return new MasterSalFacade(remoteDeviceId, netconfTopologyDeviceSetup.getActorSystem(), masterActorRef, + actorResponseWaitTime, mountService, netconfTopologyDeviceSetup.getDataBroker()); } }