Search in sources :

Example 1 with Stable

use of io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable in project kop by streamnative.

the class GroupMetadataManagerTest method testLoadGroupAndOffsetsFromDifferentSegments.

@Test
public void testLoadGroupAndOffsetsFromDifferentSegments() throws Exception {
    int generation = 293;
    String protocolType = "consumer";
    String protocol = "range";
    TopicPartition tp0 = new TopicPartition("foo", 0);
    TopicPartition tp1 = new TopicPartition("foo", 1);
    TopicPartition tp2 = new TopicPartition("bar", 0);
    TopicPartition tp3 = new TopicPartition("xxx", 0);
    String segment1MemberId = "a";
    Map<TopicPartition, Long> segment1Offsets = new HashMap<>();
    segment1Offsets.put(tp0, 23L);
    segment1Offsets.put(tp1, 455L);
    segment1Offsets.put(tp3, 42L);
    List<SimpleRecord> segment1Records = createCommittedOffsetRecords(segment1Offsets, groupId, NAMESPACE_PREFIX);
    SimpleRecord segment1Group = buildStableGroupRecordWithMember(generation, protocolType, protocol, segment1MemberId);
    segment1Records.add(segment1Group);
    ByteBuffer segment1Buffer = newMemoryRecordsBuffer(segment1Records);
    String segment2MemberId = "a";
    Map<TopicPartition, Long> segment2Offsets = new HashMap<>();
    segment2Offsets.put(tp0, 33L);
    segment2Offsets.put(tp2, 8992L);
    segment2Offsets.put(tp3, 10L);
    List<SimpleRecord> segment2Records = createCommittedOffsetRecords(segment2Offsets, groupId, NAMESPACE_PREFIX);
    SimpleRecord segment2Group = buildStableGroupRecordWithMember(generation, protocolType, protocol, segment2MemberId);
    segment2Records.add(segment2Group);
    ByteBuffer segment2Buffer = newMemoryRecordsBuffer(segment2Records);
    byte[] key = groupMetadataKey(groupId);
    Producer<ByteBuffer> producer = groupMetadataManager.getOffsetsTopicProducer(groupPartitionId).get();
    producer.newMessage().keyBytes(key).value(segment1Buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    producer.newMessage().keyBytes(key).value(segment2Buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    CompletableFuture<GroupMetadata> onLoadedFuture = new CompletableFuture<>();
    groupMetadataManager.scheduleLoadGroupAndOffsets(groupPartitionId, groupMetadata -> onLoadedFuture.complete(groupMetadata)).get();
    GroupMetadata group = onLoadedFuture.get();
    GroupMetadata groupInCache = groupMetadataManager.getGroup(groupId).orElseGet(() -> {
        fail("Group was not loaded into the cache");
        return null;
    });
    assertSame(group, groupInCache);
    assertEquals(groupId, group.groupId());
    assertEquals(Stable, group.currentState());
    assertEquals(segment2MemberId, group.leaderOrNull(), "segment2 group record member should be elected");
    assertEquals(Lists.newArrayList(segment2MemberId), group.allMembers().stream().collect(Collectors.toList()), "segment2 group record member should be only member");
    // offsets of segment1 should be overridden by segment2 offsets of the same topic partitions
    Map<TopicPartition, Long> committedOffsets = new HashMap<>();
    committedOffsets.putAll(segment1Offsets);
    committedOffsets.putAll(segment2Offsets);
    assertEquals(committedOffsets.size(), group.allOffsets().size());
    committedOffsets.forEach((tp, offset) -> {
        assertEquals(Optional.of(offset), group.offset(tp, NAMESPACE_PREFIX).map(OffsetAndMetadata::offset));
    });
}
Also used : MathUtils(org.apache.bookkeeper.common.util.MathUtils) Producer(org.apache.pulsar.client.api.Producer) Test(org.testng.annotations.Test) AfterMethod(org.testng.annotations.AfterMethod) ControlRecordType(org.apache.kafka.common.record.ControlRecordType) ByteBuffer(java.nio.ByteBuffer) Record(org.apache.kafka.common.record.Record) PartitionData(org.apache.kafka.common.requests.OffsetFetchResponse.PartitionData) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) RecordBatch(org.apache.kafka.common.record.RecordBatch) Empty(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Empty) Assert.assertFalse(org.testng.Assert.assertFalse) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) TimestampType(org.apache.kafka.common.record.TimestampType) Assert.assertSame(org.testng.Assert.assertSame) TopicPartition(org.apache.kafka.common.TopicPartition) MemoryRecordsBuilder(org.apache.kafka.common.record.MemoryRecordsBuilder) CompressionType(org.apache.kafka.common.record.CompressionType) OrderedScheduler(org.apache.bookkeeper.common.util.OrderedScheduler) Time(org.apache.kafka.common.utils.Time) ImmutableMap(com.google.common.collect.ImmutableMap) KopProtocolHandlerTestBase(io.streamnative.pulsar.handlers.kop.KopProtocolHandlerTestBase) AbstractRecords(org.apache.kafka.common.record.AbstractRecords) BeforeClass(org.testng.annotations.BeforeClass) BeforeMethod(org.testng.annotations.BeforeMethod) GroupMetadataConstants.groupMetadataValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataValue) Assert.assertNotNull(org.testng.Assert.assertNotNull) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Stable(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable) Consumer(org.apache.pulsar.client.api.Consumer) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) MemoryRecords(org.apache.kafka.common.record.MemoryRecords) Optional(java.util.Optional) Errors(org.apache.kafka.common.protocol.Errors) OffsetAndMetadata(io.streamnative.pulsar.handlers.kop.offset.OffsetAndMetadata) GroupMetadataConstants.offsetCommitKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitKey) BaseKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.BaseKey) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) Assert.assertNull(org.testng.Assert.assertNull) PreparingRebalance(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.PreparingRebalance) Assert.assertEquals(org.testng.Assert.assertEquals) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) EndTransactionMarker(org.apache.kafka.common.record.EndTransactionMarker) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Message(org.apache.pulsar.client.api.Message) GroupMetadataConstants.groupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataKey) Mockito.spy(org.mockito.Mockito.spy) SubscriptionInitialPosition(org.apache.pulsar.client.api.SubscriptionInitialPosition) GroupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupMetadataKey) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ProducerBuilder(org.apache.pulsar.client.api.ProducerBuilder) Lists(com.google.common.collect.Lists) KafkaProtocolHandler(io.streamnative.pulsar.handlers.kop.KafkaProtocolHandler) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) OffsetFetchResponse(org.apache.kafka.common.requests.OffsetFetchResponse) GroupMetadataConstants.offsetCommitValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitValue) AfterClass(org.testng.annotations.AfterClass) KopTopic(io.streamnative.pulsar.handlers.kop.utils.KopTopic) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Assert.fail(org.testng.Assert.fail) MockTime(io.streamnative.pulsar.handlers.kop.utils.timer.MockTime) OffsetKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.OffsetKey) Schema(org.apache.pulsar.client.api.Schema) TimeUnit(java.util.concurrent.TimeUnit) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) MessageId(org.apache.pulsar.client.api.MessageId) Assert.assertTrue(org.testng.Assert.assertTrue) ReaderBuilder(org.apache.pulsar.client.api.ReaderBuilder) CommitRecordMetadataAndOffset(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadata.CommitRecordMetadataAndOffset) Collections(java.util.Collections) HashMap(java.util.HashMap) ByteBuffer(java.nio.ByteBuffer) CompletableFuture(java.util.concurrent.CompletableFuture) TopicPartition(org.apache.kafka.common.TopicPartition) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) Test(org.testng.annotations.Test)

