Search in sources :

Example 1 with NotLeaderOrFollowerException

use of org.apache.kafka.common.errors.NotLeaderOrFollowerException in project kafka by apache.

the class DescribeProducersHandlerTest method testFatalNotLeaderErrorIfStaticMapped.

@Test
public void testFatalNotLeaderErrorIfStaticMapped() {
    TopicPartition topicPartition = new TopicPartition("foo", 5);
    DescribeProducersOptions options = new DescribeProducersOptions().brokerId(1);
    ApiResult<TopicPartition, PartitionProducerState> result = handleResponseWithError(options, topicPartition, Errors.NOT_LEADER_OR_FOLLOWER);
    assertEquals(emptyMap(), result.completedKeys);
    assertEquals(emptyList(), result.unmappedKeys);
    assertEquals(mkSet(topicPartition), result.failedKeys.keySet());
    Throwable exception = result.failedKeys.get(topicPartition);
    assertTrue(exception instanceof NotLeaderOrFollowerException);
}
Also used : TopicPartition(org.apache.kafka.common.TopicPartition) PartitionProducerState(org.apache.kafka.clients.admin.DescribeProducersResult.PartitionProducerState) NotLeaderOrFollowerException(org.apache.kafka.common.errors.NotLeaderOrFollowerException) DescribeProducersOptions(org.apache.kafka.clients.admin.DescribeProducersOptions) Test(org.junit.jupiter.api.Test)

Example 2 with NotLeaderOrFollowerException

use of org.apache.kafka.common.errors.NotLeaderOrFollowerException in project kafka by apache.

the class ThresholdPurgatoryTest method testCompleteAllExceptionally.

@Test
public void testCompleteAllExceptionally() {
    CompletableFuture<Long> future1 = purgatory.await(3L, 500);
    CompletableFuture<Long> future2 = purgatory.await(1L, 500);
    CompletableFuture<Long> future3 = purgatory.await(5L, 500);
    assertEquals(3, purgatory.numWaiting());
    purgatory.completeAllExceptionally(new NotLeaderOrFollowerException());
    assertFutureThrows(future1, NotLeaderOrFollowerException.class);
    assertFutureThrows(future2, NotLeaderOrFollowerException.class);
    assertFutureThrows(future3, NotLeaderOrFollowerException.class);
    assertEquals(0, purgatory.numWaiting());
}
Also used : NotLeaderOrFollowerException(org.apache.kafka.common.errors.NotLeaderOrFollowerException) Test(org.junit.jupiter.api.Test)

Example 3 with NotLeaderOrFollowerException

use of org.apache.kafka.common.errors.NotLeaderOrFollowerException in project kafka by apache.

the class KafkaAdminClientTest method testDeleteRecords.

