【3.8】ScanEdgeResultIterator.next() 因重复释放 Storage 连接而阻塞
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 1/5
- Tiempo estimado
- Menos de una hora
- Aptitud para principiantes
- 92/100
Línea de trabajo
Empieza en client/src/main/java/com/vesoft/nebula/client/storage/scan/ScanEdgeResultIterator.java, centrándote en next() y en la limpieza del worker alrededor de countDownLatch.countDown(). Compara su gestión de liberación con ScanVertexResultIterator y con el bloque finally existente. La tarea estará terminada cuando cada conexión de Storage prestada se libere exactamente una vez y ScanEdgeResultIterator.next() retorne sin bloquearse en el escaneo descrito de una sola partición.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
问题描述
nebula-java 3.8 的 ScanEdgeResultIterator.next() 在正常处理响应时,会对同一个 GraphStorageConnection 执行两次 release,导致 next() 一直阻塞、无法返回。
该问题只存在于边扫描方法 ScanEdgeResultIterator 中。点扫描方法 ScanVertexResultIterator 已正确删除重复的 release,没有这个问题。
问题原因
https://github.com/vesoft-inc/nebula-java/pull/605/files#diff-8d4ffb6a9c44959ad0d34a65442ed50ea0d58bce4343ce7b04f815fddfc0e336
PR #605 为连接释放增加了 finally 逻辑:
} finally {
pool.release(leader, connection);
}
但是,ScanEdgeResultIterator 在 worker 末尾仍然保留了原来的连接释放代码:
pool.release(new HostAddress(addr.getHost(), addr.getPort()), connection);
countDownLatch.countDown();
因此,同一个 Storage 连接会被归还连接池两次。
StorageConnPool.release() 最终调用:
GenericKeyedObjectPool.returnObject()
第二次 release 位于 countDownLatch.countDown() 之前。当第二次释放连接无法正常完成时,当前 worker 不会执行 countDown(),外层线程会一直阻塞在:
countDownLatch.await();
在 PR #605 中,ScanVertexResultIterator 原有的第二次 release 已经被删除,因此点扫描不存在这个问题;只有 ScanEdgeResultIterator 遗漏了相同的修改。
影响版本
release-3.8- 提交 Issue 时,
master分支中也存在相同的重复释放代码。
涉及文件:
client/src/main/java/com/vesoft/nebula/client/storage/scan/ScanEdgeResultIterator.java
复现场景
- 集群中存在三个 Storage 地址。
- 指定扫描单个 partition,此时只有一个
PartScanInfo。 - 调用
ScanEdgeResultIterator.next()。 - 两个没有匹配 partition 的 worker 执行
countDown()后返回。 - 扫描 leader partition 的 worker 在
finally中第一次释放连接。 - 随后,该 worker 在执行
countDown()前再次调用pool.release(...)。 - 最终
CountDownLatch的计数停留在 1,next()永远无法返回。
通过 Arthas 可以看到调用线程一直阻塞在:
ScanEdgeResultIterator.next()
-> CountDownLatch.await()
预期行为
每个从连接池借出的 Storage 连接只应释放一次,ScanEdgeResultIterator.next() 应当正常返回。
实际行为
同一个连接被释放两次,导致 worker 没有执行 countDown(),最终使 next() 一直阻塞。
已验证的解决方法
删除 worker 末尾重复的 release 后,问题消失:
- pool.release(new HostAddress(addr.getHost(), addr.getPort()), connection);
countDownLatch.countDown();
该连接已经在现有的 finally 代码块中释放,无需再次释放。
- Lenguaje dominante
- Java
- Estrellas
- 199
- Forks
- 125
- Merge medio
- 5 h 6 min
- PR fusionados (30 d)
- 3
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de vesoft-inc/nebula-java
-
【5.2.1】在获取连接时偶发报错Quizá libre de nuevo @Nicole00 la tomó hace 188 días y no hay ningún pull request abierto. Abiertoaffects/none severity/none type/bug
vesoft-inc/nebula-java#644 · 1 asignado ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
vesoft-inc/nebula-java#629 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
vesoft-inc/nebula-java#621 ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
vesoft-inc/nebula-java#620 · 2 comentarios · 1 reacción ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
vesoft-inc/nebula-java#617 ·
Todos los issues de vesoft-inc/nebula-java
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
component/zeebe kind/bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
UniversalMediaServer/UniversalMediaServer#6356 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
refinedmods/refinedstorage2#1414 · 1 comentario ·
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
yegor256/rultor-image#76 · 1 comentario ·