Search in sources :

Example 16 with PartitionRegistration

use of org.apache.kafka.metadata.PartitionRegistration in project kafka by apache.

the class ReplicationControlManagerTest method testCancelReassignPartitions.

@Test
public void testCancelReassignPartitions() throws Exception {
    ReplicationControlTestContext ctx = new ReplicationControlTestContext();
    ReplicationControlManager replication = ctx.replicationControl;
    ctx.registerBrokers(0, 1, 2, 3, 4);
    ctx.unfenceBrokers(0, 1, 2, 3, 4);
    Uuid fooId = ctx.createTestTopic("foo", new int[][] { new int[] { 1, 2, 3, 4 }, new int[] { 0, 1, 2, 3 }, new int[] { 4, 3, 1, 0 }, new int[] { 2, 3, 4, 1 } }).topicId();
    Uuid barId = ctx.createTestTopic("bar", new int[][] { new int[] { 4, 3, 2 } }).topicId();
    assertEquals(NONE_REASSIGNING, replication.listPartitionReassignments(null));
    List<ApiMessageAndVersion> fenceRecords = new ArrayList<>();
    replication.handleBrokerFenced(3, fenceRecords);
    ctx.replay(fenceRecords);
    assertEquals(new PartitionRegistration(new int[] { 1, 2, 3, 4 }, new int[] { 1, 2, 4 }, new int[] {}, new int[] {}, 1, 1, 1), replication.getPartition(fooId, 0));
    ControllerResult<AlterPartitionReassignmentsResponseData> alterResult = replication.alterPartitionReassignments(new AlterPartitionReassignmentsRequestData().setTopics(asList(new ReassignableTopic().setName("foo").setPartitions(asList(new ReassignablePartition().setPartitionIndex(0).setReplicas(asList(1, 2, 3)), new ReassignablePartition().setPartitionIndex(1).setReplicas(asList(1, 2, 3, 0)), new ReassignablePartition().setPartitionIndex(2).setReplicas(asList(5, 6, 7)), new ReassignablePartition().setPartitionIndex(3).setReplicas(asList()))), new ReassignableTopic().setName("bar").setPartitions(asList(new ReassignablePartition().setPartitionIndex(0).setReplicas(asList(1, 2, 3, 4, 0)))))));
    assertEquals(new AlterPartitionReassignmentsResponseData().setErrorMessage(null).setResponses(asList(new ReassignableTopicResponse().setName("foo").setPartitions(asList(new ReassignablePartitionResponse().setPartitionIndex(0).setErrorMessage(null), new ReassignablePartitionResponse().setPartitionIndex(1).setErrorMessage(null), new ReassignablePartitionResponse().setPartitionIndex(2).setErrorCode(INVALID_REPLICA_ASSIGNMENT.code()).setErrorMessage("The manual partition assignment includes broker 5, " + "but no such broker is registered."), new ReassignablePartitionResponse().setPartitionIndex(3).setErrorCode(INVALID_REPLICA_ASSIGNMENT.code()).setErrorMessage("The manual partition assignment includes an empty " + "replica list."))), new ReassignableTopicResponse().setName("bar").setPartitions(asList(new ReassignablePartitionResponse().setPartitionIndex(0).setErrorMessage(null))))), alterResult.response());
    ctx.replay(alterResult.records());
    assertEquals(new PartitionRegistration(new int[] { 1, 2, 3 }, new int[] { 1, 2 }, new int[] {}, new int[] {}, 1, 2, 2), replication.getPartition(fooId, 0));
    assertEquals(new PartitionRegistration(new int[] { 1, 2, 3, 0 }, new int[] { 0, 1, 2 }, new int[] {}, new int[] {}, 0, 1, 2), replication.getPartition(fooId, 1));
    assertEquals(new PartitionRegistration(new int[] { 1, 2, 3, 4, 0 }, new int[] { 4, 2 }, new int[] {}, new int[] { 0, 1 }, 4, 1, 2), replication.getPartition(barId, 0));
    ListPartitionReassignmentsResponseData currentReassigning = new ListPartitionReassignmentsResponseData().setErrorMessage(null).setTopics(asList(new OngoingTopicReassignment().setName("bar").setPartitions(asList(new OngoingPartitionReassignment().setPartitionIndex(0).setRemovingReplicas(Collections.emptyList()).setAddingReplicas(asList(0, 1)).setReplicas(asList(1, 2, 3, 4, 0))))));
    assertEquals(currentReassigning, replication.listPartitionReassignments(null));
    assertEquals(NONE_REASSIGNING, replication.listPartitionReassignments(asList(new ListPartitionReassignmentsTopics().setName("foo").setPartitionIndexes(asList(0, 1, 2)))));
    assertEquals(currentReassigning, replication.listPartitionReassignments(asList(new ListPartitionReassignmentsTopics().setName("bar").setPartitionIndexes(asList(0, 1, 2)))));
    ControllerResult<AlterIsrResponseData> alterIsrResult = replication.alterIsr(new AlterIsrRequestData().setBrokerId(4).setBrokerEpoch(104).setTopics(asList(new TopicData().setName("bar").setPartitions(asList(new PartitionData().setPartitionIndex(0).setCurrentIsrVersion(2).setLeaderEpoch(1).setNewIsr(asList(4, 1, 2, 3, 0)))))));
    assertEquals(new AlterIsrResponseData().setTopics(asList(new AlterIsrResponseData.TopicData().setName("bar").setPartitions(asList(new AlterIsrResponseData.PartitionData().setPartitionIndex(0).setLeaderId(4).setLeaderEpoch(1).setIsr(asList(4, 1, 2, 3, 0)).setCurrentIsrVersion(3).setErrorCode(NONE.code()))))), alterIsrResult.response());
    ControllerResult<AlterPartitionReassignmentsResponseData> cancelResult = replication.alterPartitionReassignments(new AlterPartitionReassignmentsRequestData().setTopics(asList(new ReassignableTopic().setName("foo").setPartitions(asList(new ReassignablePartition().setPartitionIndex(0).setReplicas(null))), new ReassignableTopic().setName("bar").setPartitions(asList(new ReassignablePartition().setPartitionIndex(0).setReplicas(null))))));
    assertEquals(ControllerResult.atomicOf(Collections.singletonList(new ApiMessageAndVersion(new PartitionChangeRecord().setTopicId(barId).setPartitionId(0).setLeader(4).setReplicas(asList(2, 3, 4)).setRemovingReplicas(null).setAddingReplicas(Collections.emptyList()), (short) 0)), new AlterPartitionReassignmentsResponseData().setErrorMessage(null).setResponses(asList(new ReassignableTopicResponse().setName("foo").setPartitions(asList(new ReassignablePartitionResponse().setPartitionIndex(0).setErrorCode(NO_REASSIGNMENT_IN_PROGRESS.code()).setErrorMessage(null))), new ReassignableTopicResponse().setName("bar").setPartitions(asList(new ReassignablePartitionResponse().setPartitionIndex(0).setErrorMessage(null)))))), cancelResult);
    ctx.replay(cancelResult.records());
    assertEquals(NONE_REASSIGNING, replication.listPartitionReassignments(null));
    assertEquals(new PartitionRegistration(new int[] { 2, 3, 4 }, new int[] { 4, 2 }, new int[] {}, new int[] {}, 4, 2, 3), replication.getPartition(barId, 0));
}
Also used : PartitionRegistration(org.apache.kafka.metadata.PartitionRegistration) ReassignablePartition(org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData.ReassignablePartition) PartitionChangeRecord(org.apache.kafka.common.metadata.PartitionChangeRecord) ReassignableTopic(org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData.ReassignableTopic) ArrayList(java.util.ArrayList) TopicData(org.apache.kafka.common.message.AlterIsrRequestData.TopicData) ListPartitionReassignmentsResponseData(org.apache.kafka.common.message.ListPartitionReassignmentsResponseData) ReassignableTopicResponse(org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData.ReassignableTopicResponse) PartitionData(org.apache.kafka.common.message.AlterIsrRequestData.PartitionData) ApiMessageAndVersion(org.apache.kafka.server.common.ApiMessageAndVersion) ListPartitionReassignmentsTopics(org.apache.kafka.common.message.ListPartitionReassignmentsRequestData.ListPartitionReassignmentsTopics) ReassignablePartitionResponse(org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData.ReassignablePartitionResponse) AlterPartitionReassignmentsRequestData(org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData) AlterIsrRequestData(org.apache.kafka.common.message.AlterIsrRequestData) OngoingTopicReassignment(org.apache.kafka.common.message.ListPartitionReassignmentsResponseData.OngoingTopicReassignment) Uuid(org.apache.kafka.common.Uuid) AlterPartitionReassignmentsResponseData(org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData) OngoingPartitionReassignment(org.apache.kafka.common.message.ListPartitionReassignmentsResponseData.OngoingPartitionReassignment) AlterIsrResponseData(org.apache.kafka.common.message.AlterIsrResponseData) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) Test(org.junit.jupiter.api.Test)

