Merge "Bug 5976 - Thread leak when connecting/disconnecting ovs nodes"
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / OvsdbConnectionManager.java
index 5115a4e033a373475334c447d1b8d923ed44b6aa..5740ab573feeb40235a005df9193f1ff055e101f 100644 (file)
@@ -16,6 +16,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -105,16 +107,18 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
                 externalClient.getConnectionInfo().getLocalPort());
         List<String> databases = new ArrayList<>();
         try {
-            databases = externalClient.getDatabases().get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.warn("Unable to fetch database list");
+            databases = externalClient.getDatabases().get(1000, TimeUnit.MILLISECONDS);
+            if(databases.contains(SouthboundConstants.OPEN_V_SWITCH)) {
+                OvsdbConnectionInstance client = connectedButCallBacksNotRegistered(externalClient);
+                // Register Cluster Ownership for ConnectionInfo
+                registerEntityForOwnership(client);
+            }
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            LOG.warn("Unable to fetch Database list from device {}. Disconnecting from the device.",
+                    externalClient.getConnectionInfo().getRemoteAddress(), e);
+            externalClient.disconnect();
         }
 
-        if(databases.contains(SouthboundConstants.OPEN_V_SWITCH)) {
-            OvsdbConnectionInstance client = connectedButCallBacksNotRegistered(externalClient);
-            // Register Cluster Ownership for ConnectionInfo
-            registerEntityForOwnership(client);
-        }
     }
 
     public OvsdbConnectionInstance connectedButCallBacksNotRegistered(final OvsdbClient externalClient) {
@@ -181,7 +185,6 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
             LOG.warn("disconnected : Connection instance not found for OVSDB Node {} ", key);
         }
         LOG.trace("OvsdbConnectionManager: exit disconnected client: {}", client);
-
     }
 
     public OvsdbClient connect(InstanceIdentifier<Node> iid,