@Test
public void testDeleteRecords() throws Exception {
    HashMap<Integer, Node> nodes = new HashMap<>();
    nodes.put(0, new Node(0, "localhost", 8121));
    List<PartitionInfo> partitionInfos = new ArrayList<>();
    partitionInfos.add(new PartitionInfo("my_topic", 0, nodes.get(0), new Node[] { nodes.get(0) }, new Node[] { nodes.get(0) }));
    partitionInfos.add(new PartitionInfo("my_topic", 1, nodes.get(0), new Node[] { nodes.get(0) }, new Node[] { nodes.get(0) }));
    partitionInfos.add(new PartitionInfo("my_topic", 2, null, new Node[] { nodes.get(0) }, new Node[] { nodes.get(0) }));
    partitionInfos.add(new PartitionInfo("my_topic", 3, nodes.get(0), new Node[] { nodes.get(0) }, new Node[] { nodes.get(0) }));
    partitionInfos.add(new PartitionInfo("my_topic", 4, nodes.get(0), new Node[] { nodes.get(0) }, new Node[] { nodes.get(0) }));
    Cluster cluster = new Cluster("mockClusterId", nodes.values(), partitionInfos, Collections.<String>emptySet(), Collections.<String>emptySet(), nodes.get(0));
    TopicPartition myTopicPartition0 = new TopicPartition("my_topic", 0);
    TopicPartition myTopicPartition1 = new TopicPartition("my_topic", 1);
    TopicPartition myTopicPartition2 = new TopicPartition("my_topic", 2);
    TopicPartition myTopicPartition3 = new TopicPartition("my_topic", 3);
    TopicPartition myTopicPartition4 = new TopicPartition("my_topic", 4);
    try (AdminClientUnitTestEnv env = new AdminClientUnitTestEnv(cluster)) {
        env.kafkaClient().setNodeApiVersions(NodeApiVersions.create());
        DeleteRecordsResponseData m = new DeleteRecordsResponseData();
        m.topics().add(new DeleteRecordsResponseData.DeleteRecordsTopicResult().setName(myTopicPartition0.topic()).setPartitions(new DeleteRecordsResponseData.DeleteRecordsPartitionResultCollection(asList(new DeleteRecordsResponseData.DeleteRecordsPartitionResult().setPartitionIndex(myTopicPartition0.partition()).setLowWatermark(3).setErrorCode(Errors.NONE.code()), new DeleteRecordsResponseData.DeleteRecordsPartitionResult().setPartitionIndex(myTopicPartition1.partition()).setLowWatermark(DeleteRecordsResponse.INVALID_LOW_WATERMARK).setErrorCode(Errors.OFFSET_OUT_OF_RANGE.code()), new DeleteRecordsResponseData.DeleteRecordsPartitionResult().setPartitionIndex(myTopicPartition3.partition()).setLowWatermark(DeleteRecordsResponse.INVALID_LOW_WATERMARK).setErrorCode(Errors.NOT_LEADER_OR_FOLLOWER.code()), new DeleteRecordsResponseData.DeleteRecordsPartitionResult().setPartitionIndex(myTopicPartition4.partition()).setLowWatermark(DeleteRecordsResponse.INVALID_LOW_WATERMARK).setErrorCode(Errors.UNKNOWN_TOPIC_OR_PARTITION.code())).iterator())));
        List<MetadataResponse.TopicMetadata> t = new ArrayList<>();
        List<MetadataResponse.PartitionMetadata> p = new ArrayList<>();
        p.add(new MetadataResponse.PartitionMetadata(Errors.NONE, myTopicPartition0, Optional.of(nodes.get(0).id()), Optional.of(5), singletonList(nodes.get(0).id()), singletonList(nodes.get(0).id()), Collections.emptyList()));
        p.add(new MetadataResponse.PartitionMetadata(Errors.NONE, myTopicPartition1, Optional.of(nodes.get(0).id()), Optional.of(5), singletonList(nodes.get(0).id()), singletonList(nodes.get(0).id()), Collections.emptyList()));
        p.add(new MetadataResponse.PartitionMetadata(Errors.LEADER_NOT_AVAILABLE, myTopicPartition2, Optional.empty(), Optional.empty(), singletonList(nodes.get(0).id()), singletonList(nodes.get(0).id()), Collections.emptyList()));
        p.add(new MetadataResponse.PartitionMetadata(Errors.NONE, myTopicPartition3, Optional.of(nodes.get(0).id()), Optional.of(5), singletonList(nodes.get(0).id()), singletonList(nodes.get(0).id()), Collections.emptyList()));
        p.add(new MetadataResponse.PartitionMetadata(Errors.NONE, myTopicPartition4, Optional.of(nodes.get(0).id()), Optional.of(5), singletonList(nodes.get(0).id()), singletonList(nodes.get(0).id()), Collections.emptyList()));
        t.add(new MetadataResponse.TopicMetadata(Errors.NONE, "my_topic", false, p));
        env.kafkaClient().prepareResponse(RequestTestUtils.metadataResponse(cluster.nodes(), cluster.clusterResource().clusterId(), cluster.controller().id(), t));
        env.kafkaClient().prepareResponse(new DeleteRecordsResponse(m));
        Map<TopicPartition, RecordsToDelete> recordsToDelete = new HashMap<>();
        recordsToDelete.put(myTopicPartition0, RecordsToDelete.beforeOffset(3L));
        recordsToDelete.put(myTopicPartition1, RecordsToDelete.beforeOffset(10L));
        recordsToDelete.put(myTopicPartition2, RecordsToDelete.beforeOffset(10L));
        recordsToDelete.put(myTopicPartition3, RecordsToDelete.beforeOffset(10L));
        recordsToDelete.put(myTopicPartition4, RecordsToDelete.beforeOffset(10L));
        DeleteRecordsResult results = env.adminClient().deleteRecords(recordsToDelete);
        // success on records deletion for partition 0
        Map<TopicPartition, KafkaFuture<DeletedRecords>> values = results.lowWatermarks();
        KafkaFuture<DeletedRecords> myTopicPartition0Result = values.get(myTopicPartition0);
        long lowWatermark = myTopicPartition0Result.get().lowWatermark();
        assertEquals(lowWatermark, 3);
        // "offset out of range" failure on records deletion for partition 1
        KafkaFuture<DeletedRecords> myTopicPartition1Result = values.get(myTopicPartition1);
        try {
            myTopicPartition1Result.get();
            fail("get() should throw ExecutionException");
        } catch (ExecutionException e0) {
            assertTrue(e0.getCause() instanceof OffsetOutOfRangeException);
        }
        // "leader not available" failure on metadata request for partition 2
        KafkaFuture<DeletedRecords> myTopicPartition2Result = values.get(myTopicPartition2);
        try {
            myTopicPartition2Result.get();
            fail("get() should throw ExecutionException");
        } catch (ExecutionException e1) {
            assertTrue(e1.getCause() instanceof LeaderNotAvailableException);
        }
        // "not leader for partition" failure on records deletion for partition 3
        KafkaFuture<DeletedRecords> myTopicPartition3Result = values.get(myTopicPartition3);
        try {
            myTopicPartition3Result.get();
            fail("get() should throw ExecutionException");
        } catch (ExecutionException e1) {
            assertTrue(e1.getCause() instanceof NotLeaderOrFollowerException);
        }
        // "unknown topic or partition" failure on records deletion for partition 4
        KafkaFuture<DeletedRecords> myTopicPartition4Result = values.get(myTopicPartition4);
        try {
            myTopicPartition4Result.get();
            fail("get() should throw ExecutionException");
        } catch (ExecutionException e1) {
            assertTrue(e1.getCause() instanceof UnknownTopicOrPartitionException);
        }
    }
}
Also used : HashMap(java.util.HashMap) Node(org.apache.kafka.common.Node) UnknownTopicOrPartitionException(org.apache.kafka.common.errors.UnknownTopicOrPartitionException) ArrayList(java.util.ArrayList) LeaderNotAvailableException(org.apache.kafka.common.errors.LeaderNotAvailableException) MetadataResponse(org.apache.kafka.common.requests.MetadataResponse) DeleteRecordsResponse(org.apache.kafka.common.requests.DeleteRecordsResponse) PartitionInfo(org.apache.kafka.common.PartitionInfo) NotLeaderOrFollowerException(org.apache.kafka.common.errors.NotLeaderOrFollowerException) ExecutionException(java.util.concurrent.ExecutionException) KafkaFuture(org.apache.kafka.common.KafkaFuture) Cluster(org.apache.kafka.common.Cluster) TopicPartition(org.apache.kafka.common.TopicPartition) OffsetOutOfRangeException(org.apache.kafka.common.errors.OffsetOutOfRangeException) DeleteRecordsResponseData(org.apache.kafka.common.message.DeleteRecordsResponseData) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) Test(org.junit.jupiter.api.Test)

