X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardTransactionChain.java;h=484bd54a0743616ebb3fdb3bd95f0c1c253b1996;hp=79aaa86b28baaa71f161dceca0d56f59528d94a1;hb=c33b2b55b2eae406df001619885a0610800cb951;hpb=e55942fd1fcc4748197146b81f7497256de22a94 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java index 79aaa86b28..484bd54a07 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionChain.java @@ -10,45 +10,109 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.Props; -import akka.actor.UntypedActor; import akka.japi.Creator; + +import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChain; import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionChainReply; import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionReply; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; /** * The ShardTransactionChain Actor represents a remote TransactionChain */ -public class ShardTransactionChain extends UntypedActor{ - - private final DOMStoreTransactionChain chain; - - public ShardTransactionChain(DOMStoreTransactionChain chain) { - this.chain = chain; - } - - @Override - public void onReceive(Object message) throws Exception { - if(message instanceof CreateTransaction){ - DOMStoreReadWriteTransaction transaction = chain.newReadWriteTransaction(); - ActorRef transactionActor = getContext().actorOf(ShardTransaction.props(transaction, getContext().parent())); - getSender().tell(new CreateTransactionReply(transactionActor.path()), getSelf()); - } else if (message instanceof CloseTransactionChain){ - chain.close(); - getSender().tell(new CloseTransactionChainReply(), getSelf()); +public class ShardTransactionChain extends AbstractUntypedActor { + + private final DOMStoreTransactionChain chain; + private final DatastoreContext datastoreContext; + private final SchemaContext schemaContext; + private final ShardStats shardStats; + + public ShardTransactionChain(DOMStoreTransactionChain chain, SchemaContext schemaContext, + DatastoreContext datastoreContext, ShardStats shardStats) { + this.chain = chain; + this.datastoreContext = datastoreContext; + this.schemaContext = schemaContext; + this.shardStats = shardStats; + } + + @Override + public void handleReceive(Object message) throws Exception { + if (message.getClass().equals(CreateTransaction.SERIALIZABLE_CLASS)) { + CreateTransaction createTransaction = CreateTransaction.fromSerializable( message); + createTransaction(createTransaction); + } else if (message.getClass().equals(CloseTransactionChain.SERIALIZABLE_CLASS)) { + chain.close(); + getSender().tell(new CloseTransactionChainReply().toSerializable(), getSelf()); + }else{ + unknownMessage(message); + } + } + + private ActorRef getShardActor(){ + return getContext().parent(); + } + + private ActorRef createTypedTransactionActor(CreateTransaction createTransaction, + String transactionId) { + if(createTransaction.getTransactionType() == + TransactionProxy.TransactionType.READ_ONLY.ordinal()) { + return getContext().actorOf( + ShardTransaction.props( chain.newReadOnlyTransaction(), getShardActor(), + schemaContext, datastoreContext, shardStats), transactionId); + } else if (createTransaction.getTransactionType() == + TransactionProxy.TransactionType.READ_WRITE.ordinal()) { + return getContext().actorOf( + ShardTransaction.props( chain.newReadWriteTransaction(), getShardActor(), + schemaContext, datastoreContext, shardStats), transactionId); + } else if (createTransaction.getTransactionType() == + TransactionProxy.TransactionType.WRITE_ONLY.ordinal()) { + return getContext().actorOf( + ShardTransaction.props( chain.newWriteOnlyTransaction(), getShardActor(), + schemaContext, datastoreContext, shardStats), transactionId); + } else { + throw new IllegalArgumentException ( + "CreateTransaction message has unidentified transaction type=" + + createTransaction.getTransactionType()); + } } - } - public static Props props(final DOMStoreTransactionChain chain){ - return Props.create(new Creator(){ + private void createTransaction(CreateTransaction createTransaction) { - @Override - public ShardTransactionChain create() throws Exception { - return new ShardTransactionChain(chain); - } - }); - } + ActorRef transactionActor = createTypedTransactionActor(createTransaction, "shard-" + createTransaction.getTransactionId()); + getSender() + .tell(new CreateTransactionReply(transactionActor.path().toString(),createTransaction.getTransactionId()).toSerializable(), + getSelf()); + } + + public static Props props(DOMStoreTransactionChain chain, SchemaContext schemaContext, + DatastoreContext datastoreContext, ShardStats shardStats) { + return Props.create(new ShardTransactionChainCreator(chain, schemaContext, + datastoreContext, shardStats)); + } + + private static class ShardTransactionChainCreator implements Creator { + private static final long serialVersionUID = 1L; + + final DOMStoreTransactionChain chain; + final DatastoreContext datastoreContext; + final SchemaContext schemaContext; + final ShardStats shardStats; + + + ShardTransactionChainCreator(DOMStoreTransactionChain chain, SchemaContext schemaContext, + DatastoreContext datastoreContext, ShardStats shardStats) { + this.chain = chain; + this.datastoreContext = datastoreContext; + this.schemaContext = schemaContext; + this.shardStats = shardStats; + } + + @Override + public ShardTransactionChain create() throws Exception { + return new ShardTransactionChain(chain, schemaContext, datastoreContext, shardStats); + } + } }