Bug 8074 - actor name [test-device] is not unique! 73/54873/7
authormiroslav.kovac <miroslav.kovac@pantheon.tech>
Mon, 3 Apr 2017 12:39:19 +0000 (14:39 +0200)
committermiroslav.kovac <miroslav.kovac@pantheon.tech>
Wed, 10 May 2017 15:09:37 +0000 (17:09 +0200)
When creating a new actor with same name as an old one, it might fail
becuase old actor might not be completely gone at this point.

This creates a slaveActor which will never be closed, but instead
every time that mountpoint is closed or master is changed, it would
update NetconfNodeActor data and keep the same actor.

Only time that actor is closed is when node was deleted. Or slave
became a master

The name of the actor is removed - letting akka to handle that -
log the akka created name.

Change-Id: I6d10db7b8902048632e336fb5a9701a797b363c6
Signed-off-by: miroslav.kovac <miroslav.kovac@pantheon.tech>
netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java
netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java
netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RefreshSlaveActor.java [new file with mode: 0644]

index e13c5602af45886679df241d4f814efc80b280c3..e29b36d7e6f998bfd27042c8fd736bdca43be850 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.netconf.topology.singleton.impl.actors.NetconfNodeActor;
 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils;
 import org.opendaylight.netconf.topology.singleton.messages.AskForMasterMountPoint;
+import org.opendaylight.netconf.topology.singleton.messages.RefreshSlaveActor;
 import org.opendaylight.netconf.topology.singleton.messages.UnregisterSlaveMountPoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
@@ -87,8 +88,8 @@ class NetconfNodeManager
                     handleSlaveMountPoint(rootNode);
                     break;
                 case DELETE:
-                    LOG.debug("{}: Operational for node {} deleted. Trying to remove slave mount point", id, nodeId);
-                    closeActor();
+                    LOG.debug("{}: Operational for node {} deleted.", id, nodeId);
+                    unregisterSlaveMountpoint();
                     break;
                 default:
                     LOG.debug("{}: Uknown operation for node: {}", id, nodeId);
