Bug 9034: LockManager cancel() ReadWriteTransaction if it's not submit() 96/62196/3
authorMichael Vorburger <vorburger@redhat.com>
Wed, 23 Aug 2017 11:41:04 +0000 (13:41 +0200)
committerSam Hague <shague@redhat.com>
Thu, 24 Aug 2017 00:09:35 +0000 (00:09 +0000)
Based on Robert's analysis, this change will not fix Bug 9034, because
that's due to a leaked TransactionChain (not the ReadWriteTransaction
being fixed here) - but this could well introduce ANOTHER memory leak
in mdsal, so we should get this in nevertheless ASAP.

Change-Id: I2f27c6bfe7428d864cfe9c3e3f07a390145ac98f
Signed-off-by: Michael Vorburger <vorburger@redhat.com>
lockmanager/lockmanager-impl/src/main/java/org/opendaylight/genius/lockmanager/LockManager.java

index 988258bc21f8688c7d7a943c49aef99b1ce68fdb..6668f8e91d0220be811cf50d8a7b0a2794df20dd 100644 (file)
@@ -9,7 +9,6 @@
 package org.opendaylight.genius.lockmanager;
 
 import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 
 import java.util.concurrent.CompletableFuture;
@@ -26,7 +25,6 @@ import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TryLockInput;
@@ -128,11 +126,11 @@ public class LockManager implements LockManagerService {
             Optional<Lock> result = tx.read(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier).get();
             if (!result.isPresent()) {
                 LOG.debug("{} is already unlocked", lockName);
-                return;
+                tx.cancel();
+            } else {
+                tx.delete(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier);
+                tx.submit().get();
             }
-            tx.delete(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier);
-            CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
-            futures.get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("In unlock unable to unlock: {}. Reason :", lockName, e);
         }
@@ -220,11 +218,12 @@ public class LockManager implements LockManagerService {
             if (!result.isPresent()) {
                 LOG.debug("Writing lock lockData {}", lockData);
                 tx.put(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier, lockData, true);
-                CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
-                futures.get();
+                tx.submit().get();
                 return true;
+            } else {
+                tx.cancel();
+                return false;
             }
-            return false;
         }
     }
 }