From 3f66261afc4269c546b4ece9c1e6bda9b460272c Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Sat, 10 Oct 2015 18:44:17 -0700 Subject: [PATCH] Pass in EntityOwnerSelectionStrategyConfig when constructing EntityOwnershipShard Change-Id: I56c2f4f87c61e81b662cd0b30c60775389e9b9a3 Signed-off-by: Moiz Raja --- .../DistributedEntityOwnershipService.java | 3 +- .../entityownership/EntityOwnershipShard.java | 26 ++++++--------- .../EntityOwnershipShardPropsCreator.java | 9 ++++-- ...DistributedEntityOwnershipServiceTest.java | 5 +-- .../EntityOwnershipShardTest.java | 32 ++++++++++++------- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipService.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipService.java index 09c4e50335..025e54c180 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipService.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipService.java @@ -28,6 +28,7 @@ import org.opendaylight.controller.cluster.datastore.entityownership.messages.Re import org.opendaylight.controller.cluster.datastore.entityownership.messages.RegisterListenerLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterCandidateLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterListenerLocal; +import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.EntityOwnerSelectionStrategyConfig; import org.opendaylight.controller.cluster.datastore.messages.CreateShard; import org.opendaylight.controller.cluster.datastore.messages.GetShardDataTree; import org.opendaylight.controller.cluster.datastore.shardstrategy.ModuleShardStrategy; @@ -218,7 +219,7 @@ public class DistributedEntityOwnershipService implements EntityOwnershipService } protected EntityOwnershipShardPropsCreator newShardPropsCreator() { - return new EntityOwnershipShardPropsCreator(datastore.getActorContext().getCurrentMemberName()); + return new EntityOwnershipShardPropsCreator(datastore.getActorContext().getCurrentMemberName(), EntityOwnerSelectionStrategyConfig.newBuilder().build()); } @VisibleForTesting diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java index 3d16ecf4ff..b98255635a 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java @@ -28,7 +28,6 @@ import akka.actor.ActorSelection; import akka.actor.Cancellable; import akka.actor.Props; import akka.pattern.Patterns; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.base.Strings; import java.util.ArrayList; @@ -89,12 +88,13 @@ class EntityOwnershipShard extends Shard { } protected EntityOwnershipShard(ShardIdentifier name, Map peerAddresses, - DatastoreContext datastoreContext, SchemaContext schemaContext, String localMemberName) { + DatastoreContext datastoreContext, SchemaContext schemaContext, String localMemberName, + EntityOwnerSelectionStrategyConfig strategyConfig) { super(name, peerAddresses, noPersistenceDatastoreContext(datastoreContext), schemaContext); this.localMemberName = localMemberName; this.commitCoordinator = new EntityOwnershipShardCommitCoordinator(localMemberName, LOG); this.listenerSupport = new EntityOwnershipListenerSupport(getContext(), persistenceId()); - this.strategyConfig = EntityOwnerSelectionStrategyConfig.newBuilder().build(); + this.strategyConfig = strategyConfig; for(String peerId: peerAddresses.keySet()) { ShardIdentifier shardId = ShardIdentifier.builder().fromShardIdString(peerId).build(); @@ -493,35 +493,29 @@ class EntityOwnershipShard extends Shard { return null; } - @VisibleForTesting - void addEntityOwnerSelectionStrategy(String entityType, - Class clazz, - long delay){ - EntityOwnerSelectionStrategyConfig config = EntityOwnerSelectionStrategyConfig.newBuilder() - .addStrategy(entityType, clazz, delay).build(); - this.strategyConfig = config; - } - public static Props props(final ShardIdentifier name, final Map peerAddresses, - final DatastoreContext datastoreContext, final SchemaContext schemaContext, final String localMemberName) { - return Props.create(new Creator(name, peerAddresses, datastoreContext, schemaContext, localMemberName)); + final DatastoreContext datastoreContext, final SchemaContext schemaContext, + final String localMemberName, final EntityOwnerSelectionStrategyConfig strategyConfig) { + return Props.create(new Creator(name, peerAddresses, datastoreContext, schemaContext, localMemberName, strategyConfig)); } private static class Creator extends AbstractShardCreator { private static final long serialVersionUID = 1L; private final String localMemberName; + private final EntityOwnerSelectionStrategyConfig strategyConfig; Creator(final ShardIdentifier name, final Map peerAddresses, final DatastoreContext datastoreContext, final SchemaContext schemaContext, - final String localMemberName) { + final String localMemberName, EntityOwnerSelectionStrategyConfig strategyConfig) { super(name, peerAddresses, datastoreContext, schemaContext); this.localMemberName = localMemberName; + this.strategyConfig = strategyConfig; } @Override public Shard create() throws Exception { - return new EntityOwnershipShard(name, peerAddresses, datastoreContext, schemaContext, localMemberName); + return new EntityOwnershipShard(name, peerAddresses, datastoreContext, schemaContext, localMemberName, strategyConfig); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardPropsCreator.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardPropsCreator.java index a00f514d79..893a1d4d31 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardPropsCreator.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardPropsCreator.java @@ -11,6 +11,7 @@ import akka.actor.Props; import java.util.Map; import org.opendaylight.controller.cluster.datastore.DatastoreContext; import org.opendaylight.controller.cluster.datastore.ShardPropsCreator; +import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.EntityOwnerSelectionStrategyConfig; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -21,14 +22,18 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; */ class EntityOwnershipShardPropsCreator implements ShardPropsCreator { private final String localMemberName; + private final EntityOwnerSelectionStrategyConfig strategyConfig; - EntityOwnershipShardPropsCreator(String localMemberName) { + EntityOwnershipShardPropsCreator(String localMemberName, EntityOwnerSelectionStrategyConfig strategyConfig) { this.localMemberName = localMemberName; + this.strategyConfig = strategyConfig; } @Override public Props newProps(ShardIdentifier shardId, Map peerAddresses, DatastoreContext datastoreContext, SchemaContext schemaContext) { - return EntityOwnershipShard.props(shardId, peerAddresses, datastoreContext, schemaContext, localMemberName); + return EntityOwnershipShard.props(shardId, peerAddresses, datastoreContext, schemaContext, localMemberName, + strategyConfig); } + } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipServiceTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipServiceTest.java index 5591772afc..9d6337daa9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipServiceTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/DistributedEntityOwnershipServiceTest.java @@ -45,6 +45,7 @@ import org.opendaylight.controller.cluster.datastore.entityownership.messages.Re import org.opendaylight.controller.cluster.datastore.entityownership.messages.RegisterListenerLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterCandidateLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterListenerLocal; +import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.EntityOwnerSelectionStrategyConfig; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.messages.GetShardDataTree; import org.opendaylight.controller.cluster.datastore.utils.MockClusterWrapper; @@ -315,7 +316,7 @@ public class DistributedEntityOwnershipServiceTest extends AbstractEntityOwnersh static class TestShardPropsCreator extends EntityOwnershipShardPropsCreator { TestShardPropsCreator() { - super("member-1"); + super("member-1", EntityOwnerSelectionStrategyConfig.newBuilder().build()); } private final AtomicReference messageReceived = new AtomicReference<>(); @@ -359,7 +360,7 @@ public class DistributedEntityOwnershipServiceTest extends AbstractEntityOwnersh DatastoreContext datastoreContext, SchemaContext schemaContext, String localMemberName, AtomicReference> messageClass, AtomicReference messageReceived, AtomicReference receivedMessage, AtomicReference dataTree) { - super(name, peerAddresses, datastoreContext, schemaContext, localMemberName); + super(name, peerAddresses, datastoreContext, schemaContext, localMemberName, EntityOwnerSelectionStrategyConfig.newBuilder().build()); this.messageClass = messageClass; this.messageReceived = messageReceived; this.receivedMessage = receivedMessage; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java index 2af774b09c..2b188924b2 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java @@ -48,6 +48,7 @@ import org.opendaylight.controller.cluster.datastore.entityownership.messages.Re import org.opendaylight.controller.cluster.datastore.entityownership.messages.RegisterListenerLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterCandidateLocal; import org.opendaylight.controller.cluster.datastore.entityownership.messages.UnregisterListenerLocal; +import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.EntityOwnerSelectionStrategyConfig; import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.LastCandidateSelectionStrategy; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.messages.BatchedModifications; @@ -405,15 +406,15 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { TestActorRef peer1 = actorFactory.createTestActor(newShardProps(peerId1, ImmutableMap.builder().put(leaderId.toString(), ""). put(peerId2.toString(), "").build(), - peerMemberName1).withDispatcher(Dispatchers.DefaultDispatcherId()), peerId1.toString()); + peerMemberName1, EntityOwnerSelectionStrategyConfig.newBuilder().build()).withDispatcher(Dispatchers.DefaultDispatcherId()), peerId1.toString()); TestActorRef peer2 = actorFactory.createTestActor(newShardProps(peerId2, ImmutableMap.builder().put(leaderId.toString(), ""). put(peerId1.toString(), "").build(), - peerMemberName2). withDispatcher(Dispatchers.DefaultDispatcherId()), peerId2.toString()); + peerMemberName2, EntityOwnerSelectionStrategyConfig.newBuilder().build()). withDispatcher(Dispatchers.DefaultDispatcherId()), peerId2.toString()); TestActorRef leader = actorFactory.createTestActor(newShardProps(leaderId, ImmutableMap.builder().put(peerId1.toString(), peer1.path().toString()). - put(peerId2.toString(), peer2.path().toString()).build(), LOCAL_MEMBER_NAME). + put(peerId2.toString(), peer2.path().toString()).build(), LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()). withDispatcher(Dispatchers.DefaultDispatcherId()), leaderId.toString()); leader.tell(new ElectionTimeout(), leader); @@ -498,7 +499,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { peer2 = actorFactory.createTestActor(newShardProps(peerId2, ImmutableMap.builder().put(leaderId.toString(), ""). put(peerId1.toString(), "").build(), - peerMemberName2). withDispatcher(Dispatchers.DefaultDispatcherId()), peerId2.toString()); + peerMemberName2, EntityOwnerSelectionStrategyConfig.newBuilder().build()). withDispatcher(Dispatchers.DefaultDispatcherId()), peerId2.toString()); leader.tell(new PeerUp(peerMemberName2, peerId2.toString()), ActorRef.noSender()); // Send PeerUp again - should be noop leader.tell(new PeerUp(peerMemberName2, peerId2.toString()), ActorRef.noSender()); @@ -539,7 +540,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { peer1 = actorFactory.createTestActor(newShardProps(peerId1, ImmutableMap.builder().put(leaderId.toString(), ""). put(peerId2.toString(), "").build(), - peerMemberName1).withDispatcher(Dispatchers.DefaultDispatcherId()), peerId1.toString()); + peerMemberName1, EntityOwnerSelectionStrategyConfig.newBuilder().build()).withDispatcher(Dispatchers.DefaultDispatcherId()), peerId1.toString()); leader.tell(new PeerUp(peerMemberName1, peerId1.toString()), ActorRef.noSender()); verifyOwner(leader, ENTITY_TYPE, ENTITY_ID4, ""); @@ -588,7 +589,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { TestActorRef leader = actorFactory.createTestActor(newShardProps(leaderId, ImmutableMap.builder().put(localId.toString(), shard.path().toString()).build(), - LOCAL_MEMBER_NAME).withDispatcher(Dispatchers.DefaultDispatcherId()), leaderId.toString()); + LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()).withDispatcher(Dispatchers.DefaultDispatcherId()), leaderId.toString()); leader.tell(new ElectionTimeout(), leader); kit.waitUntilLeader(leader); @@ -803,13 +804,19 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { return newShardProps(Collections.emptyMap()); } + private Props newShardProps(EntityOwnerSelectionStrategyConfig strategyConfig) { + return newShardProps(newShardId(LOCAL_MEMBER_NAME), Collections.emptyMap(), + LOCAL_MEMBER_NAME, strategyConfig); + } + private Props newShardProps(Map peers) { - return newShardProps(newShardId(LOCAL_MEMBER_NAME), peers, LOCAL_MEMBER_NAME); + return newShardProps(newShardId(LOCAL_MEMBER_NAME), peers, LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()); } - private Props newShardProps(ShardIdentifier shardId, Map peers, String memberName) { + private Props newShardProps(ShardIdentifier shardId, Map peers, String memberName, + EntityOwnerSelectionStrategyConfig strategyConfig) { return EntityOwnershipShard.props(shardId, peers, dataStoreContextBuilder.build(), - SCHEMA_CONTEXT, memberName); + SCHEMA_CONTEXT, memberName, strategyConfig); } private ShardIdentifier newShardId(String memberName) { @@ -821,7 +828,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { TestEntityOwnershipShard(ShardIdentifier name, Map peerAddresses, DatastoreContext datastoreContext) { - super(name, peerAddresses, datastoreContext, SCHEMA_CONTEXT, LOCAL_MEMBER_NAME); + super(name, peerAddresses, datastoreContext, SCHEMA_CONTEXT, LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()); } @Override @@ -875,8 +882,9 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { @Test public void testDelayedEntityOwnerSelection() throws Exception { ShardTestKit kit = new ShardTestKit(getSystem()); - TestActorRef shard = actorFactory.createTestActor(newShardProps()); - shard.underlyingActor().addEntityOwnerSelectionStrategy(ENTITY_TYPE, LastCandidateSelectionStrategy.class, 500); + EntityOwnerSelectionStrategyConfig.Builder builder + = EntityOwnerSelectionStrategyConfig.newBuilder().addStrategy(ENTITY_TYPE, LastCandidateSelectionStrategy.class, 500); + TestActorRef shard = actorFactory.createTestActor(newShardProps(builder.build())); kit.waitUntilLeader(shard); Entity entity = new Entity(ENTITY_TYPE, ENTITY_ID1); -- 2.36.6