Skip to content

Commit 6519136

Browse files
Merge pull request #127 from Workiva/fix_avl
Fix deletion bug due to incorrect node copy.
2 parents 371ee25 + d50a4a7 commit 6519136

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

tree/avl/avl.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ func (immutable *Immutable) delete(entry Entry) Entry {
251251
}
252252
it = it.copy() // the node we found needs to be copied
253253

254+
oldTop := top
254255
if it.children[0] == nil || it.children[1] == nil { // need to set children on parent, splicing out
255256
dir = intFromBool(it.children[0] == nil)
256257
if top != 0 {
@@ -272,6 +273,11 @@ func (immutable *Immutable) delete(entry Entry) Entry {
272273
}
273274

274275
it.entry = heir.entry
276+
if oldTop != 0 {
277+
cache[oldTop-1].children[dirs[oldTop-1]] = it
278+
} else {
279+
immutable.root = it
280+
}
275281
cache[top-1].children[intFromBool(cache[top-1] == it)] = heir.children[1]
276282
}
277283

tree/avl/avl_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,29 @@ func TestAVLDeleteReplay(t *testing.T) {
295295
assert.Equal(t, uint64(4), i2.Len())
296296
}
297297

298+
func TestAVLFails(t *testing.T) {
299+
keys := []mockEntry{
300+
mockEntry(0),
301+
mockEntry(1),
302+
mockEntry(3),
303+
mockEntry(4),
304+
mockEntry(5),
305+
mockEntry(6),
306+
mockEntry(7),
307+
mockEntry(2),
308+
}
309+
i1 := NewImmutable()
310+
for _, k := range keys {
311+
i1, _ = i1.Insert(k)
312+
}
313+
314+
for _, k := range keys {
315+
var deleted Entries
316+
i1, deleted = i1.Delete(k)
317+
assert.Equal(t, Entries{k}, deleted)
318+
}
319+
}
320+
298321
func BenchmarkImmutableInsert(b *testing.B) {
299322
numItems := b.N
300323
sl := NewImmutable()

0 commit comments

Comments
 (0)