From 45481ba83a3f698f1127f15b02f4c5aaa4081ad5 Mon Sep 17 00:00:00 2001 From: "tadei.bilan" Date: Tue, 12 May 2020 17:03:37 +0300 Subject: [PATCH] Fix DeleteEntries persisting with wrong index During persisting we delete entries, so in case of persisting DeleteEntries with adjusted index, index is being adjusted twice, that results in additional entries being deleted during recovery. JIRA: CONTROLLER-1934 Signed-off-by: tadei.bilan Change-Id: Ib326f02630281ed52982dab2f48c01503b791ef7 --- .../cluster/raft/ReplicatedLogImpl.java | 3 +- .../cluster/raft/RecoveryIntegrationTest.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImpl.java index c22f6f431b..66d7b352a2 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImpl.java @@ -42,10 +42,9 @@ final class ReplicatedLogImpl extends AbstractReplicatedLogImpl { @Override public boolean removeFromAndPersist(final long logEntryIndex) { - // FIXME: Maybe this should be done after the command is saved long adjustedIndex = removeFrom(logEntryIndex); if (adjustedIndex >= 0) { - context.getPersistenceProvider().persist(new DeleteEntries(adjustedIndex), NoopProcedure.instance()); + context.getPersistenceProvider().persist(new DeleteEntries(logEntryIndex), NoopProcedure.instance()); return true; } diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RecoveryIntegrationTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RecoveryIntegrationTest.java index de6a4909c3..2ef77c162e 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RecoveryIntegrationTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RecoveryIntegrationTest.java @@ -204,6 +204,51 @@ public class RecoveryIntegrationTest extends AbstractRaftActorIntegrationTest { assertEquals("Follower state", expFollowerState, follower2Underlying.getState()); } + @Test + public void testRecoveryDeleteEntries() { + send2InitialPayloads(); + + sendPayloadData(leaderActor, "two"); + + // This should trigger a snapshot. + sendPayloadData(leaderActor, "three"); + + MessageCollectorActor.expectFirstMatching(leaderCollectorActor, SaveSnapshotSuccess.class); + MessageCollectorActor.expectMatching(leaderCollectorActor, ApplyJournalEntries.class, 2); + + // Disconnect follower from leader + killActor(follower1Actor); + + // Send another payloads + sendPayloadData(leaderActor, "four"); + sendPayloadData(leaderActor, "five"); + + verifyRaftState(leaderActor, raftState -> { + assertEquals("leader journal last index", 5, leaderContext.getReplicatedLog().lastIndex()); + }); + + // Remove entries started from 4 index + leaderActor.underlyingActor().getReplicatedLog().removeFromAndPersist(4); + + verifyRaftState(leaderActor, raftState -> { + assertEquals("leader journal last index", 3, leaderContext.getReplicatedLog().lastIndex()); + }); + + // Send new payloads + final MockPayload payload4 = sendPayloadData(leaderActor,"newFour"); + final MockPayload payload5 = sendPayloadData(leaderActor,"newFive"); + + verifyRaftState(leaderActor, raftState -> { + assertEquals("leader journal last index", 5, leaderContext.getReplicatedLog().lastIndex()); + }); + + reinstateLeaderActor(); + + assertEquals("Leader last index", 5 , leaderActor.underlyingActor().getReplicatedLog().lastIndex()); + assertEquals(payload4 ,leaderActor.underlyingActor().getReplicatedLog().get(4).getData()); + assertEquals(payload5 ,leaderActor.underlyingActor().getReplicatedLog().get(5).getData()); + } + private void reinstateLeaderActor() { killActor(leaderActor); -- 2.36.6