Aias00 opened a new issue, #6835:
URL: https://github.com/apache/shenyu/issues/6835

   ## Description
   All four `shenyu-registry` instance-register implementations 
(consul/etcd/zookeeper/apollo) store the cached instance list 
(`watcherInstanceRegisterMap`) in a plain `java.util.HashMap`. This map is 
written by an async watcher/callback thread (Consul scheduled executor, etcd 
`Watch.listener`, Curator `CuratorWatcher`, Apollo `ConfigChangeListener`) 
while concurrently read and written by the caller thread in `selectInstances` 
(`containsKey`/`get`/`put`). The Zookeeper impl also races `nodeDataMap` 
between `persistInstance` (caller) and the `ConnectionState.RECONNECTED` 
listener; Apollo additionally mutates a local `HashMap childrenList` from the 
config thread. The Nacos impl already uses `ConcurrentHashMap`/`ConcurrentMap`.
   
   ## Location
   - 
`shenyu-registry/shenyu-registry-consul/src/main/java/org/apache/shenyu/registry/consul/ConsulInstanceRegisterRepository.java:76,90,92,160-196`
 (also `consulIndexes`:76, `watchSelectKeySet`:92)
   - 
`shenyu-registry/shenyu-registry-etcd/.../EtcdInstanceRegisterRepository.java:60,98,118-121`
   - 
`shenyu-registry/shenyu-registry-zookeeper/.../ZookeeperInstanceRegisterRepository.java:67,71,100,122,145-167`
   - 
`shenyu-registry/shenyu-registry-apollo/.../ApolloInstanceRegisterRepository.java:65,128-163`
   
   ## Impact
   Under normal multi-path operation, concurrent access corrupts the HashMap, 
loses instance updates (watcher misses instances or serves stale lists), 
produces inconsistent discovery state, or causes infinite-loop/CME-style hangs 
on the `selectInstances` path → wrong/missing upstream routing.
   
   ## Suggested fix
   Replace all `new HashMap<>()` / `new HashSet<>()` field declarations with 
`Maps.newConcurrentMap()` / `ConcurrentHashMap.newKeySet()` (as the Nacos impl 
already does), or guard all access with a single `synchronized` lock. For the 
Apollo local `childrenList`, use `ConcurrentHashMap` or copy before passing to 
the listener.
   
   ## Related existing
   Distinct from SYNC-8 (#6783, `ConsulSyncDataService` HashMap) — that covers 
`shenyu-sync-data-center/shenyu-sync-data-consul` (gateway-side sync service), 
not `shenyu-registry-consul` (instance register repository). The Nacos registry 
is already safe.
   


-- 
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.

To unsubscribe, e-mail: [email protected]

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

Reply via email to