Do not leak DataTree from backend actor
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / TransactionChainProxy.java
index 1e5f58fcfed2dc3bf638fa1acd320836d1570f99..c3b81d7e15730c338669757e22338ef816938ee1 100644 (file)
@@ -18,17 +18,16 @@ import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-import javax.annotation.Nonnull;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChain;
 import org.opendaylight.controller.cluster.datastore.messages.PrimaryShardInfo;
-import org.opendaylight.mdsal.common.api.TransactionChainClosedException;
+import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException;
 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.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.ReadOnlyDataTree;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import scala.concurrent.Future;
@@ -114,7 +113,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
     private static final State CLOSED_STATE = new DefaultState() {
         @Override
         void checkReady() {
-            throw new TransactionChainClosedException("Transaction chain has been closed");
+            throw new DOMTransactionChainClosedException("Transaction chain has been closed");
         }
     };
 
@@ -148,7 +147,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
             new ConcurrentHashMap<>();
 
     TransactionChainProxy(final TransactionContextFactory parent, final LocalHistoryIdentifier historyId) {
-        super(parent.getActorContext(), historyId);
+        super(parent.getActorUtils(), historyId);
         this.parent = parent;
     }
 
@@ -162,13 +161,13 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
 
     @Override
     public DOMStoreReadWriteTransaction newReadWriteTransaction() {
-        getActorContext().acquireTxCreationPermit();
+        getActorUtils().acquireTxCreationPermit();
         return allocateWriteTransaction(TransactionType.READ_WRITE);
     }
 
     @Override
     public DOMStoreWriteTransaction newWriteOnlyTransaction() {
-        getActorContext().acquireTxCreationPermit();
+        getActorUtils().acquireTxCreationPermit();
         return allocateWriteTransaction(TransactionType.WRITE_ONLY);
     }
 
@@ -178,7 +177,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
 
         // Send a close transaction chain request to each and every shard
 
-        getActorContext().broadcast(version -> new CloseTransactionChain(getHistoryId(), version).toSerializable(),
+        getActorUtils().broadcast(version -> new CloseTransactionChain(getHistoryId(), version).toSerializable(),
                 CloseTransactionChain.class);
     }
 
@@ -193,7 +192,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
 
     @Override
     protected LocalTransactionChain factoryForShard(final String shardName, final ActorSelection shardLeader,
-            final DataTree dataTree) {
+            final ReadOnlyDataTree dataTree) {
         final LocalTransactionChain ret = new LocalTransactionChain(this, shardLeader, dataTree);
         LOG.debug("Allocated transaction chain {} for shard {} leader {}", ret, shardName, shardLeader);
         return ret;
@@ -249,7 +248,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
             }
         };
 
-        previous.onComplete(onComplete, getActorContext().getClientDispatcher());
+        previous.onComplete(onComplete, getActorUtils().getClientDispatcher());
         return returnPromise.future();
     }
 
@@ -269,7 +268,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
             }
 
             Future<Iterable<Object>> combinedFutures = Futures.sequence(priorReadOnlyTxFutures,
-                    getActorContext().getClientDispatcher());
+                    getActorUtils().getClientDispatcher());
 
             final Promise<T> returnPromise = Futures.promise();
             final OnComplete<Iterable<Object>> onComplete = new OnComplete<Iterable<Object>>() {
@@ -282,7 +281,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
                 }
             };
 
-            combinedFutures.onComplete(onComplete, getActorContext().getClientDispatcher());
+            combinedFutures.onComplete(onComplete, getActorUtils().getClientDispatcher());
             return returnPromise.future();
         } else {
             return future;
@@ -306,7 +305,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
         }
 
         // Combine the ready Futures into 1
-        final Future<Iterable<T>> combined = Futures.sequence(cohortFutures, getActorContext().getClientDispatcher());
+        final Future<Iterable<T>> combined = Futures.sequence(cohortFutures, getActorUtils().getClientDispatcher());
 
         // Record the we have outstanding futures
         final State newState = new Submitted(transaction, combined);
@@ -319,11 +318,11 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory<Loca
             public void onComplete(final Throwable arg0, final Iterable<T> arg1) {
                 STATE_UPDATER.compareAndSet(TransactionChainProxy.this, newState, IDLE_STATE);
             }
-        }, getActorContext().getClientDispatcher());
+        }, getActorUtils().getClientDispatcher());
     }
 
     @Override
-    protected void onTransactionContextCreated(@Nonnull TransactionIdentifier transactionId) {
+    protected void onTransactionContextCreated(TransactionIdentifier transactionId) {
         Promise<Object> promise = priorReadOnlyTxPromises.remove(transactionId);
         if (promise != null) {
             promise.success(null);