BUG-5280: refactor CohortEntry
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / ShardTransactionFactory.java
index 9637646fc554207746aba1db325eca26de74fbfa..ecfd2aa50d8375ac3cc184eaf1e55a383bc85df5 100644 (file)
@@ -9,9 +9,12 @@ package org.opendaylight.controller.cluster.datastore;
 
 import akka.actor.ActorRef;
 import akka.actor.UntypedActorContext;
-import org.opendaylight.controller.cluster.datastore.identifiers.ShardTransactionIdentifier;
+import com.google.common.base.Preconditions;
+import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
+import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier;
+import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransaction;
 
 /**
  * A factory for creating ShardTransaction actors.
@@ -20,16 +23,16 @@ import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransaction;
  */
 class ShardTransactionActorFactory {
 
-    private final DOMTransactionFactory domTransactionFactory;
+    private final ShardDataTree dataTree;
     private final DatastoreContext datastoreContext;
     private final String txnDispatcherPath;
     private final ShardStats shardMBean;
     private final UntypedActorContext actorContext;
     private final ActorRef shardActor;
 
-    ShardTransactionActorFactory(DOMTransactionFactory domTransactionFactory, DatastoreContext datastoreContext,
+    ShardTransactionActorFactory(ShardDataTree dataTree, DatastoreContext datastoreContext,
             String txnDispatcherPath, ActorRef shardActor, UntypedActorContext actorContext, ShardStats shardMBean) {
-        this.domTransactionFactory = domTransactionFactory;
+        this.dataTree = Preconditions.checkNotNull(dataTree);
         this.datastoreContext = datastoreContext;
         this.txnDispatcherPath = txnDispatcherPath;
         this.shardMBean = shardMBean;
@@ -37,14 +40,42 @@ class ShardTransactionActorFactory {
         this.shardActor = shardActor;
     }
 
-    ActorRef newShardTransaction(TransactionProxy.TransactionType type, ShardTransactionIdentifier transactionID,
-            String transactionChainID, short clientVersion) {
+    private static String actorNameFor(final TransactionIdentifier txId) {
+        final LocalHistoryIdentifier historyId = txId.getHistoryId();
+        final ClientIdentifier clientId = historyId.getClientId();
+        final FrontendIdentifier frontendId = clientId.getFrontendId();
 
-        DOMStoreTransaction transaction = domTransactionFactory.newTransaction(type, transactionID.toString(),
-                transactionChainID);
+        final StringBuilder sb = new StringBuilder("shard-");
+        sb.append(frontendId.getMemberName().getName()).append(':');
+        sb.append(frontendId.getClientType().getName()).append('@');
+        sb.append(clientId.getGeneration()).append(':');
+        if (historyId.getHistoryId() != 0) {
+            sb.append(historyId.getHistoryId()).append('-');
+        }
 
-        return actorContext.actorOf(ShardTransaction.props(transaction, shardActor, datastoreContext, shardMBean,
-                transactionID.getRemoteTransactionId(), clientVersion).withDispatcher(txnDispatcherPath),
-                transactionID.toString());
+        return sb.append(txId.getTransactionId()).toString();
+    }
+
+    ActorRef newShardTransaction(TransactionType type, TransactionIdentifier transactionID) {
+        final AbstractShardDataTreeTransaction<?> transaction;
+        switch (type) {
+        case READ_ONLY:
+            transaction = dataTree.newReadOnlyTransaction(transactionID);
+            shardMBean.incrementReadOnlyTransactionCount();
+            break;
+        case READ_WRITE:
+            transaction = dataTree.newReadWriteTransaction(transactionID);
+            shardMBean.incrementReadWriteTransactionCount();
+            break;
+        case WRITE_ONLY:
+            transaction = dataTree.newReadWriteTransaction(transactionID);
+            shardMBean.incrementWriteOnlyTransactionCount();
+            break;
+        default:
+            throw new IllegalArgumentException("Unsupported transaction type " + type);
+        }
+
+        return actorContext.actorOf(ShardTransaction.props(type, transaction, shardActor, datastoreContext, shardMBean)
+            .withDispatcher(txnDispatcherPath), actorNameFor(transactionID));
     }
 }