Example 2 with Stable

use of io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable in project starlight-for-kafka by datastax.

the class GroupMetadataManagerTest method testLoadOffsetsAndGroup.

@Test
public void testLoadOffsetsAndGroup() throws Exception {
    int generation = 935;
    String protocolType = "consumer";
    String protocol = "range";
    Map<TopicPartition, Long> committedOffsets = new HashMap<>();
    committedOffsets.put(new TopicPartition("foo", 0), 23L);
    committedOffsets.put(new TopicPartition("foo", 1), 455L);
    committedOffsets.put(new TopicPartition("bar", 0), 8992L);
    List<SimpleRecord> offsetCommitRecords = createCommittedOffsetRecords(committedOffsets, groupId, NAMESPACE_PREFIX);
    String memberId = "98098230493";
    SimpleRecord groupMetadataRecord = buildStableGroupRecordWithMember(generation, protocolType, protocol, memberId);
    offsetCommitRecords.add(groupMetadataRecord);
    ByteBuffer buffer = newMemoryRecordsBuffer(offsetCommitRecords);
    byte[] key = groupMetadataKey(groupId);
    Producer<ByteBuffer> producer = groupMetadataManager.getOffsetsTopicProducer(groupPartitionId).get();
    producer.newMessage().keyBytes(key).value(buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    CompletableFuture<GroupMetadata> onLoadedFuture = new CompletableFuture<>();
    groupMetadataManager.scheduleLoadGroupAndOffsets(groupPartitionId, groupMetadata -> onLoadedFuture.complete(groupMetadata)).get();
    GroupMetadata group = onLoadedFuture.get();
    GroupMetadata groupInCache = groupMetadataManager.getGroup(groupId).orElseGet(() -> {
        fail("Group was not loaded into the cache");
        return null;
    });
    assertSame(group, groupInCache);
    assertEquals(groupId, group.groupId());
    assertEquals(Stable, group.currentState());
    assertEquals(memberId, group.leaderOrNull());
    assertEquals(generation, group.generationId());
    assertEquals(Optional.of(protocolType), group.protocolType());
    assertEquals(Lists.newArrayList(memberId), group.allMembers().stream().collect(Collectors.toList()));
    assertEquals(committedOffsets.size(), group.allOffsets().size());
    committedOffsets.forEach((tp, offset) -> {
        assertEquals(Optional.of(offset), group.offset(tp, NAMESPACE_PREFIX).map(OffsetAndMetadata::offset));
    });
}
Also used : MathUtils(org.apache.bookkeeper.common.util.MathUtils) Producer(org.apache.pulsar.client.api.Producer) Cleanup(lombok.Cleanup) Test(org.testng.annotations.Test) AfterMethod(org.testng.annotations.AfterMethod) ControlRecordType(org.apache.kafka.common.record.ControlRecordType) ByteBuffer(java.nio.ByteBuffer) Record(org.apache.kafka.common.record.Record) PartitionData(org.apache.kafka.common.requests.OffsetFetchResponse.PartitionData) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) RecordBatch(org.apache.kafka.common.record.RecordBatch) Empty(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Empty) Assert.assertFalse(org.testng.Assert.assertFalse) TimestampType(org.apache.kafka.common.record.TimestampType) Assert.assertSame(org.testng.Assert.assertSame) TopicPartition(org.apache.kafka.common.TopicPartition) MemoryRecordsBuilder(org.apache.kafka.common.record.MemoryRecordsBuilder) CompressionType(org.apache.kafka.common.record.CompressionType) OrderedScheduler(org.apache.bookkeeper.common.util.OrderedScheduler) Time(org.apache.kafka.common.utils.Time) ImmutableMap(com.google.common.collect.ImmutableMap) KopProtocolHandlerTestBase(io.streamnative.pulsar.handlers.kop.KopProtocolHandlerTestBase) AbstractRecords(org.apache.kafka.common.record.AbstractRecords) BeforeMethod(org.testng.annotations.BeforeMethod) GroupMetadataConstants.groupMetadataValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataValue) Assert.assertNotNull(org.testng.Assert.assertNotNull) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Stable(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable) Consumer(org.apache.pulsar.client.api.Consumer) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) MemoryRecords(org.apache.kafka.common.record.MemoryRecords) Optional(java.util.Optional) Errors(org.apache.kafka.common.protocol.Errors) OffsetAndMetadata(io.streamnative.pulsar.handlers.kop.offset.OffsetAndMetadata) GroupMetadataConstants.offsetCommitKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitKey) BaseKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.BaseKey) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) Assert.assertNull(org.testng.Assert.assertNull) PreparingRebalance(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.PreparingRebalance) Assert.assertEquals(org.testng.Assert.assertEquals) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) EndTransactionMarker(org.apache.kafka.common.record.EndTransactionMarker) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Message(org.apache.pulsar.client.api.Message) GroupMetadataConstants.groupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataKey) Mockito.spy(org.mockito.Mockito.spy) SubscriptionInitialPosition(org.apache.pulsar.client.api.SubscriptionInitialPosition) GroupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupMetadataKey) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ProducerBuilder(org.apache.pulsar.client.api.ProducerBuilder) Lists(com.google.common.collect.Lists) KafkaProtocolHandler(io.streamnative.pulsar.handlers.kop.KafkaProtocolHandler) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) OffsetFetchResponse(org.apache.kafka.common.requests.OffsetFetchResponse) GroupMetadataConstants.offsetCommitValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitValue) KopTopic(io.streamnative.pulsar.handlers.kop.utils.KopTopic) Assert.fail(org.testng.Assert.fail) MockTime(io.streamnative.pulsar.handlers.kop.utils.timer.MockTime) OffsetKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.OffsetKey) Schema(org.apache.pulsar.client.api.Schema) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) MessageId(org.apache.pulsar.client.api.MessageId) Assert.assertTrue(org.testng.Assert.assertTrue) ReaderBuilder(org.apache.pulsar.client.api.ReaderBuilder) CommitRecordMetadataAndOffset(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadata.CommitRecordMetadataAndOffset) Collections(java.util.Collections) HashMap(java.util.HashMap) ByteBuffer(java.nio.ByteBuffer) CompletableFuture(java.util.concurrent.CompletableFuture) TopicPartition(org.apache.kafka.common.TopicPartition) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) Test(org.testng.annotations.Test)

