Hi community

I am starting a DISCUSS for "Retry topic should not create for a retry
topic."

If we use regex-topic consumer and enable retry, it is possible to create
such a topic
"persistent://public/default/tp1-sub1-RETRY-sub2-RETRY-sub3-RETRY....". You
can reproduce this by using the test below.

It probably doesn't make sense to create a RETRY/DLQ topic on RETRY/DLQ. We
should avoid this scenario if users use the default configuration (users
can enable it if they need it).

```java
    @Test
    public void testRetryTopicWillNotCreatedForRetryTopic() throws
Exception {
        final String topic = "persistent://my-property/my-ns/tp1";
        Producer<byte[]> producer = pulsarClient.newProducer(Schema.BYTES)
                .topic(topic)
                .create();
        for (int i = 0; i < 100; i++) {
            producer.send(String.format("Hello Pulsar [%d]", i).getBytes());
        }
        producer.close();

        for (int i =0; i< 10; i++) {
            Consumer<byte[]> consumer =
pulsarClient.newConsumer(Schema.BYTES)
                    .topicsPattern("my-property/my-ns/.*")
                    .subscriptionName("sub" + i)
                    .enableRetry(true)

.deadLetterPolicy(DeadLetterPolicy.builder().maxRedeliverCount(2).build())

.subscriptionInitialPosition(SubscriptionInitialPosition.Earliest)
                    .subscribe();
            Message<byte[]> message = consumer.receive();
            log.info("consumer received message : {} {}",
message.getMessageId(), new String(message.getData()));
            consumer.reconsumeLater(message, 1, TimeUnit.SECONDS);
            consumer.close();
        }

        Set<String> tps =
pulsar.getBrokerService().getTopics().keys().stream().collect(Collectors.toSet());
        try {
            for (String tp : tps) {
                assertTrue(howManyKeyWordRetryInTopicName(tp,
RETRY_GROUP_TOPIC_SUFFIX) <= 1, tp);
                assertTrue(howManyKeyWordRetryInTopicName(tp,
DLQ_GROUP_TOPIC_SUFFIX) <= 1, tp);
            }
        } finally {
            // cleanup.
            for (String tp : tps){
                if (tp.startsWith(topic)) {
                    admin.topics().delete(tp ,true);
                }
            }
        }
    }

    private int howManyKeyWordRetryInTopicName(String topicName, String
keyWord) {
        int retryCountInTopicName = 0;
        String tpCp = topicName;
        while (true) {
            int index = tpCp.indexOf(keyWord);
            if (index < 0) {
                break;
            }
            tpCp = tpCp.substring(index + keyWord.length());
            retryCountInTopicName++;
        }
        return  retryCountInTopicName;
    }
```

Thanks
Yubiao Feng

Reply via email to