X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FMockRaftActor.java;h=28cc9b3f81e9226e2baf5e7ecd4422d9e20413ee;hb=a6af137c30470b86d4bc624d4c48cb686495a182;hp=b4b558b6f357a908c8ac537dd80e86c3abdd5eca;hpb=e1eca73a5ae2ffae8dd78c6fe5281cd2f45d5ef3;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActor.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActor.java index b4b558b6f3..28cc9b3f81 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActor.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActor.java @@ -15,11 +15,10 @@ import akka.actor.ActorRef; import akka.actor.Props; import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.base.Throwables; +import com.google.common.io.ByteSource; import com.google.common.util.concurrent.Uninterruptibles; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.ObjectInputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,8 +26,10 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; +import org.apache.commons.lang3.SerializationUtils; import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior; +import org.opendaylight.controller.cluster.raft.persisted.Snapshot; import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload; import org.opendaylight.yangtools.concepts.Identifier; @@ -44,11 +45,11 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, protected final CountDownLatch initializeBehaviorComplete = new CountDownLatch(1); private RaftActorRecoverySupport raftActorRecoverySupport; private RaftActorSnapshotMessageSupport snapshotMessageSupport; - private final byte[] restoreFromSnapshot; + private final Snapshot restoreFromSnapshot; final CountDownLatch snapshotCommitted = new CountDownLatch(1); private final Function pauseLeaderFunction; - protected MockRaftActor(AbstractBuilder builder) { + protected MockRaftActor(final AbstractBuilder builder) { super(builder.id, builder.peerAddresses != null ? builder.peerAddresses : Collections.emptyMap(), Optional.fromNullable(builder.config), PAYLOAD_VERSION); state = new ArrayList<>(); @@ -70,7 +71,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, pauseLeaderFunction = builder.pauseLeaderFunction; } - public void setRaftActorRecoverySupport(RaftActorRecoverySupport support) { + public void setRaftActorRecoverySupport(final RaftActorRecoverySupport support) { raftActorRecoverySupport = support; } @@ -85,6 +86,11 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, (snapshotMessageSupport = super.newRaftActorSnapshotMessageSupport()); } + @Override + public RaftActorContext getRaftActorContext() { + return super.getRaftActorContext(); + } + public RaftActorSnapshotMessageSupport getSnapshotMessageSupport() { return snapshotMessageSupport; } @@ -93,7 +99,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, try { assertEquals("Recovery complete", true, recoveryComplete.await(5, TimeUnit.SECONDS)); } catch (InterruptedException e) { - Throwables.propagate(e); + throw new RuntimeException(e); } } @@ -101,7 +107,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, try { assertEquals("Behavior initialized", true, initializeBehaviorComplete.await(5, TimeUnit.SECONDS)); } catch (InterruptedException e) { - Throwables.propagate(e); + throw new RuntimeException(e); } } @@ -120,7 +126,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } @Override - protected void applyState(ActorRef clientActor, Identifier identifier, Object data) { + protected void applyState(final ActorRef clientActor, final Identifier identifier, final Object data) { actorDelegate.applyState(clientActor, identifier, data); LOG.info("{}: applyState called: {}", persistenceId(), data); @@ -139,11 +145,11 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } @Override - public void startLogRecoveryBatch(int maxBatchSize) { + public void startLogRecoveryBatch(final int maxBatchSize) { } @Override - public void appendRecoveredLogEntry(Payload data) { + public void appendRecoveredLogEntry(final Payload data) { state.add(data); } @@ -164,38 +170,38 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } @Override - public void applyRecoverySnapshot(byte[] bytes) { - recoveryCohortDelegate.applyRecoverySnapshot(bytes); - applySnapshotBytes(bytes); + public void applyRecoverySnapshot(final Snapshot.State newState) { + recoveryCohortDelegate.applyRecoverySnapshot(newState); + applySnapshotState(newState); } - private void applySnapshotBytes(byte[] bytes) { - if (bytes.length == 0) { - return; - } - - try { - Object data = toObject(bytes); - if (data instanceof List) { - state.clear(); - state.addAll((List) data); - } - } catch (ClassNotFoundException | IOException e) { - Throwables.propagate(e); + private void applySnapshotState(final Snapshot.State newState) { + if (newState instanceof MockSnapshotState) { + state.clear(); + state.addAll(((MockSnapshotState)newState).getState()); } } @Override - public void createSnapshot(ActorRef actorRef) { + public void createSnapshot(final ActorRef actorRef, final java.util.Optional installSnapshotStream) { LOG.info("{}: createSnapshot called", persistenceId()); - snapshotCohortDelegate.createSnapshot(actorRef); + snapshotCohortDelegate.createSnapshot(actorRef, installSnapshotStream); } @Override - public void applySnapshot(byte [] snapshot) { + public void applySnapshot(final Snapshot.State newState) { LOG.info("{}: applySnapshot called", persistenceId()); - applySnapshotBytes(snapshot); - snapshotCohortDelegate.applySnapshot(snapshot); + applySnapshotState(newState); + snapshotCohortDelegate.applySnapshot(newState); + } + + @Override + public Snapshot.State deserializeSnapshot(final ByteSource snapshotBytes) { + try { + return (Snapshot.State) SerializationUtils.deserialize(snapshotBytes.read()); + } catch (IOException e) { + throw new RuntimeException("Error deserializing state", e); + } } @Override @@ -212,7 +218,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, return this.getId(); } - protected void newBehavior(RaftActorBehavior newBehavior) { + protected void newBehavior(final RaftActorBehavior newBehavior) { self().tell(newBehavior, ActorRef.noSender()); } @@ -230,7 +236,7 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } @Override - protected void pauseLeader(Runnable operation) { + protected void pauseLeader(final Runnable operation) { if (pauseLeaderFunction != null) { pauseLeaderFunction.apply(operation); } else { @@ -238,23 +244,12 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } } - public static Object toObject(byte[] bs) throws ClassNotFoundException, IOException { - Object obj = null; - ByteArrayInputStream bis = null; - ObjectInputStream ois = null; - try { - bis = new ByteArrayInputStream(bs); - ois = new ObjectInputStream(bis); - obj = ois.readObject(); - } finally { - if (bis != null) { - bis.close(); - } - if (ois != null) { - ois.close(); - } + public static List fromState(final Snapshot.State from) { + if (from instanceof MockSnapshotState) { + return ((MockSnapshotState)from).getState(); } - return obj; + + throw new IllegalStateException("Unexpected snapshot State: " + from); } public ReplicatedLog getReplicatedLog() { @@ -262,16 +257,16 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } @Override - public byte[] getRestoreFromSnapshot() { + public Snapshot getRestoreFromSnapshot() { return restoreFromSnapshot; } - public static Props props(final String id, final Map peerAddresses, ConfigParams config) { + public static Props props(final String id, final Map peerAddresses, final ConfigParams config) { return builder().id(id).peerAddresses(peerAddresses).config(config).props(); } public static Props props(final String id, final Map peerAddresses, - ConfigParams config, DataPersistenceProvider dataPersistenceProvider) { + final ConfigParams config, final DataPersistenceProvider dataPersistenceProvider) { return builder().id(id).peerAddresses(peerAddresses).config(config) .dataPersistenceProvider(dataPersistenceProvider).props(); } @@ -287,13 +282,13 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, private DataPersistenceProvider dataPersistenceProvider; private ActorRef roleChangeNotifier; private RaftActorSnapshotMessageSupport snapshotMessageSupport; - private byte[] restoreFromSnapshot; + private Snapshot restoreFromSnapshot; private Optional persistent = Optional.absent(); private final Class actorClass; private Function pauseLeaderFunction; private RaftActorSnapshotCohort snapshotCohort; - protected AbstractBuilder(Class actorClass) { + protected AbstractBuilder(final Class actorClass) { this.actorClass = actorClass; } @@ -302,52 +297,52 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, return (T) this; } - public T id(String newId) { + public T id(final String newId) { this.id = newId; return self(); } - public T peerAddresses(Map newPeerAddresses) { + public T peerAddresses(final Map newPeerAddresses) { this.peerAddresses = newPeerAddresses; return self(); } - public T config(ConfigParams newConfig) { + public T config(final ConfigParams newConfig) { this.config = newConfig; return self(); } - public T dataPersistenceProvider(DataPersistenceProvider newDataPersistenceProvider) { + public T dataPersistenceProvider(final DataPersistenceProvider newDataPersistenceProvider) { this.dataPersistenceProvider = newDataPersistenceProvider; return self(); } - public T roleChangeNotifier(ActorRef newRoleChangeNotifier) { + public T roleChangeNotifier(final ActorRef newRoleChangeNotifier) { this.roleChangeNotifier = newRoleChangeNotifier; return self(); } - public T snapshotMessageSupport(RaftActorSnapshotMessageSupport newSnapshotMessageSupport) { + public T snapshotMessageSupport(final RaftActorSnapshotMessageSupport newSnapshotMessageSupport) { this.snapshotMessageSupport = newSnapshotMessageSupport; return self(); } - public T restoreFromSnapshot(byte[] newRestoreFromSnapshot) { + public T restoreFromSnapshot(final Snapshot newRestoreFromSnapshot) { this.restoreFromSnapshot = newRestoreFromSnapshot; return self(); } - public T persistent(Optional newPersistent) { + public T persistent(final Optional newPersistent) { this.persistent = newPersistent; return self(); } - public T pauseLeaderFunction(Function newPauseLeaderFunction) { + public T pauseLeaderFunction(final Function newPauseLeaderFunction) { this.pauseLeaderFunction = newPauseLeaderFunction; return self(); } - public T snapshotCohort(RaftActorSnapshotCohort newSnapshotCohort) { + public T snapshotCohort(final RaftActorSnapshotCohort newSnapshotCohort) { this.snapshotCohort = newSnapshotCohort; return self(); } @@ -358,8 +353,57 @@ public class MockRaftActor extends RaftActor implements RaftActorRecoveryCohort, } public static class Builder extends AbstractBuilder { - private Builder() { + Builder() { super(MockRaftActor.class); } } + + public static class MockSnapshotState implements Snapshot.State { + private static final long serialVersionUID = 1L; + + private final List state; + + public MockSnapshotState(final List state) { + this.state = state; + } + + public List getState() { + return state; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (state == null ? 0 : state.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + MockSnapshotState other = (MockSnapshotState) obj; + if (state == null) { + if (other.state != null) { + return false; + } + } else if (!state.equals(other.state)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "MockSnapshotState [state=" + state + "]"; + } + } }