mirror of https://github.com/apache/kafka.git
KAFKA-19522: avoid electing fenced lastKnownLeader (#20200)
CI / build (push) Waiting to run
Details
CI / build (push) Waiting to run
Details
This patch fixes the bug that allows the last known leader to be elected as a partition leader while still in a fenced state, before the next heartbeat removes the fence. https://issues.apache.org/jira/browse/KAFKA-19522 Reviewers: Jun Rao <junrao@gmail.com>, TengYao Chi <frankvicky@apache.org>
This commit is contained in:
parent
01d8154b6e
commit
e4e2dce2eb
|
@ -311,9 +311,10 @@ public class PartitionChangeBuilder {
|
||||||
topicId, partitionId, Arrays.toString(partition.lastKnownElr));
|
topicId, partitionId, Arrays.toString(partition.lastKnownElr));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (isAcceptableLeader.test(partition.lastKnownElr[0])) {
|
if (!isAcceptableLeader.test(partition.lastKnownElr[0])) {
|
||||||
log.trace("Try to elect last known leader for {}-{} but last known leader is not alive. last known leader={}",
|
log.trace("Try to elect last known leader for {}-{} but last known leader is not alive. last known leader={}",
|
||||||
topicId, partitionId, partition.lastKnownElr[0]);
|
topicId, partitionId, partition.lastKnownElr[0]);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.Timeout;
|
import org.junit.jupiter.api.Timeout;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.Arguments;
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
|
import org.junit.jupiter.params.provider.EnumSource;
|
||||||
import org.junit.jupiter.params.provider.MethodSource;
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
|
||||||
|
@ -1233,4 +1234,39 @@ public class PartitionChangeBuilderTest {
|
||||||
// No change to the partition.
|
// No change to the partition.
|
||||||
assertEquals(Optional.empty(), builder.build());
|
assertEquals(Optional.empty(), builder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@EnumSource(value = Election.class)
|
||||||
|
public void testEligibleLeaderReplicas_NotEligibleLastKnownLeader(Election type) {
|
||||||
|
short version = 2;
|
||||||
|
PartitionRegistration partition = new PartitionRegistration.Builder()
|
||||||
|
.setReplicas(new int[] {1, 2, 3, 4})
|
||||||
|
.setDirectories(new Uuid[]{
|
||||||
|
Uuid.fromString("zANDdMukTEqefOvHpmniMg"),
|
||||||
|
Uuid.fromString("Ui2Eq8rbRiuW7m7uiPTRyg"),
|
||||||
|
Uuid.fromString("MhgJOZrrTsKNcGM0XKK4aA"),
|
||||||
|
Uuid.fromString("Y25PaCAmRfyGIKxAThhBAw")
|
||||||
|
})
|
||||||
|
.setIsr(new int[] {})
|
||||||
|
.setElr(new int[] {})
|
||||||
|
.setLastKnownElr(new int[] {1})
|
||||||
|
.setLeader(-1)
|
||||||
|
.setLeaderRecoveryState(LeaderRecoveryState.RECOVERED)
|
||||||
|
.setLeaderEpoch(100)
|
||||||
|
.setPartitionEpoch(200)
|
||||||
|
.build();
|
||||||
|
Uuid topicId = Uuid.fromString("FbrrdcfiR-KC2CPSTHaJrg");
|
||||||
|
|
||||||
|
PartitionChangeBuilder builder = new PartitionChangeBuilder(partition, topicId, 0, r -> false,
|
||||||
|
metadataVersionForPartitionChangeRecordVersion(version), 3)
|
||||||
|
.setElection(type)
|
||||||
|
.setEligibleLeaderReplicasEnabled(true)
|
||||||
|
.setDefaultDirProvider(DEFAULT_DIR_PROVIDER)
|
||||||
|
.setUseLastKnownLeaderInBalancedRecovery(true);
|
||||||
|
|
||||||
|
builder.setTargetIsr(List.of());
|
||||||
|
|
||||||
|
// No change to the partition.
|
||||||
|
assertEquals(Optional.empty(), builder.build());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue