SessionPool使用问题

  • nebula 版本:3.4.1

  • 部署方式:单机

  • 安装方式:源码编译

  • 是否上生产环境:N

  • 问题的具体描述:我使用SessionPool进行图库的连接和操作,但是在操作完成后,系统报错

Exception ignored in: <bound method Session.__del__ of <nebula3.gclient.net.Session.Session object at 0x7f5044186518>>
Traceback (most recent call last):
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/gclient/net/Session.py", line 273, in __del__
    self.release()
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/gclient/net/Session.py", line 235, in release
    self._connection.signout(self._session_id)
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/gclient/net/Connection.py", line 205, in signout
    self._connection.signout(session_id)
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/graph/GraphService.py", line 1603, in signout
    self.send_signout(sessionId)
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/graph/GraphService.py", line 1611, in send_signout
    self._oprot.trans.onewayFlush()
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/fbthrift/transport/THeaderTransport.py", line 429, in onewayFlush
    self.flushImpl(True)
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/fbthrift/transport/THeaderTransport.py", line 531, in flushImpl
    self.getTransport().write(buf.getvalue())
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/fbthrift/transport/TTransport.py", line 187, in write
    self.__wbuf.write(buf)
  File "/home/xxx/anaconda3/envs/jiayi/lib/python3.6/site-packages/nebula3/fbthrift/util/BytesStrIO.py", line 40, in write
    BytesIO.write(self, data)
ValueError: I/O operation on closed file.

想知道是哪里的问题,感谢:pray:

代码贴下

这部分是创建连接的代码:

class NebulaCon(object):
    def __init__(self):
        self.ip = xxx
        self.port = xxx
        self.username = xxx
        self.password = xxx
        self.namespace = xxx

        self.session_pool = self.get_connection()
        self.build_schema()
    
    def get_connection(self):
        config = SessionPoolConfig()
        # init session pool
        session_pool = SessionPool(self.username, self.password, self.namespace, [(self.ip, self.port)])
        assert session_pool.init(config), "session init FAIL!"

        return session_pool

    def build_schema(self):
        # 创建tag
        self.session_pool.execute(
            'CREATE TAG IF NOT EXISTS router(asn int, source_coll string, source_ip string);'
            'CREATE TAG IF NOT EXISTS as_node(asn int);'
        )
        logger.info('Show tags: {}'.format(self.session_pool.execute('SHOW TAGS;')))
        self.session_pool.execute(
            'CREATE EDGE IF NOT EXISTS l_type(event_time timestamp, path_origin_prefix string, \
             path_origin_asn int, community string, is_last int);'
            'CREATE EDGE IF NOT EXISTS A_type(event_time timestamp, path_origin_prefix string, \
             path_origin_asn int, community string, is_last int, order_idx int);'
            'CREATE EDGE IF NOT EXISTS W_type(event_time timestamp, path_origin_prefix string, \
             is_last int, order_idx int);'
        )
        logger.info('Show edges: {}'.format(self.session_pool.execute('SHOW EDGES;')))
    
    def insert(self, ngql):
        resp = self.session_pool.execute(ngql)
        assert resp.is_succeeded(), resp.error_msg()

这部分是入库代码:

class xxx(object):
    def __init__(self, prefix, start, end):
        self.PREFIX = prefix
        self.START = start
        self.END = end
        self.nebulacon = NebulaCon()
    def insert(self):
        ....
        self.nebulacon.insert('INSERT VERTEX router (asn, source_coll, source_ip) VALUES \"{}\":({}, \"{}\", \"{}\");'.format( peer_id, peer_as, collecor, peer_ip))

你好,这个是什么原因呢?谢谢:pray:

你稍等哈,我找他回复下。

好的,麻烦了:pray:

看报错是销毁 session 对象的时候的 Session.__del__() call 的时候试图去释放已经不存在的 connection,猜测可能和你的 NebulaCon 实现没有显示去做一个 SessionPool 的销毁有关,如果你的报错是关闭程序的时候报的,这种情况下可以做这样的实现,而不是等 python 的回收机制去做(这样可能出现它先回收了 session pool,还会再去回收 session。)

class NebulaCon(object):
    # ...

    def close(self):
        if self.session_pool is not None:
            self.session_pool.close()
            self.session_pool = None

    def __del__(self):
        self.close()

另外就可能是 sessionPool 的 周期清理的函数有关了 cc @Aiee ,可能是 session pool 的 bug 了。

可以确认一下出错的条件是关nebulacon 还是别的么?

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