Example 17 with PartitionRegistration

use of org.apache.kafka.metadata.PartitionRegistration in project kafka by apache.

the class TopicsImageTest method newTopicImage.

private static TopicImage newTopicImage(String name, Uuid id, PartitionRegistration... partitions) {
    Map<Integer, PartitionRegistration> partitionMap = new HashMap<>();
    int i = 0;
    for (PartitionRegistration partition : partitions) {
        partitionMap.put(i++, partition);
    }
    return new TopicImage(name, id, partitionMap);
}
Also used : PartitionRegistration(org.apache.kafka.metadata.PartitionRegistration) HashMap(java.util.HashMap)

Example 18 with PartitionRegistration

use of org.apache.kafka.metadata.PartitionRegistration in project kafka by apache.

the class ReplicationControlManager method electLeader.

ApiError electLeader(String topic, int partitionId, ElectionType electionType, List<ApiMessageAndVersion> records) {
    Uuid topicId = topicsByName.get(topic);
    if (topicId == null) {
        return new ApiError(UNKNOWN_TOPIC_OR_PARTITION, "No such topic as " + topic);
    }
    TopicControlInfo topicInfo = topics.get(topicId);
    if (topicInfo == null) {
        return new ApiError(UNKNOWN_TOPIC_OR_PARTITION, "No such topic id as " + topicId);
    }
    PartitionRegistration partition = topicInfo.parts.get(partitionId);
    if (partition == null) {
        return new ApiError(UNKNOWN_TOPIC_OR_PARTITION, "No such partition as " + topic + "-" + partitionId);
    }
    if ((electionType == ElectionType.PREFERRED && partition.hasPreferredLeader()) || (electionType == ElectionType.UNCLEAN && partition.hasLeader())) {
        return new ApiError(Errors.ELECTION_NOT_NEEDED);
    }
    PartitionChangeBuilder builder = new PartitionChangeBuilder(partition, topicId, partitionId, r -> clusterControl.unfenced(r), () -> electionType == ElectionType.UNCLEAN);
    builder.setAlwaysElectPreferredIfPossible(electionType == ElectionType.PREFERRED);
    Optional<ApiMessageAndVersion> record = builder.build();
    if (!record.isPresent()) {
        if (electionType == ElectionType.PREFERRED) {
            return new ApiError(Errors.PREFERRED_LEADER_NOT_AVAILABLE);
        } else {
            return new ApiError(Errors.ELIGIBLE_LEADERS_NOT_AVAILABLE);
        }
    }
    records.add(record.get());
    return ApiError.NONE;
}
Also used : PartitionRegistration(org.apache.kafka.metadata.PartitionRegistration) Uuid(org.apache.kafka.common.Uuid) ApiMessageAndVersion(org.apache.kafka.server.common.ApiMessageAndVersion) ApiError(org.apache.kafka.common.requests.ApiError)

