apache / apache/shenyu

[BUG] SelectorDataRefresh.refresh() NPE on null data / no-op on empty data (HTTP sync)

Open Beginner friendly
#6,662 1 comment 0 reactions 0 assignees View on GitHub
data-sync: http priority: high type: bug
Dominant language
Java
Stars
8.8k
Forks
3.1k
Avg merge
7d 1h
Merged PRs (30d)
85

Description

- Severity: High
- Location:
`shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/SelectorDataRefresh.java:71-81`
-
Description:
`if (CollectionUtils.isEmpty(data)) { ...; data.forEach(pluginDataSubscriber::unSelectorSubscribe); pluginDataSubscriber.refreshSelectorDataAll(); }`. `CollectionUtils.isEmpty(null)` returns true, so the branch is entered with `data == null`, then `data.forEach(...)` throws `NullPointerException`. If `data` is an empty list, `forEach` is a no-op (unsubscribe nothing) and the clear intent is not achieved. The ordering is also backwards (`forEach` before `refreshSelectorDataAll`). Compare `PluginDataRefresh` which correctly calls `refreshPluginDataAll()` first and returns before iterating.
-
Impact:
HTTP sync refresh with an empty/null selector group crashes the long-polling task (NPE) or silently leaves stale selectors in cache.
-
Suggested fix:
Move `pluginDataSubscriber.refreshSelectorDataAll()` to before the empty check, and return early when empty (same pattern as `PluginDataRefresh`).
-
Confidence: High

---
_Identified during the 2026-08-02 deep re-scan; full list in [`docs/scan2-2026-08-02/00-consolidated-critical-high.md`](docs/scan2-2026-08-02/00-consolidated-critical-high.md)._

Contributor guide

No contributing guide indexed for this repository

Research direction

Start at shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/SelectorDataRefresh.java:71-81 and compare its flow with PluginDataRefresh, which is identified as the correct pattern. Verify that null and empty selector data clear existing subscriptions without throwing, and that refreshSelectorDataAll runs before the empty check.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.