Kirill Tkalenko created IGNITE-16518:
----------------------------------------
Summary:
BPlusTreeReuseListPageMemoryImplTest.testMassiveRemove2_true flaky
Key: IGNITE-16518
URL: https://issues.apache.org/jira/browse/IGNITE-16518
Project: Ignite
Issue Type: Bug
Components: data structures
Reporter: Kirill Tkalenko
Assignee: Kirill Tkalenko
Fix For: 2.13
Found that the test sometimes fails:
*BPlusTreeReuseListPageMemoryImplTest.testMassiveRemove2_true* flaky.
https://ci.ignite.apache.org/project.html?tab=testDetails&projectId=IgniteTests24Java8&testNameId=7031624718556126435&page=1
Explanation
{noformat}
Here’s a tree and a set of operations that lead to undesired results:
[ 2 ]
/ \
[ 1 ] [ 3 | 4 ]
/ \ / | \
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]
// Remove 2
[ 1 ]
/ \
[ ] [ 3 | 4 ]
| / | \
[ 1 ] [ 3 ] [ 4 ] [ 5 ]
// Remove 5
[ 1 ]
/ \
[ ] [ 3 ]
| / \
[ 1 ] [ 3 ] [ 4 ]
// Remove 4
[ 1 ]
/ \
[ ] [ ]
| |
[ 1 ] [ 3 ]
// Remove 3
[ 1 ]
|
[ ]
|
[ 1 ]
// Remove 1
[ ]
|
[ ]
{noformat}
It’s clear that at some point we have a whole level consisting of routing
nodes. This later leads to somewhat incorrect “cut tree root” operation that
leaves empty leaf.
Possible solutions
root cutting should probably be recursive and should proceed until root node is
not empty or is a leaf.
merge operation should work better with routing nodes - every time there’s a
merge, we should consider the possibility to merge empty neighbor as well.
re-balance data from neighbor when node becomes a router node. Might be
impossible or very challenging in current implementation.
Option 1 is the easiest one. Given the rarity of the case, I’d go with it.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)