python客户端执行超时后重新获取session报错nebula2.fbthrift.transport.TTransport.TTransportException: Transport not open

提问参考模版:

  • nebula 版本:2.5.1
  • 部署方式:分布式
  • python客户端:2.0.0
  • 问题的具体描述:
    python客户端ConnectionPool配置了timeout, 执行超时后,立即重新获取session报错:nebula2.fbthrift.transport.TTransport.TTransportException: Transport not open。再次获取session又恢复
  • 相关的 meta / storage / graph info 日志信息(尽量使用文本形式方便检索)

代码

from nebula2.gclient.net import ConnectionPool
from nebula2.Config import Config
config = Config()
config.max_connection_pool_size = 400
config.timeout = 10000
connection_pool = ConnectionPool()
connection_pool.init([(host, port)], config)
nsql = "get subgraph 10 steps from 'vid' out edge"
nebula_session = connection_pool.get_session("root", "nebula",retry_connect=False)
nebula_session.execute("use space")
subgraph = nebula_session.execute(nsql)

第一次执行报错超时符合预期

timeout                                   Traceback (most recent call last)
/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TSocket.py in read(self, sz)
    304         try:
--> 305             buff = self.handle.recv(sz)
    306             if len(buff) == 0:

timeout: timed out

During handling of the above exception, another exception occurred:

TTransportException                       Traceback (most recent call last)
/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py in execute(self, session_id, stmt)
    441         try:
--> 442             resp = self._connection.execute(session_id, stmt)
    443             return resp

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/graph/GraphService.py in execute(self, sessionId, stmt)
    902     self.send_execute(sessionId, stmt)
--> 903     return self.recv_execute()
    904 

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/graph/GraphService.py in recv_execute(self)
    914   def recv_execute(self, ):
--> 915     (fname, mtype, rseqid) = self._iprot.readMessageBegin()
    916     if mtype == TMessageType.EXCEPTION:

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/protocol/TBinaryProtocol.py in readMessageBegin(self)
    136     def readMessageBegin(self):
--> 137         sz = self.readI32()
    138         if sz < 0:

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/protocol/TBinaryProtocol.py in readI32(self)
    215     def readI32(self):
--> 216         buff = self.trans.readAll(4)
    217         val, = unpack(b'!i', buff)

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TTransport.py in readAll(self, sz)
     71         while need:
---> 72             chunk = self.read(need)
     73             if not chunk:

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TTransport.py in read(self, sz)
    182 
--> 183         self.__rbuf = StringIO(self.__trans.read(max(sz, self.__rbuf_size)))
    184         return self.__rbuf.read(sz)

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TSocket.py in read(self, sz)
    309         except socket.error as e:
--> 310             raise TTransportException(
    311                 type=TTransportException.END_OF_FILE,

TTransportException: Socket read failed: timed out

During handling of the above exception, another exception occurred:

IOErrorException                          Traceback (most recent call last)
<ipython-input-109-c67587a91bec> in <module>
      6 nebula_session = connection_pool.get_session("root", "nebula",retry_connect=False)
      7 nebula_session.execute("use xdr")
----> 8 subgraph = nebula_session.execute(nsql)

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py in execute(self, stmt)
     72         try:
     73             start_time = time.time()
---> 74             resp = self._connection.execute(self._session_id, stmt)
     75             end_time = time.time()
     76             return ResultSet(resp,

/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py in execute(self, session_id, stmt)
    445             if te.type == TTransportException.END_OF_FILE:
    446                 self.close()
--> 447             raise IOErrorException(IOErrorException.E_CONNECT_BROKEN, te.message)
    448 
    449     def signout(self, session_id):

IOErrorException: Socket read failed: timed out

第二次执行报错信息

Traceback (most recent call last):
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py", line 425, in authenticate
    resp = self._connection.authenticate(user_name, password)
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/graph/GraphService.py", line 856, in authenticate
    self.send_authenticate(username, password)
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/graph/GraphService.py", line 866, in send_authenticate
    self._oprot.trans.flush()
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TTransport.py", line 193, in flush
    self.__trans.write(out)
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/fbthrift/transport/TSocket.py", line 318, in write
    raise TTransportException(TTransportException.NOT_OPEN,
nebula2.fbthrift.transport.TTransport.TTransportException: Transport not open

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<ipython-input-94-7e3147431ceb>", line 170, in investigate
    nebula_session = connection_pool.get_session("root", "nebula", retry_connect=False)
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py", line 205, in get_session
    auth_result = connection.authenticate(user_name, password)
  File "/data/miniconda3/envs/env-3.8.8/lib/python3.8/site-packages/nebula2/gclient/net/__init__.py", line 432, in authenticate
    raise IOErrorException(IOErrorException.E_CONNECT_BROKEN, te.message)
nebula2.Exception.IOErrorException: Transport not open

你的版本不对齐呀

image

你如果要用 2.5 的内核的话,可以用 2.5 的客户端呀。

2.0.0 的 python 客户端有个 bug,当 connection 超时后,并没有重连。
所以你下次使用这个 session 的时候,因为 connection 没有 reopen,所以连接是关闭的。

2.5.0 修复了,https://github.com/vesoft-inc/nebula-python/pull/126

3 个赞

哦哦,不好意思hh,我重新试试

嗯嗯好的,十分感谢~
还有一个问题,貌似客户端timeout之后,服务端还在执行,之前看论坛里其他帖子说不支持从客户端终止查询,不知道现在这块有什么进展吗~
之前帖子链接:怎样设置graphd超时?

2.6 的版本以后,我们多了 kill query 的功能,可以手动 kill 一个 query。

2 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。