Fix transaction leak in OvsdbConnectionManager 74/65574/2
authorMichael Vorburger <vorburger@redhat.com>
Wed, 15 Nov 2017 18:26:56 +0000 (19:26 +0100)
committerMichael Vorburger <vorburger@redhat.com>
Thu, 16 Nov 2017 10:26:54 +0000 (10:26 +0000)
see https://jira.opendaylight.org/browse/NETVIRT-985

Change-Id: I50d5e5856d813be8b40bd552c734630856257294
Signed-off-by: Michael Vorburger <vorburger@redhat.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionManager.java

index 3f7f69fa752b653cb85dcb6b49829cf4df7cf42b..bfbb7964f450ce465097e732435a0e3eabf301d0 100644 (file)
@@ -67,21 +67,21 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoCloseable {
-    private Map<ConnectionInfo, OvsdbConnectionInstance> clients =
+    private final Map<ConnectionInfo, OvsdbConnectionInstance> clients =
             new ConcurrentHashMap<>();
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbConnectionManager.class);
     private static final String ENTITY_TYPE = "ovsdb";
     private static final int DB_FETCH_TIMEOUT = 1000;
 
-    private DataBroker db;
-    private TransactionInvoker txInvoker;
-    private Map<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers =
+    private final DataBroker db;
+    private final TransactionInvoker txInvoker;
+    private final Map<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers =
             new ConcurrentHashMap<>();
-    private Map<Entity, OvsdbConnectionInstance> entityConnectionMap =
+    private final Map<Entity, OvsdbConnectionInstance> entityConnectionMap =
             new ConcurrentHashMap<>();
-    private EntityOwnershipService entityOwnershipService;
-    private OvsdbDeviceEntityOwnershipListener ovsdbDeviceEntityOwnershipListener;
-    private OvsdbConnection ovsdbConnection;
+    private final EntityOwnershipService entityOwnershipService;
+    private final OvsdbDeviceEntityOwnershipListener ovsdbDeviceEntityOwnershipListener;
+    private final OvsdbConnection ovsdbConnection;
     private final ReconciliationManager reconciliationManager;
     private final InstanceIdentifierCodec instanceIdentifierCodec;
 
@@ -578,11 +578,10 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
                 break;
             case ON_DISCONNECT:
             {
-                ReadOnlyTransaction tx = db.newReadOnlyTransaction();
-                CheckedFuture<Optional<Node>, ReadFailedException> readNodeFuture =
-                        tx.read(LogicalDatastoreType.CONFIGURATION, iid);
-
-                final OvsdbConnectionManager connectionManager = this;
+                CheckedFuture<Optional<Node>, ReadFailedException> readNodeFuture;
+                try (ReadOnlyTransaction tx = db.newReadOnlyTransaction()) {
+                    readNodeFuture = tx.read(LogicalDatastoreType.CONFIGURATION, iid);
+                }
                 Futures.addCallback(readNodeFuture, new FutureCallback<Optional<Node>>() {
                     @Override
                     public void onSuccess(@Nullable Optional<Node> node) {
@@ -618,8 +617,8 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
     }
 
     private class OvsdbDeviceEntityOwnershipListener implements EntityOwnershipListener {
-        private OvsdbConnectionManager cm;
-        private EntityOwnershipListenerRegistration listenerRegistration;
+        private final OvsdbConnectionManager cm;
+        private final EntityOwnershipListenerRegistration listenerRegistration;
 
         OvsdbDeviceEntityOwnershipListener(OvsdbConnectionManager cm, EntityOwnershipService entityOwnershipService) {
             this.cm = cm;