cascadb icon indicating copy to clipboard operation
cascadb copied to clipboard

fix a lock contention issue

Open kedebug opened this issue 12 years ago • 2 comments

考虑一种极端的并发情况:

  1. 假设当前根结点是 x,线程 a, b 同时写入数据
  2. a 此时持有 x 的 write_lock() 准备分裂操作,b 此时持有 x 的 read_lock() 等待 a 线程完成操作写入
  3. 极端情况考虑,此时缓冲树增高,产生新的根节点 y,但是 b 将要 write 的 msg 成为 y 的右子树部分(即新分裂的部分)
  4. b 终于得到 read_lock() 准备写操作,但是得到的是 x 的读权限,并非新的根节点 y 可想而知,会有bug产生。我对代码进行简单的修改,可以在不损失效率的情况下,避免这种竞态环境下的错误。

kedebug avatar Dec 16 '13 07:12 kedebug

@kedebug Root节点的分裂是很重要的!

cascaDB在Lock上也在改进,计划: 所有的lock不应该直接加在Node上,外面需要个Container,所有的lock和unlock统一交给cache来管理。 当对Root进行split的时候,其他线程会一直在Container上进行spin,root nid要保持不变。

这样就不会出现你描述的情况了。 严格避免Lock下的Data Race和Dead Lock问题,应该是我们接下来的一个重点。 Thanx.

bohutang avatar Dec 16 '13 09:12 bohutang

@shuttler 很高兴能得到您的回复,并且也非常期待cascadb能在这方面做出改进。

kedebug avatar Dec 16 '13 10:12 kedebug