Example 3 with Stable

use of io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable in project starlight-for-kafka by datastax.

the class GroupMetadataManagerTest method testLoadGroupAndOffsetsFromDifferentSegments.

@Test
public void testLoadGroupAndOffsetsFromDifferentSegments() throws Exception {
    int generation = 293;
    String protocolType = "consumer";
    String protocol = "range";
    TopicPartition tp0 = new TopicPartition("foo", 0);
    TopicPartition tp1 = new TopicPartition("foo", 1);
    TopicPartition tp2 = new TopicPartition("bar", 0);
    TopicPartition tp3 = new TopicPartition("xxx", 0);
    String segment1MemberId = "a";
    Map<TopicPartition, Long> segment1Offsets = new HashMap<>();
    segment1Offsets.put(tp0, 23L);
    segment1Offsets.put(tp1, 455L);
    segment1Offsets.put(tp3, 42L);
    List<SimpleRecord> segment1Records = createCommittedOffsetRecords(segment1Offsets, groupId, NAMESPACE_PREFIX);
    SimpleRecord segment1Group = buildStableGroupRecordWithMember(generation, protocolType, protocol, segment1MemberId);
    segment1Records.add(segment1Group);
    ByteBuffer segment1Buffer = newMemoryRecordsBuffer(segment1Records);
    String segment2MemberId = "a";
    Map<TopicPartition, Long> segment2Offsets = new HashMap<>();
    segment2Offsets.put(tp0, 33L);
    segment2Offsets.put(tp2, 8992L);
    segment2Offsets.put(tp3, 10L);
    List<SimpleRecord> segment2Records = createCommittedOffsetRecords(segment2Offsets, groupId, NAMESPACE_PREFIX);
    SimpleRecord segment2Group = buildStableGroupRecordWithMember(generation, protocolType, protocol, segment2MemberId);
    segment2Records.add(segment2Group);
    ByteBuffer segment2Buffer = newMemoryRecordsBuffer(segment2Records);
    byte[] key = groupMetadataKey(groupId);
    Producer<ByteBuffer> producer = groupMetadataManager.getOffsetsTopicProducer(groupPartitionId).get();
    producer.newMessage().keyBytes(key).value(segment1Buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    producer.newMessage().keyBytes(key).value(segment2Buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    CompletableFuture<GroupMetadata> onLoadedFuture = new CompletableFuture<>();
    groupMetadataManager.scheduleLoadGroupAndOffsets(groupPartitionId, groupMetadata -> onLoadedFuture.complete(groupMetadata)).get();
    GroupMetadata group = onLoadedFuture.get();
    GroupMetadata groupInCache = groupMetadataManager.getGroup(groupId).orElseGet(() -> {
        fail("Group was not loaded into the cache");
        return null;
    });
    assertSame(group, groupInCache);
    assertEquals(groupId, group.groupId());
    assertEquals(Stable, group.currentState());
    assertEquals(segment2MemberId, group.leaderOrNull(), "segment2 group record member should be elected");
    assertEquals(Lists.newArrayList(segment2MemberId), group.allMembers().stream().collect(Collectors.toList()), "segment2 group record member should be only member");
    // offsets of segment1 should be overridden by segment2 offsets of the same topic partitions
    Map<TopicPartition, Long> committedOffsets = new HashMap<>();
    committedOffsets.putAll(segment1Offsets);
    committedOffsets.putAll(segment2Offsets);
    assertEquals(committedOffsets.size(), group.allOffsets().size());
    committedOffsets.forEach((tp, offset) -> {
        assertEquals(Optional.of(offset), group.offset(tp, NAMESPACE_PREFIX).map(OffsetAndMetadata::offset));
    });
}
Also used : MathUtils(org.apache.bookkeeper.common.util.MathUtils) Producer(org.apache.pulsar.client.api.Producer) Cleanup(lombok.Cleanup) Test(org.testng.annotations.Test) AfterMethod(org.testng.annotations.AfterMethod) ControlRecordType(org.apache.kafka.common.record.ControlRecordType) ByteBuffer(java.nio.ByteBuffer) Record(org.apache.kafka.common.record.Record) PartitionData(org.apache.kafka.common.requests.OffsetFetchResponse.PartitionData) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) RecordBatch(org.apache.kafka.common.record.RecordBatch) Empty(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Empty) Assert.assertFalse(org.testng.Assert.assertFalse) TimestampType(org.apache.kafka.common.record.TimestampType) Assert.assertSame(org.testng.Assert.assertSame) TopicPartition(org.apache.kafka.common.TopicPartition) MemoryRecordsBuilder(org.apache.kafka.common.record.MemoryRecordsBuilder) CompressionType(org.apache.kafka.common.record.CompressionType) OrderedScheduler(org.apache.bookkeeper.common.util.OrderedScheduler) Time(org.apache.kafka.common.utils.Time) ImmutableMap(com.google.common.collect.ImmutableMap) KopProtocolHandlerTestBase(io.streamnative.pulsar.handlers.kop.KopProtocolHandlerTestBase) AbstractRecords(org.apache.kafka.common.record.AbstractRecords) BeforeMethod(org.testng.annotations.BeforeMethod) GroupMetadataConstants.groupMetadataValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataValue) Assert.assertNotNull(org.testng.Assert.assertNotNull) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Stable(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable) Consumer(org.apache.pulsar.client.api.Consumer) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) MemoryRecords(org.apache.kafka.common.record.MemoryRecords) Optional(java.util.Optional) Errors(org.apache.kafka.common.protocol.Errors) OffsetAndMetadata(io.streamnative.pulsar.handlers.kop.offset.OffsetAndMetadata) GroupMetadataConstants.offsetCommitKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitKey) BaseKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.BaseKey) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) Assert.assertNull(org.testng.Assert.assertNull) PreparingRebalance(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.PreparingRebalance) Assert.assertEquals(org.testng.Assert.assertEquals) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) EndTransactionMarker(org.apache.kafka.common.record.EndTransactionMarker) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Message(org.apache.pulsar.client.api.Message) GroupMetadataConstants.groupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataKey) Mockito.spy(org.mockito.Mockito.spy) SubscriptionInitialPosition(org.apache.pulsar.client.api.SubscriptionInitialPosition) GroupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupMetadataKey) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ProducerBuilder(org.apache.pulsar.client.api.ProducerBuilder) Lists(com.google.common.collect.Lists) KafkaProtocolHandler(io.streamnative.pulsar.handlers.kop.KafkaProtocolHandler) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) OffsetFetchResponse(org.apache.kafka.common.requests.OffsetFetchResponse) GroupMetadataConstants.offsetCommitValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitValue) KopTopic(io.streamnative.pulsar.handlers.kop.utils.KopTopic) Assert.fail(org.testng.Assert.fail) MockTime(io.streamnative.pulsar.handlers.kop.utils.timer.MockTime) OffsetKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.OffsetKey) Schema(org.apache.pulsar.client.api.Schema) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) MessageId(org.apache.pulsar.client.api.MessageId) Assert.assertTrue(org.testng.Assert.assertTrue) ReaderBuilder(org.apache.pulsar.client.api.ReaderBuilder) CommitRecordMetadataAndOffset(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadata.CommitRecordMetadataAndOffset) Collections(java.util.Collections) HashMap(java.util.HashMap) ByteBuffer(java.nio.ByteBuffer) CompletableFuture(java.util.concurrent.CompletableFuture) TopicPartition(org.apache.kafka.common.TopicPartition) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) Test(org.testng.annotations.Test)

