Search in sources :

Example 6 with EpochEndOffset

use of org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset in project kafka by apache.

the class OffsetForLeaderEpochClientTest method prepareOffsetForLeaderEpochResponse.

private static OffsetsForLeaderEpochResponse prepareOffsetForLeaderEpochResponse(TopicPartition tp, Errors error, int leaderEpoch, long endOffset) {
    OffsetForLeaderEpochResponseData data = new OffsetForLeaderEpochResponseData();
    OffsetForLeaderTopicResult topic = new OffsetForLeaderTopicResult().setTopic(tp.topic());
    data.topics().add(topic);
    topic.partitions().add(new EpochEndOffset().setPartition(tp.partition()).setErrorCode(error.code()).setLeaderEpoch(leaderEpoch).setEndOffset(endOffset));
    return new OffsetsForLeaderEpochResponse(data);
}
Also used : EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) OffsetForLeaderTopicResult(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.OffsetForLeaderTopicResult) OffsetForLeaderEpochResponseData(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData) OffsetsForLeaderEpochResponse(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse)

Example 7 with EpochEndOffset

use of org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset in project kafka by apache.

the class FetcherTest method prepareOffsetsForLeaderEpochResponse.

private OffsetsForLeaderEpochResponse prepareOffsetsForLeaderEpochResponse(TopicPartition topicPartition, Errors error, int leaderEpoch, long endOffset) {
    OffsetForLeaderEpochResponseData data = new OffsetForLeaderEpochResponseData();
    data.topics().add(new OffsetForLeaderTopicResult().setTopic(topicPartition.topic()).setPartitions(Collections.singletonList(new EpochEndOffset().setPartition(topicPartition.partition()).setErrorCode(error.code()).setLeaderEpoch(leaderEpoch).setEndOffset(endOffset))));
    return new OffsetsForLeaderEpochResponse(data);
}
Also used : EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) OffsetForLeaderTopicResult(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.OffsetForLeaderTopicResult) OffsetForLeaderEpochResponseData(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData) OffsetsForLeaderEpochResponse(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse)

Example 8 with EpochEndOffset

use of org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset in project kafka by apache.

the class FetcherTest method testOffsetValidationRequestGrouping.

