[Bug] Java SDK 自动发现持续选择已断网的 DataNode,导致查询周期性等待连接超时
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 48/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- java
- Domaine
- databases, distributed-systems
Piste de recherche
Commencez par ShowAvailableUrlsTask.java, NodesSupplier.java et Session.java aux emplacements v2.0.11 liés, puis reproduisez le scénario de TableSessionPoolBuilder avec un nœud déconnecté et comparez auto-discovery activé et désactivé. Suivez la manière dont les endpoints indisponibles sont sélectionnés et dont les connexions ayant échoué sont traitées. Le travail est terminé lorsque le délai répété dû à l’expiration du délai de connexion est évité, tandis que les nœuds sains continuent de traiter les requêtes et que la récupération reste possible.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
现象与复现
IoTDB 服务端和 Java SDK 均为 2.0.10,Table model,三节点各部署 ConfigNode/DataNode;Schema 三副本,Data 两副本,数据共识为 IoTConsensus。
- 将节点 A 断网,保持 B/C 正常。等待
SHOW CLUSTER显示 A 为Unknown、B/C 为Running。 - 此时
SHOW AVAILABLE URLS仍返回 A/B/C 三个地址。 - 使用原生
TableSessionPoolBuilder,初始nodeUrls只配置 B/C,设置maxSize(1)、connectionTimeoutInMs(3000),开启enableAutoFetch(true)和enableRedirection(true),串行重复执行同一条SELECT … LIMIT 5,完整读取并关闭结果集。
绕过业务适配层仍能复现,12 次查询均成功返回 5 行:
| 设置 | 12 次查询结果 |
|---|---|
| 自动发现、重定向均开启 | 第 1/4/7/10 次分别约 2423/2976/3029/3028 ms,其余约 22–29 ms |
| 两项均关闭,其他配置及 SQL 不变 | 全部约 21–30 ms |
节点 A 在整个对照期间保持断网。即使初始地址仅填写 B/C,自动发现仍会将 A 加回查询候选列表。这不是故障发生瞬间的一次切换等待,而是持续的周期性延迟。
关键源码
以下链接固定到 v2.0.11:对比发现,本问题涉及的关键逻辑仍保留;尚未在完整 2.0.11 集群实测复现。
1. 服务端仅排除 Removing,没有排除 Unknown。
ShowAvailableUrlsTask.buildTsBlock():
for (TDataNodeInfo dataNodeInfo : showDataNodesResp.getDataNodesInfoList()) {
String status = dataNodeInfo.getStatus();
if (RegionStatus.Removing.getStatus().equals(status)) {
continue;
}
2. SDK 根据发现列表轮询端点。
NodesSupplier 使用以下策略;getQueryEndPoint() 调用 policy.chooseOne(get()):
private final QueryEndPointPolicy policy = new RoundRobinPolicy();
3. 连接失败后回落默认连接,但没有在该路径隔离失败端点。
Session.getQuerySessionConnection(),该方法与 2.0.10 完全一致:
endPointToSessionConnection.computeIfAbsent(
endPoint.get(),
k -> {
try {
return constructSessionConnection(this, endPoint.get(), zoneId);
} catch (IoTDBConnectionException ex) {
return null;
}
});
computeIfAbsent 返回 null 时不会保存映射;方法随后回落到默认连接。故障地址仍留在轮询列表,下次选中时再次尝试连接,和实测“每三次出现一次秒级等待”吻合。
期望与希望确认
当一个节点持续不可达且其他节点可完成查询时,希望 SDK 能暂时隔离失败端点并探测恢复,避免后续查询反复承担完整连接超时。
请确认:SHOW AVAILABLE URLS 包含 Unknown 是否为预期?此场景是否应由 SDK 增加故障端点退避/隔离,或调整服务端过滤规则?是否已有对应修复或推荐配置?
目前临时通过关闭自动发现、重定向并只配置健康节点规避,但这需要用户手动维护节点列表。
- Langage dominant
- Java
- Étoiles
- 6.4k
- Forks
- 1.2k
- Merge moyen
- 1 j 17 h
- PR mergées (30 j)
- 152
Préparer son environnement
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/iotdb
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
apache/iotdb#18655 · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
IoTDB Edge: stop-edge.sh does not stop its own process when IOTDB_HOME is set, and reports successOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug] 执行start-all.sh后无法启动集群问题Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug] findColumn throws NullPointerException instead of SQLException for an unknown column nameOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/iotdb
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
OpenAPITools/openapi-generator#25014 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
openhab/openhab-core#5847 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
apache/parquet-java#3820 ·
Les mainteneurs répondent en général sous 1 jour