Skip to content

Commit 278205e

Browse files
fix: Upgrade kafka shim pubsublite version (#405)
1 parent 7d99aef commit 278205e

File tree

9 files changed

+81
-70
lines changed

9 files changed

+81
-70
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module>pubsublite-kafka-auth</module>
1919
</modules>
2020
<properties>
21-
<psl.version>1.9.2</psl.version>
21+
<psl.version>1.11.1</psl.version>
2222
</properties>
2323

2424
<dependencyManagement>

pubsublite-kafka/src/main/java/com/google/cloud/pubsublite/kafka/LiteHeaders.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,22 @@
1616

1717
package com.google.cloud.pubsublite.kafka;
1818

19+
import com.google.cloud.pubsublite.proto.AttributeValues;
1920
import com.google.common.collect.ImmutableList;
20-
import com.google.common.collect.ImmutableListMultimap;
2121
import com.google.common.collect.Iterables;
2222
import com.google.common.collect.Iterators;
2323
import com.google.protobuf.ByteString;
2424
import java.util.Iterator;
25+
import java.util.Map;
26+
import java.util.stream.Collectors;
27+
import javax.annotation.Nullable;
2528
import org.apache.kafka.common.header.Header;
2629
import org.apache.kafka.common.header.Headers;
2730

2831
class LiteHeaders implements Headers {
29-
private ImmutableListMultimap<String, ByteString> attributes;
32+
private Map<String, AttributeValues> attributes;
3033

31-
LiteHeaders(ImmutableListMultimap<String, ByteString> attributes) {
34+
LiteHeaders(Map<String, AttributeValues> attributes) {
3235
this.attributes = attributes;
3336
}
3437

@@ -68,23 +71,24 @@ public Header lastHeader(String s) {
6871

6972
@Override
7073
public Iterable<Header> headers(String s) {
71-
if (attributes.containsKey(s))
72-
return Iterables.transform(attributes.get(s), value -> toHeader(s, value));
73-
return ImmutableList.of();
74+
@Nullable AttributeValues values = attributes.get(s);
75+
if (values == null) {
76+
return ImmutableList.of();
77+
}
78+
return values.getValuesList().stream().map(v -> toHeader(s, v)).collect(Collectors.toList());
7479
}
7580

7681
@Override
7782
public Header[] toArray() {
78-
ImmutableList.Builder<Header> arrayBuilder = ImmutableList.builder();
79-
attributes
80-
.entries()
81-
.forEach(entry -> arrayBuilder.add(toHeader(entry.getKey(), entry.getValue())));
82-
return (Header[]) arrayBuilder.build().toArray();
83+
return Iterators.toArray(iterator(), Header.class);
8384
}
8485

8586
@Override
8687
public Iterator<Header> iterator() {
87-
return Iterators.transform(
88-
attributes.entries().iterator(), entry -> toHeader(entry.getKey(), entry.getValue()));
88+
return attributes.entrySet().stream()
89+
.flatMap(
90+
entry ->
91+
entry.getValue().getValuesList().stream().map(v -> toHeader(entry.getKey(), v)))
92+
.iterator();
8993
}
9094
}

pubsublite-kafka/src/main/java/com/google/cloud/pubsublite/kafka/RecordTransforms.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616

1717
package com.google.cloud.pubsublite.kafka;
1818

19-
import com.google.cloud.pubsublite.Message;
2019
import com.google.cloud.pubsublite.Partition;
21-
import com.google.cloud.pubsublite.SequencedMessage;
2220
import com.google.cloud.pubsublite.TopicPath;
21+
import com.google.cloud.pubsublite.proto.AttributeValues;
22+
import com.google.cloud.pubsublite.proto.PubSubMessage;
23+
import com.google.cloud.pubsublite.proto.SequencedMessage;
2324
import com.google.common.collect.ImmutableListMultimap;
2425
import com.google.protobuf.ByteString;
2526
import com.google.protobuf.Timestamp;
@@ -32,44 +33,52 @@
3233
class RecordTransforms {
3334
private RecordTransforms() {}
3435

35-
static Message toMessage(ProducerRecord<byte[], byte[]> record) {
36-
Message.Builder builder =
37-
Message.builder()
36+
static PubSubMessage toMessage(ProducerRecord<byte[], byte[]> record) {
37+
PubSubMessage.Builder builder =
38+
PubSubMessage.newBuilder()
3839
.setKey(ByteString.copyFrom(record.key()))
3940
.setData(ByteString.copyFrom(record.value()));
4041
if (record.timestamp() != null) {
41-
builder = builder.setEventTime(Timestamps.fromMillis(record.timestamp()));
42+
builder.setEventTime(Timestamps.fromMillis(record.timestamp()));
4243
}
4344
ImmutableListMultimap.Builder<String, ByteString> attributes = ImmutableListMultimap.builder();
4445
record
4546
.headers()
4647
.forEach(header -> attributes.put(header.key(), ByteString.copyFrom(header.value())));
47-
return builder.setAttributes(attributes.build()).build();
48+
attributes
49+
.build()
50+
.asMap()
51+
.forEach(
52+
(key, values) ->
53+
builder.putAttributes(
54+
key, AttributeValues.newBuilder().addAllValues(values).build()));
55+
return builder.build();
4856
}
4957

5058
static ConsumerRecord<byte[], byte[]> fromMessage(
51-
SequencedMessage message, TopicPath topic, Partition partition) {
52-
Headers headers = new LiteHeaders(message.message().attributes());
59+
SequencedMessage sequenced, TopicPath topic, Partition partition) {
60+
PubSubMessage message = sequenced.getMessage();
61+
Headers headers = new LiteHeaders(message.getAttributesMap());
5362
TimestampType type;
5463
Timestamp timestamp;
55-
if (message.message().eventTime().isPresent()) {
64+
if (message.hasEventTime()) {
5665
type = TimestampType.CREATE_TIME;
57-
timestamp = message.message().eventTime().get();
66+
timestamp = message.getEventTime();
5867
} else {
5968
type = TimestampType.LOG_APPEND_TIME;
60-
timestamp = message.publishTime();
69+
timestamp = sequenced.getPublishTime();
6170
}
6271
return new ConsumerRecord<>(
6372
topic.toString(),
6473
(int) partition.value(),
65-
message.offset().value(),
74+
sequenced.getCursor().getOffset(),
6675
Timestamps.toMillis(timestamp),
6776
type,
6877
0L,
69-
message.message().key().size(),
70-
message.message().data().size(),
71-
message.message().key().toByteArray(),
72-
message.message().data().toByteArray(),
78+
message.getKey().size(),
79+
message.getData().size(),
80+
message.getKey().toByteArray(),
81+
message.getData().toByteArray(),
7382
headers);
7483
}
7584
}

pubsublite-kafka/src/main/java/com/google/cloud/pubsublite/kafka/SinglePartitionSubscriber.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
import com.google.api.core.ApiFutures;
2323
import com.google.cloud.pubsublite.Offset;
2424
import com.google.cloud.pubsublite.Partition;
25-
import com.google.cloud.pubsublite.SequencedMessage;
2625
import com.google.cloud.pubsublite.internal.BlockingPullSubscriber;
2726
import com.google.cloud.pubsublite.internal.CheckedApiException;
2827
import com.google.cloud.pubsublite.internal.CloseableMonitor;
2928
import com.google.cloud.pubsublite.internal.ProxyService;
3029
import com.google.cloud.pubsublite.internal.wire.Committer;
3130
import com.google.cloud.pubsublite.proto.SeekRequest;
31+
import com.google.cloud.pubsublite.proto.SequencedMessage;
3232
import com.google.common.collect.Iterables;
3333
import com.google.common.util.concurrent.MoreExecutors;
3434
import com.google.errorprone.annotations.concurrent.GuardedBy;
@@ -115,7 +115,7 @@ ArrayDeque<SequencedMessage> getMessages() throws CheckedApiException {
115115
try (CloseableMonitor.Hold h = monitor.enter()) {
116116
ArrayDeque<SequencedMessage> messages = pullMessages();
117117
if (!messages.isEmpty()) {
118-
lastReceived = Optional.of(Iterables.getLast(messages).offset());
118+
lastReceived = Optional.of(Offset.of(Iterables.getLast(messages).getCursor().getOffset()));
119119
needsCommitting = true;
120120
}
121121
return messages;

pubsublite-kafka/src/main/java/com/google/cloud/pubsublite/kafka/SingleSubscriptionConsumerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
import com.google.api.core.SettableApiFuture;
2727
import com.google.cloud.pubsublite.Offset;
2828
import com.google.cloud.pubsublite.Partition;
29-
import com.google.cloud.pubsublite.SequencedMessage;
3029
import com.google.cloud.pubsublite.TopicPath;
3130
import com.google.cloud.pubsublite.internal.CloseableMonitor;
3231
import com.google.cloud.pubsublite.internal.ExtractStatus;
3332
import com.google.cloud.pubsublite.proto.SeekRequest;
3433
import com.google.cloud.pubsublite.proto.SeekRequest.NamedTarget;
34+
import com.google.cloud.pubsublite.proto.SequencedMessage;
3535
import com.google.common.collect.ImmutableList;
3636
import com.google.common.collect.ImmutableMap;
3737
import com.google.common.collect.ImmutableSet;

pubsublite-kafka/src/test/java/com/google/cloud/pubsublite/kafka/PubsubLiteProducerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.google.api.core.SettableApiFuture;
2828
import com.google.api.gax.rpc.StatusCode.Code;
2929
import com.google.cloud.pubsublite.AdminClient;
30-
import com.google.cloud.pubsublite.Message;
3130
import com.google.cloud.pubsublite.MessageMetadata;
3231
import com.google.cloud.pubsublite.Offset;
3332
import com.google.cloud.pubsublite.Partition;
@@ -36,6 +35,7 @@
3635
import com.google.cloud.pubsublite.internal.CheckedApiException;
3736
import com.google.cloud.pubsublite.internal.Publisher;
3837
import com.google.cloud.pubsublite.internal.testing.FakeApiService;
38+
import com.google.cloud.pubsublite.proto.PubSubMessage;
3939
import com.google.common.collect.ImmutableMap;
4040
import java.util.List;
4141
import java.util.concurrent.Future;
@@ -63,7 +63,7 @@ abstract static class FakePublisher extends FakeApiService
6363
private static final ProducerRecord<byte[], byte[]> RECORD =
6464
new ProducerRecord<>(
6565
example(TopicPath.class).toString(), "abc".getBytes(), "defg".getBytes());
66-
private static final Message MESSAGE = RecordTransforms.toMessage(RECORD);
66+
private static final PubSubMessage MESSAGE = RecordTransforms.toMessage(RECORD);
6767
private static final TopicPartition TOPIC_PARTITION =
6868
new TopicPartition(
6969
example(TopicPath.class).toString(), (int) example(Partition.class).value());

pubsublite-kafka/src/test/java/com/google/cloud/pubsublite/kafka/RecordTransformsTest.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
import com.google.cloud.pubsublite.Message;
2323
import com.google.cloud.pubsublite.Offset;
2424
import com.google.cloud.pubsublite.Partition;
25-
import com.google.cloud.pubsublite.SequencedMessage;
2625
import com.google.cloud.pubsublite.TopicPath;
26+
import com.google.cloud.pubsublite.proto.AttributeValues;
27+
import com.google.cloud.pubsublite.proto.Cursor;
28+
import com.google.cloud.pubsublite.proto.PubSubMessage;
29+
import com.google.cloud.pubsublite.proto.SequencedMessage;
2730
import com.google.common.collect.ImmutableList;
2831
import com.google.common.collect.ImmutableListMultimap;
2932
import com.google.protobuf.ByteString;
@@ -37,21 +40,24 @@
3740

3841
@RunWith(JUnit4.class)
3942
public class RecordTransformsTest {
40-
private static final Message MESSAGE =
41-
Message.builder()
43+
private static final PubSubMessage MESSAGE =
44+
PubSubMessage.newBuilder()
4245
.setKey(ByteString.copyFromUtf8("abc"))
4346
.setData(ByteString.copyFromUtf8("def"))
4447
.setEventTime(Timestamp.newBuilder().setSeconds(1).setNanos(1000000).build())
45-
.setAttributes(
46-
ImmutableListMultimap.of(
47-
"xxx",
48-
ByteString.copyFromUtf8("yyy"),
49-
"zzz",
50-
ByteString.copyFromUtf8("zzz"),
51-
"zzz",
52-
ByteString.copyFromUtf8("zzz")))
48+
.putAttributes("xxx", single("yyy"))
49+
.putAttributes(
50+
"zzz",
51+
AttributeValues.newBuilder()
52+
.addValues(ByteString.copyFromUtf8("zzz"))
53+
.addValues(ByteString.copyFromUtf8("zzz"))
54+
.build())
5355
.build();
5456

57+
private static AttributeValues single(String v) {
58+
return AttributeValues.newBuilder().addValues(ByteString.copyFromUtf8(v)).build();
59+
}
60+
5561
@Test
5662
public void publishTransform() {
5763
ProducerRecord<byte[], byte[]> record =
@@ -65,15 +71,19 @@ public void publishTransform() {
6571
LiteHeaders.toHeader("xxx", ByteString.copyFromUtf8("yyy")),
6672
LiteHeaders.toHeader("zzz", ByteString.copyFromUtf8("zzz")),
6773
LiteHeaders.toHeader("zzz", ByteString.copyFromUtf8("zzz"))));
68-
Message message = RecordTransforms.toMessage(record);
74+
PubSubMessage message = RecordTransforms.toMessage(record);
6975
assertThat(message).isEqualTo(MESSAGE);
7076
}
7177

7278
@Test
7379
public void subscribeTransform() {
7480
SequencedMessage sequencedMessage =
75-
SequencedMessage.of(
76-
MESSAGE, Timestamp.newBuilder().setNanos(12345).build(), example(Offset.class), 123L);
81+
SequencedMessage.newBuilder()
82+
.setMessage(MESSAGE)
83+
.setPublishTime(Timestamp.newBuilder().setNanos(12345))
84+
.setCursor(Cursor.newBuilder().setOffset(example(Offset.class).value()))
85+
.setSizeBytes(123)
86+
.build();
7787
ConsumerRecord<byte[], byte[]> record =
7888
RecordTransforms.fromMessage(
7989
sequencedMessage, example(TopicPath.class), example(Partition.class));
@@ -85,7 +95,7 @@ public void subscribeTransform() {
8595
record
8696
.headers()
8797
.forEach(header -> headers.put(header.key(), ByteString.copyFrom(header.value())));
88-
assertThat(headers.build()).isEqualTo(MESSAGE.attributes());
98+
assertThat(headers.build()).isEqualTo(Message.fromProto(MESSAGE).attributes());
8999
assertThat(record.offset()).isEqualTo(example(Offset.class).value());
90100
assertThat(record.topic()).isEqualTo(example(TopicPath.class).toString());
91101
assertThat(record.partition()).isEqualTo(example(Partition.class).value());

pubsublite-kafka/src/test/java/com/google/cloud/pubsublite/kafka/SinglePartitionSubscriberTest.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,22 @@
2222
import static org.mockito.ArgumentMatchers.eq;
2323
import static org.mockito.Mockito.times;
2424
import static org.mockito.Mockito.verify;
25-
import static org.mockito.Mockito.verifyNoMoreInteractions;
2625
import static org.mockito.Mockito.when;
2726
import static org.mockito.MockitoAnnotations.initMocks;
2827

2928
import com.google.api.core.ApiFutures;
30-
import com.google.cloud.pubsublite.Message;
3129
import com.google.cloud.pubsublite.Offset;
3230
import com.google.cloud.pubsublite.Partition;
33-
import com.google.cloud.pubsublite.SequencedMessage;
3431
import com.google.cloud.pubsublite.internal.BlockingPullSubscriber;
3532
import com.google.cloud.pubsublite.internal.CheckedApiException;
3633
import com.google.cloud.pubsublite.internal.testing.FakeApiService;
3734
import com.google.cloud.pubsublite.internal.wire.Committer;
3835
import com.google.cloud.pubsublite.internal.wire.SubscriberResetHandler;
36+
import com.google.cloud.pubsublite.proto.Cursor;
3937
import com.google.cloud.pubsublite.proto.SeekRequest;
4038
import com.google.cloud.pubsublite.proto.SeekRequest.NamedTarget;
41-
import com.google.protobuf.Timestamp;
39+
import com.google.cloud.pubsublite.proto.SequencedMessage;
4240
import java.util.Optional;
43-
import org.junit.After;
4441
import org.junit.Before;
4542
import org.junit.Test;
4643
import org.junit.runner.RunWith;
@@ -73,16 +70,8 @@ public void setUp() throws CheckedApiException {
7370
.thenReturn(pullSubscriber);
7471
}
7572

76-
@After
77-
public void tearDown() throws Exception {
78-
verifyNoMoreInteractions(subscriberFactory);
79-
verifyNoMoreInteractions(pullSubscriber);
80-
verifyNoMoreInteractions(committer);
81-
}
82-
8373
private static SequencedMessage message(long offset) {
84-
return SequencedMessage.of(
85-
Message.builder().build(), Timestamp.getDefaultInstance(), Offset.of(offset), 0L);
74+
return SequencedMessage.newBuilder().setCursor(Cursor.newBuilder().setOffset(offset)).build();
8675
}
8776

8877
@Test

pubsublite-kafka/src/test/java/com/google/cloud/pubsublite/kafka/SingleSubscriptionConsumerImplTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
import com.google.api.core.ApiFuture;
3232
import com.google.api.core.ApiFutures;
3333
import com.google.api.core.SettableApiFuture;
34-
import com.google.cloud.pubsublite.Message;
3534
import com.google.cloud.pubsublite.Offset;
3635
import com.google.cloud.pubsublite.Partition;
37-
import com.google.cloud.pubsublite.SequencedMessage;
3836
import com.google.cloud.pubsublite.TopicPath;
3937
import com.google.cloud.pubsublite.internal.BlockingPullSubscriber;
4038
import com.google.cloud.pubsublite.internal.CheckedApiException;
@@ -44,12 +42,12 @@
4442
import com.google.cloud.pubsublite.proto.Cursor;
4543
import com.google.cloud.pubsublite.proto.SeekRequest;
4644
import com.google.cloud.pubsublite.proto.SeekRequest.NamedTarget;
45+
import com.google.cloud.pubsublite.proto.SequencedMessage;
4746
import com.google.common.collect.ImmutableList;
4847
import com.google.common.collect.ImmutableListMultimap;
4948
import com.google.common.collect.ImmutableMap;
5049
import com.google.common.collect.ImmutableSet;
5150
import com.google.common.collect.ListMultimap;
52-
import com.google.protobuf.Timestamp;
5351
import java.time.Duration;
5452
import java.util.Map;
5553
import java.util.Optional;
@@ -102,8 +100,9 @@ public void setUp() throws CheckedApiException {
102100
}
103101

104102
private static SequencedMessage message(Offset offset) {
105-
return SequencedMessage.of(
106-
Message.builder().build(), Timestamp.getDefaultInstance(), Offset.of(offset.value()), 0L);
103+
return SequencedMessage.newBuilder()
104+
.setCursor(Cursor.newBuilder().setOffset(offset.value()))
105+
.build();
107106
}
108107

109108
private static SequencedMessage message(long offset) {

0 commit comments

Comments
 (0)