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.controller.md.sal.dom.api.DOMMountPointService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
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 RemoteDeviceConnector remoteDeviceConnector;
private NetconfNodeManager netconfNodeManager;
private ActorRef masterActorRef;
- private boolean finalClose = false;
- private boolean closed = false;
- private boolean isMaster;
+ 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,
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, mountService),
@Override
public ListenableFuture<Void> 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
return ndm;
}
- void closeFinal() throws Exception {
- finalClose = true;
+ @Override
+ public void close() throws Exception {
+ if (!closed.compareAndSet(false, true)) {
+ return;
+ }
if (netconfNodeManager != null) {
netconfNodeManager.close();
}
/**
- * If configuration data was changed
+ * Refresh, if configuration data was changed.
* @param setup new setup
*/
void refresh(@Nonnull final NetconfTopologySetup setup) {
}
}
- private synchronized void stopDeviceConnectorAndActor() {
- if (closed) {
+ private void stopDeviceConnectorAndActor() {
+ if (!stopped.compareAndSet(false, true)) {
return;
}
if (remoteDeviceConnector != null) {
netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef);
masterActorRef = null;
}
- closed = true;
}
}