@Test
public void testOffsetValidationRequestGrouping() {
    buildFetcher();
    assignFromUser(mkSet(tp0, tp1, tp2, tp3));
    metadata.updateWithCurrentRequestVersion(RequestTestUtils.metadataUpdateWithIds("dummy", 3, Collections.emptyMap(), singletonMap(topicName, 4), tp -> 5, topicIds), false, 0L);
    for (TopicPartition tp : subscriptions.assignedPartitions()) {
        Metadata.LeaderAndEpoch leaderAndEpoch = new Metadata.LeaderAndEpoch(metadata.currentLeader(tp).leader, Optional.of(4));
        subscriptions.seekUnvalidated(tp, new SubscriptionState.FetchPosition(0, Optional.of(4), leaderAndEpoch));
    }
    Set<TopicPartition> allRequestedPartitions = new HashSet<>();
    for (Node node : metadata.fetch().nodes()) {
        apiVersions.update(node.idString(), NodeApiVersions.create());
        Set<TopicPartition> expectedPartitions = subscriptions.assignedPartitions().stream().filter(tp -> metadata.currentLeader(tp).leader.equals(Optional.of(node))).collect(Collectors.toSet());
        assertTrue(expectedPartitions.stream().noneMatch(allRequestedPartitions::contains));
        assertTrue(expectedPartitions.size() > 0);
        allRequestedPartitions.addAll(expectedPartitions);
        OffsetForLeaderEpochResponseData data = new OffsetForLeaderEpochResponseData();
        expectedPartitions.forEach(tp -> {
            OffsetForLeaderTopicResult topic = data.topics().find(tp.topic());
            if (topic == null) {
                topic = new OffsetForLeaderTopicResult().setTopic(tp.topic());
                data.topics().add(topic);
            }
            topic.partitions().add(new EpochEndOffset().setPartition(tp.partition()).setErrorCode(Errors.NONE.code()).setLeaderEpoch(4).setEndOffset(0));
        });
        OffsetsForLeaderEpochResponse response = new OffsetsForLeaderEpochResponse(data);
        client.prepareResponseFrom(body -> {
            OffsetsForLeaderEpochRequest request = (OffsetsForLeaderEpochRequest) body;
            return expectedPartitions.equals(offsetForLeaderPartitionMap(request.data()).keySet());
        }, response, node);
    }
    assertEquals(subscriptions.assignedPartitions(), allRequestedPartitions);
    fetcher.validateOffsetsIfNeeded();
    consumerClient.pollNoWakeup();
    assertTrue(subscriptions.assignedPartitions().stream().noneMatch(subscriptions::awaitingValidation));
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) MockTime(org.apache.kafka.common.utils.MockTime) Arrays(java.util.Arrays) ListOffsetsRequest(org.apache.kafka.common.requests.ListOffsetsRequest) SerializationException(org.apache.kafka.common.errors.SerializationException) KafkaException(org.apache.kafka.common.KafkaException) DefaultRecordBatch(org.apache.kafka.common.record.DefaultRecordBatch) OffsetResetStrategy(org.apache.kafka.clients.consumer.OffsetResetStrategy) Collections.singletonList(java.util.Collections.singletonList) ClientUtils(org.apache.kafka.clients.ClientUtils) Cluster(org.apache.kafka.common.Cluster) Future(java.util.concurrent.Future) StringDeserializer(org.apache.kafka.common.serialization.StringDeserializer) DataOutputStream(java.io.DataOutputStream) ApiVersionsResponse(org.apache.kafka.common.requests.ApiVersionsResponse) Arrays.asList(java.util.Arrays.asList) RecordBatch(org.apache.kafka.common.record.RecordBatch) ListOffsetsResponse(org.apache.kafka.common.requests.ListOffsetsResponse) LogContext(org.apache.kafka.common.utils.LogContext) Duration(java.time.Duration) Map(java.util.Map) FetchResponse(org.apache.kafka.common.requests.FetchResponse) TimestampType(org.apache.kafka.common.record.TimestampType) Sensor(org.apache.kafka.common.metrics.Sensor) CompressionType(org.apache.kafka.common.record.CompressionType) TestUtils(org.apache.kafka.test.TestUtils) Utils.mkSet(org.apache.kafka.common.utils.Utils.mkSet) InvalidTopicException(org.apache.kafka.common.errors.InvalidTopicException) Set(java.util.Set) PartitionInfo(org.apache.kafka.common.PartitionInfo) OffsetAndTimestamp(org.apache.kafka.clients.consumer.OffsetAndTimestamp) TopicIdPartition(org.apache.kafka.common.TopicIdPartition) StandardCharsets(java.nio.charset.StandardCharsets) Executors(java.util.concurrent.Executors) MemoryRecords(org.apache.kafka.common.record.MemoryRecords) Metrics(org.apache.kafka.common.metrics.Metrics) ApiMessageType(org.apache.kafka.common.message.ApiMessageType) ConsumerRecord(org.apache.kafka.clients.consumer.ConsumerRecord) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) ListOffsetsTopicResponse(org.apache.kafka.common.message.ListOffsetsResponseData.ListOffsetsTopicResponse) Errors(org.apache.kafka.common.protocol.Errors) Node(org.apache.kafka.common.Node) FetchRequest(org.apache.kafka.common.requests.FetchRequest) MetadataResponse(org.apache.kafka.common.requests.MetadataResponse) NodeApiVersions(org.apache.kafka.clients.NodeApiVersions) Records(org.apache.kafka.common.record.Records) Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) Assertions.fail(org.junit.jupiter.api.Assertions.fail) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) OffsetForLeaderPartition(org.apache.kafka.common.message.OffsetForLeaderEpochRequestData.OffsetForLeaderPartition) ClientDnsLookup(org.apache.kafka.clients.ClientDnsLookup) Assertions.assertNull(org.junit.jupiter.api.Assertions.assertNull) RequestTestUtils(org.apache.kafka.common.requests.RequestTestUtils) RecordHeader(org.apache.kafka.common.header.internals.RecordHeader) ListOffsetsPartitionResponse(org.apache.kafka.common.message.ListOffsetsResponseData.ListOffsetsPartitionResponse) OffsetForLeaderEpochRequestData(org.apache.kafka.common.message.OffsetForLeaderEpochRequestData) INVALID_SESSION_ID(org.apache.kafka.common.requests.FetchMetadata.INVALID_SESSION_ID) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) UNDEFINED_EPOCH(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse.UNDEFINED_EPOCH) NetworkClient(org.apache.kafka.clients.NetworkClient) Deserializer(org.apache.kafka.common.serialization.Deserializer) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) TestUtils.assertOptional(org.apache.kafka.test.TestUtils.assertOptional) OffsetOutOfRangeException(org.apache.kafka.clients.consumer.OffsetOutOfRangeException) ByteArrayDeserializer(org.apache.kafka.common.serialization.ByteArrayDeserializer) MockSelector(org.apache.kafka.test.MockSelector) Field(java.lang.reflect.Field) ApiVersions(org.apache.kafka.clients.ApiVersions) MetricNameTemplate(org.apache.kafka.common.MetricNameTemplate) OffsetForLeaderEpochResponseData(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData) Assertions.assertArrayEquals(org.junit.jupiter.api.Assertions.assertArrayEquals) AfterEach(org.junit.jupiter.api.AfterEach) NetworkReceive(org.apache.kafka.common.network.NetworkReceive) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) PartitionData(org.apache.kafka.common.requests.FetchRequest.PartitionData) BytesDeserializer(org.apache.kafka.common.serialization.BytesDeserializer) ByteBufferOutputStream(org.apache.kafka.common.utils.ByteBufferOutputStream) LogTruncationException(org.apache.kafka.clients.consumer.LogTruncationException) Assertions.assertNotEquals(org.junit.jupiter.api.Assertions.assertNotEquals) AbstractRequest(org.apache.kafka.common.requests.AbstractRequest) ControlRecordType(org.apache.kafka.common.record.ControlRecordType) ByteBuffer(java.nio.ByteBuffer) ClientRequest(org.apache.kafka.clients.ClientRequest) FetchResponseData(org.apache.kafka.common.message.FetchResponseData) Record(org.apache.kafka.common.record.Record) Collections.singleton(java.util.Collections.singleton) Assertions.assertFalse(org.junit.jupiter.api.Assertions.assertFalse) BufferSupplier(org.apache.kafka.common.utils.BufferSupplier) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) MetricName(org.apache.kafka.common.MetricName) OffsetForLeaderTopicResult(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.OffsetForLeaderTopicResult) ListOffsetsTopic(org.apache.kafka.common.message.ListOffsetsRequestData.ListOffsetsTopic) TopicPartition(org.apache.kafka.common.TopicPartition) MemoryRecordsBuilder(org.apache.kafka.common.record.MemoryRecordsBuilder) LegacyRecord(org.apache.kafka.common.record.LegacyRecord) Collections.emptyList(java.util.Collections.emptyList) MetricConfig(org.apache.kafka.common.metrics.MetricConfig) ClusterResourceListeners(org.apache.kafka.common.internals.ClusterResourceListeners) Collectors(java.util.stream.Collectors) ListOffsetsResponseData(org.apache.kafka.common.message.ListOffsetsResponseData) Test(org.junit.jupiter.api.Test) ConsumerRebalanceListener(org.apache.kafka.clients.consumer.ConsumerRebalanceListener) List(java.util.List) Header(org.apache.kafka.common.header.Header) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) RecordTooLargeException(org.apache.kafka.common.errors.RecordTooLargeException) Optional(java.util.Optional) KafkaMetric(org.apache.kafka.common.metrics.KafkaMetric) OffsetsForLeaderEpochResponse(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse) Uuid(org.apache.kafka.common.Uuid) EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) Metadata(org.apache.kafka.clients.Metadata) EndTransactionMarker(org.apache.kafka.common.record.EndTransactionMarker) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) FetchSessionHandler(org.apache.kafka.clients.FetchSessionHandler) HashMap(java.util.HashMap) Function(java.util.function.Function) HashSet(java.util.HashSet) MetadataRequest(org.apache.kafka.common.requests.MetadataRequest) Collections.singletonMap(java.util.Collections.singletonMap) ExecutorService(java.util.concurrent.ExecutorService) Utils(org.apache.kafka.common.utils.Utils) UNDEFINED_EPOCH_OFFSET(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse.UNDEFINED_EPOCH_OFFSET) Collections.emptyMap(java.util.Collections.emptyMap) TimeoutException(org.apache.kafka.common.errors.TimeoutException) MockClient(org.apache.kafka.clients.MockClient) ListOffsetsPartition(org.apache.kafka.common.message.ListOffsetsRequestData.ListOffsetsPartition) Iterator(java.util.Iterator) ApiKeys(org.apache.kafka.common.protocol.ApiKeys) TimeUnit(java.util.concurrent.TimeUnit) IsolationLevel(org.apache.kafka.common.IsolationLevel) DelayedReceive(org.apache.kafka.test.DelayedReceive) TopicAuthorizationException(org.apache.kafka.common.errors.TopicAuthorizationException) OffsetsForLeaderEpochRequest(org.apache.kafka.common.requests.OffsetsForLeaderEpochRequest) Collections(java.util.Collections) EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) Node(org.apache.kafka.common.Node) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) Metadata(org.apache.kafka.clients.Metadata) OffsetForLeaderEpochResponseData(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData) OffsetsForLeaderEpochRequest(org.apache.kafka.common.requests.OffsetsForLeaderEpochRequest) TopicPartition(org.apache.kafka.common.TopicPartition) OffsetForLeaderTopicResult(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.OffsetForLeaderTopicResult) OffsetsForLeaderEpochResponse(org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test)