Example 4 with Stable

use of io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable in project kop by streamnative.

the class GroupMetadataManagerTest method testLoadOffsetsAndGroup.

@Test
public void testLoadOffsetsAndGroup() throws Exception {
    int generation = 935;
    String protocolType = "consumer";
    String protocol = "range";
    Map<TopicPartition, Long> committedOffsets = new HashMap<>();
    committedOffsets.put(new TopicPartition("foo", 0), 23L);
    committedOffsets.put(new TopicPartition("foo", 1), 455L);
    committedOffsets.put(new TopicPartition("bar", 0), 8992L);
    List<SimpleRecord> offsetCommitRecords = createCommittedOffsetRecords(committedOffsets, groupId, NAMESPACE_PREFIX);
    String memberId = "98098230493";
    SimpleRecord groupMetadataRecord = buildStableGroupRecordWithMember(generation, protocolType, protocol, memberId);
    offsetCommitRecords.add(groupMetadataRecord);
    ByteBuffer buffer = newMemoryRecordsBuffer(offsetCommitRecords);
    byte[] key = groupMetadataKey(groupId);
    Producer<ByteBuffer> producer = groupMetadataManager.getOffsetsTopicProducer(groupPartitionId).get();
    producer.newMessage().keyBytes(key).value(buffer).eventTime(Time.SYSTEM.milliseconds()).send();
    CompletableFuture<GroupMetadata> onLoadedFuture = new CompletableFuture<>();
    groupMetadataManager.scheduleLoadGroupAndOffsets(groupPartitionId, groupMetadata -> onLoadedFuture.complete(groupMetadata)).get();
    GroupMetadata group = onLoadedFuture.get();
    GroupMetadata groupInCache = groupMetadataManager.getGroup(groupId).orElseGet(() -> {
        fail("Group was not loaded into the cache");
        return null;
    });
    assertSame(group, groupInCache);
    assertEquals(groupId, group.groupId());
    assertEquals(Stable, group.currentState());
    assertEquals(memberId, group.leaderOrNull());
    assertEquals(generation, group.generationId());
    assertEquals(Optional.of(protocolType), group.protocolType());
    assertEquals(Lists.newArrayList(memberId), group.allMembers().stream().collect(Collectors.toList()));
    assertEquals(committedOffsets.size(), group.allOffsets().size());
    committedOffsets.forEach((tp, offset) -> {
        assertEquals(Optional.of(offset), group.offset(tp, NAMESPACE_PREFIX).map(OffsetAndMetadata::offset));
    });
}
Also used : MathUtils(org.apache.bookkeeper.common.util.MathUtils) Producer(org.apache.pulsar.client.api.Producer) Test(org.testng.annotations.Test) AfterMethod(org.testng.annotations.AfterMethod) ControlRecordType(org.apache.kafka.common.record.ControlRecordType) ByteBuffer(java.nio.ByteBuffer) Record(org.apache.kafka.common.record.Record) PartitionData(org.apache.kafka.common.requests.OffsetFetchResponse.PartitionData) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) RecordBatch(org.apache.kafka.common.record.RecordBatch) Empty(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Empty) Assert.assertFalse(org.testng.Assert.assertFalse) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) TimestampType(org.apache.kafka.common.record.TimestampType) Assert.assertSame(org.testng.Assert.assertSame) TopicPartition(org.apache.kafka.common.TopicPartition) MemoryRecordsBuilder(org.apache.kafka.common.record.MemoryRecordsBuilder) CompressionType(org.apache.kafka.common.record.CompressionType) OrderedScheduler(org.apache.bookkeeper.common.util.OrderedScheduler) Time(org.apache.kafka.common.utils.Time) ImmutableMap(com.google.common.collect.ImmutableMap) KopProtocolHandlerTestBase(io.streamnative.pulsar.handlers.kop.KopProtocolHandlerTestBase) AbstractRecords(org.apache.kafka.common.record.AbstractRecords) BeforeClass(org.testng.annotations.BeforeClass) BeforeMethod(org.testng.annotations.BeforeMethod) GroupMetadataConstants.groupMetadataValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataValue) Assert.assertNotNull(org.testng.Assert.assertNotNull) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Stable(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable) Consumer(org.apache.pulsar.client.api.Consumer) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) MemoryRecords(org.apache.kafka.common.record.MemoryRecords) Optional(java.util.Optional) Errors(org.apache.kafka.common.protocol.Errors) OffsetAndMetadata(io.streamnative.pulsar.handlers.kop.offset.OffsetAndMetadata) GroupMetadataConstants.offsetCommitKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitKey) BaseKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.BaseKey) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) Assert.assertNull(org.testng.Assert.assertNull) PreparingRebalance(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.PreparingRebalance) Assert.assertEquals(org.testng.Assert.assertEquals) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) EndTransactionMarker(org.apache.kafka.common.record.EndTransactionMarker) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Message(org.apache.pulsar.client.api.Message) GroupMetadataConstants.groupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataKey) Mockito.spy(org.mockito.Mockito.spy) SubscriptionInitialPosition(org.apache.pulsar.client.api.SubscriptionInitialPosition) GroupMetadataKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupMetadataKey) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ProducerBuilder(org.apache.pulsar.client.api.ProducerBuilder) Lists(com.google.common.collect.Lists) KafkaProtocolHandler(io.streamnative.pulsar.handlers.kop.KafkaProtocolHandler) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) OffsetFetchResponse(org.apache.kafka.common.requests.OffsetFetchResponse) GroupMetadataConstants.offsetCommitValue(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitValue) AfterClass(org.testng.annotations.AfterClass) KopTopic(io.streamnative.pulsar.handlers.kop.utils.KopTopic) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Assert.fail(org.testng.Assert.fail) MockTime(io.streamnative.pulsar.handlers.kop.utils.timer.MockTime) OffsetKey(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.OffsetKey) Schema(org.apache.pulsar.client.api.Schema) TimeUnit(java.util.concurrent.TimeUnit) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) MessageId(org.apache.pulsar.client.api.MessageId) Assert.assertTrue(org.testng.Assert.assertTrue) ReaderBuilder(org.apache.pulsar.client.api.ReaderBuilder) CommitRecordMetadataAndOffset(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadata.CommitRecordMetadataAndOffset) Collections(java.util.Collections) HashMap(java.util.HashMap) ByteBuffer(java.nio.ByteBuffer) CompletableFuture(java.util.concurrent.CompletableFuture) TopicPartition(org.apache.kafka.common.TopicPartition) GroupTopicPartition(io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) SimpleRecord(org.apache.kafka.common.record.SimpleRecord) Test(org.testng.annotations.Test)

