mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
pkg/adt: add "IntervalTree.Delete" failure case
Described in https://github.com/etcd-io/etcd/issues/10877. "black-height" property: Every path from a node to any descendant leaf node must have the same number of black nodes. Expected After deleting 11 (requires rebalancing): [510,511] / \ ---------- -------------------------- / \ [383,384] [830,831] / \ / \ / \ / \ [261,262](red) [410,411] [647,648] [899,900](red) / \ \ / \ / \ \ / \ [82,83] [292,293] [815,816](red) [888,889] [972,973] \ / \ / [238,239](red) [953,954](red) Got After deleting 11 (requires rebalancing): [510,511] / \ ---------- -------------------------- / \ [82,83] [830,831] \ / \ \ / \ [383,384] [647,648] [899,900] / \ \ / \ / \ \ / \ [261,262] [410,411] [815,816] [888,889] [972,973] / \ / / \ / [238,239] [292,293] [953,954] This violates "black-height" property. Signed-off-by: Gyuho Lee <leegyuho@amazon.com>
This commit is contained in:
parent
b3152365bb
commit
f4341fd35c
@ -257,6 +257,31 @@ func TestIntervalTreeDelete(t *testing.T) {
|
||||
if deleted := tr.Delete(NewInt64Interval(11, 12)); !deleted {
|
||||
t.Fatalf("range %v not deleted", range11)
|
||||
}
|
||||
|
||||
expectedAfterDelete11 := []visitedInterval{
|
||||
{root: NewInt64Interval(510, 511), color: black, left: NewInt64Interval(383, 384), right: NewInt64Interval(830, 831), depth: 0},
|
||||
|
||||
{root: NewInt64Interval(383, 384), color: black, left: NewInt64Interval(261, 262), right: NewInt64Interval(410, 411), depth: 1},
|
||||
{root: NewInt64Interval(830, 831), color: black, left: NewInt64Interval(647, 648), right: NewInt64Interval(899, 900), depth: 1},
|
||||
|
||||
{root: NewInt64Interval(261, 262), color: red, left: NewInt64Interval(82, 83), right: NewInt64Interval(292, 293), depth: 2},
|
||||
{root: NewInt64Interval(410, 411), color: black, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 2},
|
||||
{root: NewInt64Interval(647, 648), color: black, left: newInt64EmptyInterval(), right: NewInt64Interval(815, 816), depth: 2},
|
||||
{root: NewInt64Interval(899, 900), color: red, left: NewInt64Interval(888, 889), right: NewInt64Interval(972, 973), depth: 2},
|
||||
|
||||
{root: NewInt64Interval(82, 83), color: black, left: newInt64EmptyInterval(), right: NewInt64Interval(238, 239), depth: 3},
|
||||
{root: NewInt64Interval(292, 293), color: black, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 3},
|
||||
{root: NewInt64Interval(815, 816), color: red, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 3},
|
||||
{root: NewInt64Interval(888, 889), color: black, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 3},
|
||||
{root: NewInt64Interval(972, 973), color: black, left: NewInt64Interval(953, 954), right: newInt64EmptyInterval(), depth: 3},
|
||||
|
||||
{root: NewInt64Interval(238, 239), color: red, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 4},
|
||||
{root: NewInt64Interval(953, 954), color: red, left: newInt64EmptyInterval(), right: newInt64EmptyInterval(), depth: 4},
|
||||
}
|
||||
visitsAfterDelete11 := tr.visitLevel()
|
||||
if !reflect.DeepEqual(expectedAfterDelete11, visitsAfterDelete11) {
|
||||
t.Fatalf("level order after deleting '11' expected %v, got %v", expectedAfterDelete11, visitsAfterDelete11)
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntervalTreeIntersects(t *testing.T) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user