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=4d101833efb93b2c9f1ea0436b8bafdd7ce046b9;hb=8e59d67f1b7580c2135cbcc229d4c377c8cc1b09;hp=0f8255cdaa3dc5140f38928877d228d0c4752e15;hpb=dd80556b7d2d71f32cb3eeb4ed1489b520535eaf;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 0f8255cdaa..4d101833ef 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,19 +5,18 @@ * 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; - import akka.actor.ActorRef; import akka.cluster.Cluster; import akka.dispatch.OnComplete; import akka.pattern.Patterns; +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 javax.annotation.Nonnull; +import java.util.concurrent.atomic.AtomicBoolean; +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; @@ -31,32 +30,37 @@ 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 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 ServiceGroupIdentifier serviceGroupIdent, + 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); netconfNodeManager = createNodeDeviceManager(); - } @Override @@ -71,13 +75,14 @@ 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), + netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime, mountService), NetconfTopologyUtils.createMasterActorName(remoteDeviceId.getName(), masterAddress)); - remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef); + remoteDeviceConnector.startRemoteDeviceConnection(newMasterSalFacade()); } } @@ -86,19 +91,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(); } - if (masterActorRef != null) { - netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef); - masterActorRef = null; - } - if (remoteDeviceConnector != null) { - remoteDeviceConnector.stopRemoteDeviceConnection(); - } + stopDeviceConnectorAndActor(); - return Futures.immediateCheckedFuture(null); + return Futures.immediateFuture(null); } @Override @@ -108,39 +107,34 @@ class NetconfTopologyContext implements ClusterSingletonService { private NetconfNodeManager createNodeDeviceManager() { final NetconfNodeManager ndm = - new NetconfNodeManager(netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY, - DEFAULT_SCHEMA_REPOSITORY); + 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(); } + stopDeviceConnectorAndActor(); - if (remoteDeviceConnector != null) { - remoteDeviceConnector.stopRemoteDeviceConnection(); - } - - if (masterActorRef != null) { - netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef); - masterActorRef = null; - } } /** - * If configuration data was changed + * Refresh, if configuration data was changed. * @param setup new setup */ - void refresh(@Nonnull final NetconfTopologySetup setup) { + void refresh(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(); @@ -152,18 +146,37 @@ class NetconfTopologyContext implements ClusterSingletonService { if (isMaster) { final Future future = Patterns.ask(masterActorRef, new RefreshSetupMasterActorData( - netconfTopologyDeviceSetup, remoteDeviceId), NetconfTopologyUtils.TIMEOUT); + netconfTopologyDeviceSetup, remoteDeviceId), actorResponseWaitTime); 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 void stopDeviceConnectorAndActor() { + if (!stopped.compareAndSet(false, true)) { + return; + } + if (remoteDeviceConnector != null) { + remoteDeviceConnector.stopRemoteDeviceConnection(); + } + + if (masterActorRef != null) { + netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef); + masterActorRef = null; + } + } + + protected MasterSalFacade newMasterSalFacade() { + return new MasterSalFacade(remoteDeviceId, netconfTopologyDeviceSetup.getActorSystem(), masterActorRef, + actorResponseWaitTime, mountService, netconfTopologyDeviceSetup.getDataBroker()); + } }