lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.48k stars 521 forks source link

做批量数据写入超过一段时间的话,调度线程就挂住了 #148

Open zouyanjian opened 2 years ago

zouyanjian commented 2 years ago

··· "ScheduleService-1" #21 daemon prio=5 os_prio=31 cpu=576615.75ms elapsed=870.60s tid=0x00007faf33844e00 nid=0x6b03 runnable [0x00007000036f4000] java.lang.Thread.State: RUNNABLE at org.lealone.storage.aose.btree.page.LocalPage.binarySearch(LocalPage.java:105) at org.lealone.storage.aose.btree.page.Page.getPageIndex(Page.java:184) at org.lealone.storage.aose.btree.page.Page.gotoLeafPage(Page.java:449) at org.lealone.storage.aose.btree.BTreeMap.gotoLeafPage(BTreeMap.java:510) at org.lealone.storage.aose.btree.page.PageOperations$SingleWrite.gotoLeafPage(PageOperations.java:178) at org.lealone.storage.aose.btree.page.PageOperations$SingleWrite.run(PageOperations.java:88) at org.lealone.storage.page.PageOperationHandlerBase.runPageOperationTasks(PageOperationHandlerBase.java:87) at org.lealone.server.Scheduler.executeNextStatement(Scheduler.java:224) at org.lealone.server.Scheduler.run(Scheduler.java:106)

Locked ownable synchronizers:

···

hangup

codefollower commented 2 years ago

客户端建了几个连接做批量写入? 调度线程不会挂住的,如果客户端开了几个连接写入,可能其中之一锁住了某个 page 没有释放,导致其他线程不能写这个 page,但是其他线程并不会被挂起,只是无法完成写入操作,不能给客户端发回响应,所以客户端感觉自己被挂起了。

如果是没有释放 page 锁的问题,可能是新引入的并发控制算法的代码哪里还有 bug。

zouyanjian commented 2 years ago

用10个连接做批量写的 128个一个批量提交,是的 由于线程锁住了,导致连接都close,写就失败了,批量写就失败了

codefollower commented 2 years ago

我写了一个 org.lealone.test.client.BatchTest.testConcurrentBatch() 目前不能重现问题, 你把你的建表 sql 和执行批量的 sql 发出来我看看能不能复现。

zouyanjian commented 2 years ago

好的,我周末找个时间整理一下