Example 9 with EpochEndOffset

use of org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset in project kafka by apache.

the class SubscriptionStateTest method testTruncationDetectionWithoutResetPolicy.

@Test
public void testTruncationDetectionWithoutResetPolicy() {
    Node broker1 = new Node(1, "localhost", 9092);
    state = new SubscriptionState(new LogContext(), OffsetResetStrategy.NONE);
    state.assignFromUser(Collections.singleton(tp0));
    int currentEpoch = 10;
    long initialOffset = 10L;
    int initialOffsetEpoch = 5;
    long divergentOffset = 5L;
    int divergentOffsetEpoch = 7;
    SubscriptionState.FetchPosition initialPosition = new SubscriptionState.FetchPosition(initialOffset, Optional.of(initialOffsetEpoch), new Metadata.LeaderAndEpoch(Optional.of(broker1), Optional.of(currentEpoch)));
    state.seekUnvalidated(tp0, initialPosition);
    assertTrue(state.awaitingValidation(tp0));
    Optional<LogTruncation> truncationOpt = state.maybeCompleteValidation(tp0, initialPosition, new EpochEndOffset().setLeaderEpoch(divergentOffsetEpoch).setEndOffset(divergentOffset));
    assertTrue(truncationOpt.isPresent());
    LogTruncation truncation = truncationOpt.get();
    assertEquals(Optional.of(new OffsetAndMetadata(divergentOffset, Optional.of(divergentOffsetEpoch), "")), truncation.divergentOffsetOpt);
    assertEquals(initialPosition, truncation.fetchPosition);
    assertTrue(state.awaitingValidation(tp0));
}
Also used : EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) Node(org.apache.kafka.common.Node) Metadata(org.apache.kafka.clients.Metadata) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) LogContext(org.apache.kafka.common.utils.LogContext) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) LogTruncation(org.apache.kafka.clients.consumer.internals.SubscriptionState.LogTruncation) Test(org.junit.jupiter.api.Test)

