From: Tom Pantelis Date: Fri, 23 Oct 2015 02:50:20 +0000 (-0400) Subject: Add getPeerIds to RaftActorContext X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=5aa58404a8ee1ad053742780439823309360a3a1 Add getPeerIds to RaftActorContext For upcoming to work to add voting status to the peer info in RaftActorContext, I added a getPeerIds method to replace calls to getPeerAddresses as virtually all callers really just want the IDs or want to check the size. getPeerAddresses will (likely) be removed altogether - this is a preliminary patch. Change-Id: I2b6f2c36dfec14ccd4bbfef35e67ed86cf3e3e45 Signed-off-by: Tom Pantelis --- diff --git a/opendaylight/md-sal/sal-akka-raft-example/src/main/java/org/opendaylight/controller/cluster/example/ExampleActor.java b/opendaylight/md-sal/sal-akka-raft-example/src/main/java/org/opendaylight/controller/cluster/example/ExampleActor.java index aa2b26d9c8..3ce8364fce 100644 --- a/opendaylight/md-sal/sal-akka-raft-example/src/main/java/org/opendaylight/controller/cluster/example/ExampleActor.java +++ b/opendaylight/md-sal/sal-akka-raft-example/src/main/java/org/opendaylight/controller/cluster/example/ExampleActor.java @@ -79,10 +79,10 @@ public class ExampleActor extends RaftActor implements RaftActorRecoveryCohort, if (getRaftState() == RaftState.Leader || getRaftState() == RaftState.IsolatedLeader) { final String followers = ((Leader)this.getCurrentBehavior()).printFollowerStates(); LOG.debug("{} = {}, Peers={}, followers={}", getId(), getRaftState(), - getRaftActorContext().getPeerAddresses().keySet(), followers); + getRaftActorContext().getPeerIds(), followers); } else { LOG.debug("{} = {}, Peers={}", getId(), getRaftState(), - getRaftActorContext().getPeerAddresses().keySet()); + getRaftActorContext().getPeerIds()); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java index c5d81c18cc..2dd3165754 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java @@ -19,7 +19,6 @@ import com.google.common.base.Supplier; import com.google.common.collect.Lists; import java.io.Serializable; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -289,7 +288,7 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor { .snapshotIndex(replicatedLog().getSnapshotIndex()) .snapshotTerm(replicatedLog().getSnapshotTerm()) .votedFor(context.getTermInformation().getVotedFor()) - .peerAddresses(new HashMap<>(context.getPeerAddresses())); + .peerAddresses(context.getPeerAddresses()); ReplicatedLogEntry lastLogEntry = getLastLogEntry(); if (lastLogEntry != null) { diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContext.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContext.java index c4189820b3..0c9d698cd5 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContext.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContext.java @@ -14,6 +14,7 @@ import akka.actor.ActorSystem; import akka.actor.Props; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; +import java.util.Collection; import java.util.Map; import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.raft.policy.RaftPolicy; @@ -103,7 +104,7 @@ public interface RaftActorContext { Logger getLogger(); /** - * @return a mapping of peerId's to their addresses + * @return a copy of the mapping of peerId's to their addresses * */ Map getPeerAddresses(); @@ -118,6 +119,11 @@ public interface RaftActorContext { */ String getPeerAddress(String peerId); + /** + * @return the list of peer IDs. + */ + Collection getPeerIds(); + /** * Add to actor peers * diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java index f0236a1abf..cebf7b3cc6 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java @@ -13,10 +13,15 @@ import akka.actor.ActorSelection; import akka.actor.ActorSystem; import akka.actor.Props; import akka.actor.UntypedActorContext; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; import com.google.common.collect.Maps; + +import java.util.Collection; +import java.util.HashMap; import java.util.Map; + import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.raft.policy.RaftPolicy; import org.slf4j.Logger; @@ -121,15 +126,18 @@ public class RaftActorContextImpl implements RaftActorContext { return lastApplied; } - @Override public void setLastApplied(long lastApplied) { + @Override + public void setLastApplied(long lastApplied) { this.lastApplied = lastApplied; } - @Override public void setReplicatedLog(ReplicatedLog replicatedLog) { + @Override + public void setReplicatedLog(ReplicatedLog replicatedLog) { this.replicatedLog = replicatedLog; } - @Override public ReplicatedLog getReplicatedLog() { + @Override + public ReplicatedLog getReplicatedLog() { return replicatedLog; } @@ -141,8 +149,14 @@ public class RaftActorContextImpl implements RaftActorContext { return this.LOG; } - @Override public Map getPeerAddresses() { - return peerAddresses; + @Override + public Map getPeerAddresses() { + return new HashMap(peerAddresses); + } + + @Override + public Collection getPeerIds() { + return peerAddresses.keySet(); } @Override public String getPeerAddress(String peerId) { @@ -203,7 +217,7 @@ public class RaftActorContextImpl implements RaftActorContext { @Override public boolean hasFollowers() { - return getPeerAddresses().keySet().size() > 0; + return getPeerIds().size() > 0; } @Override diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupport.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupport.java index a00c0241d9..7c8888b9f4 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupport.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupport.java @@ -172,7 +172,7 @@ class RaftActorServerConfigurationSupport { } protected void persistNewServerConfiguration(RaftActor raftActor, ServerOperationContext operationContext){ - List newConfig = new ArrayList(raftContext.getPeerAddresses().keySet()); + List newConfig = new ArrayList(raftContext.getPeerIds()); newConfig.add(raftContext.getId()); LOG.debug("{}: New server configuration : {}", raftContext.getId(), newConfig); diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/SnapshotManager.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/SnapshotManager.java index 8e0d2f820b..26d8c0af08 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/SnapshotManager.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/SnapshotManager.java @@ -108,7 +108,7 @@ public class SnapshotManager implements SnapshotState { } private boolean hasFollowers(){ - return context.getPeerAddresses().keySet().size() > 0; + return context.hasFollowers(); } private String persistenceId(){ diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java index d4612dbeda..b80a1bab15 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java @@ -97,7 +97,7 @@ public abstract class AbstractLeader extends AbstractRaftActorBehavior { setLeaderPayloadVersion(context.getPayloadVersion()); - for (String followerId : context.getPeerAddresses().keySet()) { + for (String followerId : context.getPeerIds()) { FollowerLogInformation followerLogInformation = new FollowerLogInformationImpl(followerId, -1, context); diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java index b20671f9d8..8cb011f7a7 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java @@ -10,7 +10,6 @@ package org.opendaylight.controller.cluster.raft.behaviors; import akka.actor.ActorRef; import akka.actor.Cancellable; -import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; @@ -494,7 +493,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } public void applyServerConfiguration(ServerConfigurationPayload serverConfig) { - Map currentPeers = new HashMap<>(context.getPeerAddresses()); + Map currentPeers = context.getPeerAddresses(); for(String peerId: serverConfig.getNewServerConfig()) { if(!getId().equals(peerId)) { if(!currentPeers.containsKey(peerId)) { diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java index a59a02051a..8baf0d8e81 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java @@ -10,7 +10,7 @@ package org.opendaylight.controller.cluster.raft.behaviors; import akka.actor.ActorRef; import akka.actor.ActorSelection; -import java.util.Set; +import java.util.Collection; import org.opendaylight.controller.cluster.raft.RaftActorContext; import org.opendaylight.controller.cluster.raft.RaftState; import org.opendaylight.controller.cluster.raft.base.messages.ElectionTimeout; @@ -44,12 +44,12 @@ public class Candidate extends AbstractRaftActorBehavior { private final int votesRequired; - private final Set peers; + private final Collection peers; public Candidate(RaftActorContext context) { super(context, RaftState.Candidate); - peers = context.getPeerAddresses().keySet(); + peers = context.getPeerIds(); if(LOG.isDebugEnabled()) { LOG.debug("{}: Election: Candidate has following peers: {}", logName(), peers); @@ -59,7 +59,7 @@ public class Candidate extends AbstractRaftActorBehavior { startNewTerm(); - if(context.getPeerAddresses().isEmpty()){ + if(peers.isEmpty()){ actor().tell(ELECTION_TIMEOUT, actor()); } else { scheduleElection(electionDuration()); diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java index 8f41147537..c695282300 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java @@ -50,7 +50,7 @@ public class Follower extends AbstractRaftActorBehavior { initialSyncStatusTracker = new SyncStatusTracker(context.getActor(), getId(), SYNC_THRESHOLD); if(context.getRaftPolicy().automaticElectionsEnabled()) { - if (context.getPeerAddresses().isEmpty()) { + if (context.getPeerIds().isEmpty()) { actor().tell(ELECTION_TIMEOUT, actor()); } else { scheduleElection(electionDuration()); diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java index 1938dab98e..2a1a94c549 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java @@ -17,6 +17,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.protobuf.GeneratedMessage; import java.io.Serializable; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.opendaylight.controller.cluster.DataPersistenceProvider; @@ -166,6 +167,11 @@ public class MockRaftActorContext implements RaftActorContext { return peerAddresses; } + @Override + public Collection getPeerIds() { + return peerAddresses.keySet(); + } + @Override public String getPeerAddress(String peerId) { return peerAddresses.get(peerId); } @@ -224,7 +230,7 @@ public class MockRaftActorContext implements RaftActorContext { @Override public boolean hasFollowers() { - return getPeerAddresses().keySet().size() > 0; + return getPeerIds().size() > 0; } @Override diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java index 2528c8aad4..1b717f147d 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java @@ -161,11 +161,9 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { // Verify new server config was applied in both followers - assertEquals("Follower peers", Sets.newHashSet(LEADER_ID, NEW_SERVER_ID), - followerActorContext.getPeerAddresses().keySet()); + assertEquals("Follower peers", Sets.newHashSet(LEADER_ID, NEW_SERVER_ID), followerActorContext.getPeerIds()); - assertEquals("New follower peers", Sets.newHashSet(LEADER_ID, FOLLOWER_ID), - newFollowerActorContext.getPeerAddresses().keySet()); + assertEquals("New follower peers", Sets.newHashSet(LEADER_ID, FOLLOWER_ID), newFollowerActorContext.getPeerIds()); expectFirstMatching(newFollowerCollectorActor, ApplyState.class); expectFirstMatching(followerActor, ApplyState.class); @@ -219,8 +217,7 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { // Verify new server config was applied in the new follower - assertEquals("New follower peers", Sets.newHashSet(LEADER_ID), - newFollowerActorContext.getPeerAddresses().keySet()); + assertEquals("New follower peers", Sets.newHashSet(LEADER_ID), newFollowerActorContext.getPeerIds()); } @Test @@ -259,8 +256,7 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { // Verify new server config was applied in the new follower - assertEquals("New follower peers", Sets.newHashSet(LEADER_ID), - newFollowerActorContext.getPeerAddresses().keySet()); + assertEquals("New follower peers", Sets.newHashSet(LEADER_ID), newFollowerActorContext.getPeerIds()); MessageCollectorActor.assertNoneMatching(newFollowerCollectorActor, InstallSnapshot.class, 500); @@ -336,7 +332,7 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { MessageCollectorActor.expectMatching(newFollowerCollectorActor, ApplyState.class, 2); assertEquals("New follower peers", Sets.newHashSet(LEADER_ID, NEW_SERVER_ID2), - newFollowerActorContext.getPeerAddresses().keySet()); + newFollowerActorContext.getPeerIds()); } @Test @@ -362,7 +358,7 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { AddServerReply addServerReply = testKit.expectMsgClass(JavaTestKit.duration("5 seconds"), AddServerReply.class); assertEquals("getStatus", ServerChangeStatus.TIMEOUT, addServerReply.getStatus()); - assertEquals("Leader peers size", 0, leaderActorContext.getPeerAddresses().keySet().size()); + assertEquals("Leader peers size", 0, leaderActorContext.getPeerIds().size()); assertEquals("Leader followers size", 0, ((AbstractLeader)leaderRaftActor.getCurrentBehavior()).getFollowerIds().size()); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java index f1e7d3fede..ef1a926416 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java @@ -25,9 +25,7 @@ import akka.actor.ActorRef; import akka.japi.Procedure; import akka.persistence.SnapshotSelectionCriteria; import akka.testkit.TestActorRef; -import com.google.common.collect.ImmutableMap; import java.util.Arrays; -import java.util.HashMap; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -75,7 +73,7 @@ public class SnapshotManagerTest extends AbstractActorTest { public void setUp(){ MockitoAnnotations.initMocks(this); - doReturn(new HashMap<>()).when(mockRaftActorContext).getPeerAddresses(); + doReturn(false).when(mockRaftActorContext).hasFollowers(); doReturn(mockConfigParams).when(mockRaftActorContext).getConfigParams(); doReturn(10L).when(mockConfigParams).getSnapshotBatchCount(); doReturn(70).when(mockConfigParams).getSnapshotDataThresholdPercentage(); @@ -231,7 +229,7 @@ public class SnapshotManagerTest extends AbstractActorTest { doReturn(7L).when(mockReplicatedLog).getSnapshotIndex(); doReturn(1L).when(mockReplicatedLog).getSnapshotTerm(); - doReturn(ImmutableMap.builder().put("follower-1", "").build()).when(mockRaftActorContext).getPeerAddresses(); + doReturn(true).when(mockRaftActorContext).hasFollowers(); doReturn(8L).when(mockRaftActorContext).getLastApplied(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java index 99606e751a..2833018587 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -426,8 +426,8 @@ public class ShardTest extends AbstractShardTest { newDatastoreContext(), SCHEMA_CONTEXT); } - Map getPeerAddresses() { - return getRaftActorContext().getPeerAddresses(); + String getPeerAddress(String id) { + return getRaftActorContext().getPeerAddress(id); } @Override @@ -448,15 +448,14 @@ public class ShardTest extends AbstractShardTest { } })), "testPeerAddressResolved"); - //waitUntilLeader(shard); assertEquals("Recovery complete", true, Uninterruptibles.awaitUninterruptibly(recoveryComplete, 5, TimeUnit.SECONDS)); final String address = "akka://foobar"; shard.underlyingActor().onReceiveCommand(new PeerAddressResolved(shardID.toString(), address)); - assertEquals("getPeerAddresses", address, - ((TestShard) shard.underlyingActor()).getPeerAddresses().get(shardID.toString())); + assertEquals("getPeerAddress", address, + ((TestShard) shard.underlyingActor()).getPeerAddress(shardID.toString())); shard.tell(PoisonPill.getInstance(), ActorRef.noSender()); }};