From 16ba54293ad5fe41a4a606322bdab0f4ee4c464c Mon Sep 17 00:00:00 2001 From: Seebs Date: Mon, 17 Aug 2020 11:21:17 -0500 Subject: [PATCH] when updating a container, drop the single-container cache This can cause incredibly weird and hard-to-debug problems if the previous container value is still in the cache after an update, and in particular, can result in having a stale container value cached after a roaring import that modified the container. Coupled with another bug which could corrupt containers on a delete, this produces a very strange bug where a value is present in a fragment, but an attempt to delete it reports failure. --- roaring/containers_btree.go | 2 ++ roaring/containers_slice.go | 1 + 2 files changed, 3 insertions(+) diff --git a/roaring/containers_btree.go b/roaring/containers_btree.go index 72837dcb4..c31f0d746 100644 --- a/roaring/containers_btree.go +++ b/roaring/containers_btree.go @@ -189,6 +189,8 @@ func (btc *bTreeContainers) Repair() { // replace the given container. func (btc *bTreeContainers) Update(key uint64, fn func(*Container, bool) (*Container, bool)) { btc.tree.Put(key, fn) + btc.lastKey = ^uint64(0) + btc.lastContainer = nil } // UpdateEvery calls fn (existing-container, existed), and expects diff --git a/roaring/containers_slice.go b/roaring/containers_slice.go index 79798adb0..8597b0f8d 100644 --- a/roaring/containers_slice.go +++ b/roaring/containers_slice.go @@ -210,6 +210,7 @@ func (sc *sliceContainers) Update(key uint64, fn func(*Container, bool) (*Contai sc.insertAt(key, nc, i) } } + sc.invalidateCache() } // UpdateEvery calls fn (existing-container, existed), and expects