Aggregations

ImmutableMap (com.google.common.collect.ImmutableMap)4 Lists (com.google.common.collect.Lists)4 Sets (com.google.common.collect.Sets)4 KafkaProtocolHandler (io.streamnative.pulsar.handlers.kop.KafkaProtocolHandler)4 KopProtocolHandlerTestBase (io.streamnative.pulsar.handlers.kop.KopProtocolHandlerTestBase)4 CommitRecordMetadataAndOffset (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadata.CommitRecordMetadataAndOffset)4 GroupMetadataConstants.groupMetadataKey (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataKey)4 GroupMetadataConstants.groupMetadataValue (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.groupMetadataValue)4 GroupMetadataConstants.offsetCommitKey (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitKey)4 GroupMetadataConstants.offsetCommitValue (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataConstants.offsetCommitValue)4 BaseKey (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.BaseKey)4 GroupMetadataKey (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupMetadataKey)4 GroupTopicPartition (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.GroupTopicPartition)4 OffsetKey (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupMetadataManager.OffsetKey)4 Empty (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Empty)4 PreparingRebalance (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.PreparingRebalance)4 Stable (io.streamnative.pulsar.handlers.kop.coordinator.group.GroupState.Stable)4 OffsetAndMetadata (io.streamnative.pulsar.handlers.kop.offset.OffsetAndMetadata)4 KopTopic (io.streamnative.pulsar.handlers.kop.utils.KopTopic)4 MockTime (io.streamnative.pulsar.handlers.kop.utils.timer.MockTime)4