From: Moiz Raja Date: Tue, 8 Jul 2014 19:44:05 +0000 (-0700) Subject: Store schemaContext in ActorContext so that all proxy objects can have access to it X-Git-Tag: release/helium~411 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=40d9485acea90c26af4658ab3e90f969bd476f60 Store schemaContext in ActorContext so that all proxy objects can have access to it Use it for MergeData and WriteData message construction Change-Id: I20df92fc77c41016df7cc6f737226368b25b5a0f Signed-off-by: Moiz Raja --- diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java index 4401104a85..10bcd30105 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java @@ -44,6 +44,9 @@ public class DistributedDataStore implements DOMStore, SchemaContextListener, Au private final String type; private final ActorContext actorContext; + private SchemaContext schemaContext; + + /** * Executor used to run FutureTask's @@ -88,28 +91,29 @@ public class DistributedDataStore implements DOMStore, SchemaContextListener, Au @Override public DOMStoreTransactionChain createTransactionChain() { - return new TransactionChainProxy(actorContext, executor); + return new TransactionChainProxy(actorContext, executor, schemaContext); } @Override public DOMStoreReadTransaction newReadOnlyTransaction() { return new TransactionProxy(actorContext, TransactionProxy.TransactionType.READ_ONLY, - executor); + executor, schemaContext); } @Override public DOMStoreWriteTransaction newWriteOnlyTransaction() { return new TransactionProxy(actorContext, TransactionProxy.TransactionType.WRITE_ONLY, - executor); + executor, schemaContext); } @Override public DOMStoreReadWriteTransaction newReadWriteTransaction() { return new TransactionProxy(actorContext, TransactionProxy.TransactionType.READ_WRITE, - executor); + executor, schemaContext); } @Override public void onGlobalContextUpdated(SchemaContext schemaContext) { + this.schemaContext = schemaContext; actorContext.getShardManager().tell( new UpdateSchemaContext(schemaContext), null); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java index 250ef49e6f..f55774f091 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java @@ -93,7 +93,7 @@ public class ShardManager extends AbstractUntypedActor { getSender().tell(new PrimaryNotFound(shardName), getSelf()); } } else if(message instanceof UpdateSchemaContext){ - // FIXME : Notify all local shards of a context change + // FIXME : Notify all local shards of a schemaContext change getContext().system().actorSelection(defaultShardPath).forward(message, getContext()); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java index 71b61ffaa0..2e8538d077 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java @@ -13,6 +13,7 @@ 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.yangtools.yang.model.api.SchemaContext; import java.util.concurrent.ExecutorService; @@ -22,28 +23,30 @@ import java.util.concurrent.ExecutorService; public class TransactionChainProxy implements DOMStoreTransactionChain{ private final ActorContext actorContext; private final ExecutorService transactionExecutor; + private final SchemaContext schemaContext; - public TransactionChainProxy(ActorContext actorContext, ExecutorService transactionExecutor) { + public TransactionChainProxy(ActorContext actorContext, ExecutorService transactionExecutor, SchemaContext schemaContext) { this.actorContext = actorContext; this.transactionExecutor = transactionExecutor; + this.schemaContext = schemaContext; } @Override public DOMStoreReadTransaction newReadOnlyTransaction() { return new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, schemaContext); } @Override public DOMStoreReadWriteTransaction newReadWriteTransaction() { return new TransactionProxy(actorContext, - TransactionProxy.TransactionType.WRITE_ONLY, transactionExecutor); + TransactionProxy.TransactionType.WRITE_ONLY, transactionExecutor, schemaContext); } @Override public DOMStoreWriteTransaction newWriteOnlyTransaction() { return new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_WRITE, transactionExecutor); + TransactionProxy.TransactionType.READ_WRITE, transactionExecutor, schemaContext); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java index d3f209b522..9a77d1308e 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionProxy.java @@ -15,7 +15,6 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFutureTask; import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; -import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages.CreateTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.DeleteData; import org.opendaylight.controller.cluster.datastore.messages.MergeData; import org.opendaylight.controller.cluster.datastore.messages.ReadData; @@ -24,10 +23,12 @@ import org.opendaylight.controller.cluster.datastore.messages.ReadyTransaction; import org.opendaylight.controller.cluster.datastore.messages.ReadyTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.WriteData; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; +import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages.CreateTransactionReply; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction; import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; import java.util.ArrayList; import java.util.HashMap; @@ -63,17 +64,20 @@ public class TransactionProxy implements DOMStoreReadWriteTransaction { private final Map remoteTransactionPaths = new HashMap<>(); private final String identifier; private final ExecutorService executor; + private final SchemaContext schemaContext; public TransactionProxy( ActorContext actorContext, TransactionType transactionType, - ExecutorService executor + ExecutorService executor, + SchemaContext schemaContext ) { this.identifier = "txn-" + counter.getAndIncrement(); this.transactionType = transactionType; this.actorContext = actorContext; this.executor = executor; + this.schemaContext = schemaContext; Object response = actorContext.executeShardOperation(Shard.DEFAULT_NAME, new CreateTransaction(identifier), ActorContext.ASK_DURATION); if(response instanceof CreateTransactionReply){ @@ -116,13 +120,13 @@ public class TransactionProxy implements DOMStoreReadWriteTransaction { @Override public void write(InstanceIdentifier path, NormalizedNode data) { final ActorSelection remoteTransaction = remoteTransactionFromIdentifier(path); - remoteTransaction.tell(new WriteData(path, data), null); + remoteTransaction.tell(new WriteData(path, data, schemaContext), null); } @Override public void merge(InstanceIdentifier path, NormalizedNode data) { final ActorSelection remoteTransaction = remoteTransactionFromIdentifier(path); - remoteTransaction.tell(new MergeData(path, data), null); + remoteTransaction.tell(new MergeData(path, data, schemaContext), null); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java index 75d1e95c1e..5ab7741966 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/MergeData.java @@ -8,11 +8,33 @@ package org.opendaylight.controller.cluster.datastore.messages; +import org.opendaylight.controller.cluster.datastore.node.NormalizedNodeToNodeCodec; +import org.opendaylight.controller.cluster.datastore.utils.InstanceIdentifierUtils; +import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public class MergeData extends ModifyData { - public MergeData(InstanceIdentifier path, NormalizedNode data) { - super(path, data); - } +public class MergeData extends ModifyData{ + public MergeData(InstanceIdentifier path, NormalizedNode data, + SchemaContext context) { + super(path, data, context); + } + + @Override public Object toSerializable() { + return ShardTransactionMessages.MergeData.newBuilder() + .setInstanceIdentifierPathArguments(InstanceIdentifierUtils.getParentPath(path.toString())) + .setNormalizedNode(new NormalizedNodeToNodeCodec(schemaContext).encode(path, data).getNormalizedNode()).build(); + } + + public static MergeData fromSerializable(Object serializable, SchemaContext schemaContext){ + ShardTransactionMessages.MergeData o = (ShardTransactionMessages.MergeData) serializable; + InstanceIdentifier identifier = InstanceIdentifierUtils.from(o.getInstanceIdentifierPathArguments()); + + NormalizedNode normalizedNode = + new NormalizedNodeToNodeCodec(schemaContext) + .decode(identifier, o.getNormalizedNode()); + + return new MergeData(identifier, normalizedNode, schemaContext); + } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java index da8608876e..cdab30cbdc 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ModifyData.java @@ -8,24 +8,33 @@ package org.opendaylight.controller.cluster.datastore.messages; +import com.google.common.base.Preconditions; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public abstract class ModifyData { - private final InstanceIdentifier path; - private final NormalizedNode data; +public abstract class ModifyData implements SerializableMessage { + protected final InstanceIdentifier path; + protected final NormalizedNode data; + protected final SchemaContext schemaContext; - public ModifyData(InstanceIdentifier path, NormalizedNode data) { - this.path = path; - this.data = data; - } + public ModifyData(InstanceIdentifier path, NormalizedNode data, + SchemaContext context) { + Preconditions.checkNotNull(context, + "Cannot serialize an object which does not have a schema schemaContext"); - public InstanceIdentifier getPath() { - return path; - } - public NormalizedNode getData() { - return data; - } + this.path = path; + this.data = data; + this.schemaContext = context; + } + + public InstanceIdentifier getPath() { + return path; + } + + public NormalizedNode getData() { + return data; + } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java index 1348e65aa3..913da06775 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/WriteData.java @@ -10,10 +10,15 @@ package org.opendaylight.controller.cluster.datastore.messages; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; public class WriteData extends ModifyData{ - public WriteData(InstanceIdentifier path, NormalizedNode data) { - super(path, data); + public WriteData(InstanceIdentifier path, NormalizedNode data, SchemaContext schemaContext) { + super(path, data, schemaContext); } + + @Override public Object toSerializable() { + throw new UnsupportedOperationException("toSerializable"); + } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorContext.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorContext.java index c97e07db6d..3dacec72bf 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorContext.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorContext.java @@ -18,6 +18,7 @@ import org.opendaylight.controller.cluster.datastore.exceptions.PrimaryNotFoundE import org.opendaylight.controller.cluster.datastore.exceptions.TimeoutException; import org.opendaylight.controller.cluster.datastore.messages.FindPrimary; import org.opendaylight.controller.cluster.datastore.messages.PrimaryFound; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Await; @@ -45,6 +46,8 @@ public class ActorContext { private final ActorSystem actorSystem; private final ActorRef shardManager; + private SchemaContext schemaContext = null; + public ActorContext(ActorSystem actorSystem, ActorRef shardManager){ this.actorSystem = actorSystem; this.shardManager = shardManager; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/BasicIntegrationTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/BasicIntegrationTest.java index 8d7f7c87aa..6bef691f98 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/BasicIntegrationTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/BasicIntegrationTest.java @@ -99,7 +99,7 @@ public class BasicIntegrationTest extends AbstractActorTest { final ActorRef transactionActorRef = watchActor(transaction); transaction.tell(new WriteData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)), + ImmutableNodes.containerNode(TestModel.TEST_QNAME), TestModel.createTestContext()), getRef()); Boolean writeDone = new ExpectMsg("WriteDataReply") { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java index 652121132d..28bbdba3ea 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java @@ -169,7 +169,7 @@ public class ShardTransactionTest extends AbstractActorTest { protected void run() { subject.tell(new WriteData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)), + ImmutableNodes.containerNode(TestModel.TEST_QNAME), TestModel.createTestContext()), getRef()); final String out = new ExpectMsg("match hint") { @@ -207,7 +207,7 @@ public class ShardTransactionTest extends AbstractActorTest { protected void run() { subject.tell(new MergeData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)), + ImmutableNodes.containerNode(TestModel.TEST_QNAME), TestModel.createTestContext()), getRef()); final String out = new ExpectMsg("match hint") { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java index fa32c87e8f..4f3a194b0d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java @@ -42,7 +42,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); ListenableFuture>> read = @@ -73,7 +73,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); ListenableFuture>> read = @@ -104,7 +104,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); transactionProxy.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.NAME_QNAME)); @@ -136,7 +136,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); transactionProxy.merge(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.NAME_QNAME)); @@ -168,7 +168,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); transactionProxy.delete(TestModel.TEST_PATH); @@ -199,7 +199,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); DOMStoreThreePhaseCommitCohort ready = transactionProxy.ready(); @@ -222,7 +222,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); Assert.assertNotNull(transactionProxy.getIdentifier()); } @@ -238,7 +238,7 @@ public class TransactionProxyTest extends AbstractActorTest { TransactionProxy transactionProxy = new TransactionProxy(actorContext, - TransactionProxy.TransactionType.READ_ONLY, transactionExecutor); + TransactionProxy.TransactionType.READ_ONLY, transactionExecutor, TestModel.createTestContext()); transactionProxy.close(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockActorContext.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockActorContext.java index fe62516098..f5bb978fff 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockActorContext.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockActorContext.java @@ -55,6 +55,4 @@ public class MockActorContext extends ActorContext { Object executeLocalOperationResponse) { this.executeLocalOperationResponse = executeLocalOperationResponse; } - - }