@@ -98,8 +99,8 @@ class NetconfNodeManager
 
     @Override
     public void close() {
+        unregisterSlaveMountpoint();
         closeActor();
-
         if (dataChangeListenerRegistration != null) {
             dataChangeListenerRegistration.close();
             dataChangeListenerRegistration = null;
@@ -108,12 +109,19 @@ class NetconfNodeManager
 
     private void closeActor() {
         if (slaveActorRef != null) {
-            slaveActorRef.tell(new UnregisterSlaveMountPoint(), ActorRef.noSender());
+            LOG.debug("{}: Sending poison pill to {}", id, slaveActorRef);
             slaveActorRef.tell(PoisonPill.getInstance(), ActorRef.noSender());
             slaveActorRef = null;
         }
     }
 
+    private void unregisterSlaveMountpoint() {
+        if (slaveActorRef != null) {
+            LOG.debug("{}: Sending message to unregister slave mountpoint on {}", id, slaveActorRef);
+            slaveActorRef.tell(new UnregisterSlaveMountPoint(), ActorRef.noSender());
+        }
+    }
+
     void registerDataTreeChangeListener(final String topologyId, final NodeKey key) {
         LOG.debug("{}: Registering data tree change listener on node {}", id, key);
         dataChangeListenerRegistration = setup.getDataBroker().registerDataTreeChangeListener(
@@ -126,21 +134,26 @@ class NetconfNodeManager
         final NetconfNode netconfNodeAfter = rootNode.getDataAfter().getAugmentation(NetconfNode.class);
 
         if (NetconfNodeConnectionStatus.ConnectionStatus.Connected.equals(netconfNodeAfter.getConnectionStatus())) {
-            createActorRef();
+            createOrUpdateActorRef();
             final String masterAddress = netconfNodeAfter.getClusteredConnectionStatus().getNetconfMasterNode();
             final String path = NetconfTopologyUtils.createActorPath(masterAddress,
                     NetconfTopologyUtils.createMasterActorName(id.getName(),
                             netconfNodeAfter.getClusteredConnectionStatus().getNetconfMasterNode()));
             setup.getActorSystem().actorSelection(path).tell(new AskForMasterMountPoint(), slaveActorRef);
         } else {
-            closeActor();
+            unregisterSlaveMountpoint();
         }
     }
 
-    private void createActorRef() {
+    private void createOrUpdateActorRef() {
         if (slaveActorRef == null) {
             slaveActorRef = setup.getActorSystem().actorOf(NetconfNodeActor.props(setup, id, schemaRegistry,
-                    schemaRepository, actorResponseWaitTime, mountPointService), id.getName());
+                    schemaRepository, actorResponseWaitTime, mountPointService));
+            LOG.debug("{}: Slave actor created with name {}", id, slaveActorRef);
+        } else {
+            slaveActorRef
+                    .tell(new RefreshSlaveActor(setup, id, schemaRegistry, schemaRepository, actorResponseWaitTime),
+                            ActorRef.noSender());
         }
     }
 
index 2d396eb2f37634f1b3fe343559cf913993dbf505..655fe6169e578abade8cee5499820dc732a708fe 100644 (file)
@@ -41,6 +41,7 @@ import org.opendaylight.netconf.topology.singleton.messages.CreateInitialMasterA
 import org.opendaylight.netconf.topology.singleton.messages.MasterActorDataInitialized;
 import org.opendaylight.netconf.topology.singleton.messages.NormalizedNodeMessage;
 import org.opendaylight.netconf.topology.singleton.messages.RefreshSetupMasterActorData;
+import org.opendaylight.netconf.topology.singleton.messages.RefreshSlaveActor;
 import org.opendaylight.netconf.topology.singleton.messages.RegisterMountPoint;
 import org.opendaylight.netconf.topology.singleton.messages.UnregisterSlaveMountPoint;
 import org.opendaylight.netconf.topology.singleton.messages.YangTextSchemaSourceRequest;
@@ -74,12 +75,12 @@ public class NetconfNodeActor extends UntypedActor {
 
     private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeActor.class);
 
-    private final SchemaSourceRegistry schemaRegistry;
-    private final SchemaRepository schemaRepository;
     private final DOMMountPointService mountPointService;
-    private final Timeout actorResponseWaitTime;
     private final Duration writeTxIdleTimeout;
 
+    private SchemaSourceRegistry schemaRegistry;
+    private SchemaRepository schemaRepository;
+    private Timeout actorResponseWaitTime;
     private RemoteDeviceId id;
     private NetconfTopologySetup setup;
     private List<SourceIdentifier> sourceIdentifiers;
@@ -178,8 +179,14 @@ public class NetconfNodeActor extends UntypedActor {
                 slaveSalManager.close();
                 slaveSalManager = null;
             }
-
+        } else if (message instanceof RefreshSlaveActor) { //slave
+            actorResponseWaitTime = ((RefreshSlaveActor) message).getActorResponseWaitTime();
+            id = ((RefreshSlaveActor) message).getId();
+            schemaRegistry = ((RefreshSlaveActor) message).getSchemaRegistry();
+            setup = ((RefreshSlaveActor) message).getSetup();
+            schemaRepository = ((RefreshSlaveActor) message).getSchemaRepository();
         }
+
     }
 
     @Override
diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RefreshSlaveActor.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RefreshSlaveActor.java
new file mode 100644 (file)
index 0000000..47023f2
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.messages;
+
+import akka.util.Timeout;
+import java.io.Serializable;
+import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
+import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
+import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
+import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
+
+public class RefreshSlaveActor implements Serializable {
+
+    private final SchemaRepository schemaRepository;
+    private final RemoteDeviceId id;
+    private final SchemaSourceRegistry schemaRegistry;
+    private final NetconfTopologySetup setup;
+    private final Timeout actorResponseWaitTime;
+
+    public RefreshSlaveActor(final NetconfTopologySetup setup, final RemoteDeviceId id,
+                             final SchemaSourceRegistry schemaRegistry, final SchemaRepository schemaRepository,
+                             final Timeout actorResponseWaitTime) {
+        this.setup = setup;
+        this.id = id;
+        this.schemaRegistry = schemaRegistry;
+        this.schemaRepository = schemaRepository;
+        this.actorResponseWaitTime = actorResponseWaitTime;
+    }
+
+    public Timeout getActorResponseWaitTime() {
+        return actorResponseWaitTime;
+    }
+
+    public SchemaRepository getSchemaRepository() {
+        return schemaRepository;
+    }
+
+    public RemoteDeviceId getId() {
+        return id;
+    }
+
+    public SchemaSourceRegistry getSchemaRegistry() {
+        return schemaRegistry;
+    }
+
+    public NetconfTopologySetup getSetup() {
+        return setup;
+    }
+}