Search in sources :

Example 1 with ElectionType

use of org.apache.kafka.common.ElectionType in project kafka by apache.

the class KafkaAdminClientTest method testElectLeaders.

@Test
public void testElectLeaders() throws Exception {
    TopicPartition topic1 = new TopicPartition("topic", 0);
    TopicPartition topic2 = new TopicPartition("topic", 2);
    try (AdminClientUnitTestEnv env = mockClientEnv()) {
        for (ElectionType electionType : ElectionType.values()) {
            env.kafkaClient().setNodeApiVersions(NodeApiVersions.create());
            // Test a call where one partition has an error.
            ApiError value = ApiError.fromThrowable(new ClusterAuthorizationException(null));
            List<ReplicaElectionResult> electionResults = new ArrayList<>();
            ReplicaElectionResult electionResult = new ReplicaElectionResult();
            electionResult.setTopic(topic1.topic());
            // Add partition 1 result
            PartitionResult partition1Result = new PartitionResult();
            partition1Result.setPartitionId(topic1.partition());
            partition1Result.setErrorCode(value.error().code());
            partition1Result.setErrorMessage(value.message());
            electionResult.partitionResult().add(partition1Result);
            // Add partition 2 result
            PartitionResult partition2Result = new PartitionResult();
            partition2Result.setPartitionId(topic2.partition());
            partition2Result.setErrorCode(value.error().code());
            partition2Result.setErrorMessage(value.message());
            electionResult.partitionResult().add(partition2Result);
            electionResults.add(electionResult);
            env.kafkaClient().prepareResponse(new ElectLeadersResponse(0, Errors.NONE.code(), electionResults, ApiKeys.ELECT_LEADERS.latestVersion()));
            ElectLeadersResult results = env.adminClient().electLeaders(electionType, new HashSet<>(asList(topic1, topic2)));
            assertEquals(results.partitions().get().get(topic2).get().getClass(), ClusterAuthorizationException.class);
            // Test a call where there are no errors. By mutating the internal of election results
            partition1Result.setErrorCode(ApiError.NONE.error().code());
            partition1Result.setErrorMessage(ApiError.NONE.message());
            partition2Result.setErrorCode(ApiError.NONE.error().code());
            partition2Result.setErrorMessage(ApiError.NONE.message());
            env.kafkaClient().prepareResponse(new ElectLeadersResponse(0, Errors.NONE.code(), electionResults, ApiKeys.ELECT_LEADERS.latestVersion()));
            results = env.adminClient().electLeaders(electionType, new HashSet<>(asList(topic1, topic2)));
            assertFalse(results.partitions().get().get(topic1).isPresent());
            assertFalse(results.partitions().get().get(topic2).isPresent());
            // Now try a timeout
            results = env.adminClient().electLeaders(electionType, new HashSet<>(asList(topic1, topic2)), new ElectLeadersOptions().timeoutMs(100));
            TestUtils.assertFutureError(results.partitions(), TimeoutException.class);
        }
    }
}
Also used : ArrayList(java.util.ArrayList) TopicPartition(org.apache.kafka.common.TopicPartition) ElectionType(org.apache.kafka.common.ElectionType) ElectLeadersResponse(org.apache.kafka.common.requests.ElectLeadersResponse) ReplicaElectionResult(org.apache.kafka.common.message.ElectLeadersResponseData.ReplicaElectionResult) ApiError(org.apache.kafka.common.requests.ApiError) PartitionResult(org.apache.kafka.common.message.ElectLeadersResponseData.PartitionResult) AlterReplicaLogDirPartitionResult(org.apache.kafka.common.message.AlterReplicaLogDirsResponseData.AlterReplicaLogDirPartitionResult) ClusterAuthorizationException(org.apache.kafka.common.errors.ClusterAuthorizationException) HashSet(java.util.HashSet) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) Test(org.junit.jupiter.api.Test)

Example 2 with ElectionType

