Skip to content

fix(grpc): allow multiple wildcard subscriptions when topic validation disabled#1083

Open
Rishabh-git10 wants to merge 3 commits into
dapr:mainfrom
Rishabh-git10:fix/grpc-multiple-wildcard-subscriptions
Open

fix(grpc): allow multiple wildcard subscriptions when topic validation disabled#1083
Rishabh-git10 wants to merge 3 commits into
dapr:mainfrom
Rishabh-git10:fix/grpc-multiple-wildcard-subscriptions

Conversation

@Rishabh-git10

Copy link
Copy Markdown

Description

Fixes a ValueError startup crash and subscription drop when registering multiple wildcard paths on the same pub/sub component with disable_topic_validation=True.

Previously, enabling this flag collapsed internal tracking keys down to the pub/sub identifier alone, causing map collisions and rendering the sidecar blind to subsequent subscriptions. This change standardizes discrete internal dictionary keys across all registration paths. It introduces a regex-based pattern matching fallback evaluation inside OnTopicEvent and _handle_bulk_topic_event to route events when direct string lookups fail.

Issue reference

Closes #436

Checklist

Please make sure you've completed the relevant tasks for this PR, out of the following list:

  • Code compiles correctly
  • Created/updated tests
  • Extended the documentation

…n disabled

Signed-off-by: Rishabh Dewangan <107680241+Rishabh-git10@users.noreply.github.com>
@Rishabh-git10 Rishabh-git10 requested review from a team as code owners June 9, 2026 20:21

@seherv seherv left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot for contributing to Dapr! Here are my comments

if cb is None:
context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore
raise NotImplementedError(f'topic {request.topic} is not implemented!')
raise NotImplementedError(f'topic {request.topic} topic not implemented!')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this a typo 😅

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My bad. Looked past it.


self._wildcard_topics: List[Tuple[str, str, str, bool, TopicSubscribeCallable]] = []

def _match_topic(self, pattern: str, topic: str) -> bool:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to use a different approach, this would be a second filter on top of what the pubsub already filters by matching a wildcard pattern to a concrete topic name.

More on the following comments


sub = registered_topic.subscription
rules = registered_topic.rules

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here you should build an additional route map based on topic to know which handler actually takes it in case you get a wildcard. Something like

if disable_topic_validation and rule is None:
    sub.routes.default = topic
    self._route_map[(pubsub_name, topic)] = cb

Comment on lines +214 to +221
cb = None
for p_name, t_pattern, path, d_val, w_cb in self._wildcard_topics:
if p_name == request.pubsub_name and request.path == path:
if self._match_topic(t_pattern, request.topic) or (
d_val and not any(c in t_pattern for c in ['+', '#', '*'])
):
cb = w_cb
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of doing the regex match you had before, you can look up the cb on the route map

Comment on lines +317 to +326
cb = None
for p_name, t_pattern, path, d_val, w_cb in self._wildcard_topics:
if p_name == request.pubsub_name and request.path == path:
if self._match_topic(t_pattern, request.topic) or (
d_val and not any(c in t_pattern for c in ['+', '#', '*'])
):
cb = w_cb
break
if cb is None:
return None # we don't have a handler

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above. Logic looks pretty similar and could be moved to a helper method too

Signed-off-by: Rishabh Dewangan <107680241+Rishabh-git10@users.noreply.github.com>
@Rishabh-git10

Copy link
Copy Markdown
Author

Thanks for the review and guidance @seherv.
I have consolidated the fallback routing logic into _get_topic_callback to remove duplication. Removed the redundant _match_topic function.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PubSub disable_topic_validation=True breaks multiple subscriptions

2 participants