2929import org .apache .iotdb .db .subscription .broker .consensus .ConsensusSubscriptionSetupHandler ;
3030import org .apache .iotdb .db .subscription .event .SubscriptionEvent ;
3131import org .apache .iotdb .db .subscription .resource .SubscriptionDataNodeResourceManager ;
32+ import org .apache .iotdb .db .subscription .task .execution .ConsensusSubscriptionPrefetchExecutorManager ;
3233import org .apache .iotdb .db .subscription .task .subtask .SubscriptionSinkSubtask ;
3334import org .apache .iotdb .rpc .subscription .config .ConsumerConfig ;
3435import org .apache .iotdb .rpc .subscription .exception .SubscriptionException ;
@@ -229,6 +230,7 @@ public void seek(
229230 final ConsensusSubscriptionBroker consensusBroker =
230231 consumerGroupIdToConsensusBroker .get (consumerGroupId );
231232 if (Objects .nonNull (consensusBroker ) && consensusBroker .hasQueue (topicName )) {
233+ ensureConsensusSeekRuntimeAvailable (consumerGroupId , topicName , "seek" );
232234 if (seekType != PipeSubscribeSeekReq .SEEK_TO_BEGINNING
233235 && seekType != PipeSubscribeSeekReq .SEEK_TO_END ) {
234236 final String errorMessage =
@@ -261,6 +263,7 @@ public void seekToTopicProgress(
261263 final ConsensusSubscriptionBroker consensusBroker =
262264 consumerGroupIdToConsensusBroker .get (consumerGroupId );
263265 if (Objects .nonNull (consensusBroker ) && consensusBroker .hasQueue (topicName )) {
266+ ensureConsensusSeekRuntimeAvailable (consumerGroupId , topicName , "seek(topicProgress)" );
264267 consensusBroker .seek (topicName , topicProgress );
265268 return ;
266269 }
@@ -283,6 +286,7 @@ public void seekAfterTopicProgress(
283286 final ConsensusSubscriptionBroker consensusBroker =
284287 consumerGroupIdToConsensusBroker .get (consumerGroupId );
285288 if (Objects .nonNull (consensusBroker ) && consensusBroker .hasQueue (topicName )) {
289+ ensureConsensusSeekRuntimeAvailable (consumerGroupId , topicName , "seekAfter(topicProgress)" );
286290 consensusBroker .seekAfter (topicName , topicProgress );
287291 return ;
288292 }
@@ -296,6 +300,20 @@ public void seekAfterTopicProgress(
296300 throw new SubscriptionException (errorMessage );
297301 }
298302
303+ private void ensureConsensusSeekRuntimeAvailable (
304+ final String consumerGroupId , final String topicName , final String operation ) {
305+ if (!ConsensusSubscriptionPrefetchExecutorManager .getInstance ().isStarted ()
306+ || SubscriptionAgent .runtime ().isShutdown ()) {
307+ final String errorMessage =
308+ String .format (
309+ "Subscription: consensus %s is unavailable because subscription runtime is stopped, "
310+ + "consumerGroup=%s, topic=%s" ,
311+ operation , consumerGroupId , topicName );
312+ LOGGER .warn (errorMessage );
313+ throw new SubscriptionException (errorMessage );
314+ }
315+ }
316+
299317 public boolean isCommitContextOutdated (final SubscriptionCommitContext commitContext ) {
300318 final String consumerGroupId = commitContext .getConsumerGroupId ();
301319 final String topicName = commitContext .getTopicName ();
@@ -533,6 +551,12 @@ public void applyRuntimeStateForRegion(
533551 }
534552 }
535553
554+ public void abortConsensusPendingSeeksForRuntimeStop () {
555+ for (final ConsensusSubscriptionBroker broker : consumerGroupIdToConsensusBroker .values ()) {
556+ broker .abortPendingSeeksForRuntimeStop ();
557+ }
558+ }
559+
536560 public void updateCompletedTopicNames (final String consumerGroupId , final String topicName ) {
537561 final SubscriptionBroker pipeBroker = consumerGroupIdToPipeBroker .get (consumerGroupId );
538562 if (Objects .isNull (pipeBroker )) {
@@ -584,12 +608,10 @@ public void removePrefetchingQueue(final String consumerGroupId, final String to
584608 }
585609
586610 public boolean executePrefetch (final String consumerGroupId , final String topicName ) {
587- // Try consensus broker first
588- final ConsensusSubscriptionBroker consensusBroker =
589- consumerGroupIdToConsensusBroker .get (consumerGroupId );
590- if (Objects .nonNull (consensusBroker ) && consensusBroker .hasQueue (topicName )) {
591- return consensusBroker .executePrefetch (topicName );
611+ if (ConsensusSubscriptionSetupHandler .isConsensusBasedTopic (topicName )) {
612+ return false ;
592613 }
614+
593615 // Fall back to pipe broker
594616 final SubscriptionBroker pipeBroker = consumerGroupIdToPipeBroker .get (consumerGroupId );
595617 if (Objects .isNull (pipeBroker )) {
0 commit comments