use of org.apache.kafka.common.ElectionType in project kafka by apache.

the class ReplicationControlManager method electLeaders.

ControllerResult<ElectLeadersResponseData> electLeaders(ElectLeadersRequestData request) {
    ElectionType electionType = electionType(request.electionType());
    List<ApiMessageAndVersion> records = new ArrayList<>();
    ElectLeadersResponseData response = new ElectLeadersResponseData();
    if (request.topicPartitions() == null) {
        // compatibility with the old controller.
        for (Entry<String, Uuid> topicEntry : topicsByName.entrySet()) {
            String topicName = topicEntry.getKey();
            ReplicaElectionResult topicResults = new ReplicaElectionResult().setTopic(topicName);
            response.replicaElectionResults().add(topicResults);
            TopicControlInfo topic = topics.get(topicEntry.getValue());
            if (topic != null) {
                for (int partitionId : topic.parts.keySet()) {
                    ApiError error = electLeader(topicName, partitionId, electionType, records);
                    // partitions which already have the desired leader.
                    if (error.error() != Errors.ELECTION_NOT_NEEDED) {
                        topicResults.partitionResult().add(new PartitionResult().setPartitionId(partitionId).setErrorCode(error.error().code()).setErrorMessage(error.message()));
                    }
                }
            }
        }
    } else {
        for (TopicPartitions topic : request.topicPartitions()) {
            ReplicaElectionResult topicResults = new ReplicaElectionResult().setTopic(topic.topic());
            response.replicaElectionResults().add(topicResults);
            for (int partitionId : topic.partitions()) {
                ApiError error = electLeader(topic.topic(), partitionId, electionType, records);
                topicResults.partitionResult().add(new PartitionResult().setPartitionId(partitionId).setErrorCode(error.error().code()).setErrorMessage(error.message()));
            }
        }
    }
    return ControllerResult.of(records, response);
}
Also used : ArrayList(java.util.ArrayList) ElectLeadersResponseData(org.apache.kafka.common.message.ElectLeadersResponseData) Uuid(org.apache.kafka.common.Uuid) ApiMessageAndVersion(org.apache.kafka.server.common.ApiMessageAndVersion) ElectionType(org.apache.kafka.common.ElectionType) ReplicaElectionResult(org.apache.kafka.common.message.ElectLeadersResponseData.ReplicaElectionResult) ApiError(org.apache.kafka.common.requests.ApiError) PartitionResult(org.apache.kafka.common.message.ElectLeadersResponseData.PartitionResult) TopicPartitions(org.apache.kafka.common.message.ElectLeadersRequestData.TopicPartitions)

Aggregations

ArrayList (java.util.ArrayList)2 ElectionType (org.apache.kafka.common.ElectionType)2 PartitionResult (org.apache.kafka.common.message.ElectLeadersResponseData.PartitionResult)2 ReplicaElectionResult (org.apache.kafka.common.message.ElectLeadersResponseData.ReplicaElectionResult)2 ApiError (org.apache.kafka.common.requests.ApiError)2 HashSet (java.util.HashSet)1 TopicPartition (org.apache.kafka.common.TopicPartition)1 Uuid (org.apache.kafka.common.Uuid)1 ClusterAuthorizationException (org.apache.kafka.common.errors.ClusterAuthorizationException)1 AlterReplicaLogDirPartitionResult (org.apache.kafka.common.message.AlterReplicaLogDirsResponseData.AlterReplicaLogDirPartitionResult)1 TopicPartitions (org.apache.kafka.common.message.ElectLeadersRequestData.TopicPartitions)1 ElectLeadersResponseData (org.apache.kafka.common.message.ElectLeadersResponseData)1 ElectLeadersResponse (org.apache.kafka.common.requests.ElectLeadersResponse)1 ApiMessageAndVersion (org.apache.kafka.server.common.ApiMessageAndVersion)1 Test (org.junit.jupiter.api.Test)1 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)1