使用SessionsManager拿出了一个不可用的sessionWrapper

提问参考模版:

  • nebula 版本:3.1.0
  • 部署方式:分布式
  • 硬件信息
    • 磁盘( 推荐使用 SSD)
    • CPU、内存信息
  • 问题的具体描述
    使用SessionsManager拿出了一个不可用的sessionWrapper

通过官方提供的SessionsManager进行session管理,使同一个space下的线程共享sessionsManager,今天在测试的时候偶发性的发现,拿出了一个available为false的sessionWrapper,报了’The session was released, could not use again‘的问题。

对此有几点疑问:

1.初步定位问题在returnSessionWrapper的时候,设置了某个可用index下的sessionWrapper为不可用,但是官方代码中会在这个位置复用session再创建一个新的sessionWrapper,应该不会出现这个问题…
于是考虑是并发的问题,但是manager是线程安全的…因此原因还不确定…
2.SessionsManager在return的时候会保证the old SessionWrapper couldn’t use again.这一点的目的是什么?

求助 @Aiee :heart:

  1. 在你的测试环境能稳定复现吗? 按理说通过 SessionManager 操作 SessionWrapper 的话不会有第一个问题, session.setNoAvailable() 唯一调用的地方就在归还 session 那里, 有没有直接对 SessionWrapper 中的 session 做过 release()?

  2. 这是为了防止被归还的 SessionWrapper 在其他地方再被使用

1 个赞
  1. 贴一下你的代码,看怎么用的。

  2. 为了防止代码误用,简单的例子

session = sessionsManager.getSessionWrapper();
sessionsManager.returnSessionWrapper(session);
session.execute("SHOW TAGS");

当返回给 manager 了以后,之前的 session 就不能用了,一定要再次从 manager 拿一个新的。

1 个赞


这边自己封装了一下manager,但是主要逻辑都是照搬的;
发现这个问题后在拿到session后做了一层判断,后面发现内存水位上去了,manger列表里的session基本都不可用…
补充几个配置信息:
1.NebulaPoolConfig.idleTime = 0;
2.–session_idle_timeout_secs=3600;

另外这个现象目前只发现在2.6的环境里,升级到3.1过后没有发现

1 个赞

另外还有个问题求解,目前是每个线程通过threadLocal缓存自己的sessionWrapper,但是我们这边有个批量创建schema的操作,是异步实现的,这样就造成父子线程共享同一个session,导致session并发的问题。请问这个问题有什么好的解决方案嘛 :rofl:

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