rnowacoski opened a new issue #7846:
URL: https://github.com/apache/pulsar/issues/7846


   **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**
   I 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
   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to