Skip to content

Commit e21ff5d

Browse files
fix: Version bump Pub/Sub Lite and make fixes to not create many channels (#263)
* fix: Version bump Pub/Sub Lite and make fixes to not create many channels * fix: Version bump Pub/Sub Lite and make fixes to not create many channels * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent d7414cf commit e21ff5d

File tree

4 files changed

+99
-52
lines changed

4 files changed

+99
-52
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>com.google.cloud</groupId>
55
<artifactId>google-cloud-pubsublite-parent</artifactId>
6-
<version>1.4.6</version>
6+
<version>1.4.7</version>
77
</parent>
88
<modelVersion>4.0.0</modelVersion>
99
<groupId>com.google.cloud</groupId>

src/main/java/com/google/cloud/pubsublite/kafka/ConsumerSettings.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package com.google.cloud.pubsublite.kafka;
1818

1919
import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical;
20+
import static com.google.cloud.pubsublite.internal.wire.ServiceClients.addDefaultSettings;
21+
import static com.google.cloud.pubsublite.internal.wire.ServiceClients.getCallContext;
2022

23+
import com.google.api.gax.rpc.ApiCallContext;
2124
import com.google.api.gax.rpc.ApiException;
2225
import com.google.auto.value.AutoValue;
2326
import com.google.cloud.pubsublite.AdminClient;
@@ -127,6 +130,9 @@ public Consumer<byte[], byte[]> instantiate() throws ApiException {
127130
throw toCanonical(t).underlying;
128131
}
129132
};
133+
SubscriberServiceClient subscriberServiceClient =
134+
SubscriberServiceClient.create(
135+
ServiceClients.addDefaultSettings(region, SubscriberServiceSettings.newBuilder()));
130136
PullSubscriberFactory pullSubscriberFactory =
131137
(partition, initialSeek, resetHandler) -> {
132138
SubscriberFactory subscriberFactory =
@@ -136,14 +142,16 @@ public Consumer<byte[], byte[]> instantiate() throws ApiException {
136142
.setPartition(partition)
137143
.setSubscriptionPath(subscriptionPath())
138144
.setMessageConsumer(consumer)
139-
.setServiceClient(
140-
SubscriberServiceClient.create(
141-
ServiceClients.addDefaultSettings(
142-
region,
143-
ServiceClients.addDefaultMetadata(
144-
PubsubContext.of(FRAMEWORK),
145-
RoutingMetadata.of(subscriptionPath(), partition),
146-
SubscriberServiceSettings.newBuilder()))))
145+
.setStreamFactory(
146+
responseStream -> {
147+
ApiCallContext context =
148+
getCallContext(
149+
PubsubContext.of(FRAMEWORK),
150+
RoutingMetadata.of(subscriptionPath(), partition));
151+
return subscriberServiceClient
152+
.subscribeCallable()
153+
.splitCall(responseStream, context);
154+
})
147155
.setInitialLocation(initialSeek)
148156
.setResetHandler(resetHandler)
149157
.build();
@@ -154,16 +162,22 @@ public Consumer<byte[], byte[]> instantiate() throws ApiException {
154162
return new BlockingPullSubscriberImpl(
155163
subscriberFactory, perPartitionFlowControlSettings());
156164
};
165+
CursorServiceClient cursorServiceClient =
166+
CursorServiceClient.create(
167+
addDefaultSettings(
168+
subscriptionPath().location().extractRegion(),
169+
CursorServiceSettings.newBuilder()));
157170
CommitterFactory committerFactory =
158171
partition -> {
159172
try {
160173
return CommitterSettings.newBuilder()
161174
.setSubscriptionPath(subscriptionPath())
162175
.setPartition(partition)
163-
.setServiceClient(
164-
CursorServiceClient.create(
165-
ServiceClients.addDefaultSettings(
166-
region, CursorServiceSettings.newBuilder())))
176+
.setStreamFactory(
177+
responseStream ->
178+
cursorServiceClient
179+
.streamingCommitCursorCallable()
180+
.splitCall(responseStream))
167181
.build()
168182
.instantiate();
169183
} catch (Throwable t) {
@@ -189,7 +203,9 @@ public Consumer<byte[], byte[]> instantiate() throws ApiException {
189203
consumerFactory,
190204
assignerFactory,
191205
cursorClient,
192-
topicStatsClient);
206+
topicStatsClient,
207+
cursorServiceClient,
208+
subscriberServiceClient);
193209
} catch (Exception e) {
194210
throw toCanonical(e).underlying;
195211
}

src/main/java/com/google/cloud/pubsublite/kafka/ProducerSettings.java

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,24 @@
1818

1919
import static com.google.cloud.pubsublite.cloudpubsub.PublisherSettings.DEFAULT_BATCHING_SETTINGS;
2020
import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical;
21+
import static com.google.cloud.pubsublite.internal.wire.ServiceClients.addDefaultSettings;
22+
import static com.google.cloud.pubsublite.internal.wire.ServiceClients.getCallContext;
2123

24+
import com.google.api.gax.rpc.ApiCallContext;
2225
import com.google.api.gax.rpc.ApiException;
2326
import com.google.auto.value.AutoValue;
2427
import com.google.cloud.pubsublite.AdminClient;
2528
import com.google.cloud.pubsublite.AdminClientSettings;
29+
import com.google.cloud.pubsublite.MessageMetadata;
30+
import com.google.cloud.pubsublite.Partition;
2631
import com.google.cloud.pubsublite.TopicPath;
27-
import com.google.cloud.pubsublite.internal.wire.*;
32+
import com.google.cloud.pubsublite.internal.Publisher;
33+
import com.google.cloud.pubsublite.internal.wire.PartitionCountWatchingPublisherSettings;
34+
import com.google.cloud.pubsublite.internal.wire.PartitionPublisherFactory;
35+
import com.google.cloud.pubsublite.internal.wire.PubsubContext;
2836
import com.google.cloud.pubsublite.internal.wire.PubsubContext.Framework;
37+
import com.google.cloud.pubsublite.internal.wire.RoutingMetadata;
38+
import com.google.cloud.pubsublite.internal.wire.SinglePartitionPublisherBuilder;
2939
import com.google.cloud.pubsublite.v1.PublisherServiceClient;
3040
import com.google.cloud.pubsublite.v1.PublisherServiceSettings;
3141
import org.apache.kafka.clients.producer.Producer;
@@ -54,31 +64,50 @@ private AdminClient newAdminClient() {
5464
AdminClientSettings.newBuilder().setRegion(topicPath().location().extractRegion()).build());
5565
}
5666

67+
private PublisherServiceClient newServiceClient() throws ApiException {
68+
try {
69+
return PublisherServiceClient.create(
70+
addDefaultSettings(
71+
topicPath().location().extractRegion(), PublisherServiceSettings.newBuilder()));
72+
} catch (Throwable t) {
73+
throw toCanonical(t).underlying;
74+
}
75+
}
76+
77+
private PartitionPublisherFactory getPartitionPublisherFactory() {
78+
PublisherServiceClient client = newServiceClient();
79+
return new PartitionPublisherFactory() {
80+
@Override
81+
public Publisher<MessageMetadata> newPublisher(Partition partition) throws ApiException {
82+
SinglePartitionPublisherBuilder.Builder singlePartitionBuilder =
83+
SinglePartitionPublisherBuilder.newBuilder()
84+
.setTopic(topicPath())
85+
.setPartition(partition)
86+
.setBatchingSettings(DEFAULT_BATCHING_SETTINGS)
87+
.setStreamFactory(
88+
responseStream -> {
89+
ApiCallContext context =
90+
getCallContext(
91+
PubsubContext.of(FRAMEWORK),
92+
RoutingMetadata.of(topicPath(), partition));
93+
return client.publishCallable().splitCall(responseStream, context);
94+
});
95+
return singlePartitionBuilder.build();
96+
}
97+
98+
@Override
99+
public void close() {
100+
client.close();
101+
}
102+
};
103+
}
104+
57105
public Producer<byte[], byte[]> instantiate() throws ApiException {
58106
PartitionCountWatchingPublisherSettings publisherSettings =
59107
PartitionCountWatchingPublisherSettings.newBuilder()
60108
.setTopic(topicPath())
61109
.setAdminClient(newAdminClient())
62-
.setPublisherFactory(
63-
partition -> {
64-
try {
65-
return SinglePartitionPublisherBuilder.newBuilder()
66-
.setServiceClient(
67-
PublisherServiceClient.create(
68-
ServiceClients.addDefaultSettings(
69-
topicPath().location().extractRegion(),
70-
ServiceClients.addDefaultMetadata(
71-
PubsubContext.of(FRAMEWORK),
72-
RoutingMetadata.of(topicPath(), partition),
73-
PublisherServiceSettings.newBuilder()))))
74-
.setTopic(topicPath())
75-
.setPartition(partition)
76-
.setBatchingSettings(DEFAULT_BATCHING_SETTINGS)
77-
.build();
78-
} catch (Throwable t) {
79-
throw toCanonical(t).underlying;
80-
}
81-
})
110+
.setPublisherFactory(getPartitionPublisherFactory())
82111
.build();
83112
SharedBehavior shared = new SharedBehavior(newAdminClient());
84113
return new PubsubLiteProducer(publisherSettings.instantiate(), shared, topicPath());

src/main/java/com/google/cloud/pubsublite/kafka/PubsubLiteConsumer.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.cloud.pubsublite.proto.SeekRequest;
3636
import com.google.cloud.pubsublite.proto.SeekRequest.NamedTarget;
3737
import com.google.common.base.Preconditions;
38+
import com.google.common.collect.ImmutableList;
3839
import com.google.common.collect.ImmutableMap;
3940
import com.google.common.collect.ImmutableSet;
4041
import com.google.common.flogger.GoogleLogger;
@@ -79,6 +80,7 @@ class PubsubLiteConsumer implements Consumer<byte[], byte[]> {
7980
private final AssignerFactory assignerFactory;
8081
private final CursorClient cursorClient;
8182
private final TopicStatsClient topicStatsClient;
83+
private final List<AutoCloseable> toClose;
8284
private Optional<Assigner> assigner = Optional.empty();
8385
private Optional<SingleSubscriptionConsumer> consumer = Optional.empty();
8486

@@ -89,14 +91,22 @@ class PubsubLiteConsumer implements Consumer<byte[], byte[]> {
8991
ConsumerFactory consumerFactory,
9092
AssignerFactory assignerFactory,
9193
CursorClient cursorClient,
92-
TopicStatsClient topicStatsClient) {
94+
TopicStatsClient topicStatsClient,
95+
AutoCloseable... resources) {
9396
this.subscriptionPath = subscriptionPath;
9497
this.topicPath = topicPath;
9598
this.shared = shared;
9699
this.consumerFactory = consumerFactory;
97100
this.assignerFactory = assignerFactory;
98101
this.cursorClient = cursorClient;
99102
this.topicStatsClient = topicStatsClient;
103+
this.toClose =
104+
ImmutableList.<AutoCloseable>builder()
105+
.add(resources)
106+
.add(cursorClient)
107+
.add(topicStatsClient)
108+
.add(shared)
109+
.build();
100110
}
101111

102112
private TopicPartition toTopicPartition(Partition partition) {
@@ -558,23 +568,15 @@ public void close(long l, TimeUnit timeUnit) {
558568

559569
@Override
560570
public void close(Duration timeout) {
561-
try {
562-
cursorClient.close();
563-
} catch (Exception e) {
564-
logger.atSevere().withCause(e).log("Error closing cursor client during Consumer shutdown.");
565-
}
566-
try {
567-
topicStatsClient.close();
568-
} catch (Exception e) {
569-
logger.atSevere().withCause(e).log(
570-
"Error closing topic stats client during Consumer shutdown.");
571-
}
572-
try {
573-
shared.close();
574-
} catch (Exception e) {
575-
logger.atSevere().withCause(e).log("Error closing admin client during Consumer shutdown.");
576-
}
577571
unsubscribe();
572+
for (AutoCloseable closeable : toClose) {
573+
try {
574+
closeable.close();
575+
} catch (Exception e) {
576+
logger.atSevere().withCause(e).log(
577+
"Error closing %s during Consumer shutdown.", closeable.getClass().getSimpleName());
578+
}
579+
}
578580
}
579581

580582
@Override

0 commit comments

Comments
 (0)