Migrate use of AbstractDOMStoreTransaction
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / ClientBackedTransactionChain.java
index db30372676c43057749ae11d157901eaa77978d3..3893dbd21f89f2363cfe3f424e150682728669be 100644 (file)
@@ -7,19 +7,22 @@
  */
 package org.opendaylight.controller.cluster.databroker;
 
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.WeakHashMap;
-import javax.annotation.concurrent.GuardedBy;
+import org.checkerframework.checker.lock.qual.GuardedBy;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 import org.opendaylight.controller.cluster.databroker.actors.dds.AbstractClientHandle;
 import org.opendaylight.controller.cluster.databroker.actors.dds.ClientLocalHistory;
 import org.opendaylight.controller.cluster.databroker.actors.dds.ClientSnapshot;
 import org.opendaylight.controller.cluster.databroker.actors.dds.ClientTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,34 +38,43 @@ final class ClientBackedTransactionChain implements DOMStoreTransactionChain {
     private final Map<AbstractClientHandle<?>, Boolean> openSnapshots = new WeakHashMap<>();
 
     private final ClientLocalHistory history;
+    private final boolean debugAllocation;
 
-    ClientBackedTransactionChain(final ClientLocalHistory history) {
-        this.history = Preconditions.checkNotNull(history);
+    ClientBackedTransactionChain(final ClientLocalHistory history, final boolean debugAllocation) {
+        this.history = requireNonNull(history);
+        this.debugAllocation = debugAllocation;
     }
 
     @Override
     public DOMStoreReadTransaction newReadOnlyTransaction() {
-        return new ClientBackedReadTransaction(createSnapshot(), this);
+        return new ClientBackedReadTransaction(createSnapshot(), this, allocationContext());
     }
 
     @Override
     public DOMStoreReadWriteTransaction newReadWriteTransaction() {
-        return new ClientBackedReadWriteTransaction(createTransaction());
+        return new ClientBackedReadWriteTransaction(createTransaction(), allocationContext());
     }
 
     @Override
     public DOMStoreWriteTransaction newWriteOnlyTransaction() {
-        return new ClientBackedWriteTransaction(createTransaction());
+        return new ClientBackedWriteTransaction(createTransaction(), allocationContext());
     }
 
     @Override
     public synchronized void close() {
+        final List<TransactionIdentifier> abortedSnapshots = new ArrayList<>();
         for (AbstractClientHandle<?> snap : openSnapshots.keySet()) {
-            LOG.warn("Aborting unclosed transaction {}", snap.getIdentifier());
-            snap.abort();
+            final TransactionIdentifier id = snap.getIdentifier();
+            LOG.debug("Aborting recorded transaction {}", id);
+            if (snap.abort()) {
+                abortedSnapshots.add(id);
+            }
         }
         openSnapshots.clear();
 
+        if (!abortedSnapshots.isEmpty()) {
+            LOG.warn("Aborted unclosed transactions {}", abortedSnapshots, new Throwable("at"));
+        }
         history.close();
     }
 
@@ -71,19 +83,15 @@ final class ClientBackedTransactionChain implements DOMStoreTransactionChain {
     }
 
     private ClientSnapshot createSnapshot() {
-        try {
-            return recordSnapshot(history.takeSnapshot());
-        } catch (org.opendaylight.mdsal.common.api.TransactionChainClosedException e) {
-            throw new TransactionChainClosedException("Transaction chain has been closed", e);
-        }
+        return recordSnapshot(history.takeSnapshot());
     }
 
     private ClientTransaction createTransaction() {
-        try {
-            return recordSnapshot(history.createTransaction());
-        } catch (org.opendaylight.mdsal.common.api.TransactionChainClosedException e) {
-            throw new TransactionChainClosedException("Transaction chain has been closed", e);
-        }
+        return recordSnapshot(history.createTransaction());
+    }
+
+    private Throwable allocationContext() {
+        return debugAllocation ? new Throwable("allocated at") : null;
     }
 
     private synchronized <T extends AbstractClientHandle<?>> T recordSnapshot(final T snapshot) {