GitHub user rnowacoski created a discussion: Multi-Topic subscription across tenant and namespace using regex in Java client throws IllegalArgumentException
**Describe the bug** When using a regex to create a consumer and a regex pattern is present in the tenant or namespace section of the pattern this error is thrown. ``` java.lang.IllegalArgumentException: Invalid named entity: \w+ at org.apache.pulsar.common.naming.NamedEntity.checkName(NamedEntity.java:39) at org.apache.pulsar.common.naming.NamespaceName.validateNamespaceName(NamespaceName.java:179) at org.apache.pulsar.common.naming.NamespaceName.get(NamespaceName.java:53) at org.apache.pulsar.common.naming.TopicName.<init>(TopicName.java:151) at org.apache.pulsar.common.naming.TopicName.<init>(TopicName.java:38) at org.apache.pulsar.common.naming.TopicName$1.load(TopicName.java:63) at org.apache.pulsar.common.naming.TopicName$1.load(TopicName.java:60) at org.apache.pulsar.shade.com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) at org.apache.pulsar.shade.com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276) at org.apache.pulsar.shade.com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154) at org.apache.pulsar.shade.com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2044) at org.apache.pulsar.shade.com.google.common.cache.LocalCache.get(LocalCache.java:3951) at org.apache.pulsar.shade.com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3973) at org.apache.pulsar.shade.com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957) at org.apache.pulsar.common.naming.TopicName.get(TopicName.java:88) at org.apache.pulsar.client.impl.PulsarClientImpl.patternTopicSubscribeAsync(PulsarClientImpl.java:403) at org.apache.pulsar.client.impl.PulsarClientImpl.subscribeAsync(PulsarClientImpl.java:333) at org.apache.pulsar.client.impl.ConsumerBuilderImpl.subscribeAsync(ConsumerBuilderImpl.java:142) at org.apache.pulsar.client.impl.ConsumerBuilderImpl.subscribe(ConsumerBuilderImpl.java:99) ``` Example pattern: `persistent://\w+/Test/Test1` or `persistent://Test/\w+/Test1` This is because `PulsarClientImpl.patternTopicSubscribeAsync` is called when creating a consumer using a Pattern. This calls `topicName.get(regex);` where regex is the Pattern passed in. This method attempts to validate the tenant and namespace names against this regex `^[-=:.\\w]*$` in org.apache.pulsar.common.naming.NamedEntity. This fails for any regex pattern. The namespace name is needed in the current code because it is used by `LookupService.getTopicsUnderNamespace` to find the topics to subscribe to. **To Reproduce** Steps to reproduce the behavior: 1. Create a Consumer like below ``` client .newConsumer(Schema.BYTES) .topicsPattern(Pattern.compile("persistent://\w+/Test/Test1")) .subscribe() ``` 2. Observe `java.lang.IllegalArgumentException: Invalid named entity: \w+` is thrown **Expected behavior** Given a wildcard in a tenant or namespace I would expect the code to look up all tenants/namespaces that match and then lookup all topics to subscribe to. **Proposed Solution** 1. LookupService implementations should implement a method like `getNamespaces()` that will return all tenant/namespaces. 2. `PulsarClientImpl.patternTopicSubscribeAsync` should filter these namespaces based on the regex given 3. For each renaming namespace that matches the given regex `PulsarClientImpl.patternTopicSubscribeAsync` should call `LookupService.getTopicsUnderNamespace` 4. List of topics for each matching namespace should be combined into one list and the consumer should subscribe to all of those topics GitHub link: https://github.com/apache/pulsar/discussions/18862 ---- This is an automatically sent email for dev@pulsar.apache.org. To unsubscribe, please send an email to: dev-unsubscr...@pulsar.apache.org