@@ -1335,4 +1335,67 @@ TEST(ConsumerTest, testRetrySubscribe) {
13351335 // milliseconds
13361336}
13371337
1338+ TEST (ConsumerTest, testNoListenerThreadBlocking) {
1339+ Client client{lookupUrl};
1340+
1341+ const int numPartitions = 2 ;
1342+ const std::string partitionedTopic = " testNoListenerThreadBlocking-" + std::to_string (time (nullptr ));
1343+ int res =
1344+ makePutRequest (adminUrl + " admin/v2/persistent/public/default/" + partitionedTopic + " /partitions" ,
1345+ std::to_string (numPartitions));
1346+ ASSERT_TRUE (res == 204 || res == 409 ) << " res: " << res;
1347+
1348+ const int receiverQueueSize = 1 ;
1349+ const int receiverQueueSizeAcrossPartitions = receiverQueueSize * numPartitions;
1350+
1351+ Consumer consumer1, consumer2;
1352+ ConsumerConfiguration consumerConfig;
1353+ consumerConfig.setReceiverQueueSize (receiverQueueSize);
1354+ consumerConfig.setMaxTotalReceiverQueueSizeAcrossPartitions (receiverQueueSizeAcrossPartitions);
1355+ Result consumerResult;
1356+ consumerResult = client.subscribe (partitionedTopic, " sub1" , consumerConfig, consumer1);
1357+ ASSERT_EQ (consumerResult, ResultOk);
1358+ consumerResult = client.subscribe (partitionedTopic, " sub2" , consumerConfig, consumer2);
1359+ ASSERT_EQ (consumerResult, ResultOk);
1360+
1361+ Producer producer;
1362+ ProducerConfiguration producerConfig;
1363+ producerConfig.setBatchingEnabled (false );
1364+ producerConfig.setPartitionsRoutingMode (ProducerConfiguration::RoundRobinDistribution);
1365+ Result producerResult = client.createProducer (partitionedTopic, producerConfig, producer);
1366+ ASSERT_EQ (producerResult, ResultOk);
1367+
1368+ const int msgCount = receiverQueueSizeAcrossPartitions * 100 ;
1369+
1370+ for (int i = 0 ; i < msgCount; ++i) {
1371+ auto msg = MessageBuilder ().setContent (" test" ).build ();
1372+ producer.sendAsync (msg, [](Result code, const MessageId& messageId) {});
1373+ }
1374+ producer.flush ();
1375+ producer.close ();
1376+
1377+ std::this_thread::sleep_for (std::chrono::milliseconds (200 ));
1378+
1379+ // check consumer1 prefetch num
1380+ auto multiConsumerImpl = PulsarFriend::getMultiTopicsConsumerImplPtr (consumer1);
1381+ int prefetchNum = multiConsumerImpl->getNumOfPrefetchedMessages ();
1382+ ASSERT_LE (prefetchNum, receiverQueueSizeAcrossPartitions);
1383+
1384+ // read consumer2 while consumer1 reaches the prefech limit
1385+ for (int i = 0 ; i < msgCount; ++i) {
1386+ auto multiConsumerImpl = PulsarFriend::getMultiTopicsConsumerImplPtr (consumer2);
1387+ int prefetchNum = multiConsumerImpl->getNumOfPrefetchedMessages ();
1388+ ASSERT_LE (prefetchNum, receiverQueueSizeAcrossPartitions);
1389+
1390+ Message msg;
1391+ Result ret = consumer2.receive (msg, 1000 );
1392+ ASSERT_EQ (ret, ResultOk);
1393+ consumer2.acknowledge (msg);
1394+ }
1395+
1396+ consumer2.close ();
1397+ consumer1.close ();
1398+ client.close ();
1399+ }
1400+
13381401} // namespace pulsar
0 commit comments