diff --git a/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModuleAgent.java b/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModuleAgent.java index 2b1789624a..d0c3fafa09 100644 --- a/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModuleAgent.java +++ b/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModuleAgent.java @@ -892,6 +892,7 @@ else if (Cluster.Role.LEADER == role) clusterClock.time(), memberId, logPublisher.sessionId(), + ctx.appVersion(), false); } } diff --git a/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusPublisher.java b/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusPublisher.java index a10d279e94..4c487cc4e9 100644 --- a/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusPublisher.java +++ b/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusPublisher.java @@ -181,6 +181,7 @@ void newLeadershipTerm( final long timestamp, final int leaderMemberId, final int logSessionId, + final int appVersion, final boolean isStartup) { if (null == publication) @@ -214,6 +215,7 @@ void newLeadershipTerm( .timestamp(timestamp) .leaderMemberId(leaderMemberId) .logSessionId(logSessionId) + .appVersion(appVersion) .isStartup(isStartup ? BooleanType.TRUE : BooleanType.FALSE); bufferClaim.commit(); diff --git a/aeron-cluster/src/main/java/io/aeron/cluster/Election.java b/aeron-cluster/src/main/java/io/aeron/cluster/Election.java index b3e4f2868d..0b3bdb1401 100644 --- a/aeron-cluster/src/main/java/io/aeron/cluster/Election.java +++ b/aeron-cluster/src/main/java/io/aeron/cluster/Election.java @@ -1202,6 +1202,7 @@ private void publishNewLeadershipTerm( timestamp, thisMember.id(), logSessionId, + ctx.appVersion(), isLeaderStartup); } } diff --git a/aeron-cluster/src/test/java/io/aeron/cluster/ElectionTest.java b/aeron-cluster/src/test/java/io/aeron/cluster/ElectionTest.java index e121633713..05404df824 100644 --- a/aeron-cluster/src/test/java/io/aeron/cluster/ElectionTest.java +++ b/aeron-cluster/src/test/java/io/aeron/cluster/ElectionTest.java @@ -140,11 +140,12 @@ void shouldElectAppointedLeader() { final long leadershipTermId = NULL_VALUE; final long logPosition = 0; + final int appVersion = -98; final ClusterMember[] clusterMembers = prepareClusterMembers(); final ClusterMember candidateMember = clusterMembers[0]; when(consensusModuleAgent.logRecordingId()).thenReturn(RECORDING_ID); - ctx.appointedLeaderId(candidateMember.id()); + ctx.appointedLeaderId(candidateMember.id()).appVersion(appVersion); final Election election = newElection(leadershipTermId, logPosition, clusterMembers, candidateMember); @@ -203,6 +204,7 @@ void shouldElectAppointedLeader() clock.nanoTime(), candidateMember.id(), LOG_SESSION_ID, + appVersion, election.isLeaderStartup()); verify(consensusPublisher).newLeadershipTerm( @@ -218,6 +220,7 @@ void shouldElectAppointedLeader() clock.nanoTime(), candidateMember.id(), LOG_SESSION_ID, + appVersion, election.isLeaderStartup()); when(recordingLog.isUnknown(candidateTermId)).thenReturn(Boolean.TRUE); @@ -1381,6 +1384,8 @@ void leaderShouldMoveToLogReplicationThenWaitForCommitPosition() final ClusterMember liveFollower = clusterMembers[1]; final int leaderId = thisMember.id(); final int followerId = liveFollower.id(); + final int appVersion = 888; + ctx.appVersion(appVersion); when(consensusModuleAgent.role()).thenReturn(Cluster.Role.LEADER); when(consensusModuleAgent.logRecordingId()).thenReturn(RECORDING_ID); @@ -1444,6 +1449,7 @@ void leaderShouldMoveToLogReplicationThenWaitForCommitPosition() clock.nanoTime(), leaderId, LOG_SESSION_ID, + appVersion, election.isLeaderStartup()); verify(consensusPublisher).newLeadershipTerm( @@ -1459,6 +1465,7 @@ void leaderShouldMoveToLogReplicationThenWaitForCommitPosition() clock.nanoTime(), leaderId, LOG_SESSION_ID, + appVersion, election.isLeaderStartup()); // Begin replay once a quorum of followers has caught up.