Example 19 with PartitionRegistration

use of org.apache.kafka.metadata.PartitionRegistration in project kafka by apache.

the class ReplicationControlManager method replay.

public void replay(PartitionChangeRecord record) {
    TopicControlInfo topicInfo = topics.get(record.topicId());
    if (topicInfo == null) {
        throw new RuntimeException("Tried to create partition " + record.topicId() + ":" + record.partitionId() + ", but no topic with that ID was found.");
    }
    PartitionRegistration prevPartitionInfo = topicInfo.parts.get(record.partitionId());
    if (prevPartitionInfo == null) {
        throw new RuntimeException("Tried to create partition " + record.topicId() + ":" + record.partitionId() + ", but no partition with that id was found.");
    }
    PartitionRegistration newPartitionInfo = prevPartitionInfo.merge(record);
    updateReassigningTopicsIfNeeded(record.topicId(), record.partitionId(), prevPartitionInfo.isReassigning(), newPartitionInfo.isReassigning());
    topicInfo.parts.put(record.partitionId(), newPartitionInfo);
    brokersToIsrs.update(record.topicId(), record.partitionId(), prevPartitionInfo.isr, newPartitionInfo.isr, prevPartitionInfo.leader, newPartitionInfo.leader);
    String topicPart = topicInfo.name + "-" + record.partitionId() + " with topic ID " + record.topicId();
    newPartitionInfo.maybeLogPartitionChange(log, topicPart, prevPartitionInfo);
    if (!newPartitionInfo.hasPreferredLeader() && prevPartitionInfo.hasPreferredLeader()) {
        preferredReplicaImbalanceCount.increment();
    }
    controllerMetrics.setOfflinePartitionCount(brokersToIsrs.offlinePartitionCount());
    controllerMetrics.setPreferredReplicaImbalanceCount(preferredReplicaImbalanceCount.get());
    if (record.removingReplicas() != null || record.addingReplicas() != null) {
        log.info("Replayed partition assignment change {} for topic {}", record, topicInfo.name);
    } else if (log.isTraceEnabled()) {
        log.trace("Replayed partition change {} for topic {}", record, topicInfo.name);
    }
}
Also used : PartitionRegistration(org.apache.kafka.metadata.PartitionRegistration)