Example 4 with NotLeaderOrFollowerException

use of org.apache.kafka.common.errors.NotLeaderOrFollowerException in project kafka by apache.

the class KafkaRaftClient method onBecomeFollower.

private void onBecomeFollower(long currentTimeMs) {
    kafkaRaftMetrics.maybeUpdateElectionLatency(currentTimeMs);
    resetConnections();
    // After becoming a follower, we need to complete all pending fetches so that
    // they can be re-sent to the leader without waiting for their expirations
    fetchPurgatory.completeAllExceptionally(new NotLeaderOrFollowerException("Cannot process the fetch request because the node is no longer the leader."));
    // Clearing the append purgatory should complete all futures exceptionally since this node is no longer the leader
    appendPurgatory.completeAllExceptionally(new NotLeaderOrFollowerException("Failed to receive sufficient acknowledgments for this append before leader change."));
}
Also used : NotLeaderOrFollowerException(org.apache.kafka.common.errors.NotLeaderOrFollowerException)

Aggregations

NotLeaderOrFollowerException (org.apache.kafka.common.errors.NotLeaderOrFollowerException)4 Test (org.junit.jupiter.api.Test)3 TopicPartition (org.apache.kafka.common.TopicPartition)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 ExecutionException (java.util.concurrent.ExecutionException)1 DescribeProducersOptions (org.apache.kafka.clients.admin.DescribeProducersOptions)1 PartitionProducerState (org.apache.kafka.clients.admin.DescribeProducersResult.PartitionProducerState)1 Cluster (org.apache.kafka.common.Cluster)1 KafkaFuture (org.apache.kafka.common.KafkaFuture)1 Node (org.apache.kafka.common.Node)1 PartitionInfo (org.apache.kafka.common.PartitionInfo)1 LeaderNotAvailableException (org.apache.kafka.common.errors.LeaderNotAvailableException)1 OffsetOutOfRangeException (org.apache.kafka.common.errors.OffsetOutOfRangeException)1 UnknownTopicOrPartitionException (org.apache.kafka.common.errors.UnknownTopicOrPartitionException)1 DeleteRecordsResponseData (org.apache.kafka.common.message.DeleteRecordsResponseData)1 DeleteRecordsResponse (org.apache.kafka.common.requests.DeleteRecordsResponse)1 MetadataResponse (org.apache.kafka.common.requests.MetadataResponse)1 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)1