Clustered connector close logic could be called twice on master.
Add boolean guard field to prevent this.
Add null check to netconf device sal provider close method
to prevent NPE.
Change-Id: Ib84be162826726169fb254a933781bb39dce604a
Signed-off-by: Andrej Mak <andrej.mak@pantheon.tech>
private RemoteDeviceConnector remoteDeviceConnector;
private NetconfNodeManager netconfNodeManager;
private boolean finalClose = false;
private RemoteDeviceConnector remoteDeviceConnector;
private NetconfNodeManager netconfNodeManager;
private boolean finalClose = false;
+ private boolean closed = false;
private boolean isMaster;
private ActorRef masterActorRef;
private boolean isMaster;
private ActorRef masterActorRef;
// in case that master changes role to slave, new NodeDeviceManager must be created and listener registered
netconfNodeManager = createNodeDeviceManager();
}
// 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.immediateCheckedFuture(null);
}
if (netconfNodeManager != null) {
netconfNodeManager.close();
}
if (netconfNodeManager != null) {
netconfNodeManager.close();
}
+ stopDeviceConnectorAndActor();
- if (remoteDeviceConnector != null) {
- remoteDeviceConnector.stopRemoteDeviceConnection();
- }
-
- if (masterActorRef != null) {
- netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef);
- masterActorRef = null;
- }
}, netconfTopologyDeviceSetup.getActorSystem().dispatcher());
}
}
}, netconfTopologyDeviceSetup.getActorSystem().dispatcher());
}
}
+
+ private synchronized void stopDeviceConnectorAndActor() {
+ if (closed) {
+ return;
+ }
+ if (remoteDeviceConnector != null) {
+ remoteDeviceConnector.stopRemoteDeviceConnection();
+ }
+
+ if (masterActorRef != null) {
+ netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef);
+ masterActorRef = null;
+ }
+ closed = true;
+ }
public void close() throws Exception {
mountInstance.close();
public void close() throws Exception {
mountInstance.close();
- topologyDatastoreAdapter.close();
+ if (topologyDatastoreAdapter != null) {
+ topologyDatastoreAdapter.close();
+ }
topologyDatastoreAdapter = null;
topologyDatastoreAdapter = null;
+ if (txChain != null) {
+ txChain.close();
+ }
}
public static final class MountInstance implements AutoCloseable {
}
public static final class MountInstance implements AutoCloseable {
+ @Test
+ public void closeWithoutNPE() throws Exception {
+ provider.onSessionInitiated(session);
+ provider.onSessionInitiated(context);
+ provider.close();
+ provider.close();
+ verify(chain, times(2)).close();
+ }
}
\ No newline at end of file
}
\ No newline at end of file