Skip to content

Commit a477562

Browse files
authored
Subscription: unsubscribe completed topics when remove consumer config (#15660)
1 parent c874b3c commit a477562

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/subscription/receiver/SubscriptionReceiverV1.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import java.nio.ByteBuffer;
8585
import java.util.Collections;
8686
import java.util.HashMap;
87+
import java.util.HashSet;
8788
import java.util.List;
8889
import java.util.Map;
8990
import java.util.Objects;
@@ -162,7 +163,12 @@ public void handleExit() {
162163
LOGGER.info(
163164
"Subscription: remove consumer config {} when handling exit",
164165
consumerConfigThreadLocal.get());
166+
// we should not close the consumer here because it might reuse the previous consumption
167+
// progress to continue consuming
165168
// closeConsumer(consumerConfig);
169+
// when handling exit, unsubscribe from topics that have already been completed as much as
170+
// possible to release some resources (such as the underlying pipe) in a timely manner
171+
unsubscribeCompleteTopics(consumerConfig);
166172
consumerConfigThreadLocal.remove();
167173
}
168174
}
@@ -311,6 +317,8 @@ private TPipeSubscribeResp handlePipeSubscribeHeartbeatInternal(
311317
// fetch topics should be unsubscribed
312318
final List<String> topicNamesToUnsubscribe =
313319
SubscriptionAgent.broker().fetchTopicNamesToUnsubscribe(consumerConfig, topics.keySet());
320+
// here we did not immediately unsubscribe from topics in order to allow the client to perceive
321+
// completed topics
314322

315323
return PipeSubscribeHeartbeatResp.toTPipeSubscribeResp(
316324
RpcUtils.SUCCESS_STATUS, topics, endPoints, topicNamesToUnsubscribe);
@@ -684,6 +692,26 @@ private void closeConsumer(final ConsumerConfig consumerConfig) {
684692
LOGGER.info("Subscription: consumer {} close successfully", consumerConfig);
685693
}
686694

695+
private void unsubscribeCompleteTopics(final ConsumerConfig consumerConfig) {
696+
// fetch subscribed topics
697+
final Map<String, TopicConfig> topics =
698+
SubscriptionAgent.topic()
699+
.getTopicConfigs(
700+
SubscriptionAgent.consumer()
701+
.getTopicNamesSubscribedByConsumer(
702+
consumerConfig.getConsumerGroupId(), consumerConfig.getConsumerId()));
703+
704+
// fetch topics should be unsubscribed
705+
final List<String> topicNamesToUnsubscribe =
706+
SubscriptionAgent.broker().fetchTopicNamesToUnsubscribe(consumerConfig, topics.keySet());
707+
708+
unsubscribe(consumerConfig, new HashSet<>(topicNamesToUnsubscribe));
709+
LOGGER.info(
710+
"Subscription: consumer {} unsubscribe {} (completed topics) successfully",
711+
consumerConfig,
712+
topicNamesToUnsubscribe);
713+
}
714+
687715
//////////////////////////// consumer operations ////////////////////////////
688716

689717
private void createConsumer(final ConsumerConfig consumerConfig) throws SubscriptionException {

0 commit comments

Comments
 (0)