Java client 调用过程中报错 No buffer space available (maximum connections reached?): connect

  • nebula 版本:2.0.0 rc
  • 部署方式 Docker:

我使用 nebula 数据库作为知识存储,开发了一个知识图谱的 API, 其中有一个三元组插入的接口。但在调用过程中,我连续插入 1 万条左右的三元组的时候就会开始报错:

我初始化 nebula 是这样写的:

    object NebulaManager {

        @JvmStatic
        var connection: Connection? = null

        @JvmStatic
        var nebulaPoolConfig = NebulaPoolConfig()

        @JvmStatic
        lateinit var pool: NebulaPool

        @JvmStatic
        lateinit var session: Session

    }

fun start(): Boolean {
    nebulaPoolConfig.maxConnSize = 10
    pool = NebulaPool()
    pool.init(addresses, nebulaPoolConfig)
    NebulaManager.session = pool.getSession(user, password, false)
    return true}

请问是不是我初始化做得不对呀~

addresses 你那边初始化了吗?
具体可以看:nebula-java/GraphClientExample.java at master · vesoft-inc/nebula-java · GitHub

address,port 这些都写了。我不知道是不是因为我 maxConnSize 设置得不对,或者是要加一些其他的类似 setTimeout 或 setIdleTime 等的配置?

上面的调用栈没看到跟 nebula 有关的,能展开看看是 client 的哪里抛出来的吗?

就是在 request 请求的时候报错的。

上面的代码是你们自己包的 HTTP Server 的处理吧,这块没涉及到 nebula 的部分呀。是因为 nebula 的 client 哪里有问题导致了你们 api 出错吗?还是你们封装的 http server 有问题,连接不上导致,看错误是 connection error

请问一下你们有改过 LOOKUP ON entity WHERE entity.name ==“ ”;的语句嘛。因为我昨天打的镜像能用的,今天突然这里就报错了。

数据库这个查出来是正常的,这样的:

image
image

但是我 API 里面用这个地方的时候:

今天查询结果就不对了,显示的 ResultSet 是 null

你是用的 nebula 的 v2-nightly 镜像吗?LOOKUP 最近应该是没做修改。

你可以打印一下出错的 Query 语句是什么?

我自己的 API 项目打的镜像。查询语句就是 LOOKUP ON entity WHERE entity.name == '周杰伦',报错是因为没拿到结果,但是这个语句我在数据库里查是有结果的。我在 client 里是这样写的:

    val searchEntityID = "LOOKUP ON entity WHERE entity.name == '周杰伦'"
    val resSearchEntityID: ResultSet = session.execute("USE $graphSpace;$searchEntityID")
    println(resSearchEntityID.colValues("VertexID")[0])

resSearchEntityID.colValues("VertexID")[0] 拿到的应该就是这个 VertexID,但是今天拿不到了。
image

主要是我没改过我的代码,这个昨天能跑的,今天就不能了。。

问题变成了,同样的语句连的同一个 graphd 的服务,console 中有结果,client 没有结果?那你最近有更新 nebula-java client 吗?

我发现问题了。好像是因为我在 client 中执行了:

session.execute(USE baike;LOOKUP ON entity WHERE entity.name == '周杰伦';)

这个语句昨天可以一起执行,今天就不行了,必须得分开。。
session.execute(USE baike;)
session.execute(LOOKUP ON entity WHERE entity.name == '周杰伦';)

不然会出现这个错误:

image

本地最新的 2.0 代码不能复现问题:

(fass@nebula) [(none)]> use nba; lookup on player where player.name == "Tim Duncan"
+--------------+
| VertexID     |
+--------------+
| "Tim Duncan" |
+--------------+
Got 1 rows (time spent 76792/78583 us)

Thu, 04 Feb 2021 17:01:14 CST

(fass@nebula) [nba]>

我是这样的

我把这个用例加到我们的测试中,避免下次回退。

umm…问下还会经常有这种问题嘛。。这样很难上线用呀 :joy: :joy:

我在 v2.0.0-rc1 的版本上也进行了验证,也没有问题:

(fass@nebula) [(none)]> use nba; lookup on player where player.name == "Tim Duncan"
+--------------+
| VertexID     |
+--------------+
| "Tim Duncan" |
+--------------+
Got 1 rows (time spent 8968/10057 us)

Thu, 04 Feb 2021 17:16:45 CST

(fass@nebula) [nba]>

能否进入你连接的那个 graphd 的容器,执行一下 /usr/local/nebula/bin/neubla-graphd --version 查看一下版本信息?类似如下:

$ docker-compose exec graphd sh
sh-4.2# cd /usr/local/nebula/bin/
sh-4.2# ./nebula-graphd --version
nebula-graphd version 5713b46, Git: 5713b46, Build Time: Jan  6 2021 15:27:00
This source code is licensed under Apache 2.0 License, attached with Common Clause Condition 1.0.

啊好像是 user 权限的问题。我用 root 权限就可以,但是刚用的 admin 权限的就不可以了。

你意思是如果是使用的 admin 权限,那么就不能把 USE 和 LOOKUP 连在一起用,分开是没问题,如果是 root 用户就没有这个问题,对吗?

嗯嗯对的。

我版本信息是

nebula-graphd version 1dd1de0, Git: 1dd1de0, Build Time: Feb  2 2021 02:31:16
This source code is licensed under Apache 2.0 License, attached with Common Clause Condition 1.0.

感谢你的验证。这应该是个 BUG。

  1. 创建 admin 角色的用户
  2. 使用这个用户执行 USE xxx; LOOKUP ON xxx..., 失败
  3. 分别执行 USE xxxLOOKUP ON xxx 成功

行为不一致。

@tom-chensf 在我们环境上验证一下这个问题吧

cc @steam 记个 bug,同时 assign 给 @Shylock-Hg