- @Override public Future<Void> doAsyncReplayMessages(final String persistenceId, long fromSequenceNr, long toSequenceNr, long max,
- final Procedure<PersistentRepr> replayCallback) {
- if(journal.size() == 0){
- return Futures.successful(null);
- }
- return Futures.future(new Callable<Void>() {
- @Override
- public Void call() throws Exception {
- for (Map.Entry<Long, Object> entry : journal.entrySet()) {
- PersistentRepr persistentMessage =
- new PersistentImpl(entry.getValue(), entry.getKey(), persistenceId,
- false, null, null);
- replayCallback.apply(persistentMessage);
+ @Test
+ public void testWhenShardIsCandidateSyncStatusIsFalse() throws Exception{
+ final Props persistentProps = ShardManager.props(
+ new MockClusterWrapper(),
+ new MockConfiguration(),
+ DatastoreContext.newBuilder().persistent(true).build(), ready);
+ final TestActorRef<ShardManager> shardManager =
+ TestActorRef.create(getSystem(), persistentProps);
+
+ ShardManager shardManagerActor = shardManager.underlyingActor();
+ shardManagerActor.onReceiveCommand(new RoleChangeNotification("member-1-shard-default-unknown",
+ RaftState.Follower.name(), RaftState.Candidate.name()));
+
+ assertEquals(false, shardManagerActor.getMBean().getSyncStatus());
+
+ // Send a FollowerInitialSyncStatus with status = true for the replica whose current state is candidate
+ shardManagerActor.onReceiveCommand(new FollowerInitialSyncUpStatus(true, "member-1-shard-default-unknown"));
+
+ assertEquals(false, shardManagerActor.getMBean().getSyncStatus());
+ }
+
+ @Test
+ public void testWhenShardIsFollowerSyncStatusDependsOnFollowerInitialSyncStatus() throws Exception{
+ final Props persistentProps = ShardManager.props(
+ new MockClusterWrapper(),
+ new MockConfiguration(),
+ DatastoreContext.newBuilder().persistent(true).build(), ready);
+ final TestActorRef<ShardManager> shardManager =
+ TestActorRef.create(getSystem(), persistentProps);
+
+ ShardManager shardManagerActor = shardManager.underlyingActor();
+ shardManagerActor.onReceiveCommand(new RoleChangeNotification("member-1-shard-default-unknown",
+ RaftState.Candidate.name(), RaftState.Follower.name()));
+
+ // Initially will be false
+ assertEquals(false, shardManagerActor.getMBean().getSyncStatus());
+
+ // Send status true will make sync status true
+ shardManagerActor.onReceiveCommand(new FollowerInitialSyncUpStatus(true, "member-1-shard-default-unknown"));
+
+ assertEquals(true, shardManagerActor.getMBean().getSyncStatus());
+
+ // Send status false will make sync status false
+ shardManagerActor.onReceiveCommand(new FollowerInitialSyncUpStatus(false, "member-1-shard-default-unknown"));
+
+ assertEquals(false, shardManagerActor.getMBean().getSyncStatus());
+
+ }
+
+ @Test
+ public void testWhenMultipleShardsPresentSyncStatusMustBeTrueForAllShards() throws Exception{
+ final Props persistentProps = ShardManager.props(
+ new MockClusterWrapper(),
+ new MockConfiguration() {
+ @Override
+ public List<String> getMemberShardNames(String memberName) {
+ return Arrays.asList("default", "astronauts");