Example 10 with EpochEndOffset

use of org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset in project kafka by apache.

the class SubscriptionStateTest method testTruncationDetectionUnknownDivergentOffsetWithResetPolicy.

@Test
public void testTruncationDetectionUnknownDivergentOffsetWithResetPolicy() {
    Node broker1 = new Node(1, "localhost", 9092);
    state = new SubscriptionState(new LogContext(), OffsetResetStrategy.EARLIEST);
    state.assignFromUser(Collections.singleton(tp0));
    int currentEpoch = 10;
    long initialOffset = 10L;
    int initialOffsetEpoch = 5;
    SubscriptionState.FetchPosition initialPosition = new SubscriptionState.FetchPosition(initialOffset, Optional.of(initialOffsetEpoch), new Metadata.LeaderAndEpoch(Optional.of(broker1), Optional.of(currentEpoch)));
    state.seekUnvalidated(tp0, initialPosition);
    assertTrue(state.awaitingValidation(tp0));
    Optional<LogTruncation> truncationOpt = state.maybeCompleteValidation(tp0, initialPosition, new EpochEndOffset().setLeaderEpoch(UNDEFINED_EPOCH).setEndOffset(UNDEFINED_EPOCH_OFFSET));
    assertEquals(Optional.empty(), truncationOpt);
    assertFalse(state.awaitingValidation(tp0));
    assertTrue(state.isOffsetResetNeeded(tp0));
    assertEquals(OffsetResetStrategy.EARLIEST, state.resetStrategy(tp0));
}
Also used : EpochEndOffset(org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset) Node(org.apache.kafka.common.Node) Metadata(org.apache.kafka.clients.Metadata) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) LogContext(org.apache.kafka.common.utils.LogContext) LogTruncation(org.apache.kafka.clients.consumer.internals.SubscriptionState.LogTruncation) Test(org.junit.jupiter.api.Test)

Aggregations

EpochEndOffset (org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.EpochEndOffset)13 Metadata (org.apache.kafka.clients.Metadata)8 OffsetAndMetadata (org.apache.kafka.clients.consumer.OffsetAndMetadata)8 Node (org.apache.kafka.common.Node)8 Test (org.junit.jupiter.api.Test)8 LogTruncation (org.apache.kafka.clients.consumer.internals.SubscriptionState.LogTruncation)7 OffsetForLeaderTopicResult (org.apache.kafka.common.message.OffsetForLeaderEpochResponseData.OffsetForLeaderTopicResult)6 OffsetForLeaderEpochResponseData (org.apache.kafka.common.message.OffsetForLeaderEpochResponseData)5 LogContext (org.apache.kafka.common.utils.LogContext)4 OffsetsForLeaderEpochResponse (org.apache.kafka.common.requests.OffsetsForLeaderEpochResponse)3 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 Errors (org.apache.kafka.common.protocol.Errors)2 DataOutputStream (java.io.DataOutputStream)1 Field (java.lang.reflect.Field)1 ByteBuffer (java.nio.ByteBuffer)1 StandardCharsets (java.nio.charset.StandardCharsets)1 Duration (java.time.Duration)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1