OrientDB 3.2.27大量OStorageRemotePushThread.subscribe线程长期锁定是否正常?
OrientDB 3.2.27中OStorageRemotePushThread.subscribe线程长期锁定的问题分析
是否属于正常现象
这种大量OStorageRemotePushThread.subscribe线程长时间锁定的情况完全不正常。该线程负责客户端与OrientDB服务器的推送订阅同步、存储配置更新等核心逻辑,长期阻塞会导致客户端无法及时同步服务器配置、重连逻辑卡滞,甚至引发客户端服务不可用。
可能的原因分析
结合提供的线程栈信息,线程卡在SynchronousQueue.poll方法(无缓冲同步队列,需生产者与消费者配对才能完成操作),据此分析可能的原因:
| +---Thread-402 Frozen for at least 10s <Ignore a false positive> | | | | | | | +---jdk.internal.misc.Unsafe.park(boolean, long) (native) | | | | | | | +---java.util.concurrent.locks.LockSupport.parkNanos(Object, long) | | | | | | | +---java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) | | | | | | | +---java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) | | | | | | | +---com.orientechnologies.orient.client.remote.OStorageRemotePushThread.subscribe(OBinaryRequest, OStorageRemoteSession) OStorageRemotePushThread.java:124 | | | | | | | +---com.orientechnologies.orient.client.remote.OStorageRemote.subscribeStorageConfiguration(OStorageRemoteSession) OStorageRemote.java:1839 | | | | | | | +---com.orientechnologies.orient.client.remote.OStorageRemote.onPushReconnect(String) OStorageRemote.java:2331 | | | | | | | +---com.orientechnologies.orient.client.remote.OStorageRemotePushThread.run() OStorageRemotePushThread.java:99
- 服务器端无响应或处理超时:线程是在
subscribeStorageConfiguration(订阅存储配置)过程中阻塞的,说明客户端向服务器发送配置订阅请求后,服务器因负载过高、内部逻辑卡住、网络延迟等原因,没有及时返回响应,导致客户端线程在同步队列中一直等待。 - 消费端线程未及时处理请求:
SynchronousQueue需要消费端及时取走请求,如果负责处理服务器响应的客户端线程池满负荷、或者出现死锁,请求就会一直挂在队列中,导致当前线程长期阻塞。 - Kotlin协程与线程本地变量的适配问题:虽然协程挂起会保存和恢复线程本地变量,但如果OrientDB客户端依赖的线程本地上下文(如
OStorageRemoteSession)在协程调度切换线程时出现不一致,可能导致订阅请求无法被正确处理,或者响应无法正确回流到客户端,进而引发线程阻塞。 - 版本特定bug:OrientDB 3.2.27可能存在推送订阅逻辑的缺陷,比如重连时的订阅请求超时设置不合理、队列消费逻辑存在漏洞,导致线程无法正常退出阻塞状态。
内容的提问来源于stack exchange,提问作者jamie
相关产品推荐
相关产品推荐

