Reduce resource pressure to better support low resource profile device.
- Avoid opening TCP session for reachability check,
when there exist an active NETCONF session already.
Change-Id: I7374f5dd1eeb386bbd1061415a2d33a965a4fed5
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index 960b269..175e244 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -65,6 +65,7 @@
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
import org.onosproject.netconf.NetconfDeviceListener;
import org.onosproject.netconf.NetconfException;
import org.onosproject.netconf.config.NetconfDeviceConfig;
@@ -80,6 +81,7 @@
import java.util.Dictionary;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
@@ -303,6 +305,15 @@
@Override
public boolean isReachable(DeviceId deviceId) {
+
+ boolean sessionExists =
+ Optional.ofNullable(controller.getDevicesMap().get(deviceId))
+ .map(NetconfDevice::isActive)
+ .orElse(false);
+ if (sessionExists) {
+ return true;
+ }
+
//FIXME this is a workaround util device state is shared
// between controller instances.
Device device = deviceService.getDevice(deviceId);
@@ -325,12 +336,16 @@
port = Integer.parseInt(info[info.length - 1]);
}
}
+ // FIXME just opening TCP session probably is not the appropriate
+ // method to test reachability.
//test connection to device opening a socket to it.
+ log.debug("Testing reachability for {}:{}", ip, port);
try (Socket socket = new Socket(ip, port)) {
log.debug("rechability of {}, {}, {}", deviceId, socket.isConnected(), !socket.isClosed());
return socket.isConnected() && !socket.isClosed();
} catch (IOException e) {
log.info("Device {} is not reachable", deviceId);
+ log.debug(" error details", e);
return false;
}
}