Example 20 with PartitionRegistration

use of org.apache.kafka.metadata.PartitionRegistration in project kafka by apache.

the class ReplicationControlManager method replay.

public void replay(PartitionRecord record) {
    TopicControlInfo topicInfo = topics.get(record.topicId());
    if (topicInfo == null) {
        throw new RuntimeException("Tried to create partition " + record.topicId() + ":" + record.partitionId() + ", but no topic with that ID was found.");
    }
    PartitionRegistration newPartInfo = new PartitionRegistration(record);
    PartitionRegistration prevPartInfo = topicInfo.parts.get(record.partitionId());
    String description = topicInfo.name + "-" + record.partitionId() + " with topic ID " + record.topicId();
    if (prevPartInfo == null) {
        log.info("Created partition {} and {}.", description, newPartInfo);
        topicInfo.parts.put(record.partitionId(), newPartInfo);
        brokersToIsrs.update(record.topicId(), record.partitionId(), null, newPartInfo.isr, NO_LEADER, newPartInfo.leader);
        globalPartitionCount.increment();
        controllerMetrics.setGlobalPartitionCount(globalPartitionCount.get());
        updateReassigningTopicsIfNeeded(record.topicId(), record.partitionId(), false, newPartInfo.isReassigning());
    } else if (!newPartInfo.equals(prevPartInfo)) {
        newPartInfo.maybeLogPartitionChange(log, description, prevPartInfo);
        topicInfo.parts.put(record.partitionId(), newPartInfo);
        brokersToIsrs.update(record.topicId(), record.partitionId(), prevPartInfo.isr, newPartInfo.isr, prevPartInfo.leader, newPartInfo.leader);
        updateReassigningTopicsIfNeeded(record.topicId(), record.partitionId(), prevPartInfo.isReassigning(), newPartInfo.isReassigning());
    }
    if (newPartInfo.leader != newPartInfo.preferredReplica()) {
        preferredReplicaImbalanceCount.increment();
    }
    controllerMetrics.setOfflinePartitionCount(brokersToIsrs.offlinePartitionCount());
    controllerMetrics.setPreferredReplicaImbalanceCount(preferredReplicaImbalanceCount.get());
}
Also used : PartitionRegistration(org.apache.kafka.metadata.PartitionRegistration)

Aggregations

PartitionRegistration (org.apache.kafka.metadata.PartitionRegistration)26 Uuid (org.apache.kafka.common.Uuid)11 ApiMessageAndVersion (org.apache.kafka.server.common.ApiMessageAndVersion)10 Test (org.junit.jupiter.api.Test)10 ArrayList (java.util.ArrayList)6 HashMap (java.util.HashMap)6 TopicRecord (org.apache.kafka.common.metadata.TopicRecord)5 List (java.util.List)4 UnknownTopicOrPartitionException (org.apache.kafka.common.errors.UnknownTopicOrPartitionException)4 AlterIsrRequestData (org.apache.kafka.common.message.AlterIsrRequestData)4 AlterIsrResponseData (org.apache.kafka.common.message.AlterIsrResponseData)3 AlterPartitionReassignmentsRequestData (org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData)3 ReassignableTopic (org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData.ReassignableTopic)3 AlterPartitionReassignmentsResponseData (org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData)3 CreatableTopicResult (org.apache.kafka.common.message.CreateTopicsResponseData.CreatableTopicResult)3 PartitionRecord (org.apache.kafka.common.metadata.PartitionRecord)3 ApiError (org.apache.kafka.common.requests.ApiError)3 TimelineInteger (org.apache.kafka.timeline.TimelineInteger)3 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)3 OptionalInt (java.util.OptionalInt)2