Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BLinkTree 正确性的疑问 #10

Open
wine99 opened this issue Apr 16, 2024 · 3 comments
Open

BLinkTree 正确性的疑问 #10

wine99 opened this issue Apr 16, 2024 · 3 comments

Comments

@wine99
Copy link

wine99 commented Apr 16, 2024

请问插入的时候,为什么不会发生这样的情况:

树的各个节点均已满,一个线程P企图插入,它下降到了某个叶节点,此时另外几个线程也开始插入,它们下降了不同的叶节点然后插入结束,导致旧root分裂,新root生成,并且导致旧root所在那一层再次满了,这时线程P向上回溯,回溯到旧root后依然要进行分裂,可是线程P并不知道旧root的parent(也就是新root)是谁。

您的代码中,下面这行代码

assert(blink_node_is_root(left));

似乎表明这样的情况并不会发生,如果您还记得这篇paper的话,可以解答一下吗?谢谢!

@starrocks-xupeng
Copy link

旧 root 发生改变的话,正常插入旧 root 或者最多往右移动一个节点(假设旧 root 分裂了一个右节点)然后插入就行了,不需要知道更上层的新 root。

@wine99
Copy link
Author

wine99 commented Apr 26, 2024

正常插入旧 root 或者最多往右移动一个节点(假设旧 root 分裂了一个右节点)然后插入就行了

我感觉这个不太对。

我发现 Postgres 的实现也采用了 Blinktree 的变体,它的 readme 里面写道,root split 时可能需要 re-descending,见 https://github.com/postgres/postgres/blob/205db0114e03496f1d6febf276374900b6314e67/src/backend/access/nbtree/README#L112-L137

@starrocks-xupeng
Copy link

starrocks-xupeng commented Apr 29, 2024

理论上是有这个可能性的,实际发生条件会非常苛刻,甚至永远不会发生,你看他文档里自己也说了 in principle 和 rare

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants