From 6a70f27f59602e31ebfba6ee3d9cdc820d2deb2a Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 28 Aug 2017 13:46:18 -0500 Subject: [PATCH 1/3] account for all same values in rank --- cache.go | 5 +++++ cache_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 cache_test.go diff --git a/cache.go b/cache.go index 242e5a6ab..ba33fe258 100644 --- a/cache.go +++ b/cache.go @@ -273,6 +273,11 @@ func (c *RankCache) recalculate() { if cnt <= c.thresholdValue { delete(c.entries, id) } + // prevent from deleting the whole cache if all the same value + if len(c.entries) <= int(c.maxEntries) { + break + } + } } } diff --git a/cache_test.go b/cache_test.go new file mode 100644 index 000000000..21d8acf07 --- /dev/null +++ b/cache_test.go @@ -0,0 +1,35 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pilosa_test + +import ( + "testing" + + "github.com/pilosa/pilosa" +) + +// Ensure a bitmap query can be executed. +func TestCache_Rank(t *testing.T) { + cacheSize := uint32(3) + cache := pilosa.NewRankCache(cacheSize) + for i := 1; i < int(2*cacheSize); i++ { + cache.Add(uint64(i), 3) + } + cache.Recalculate() + if cache.Len() != int(cacheSize) { + t.Fatalf("unexpected cache Size: %d!=%d expected\n", cache.Len(), cacheSize) + } + +} From 60ee6dcfdda3a3e112c3f9c317dd9100f9bbba64 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 28 Aug 2017 14:12:31 -0500 Subject: [PATCH 2/3] constant cache removal --- cache.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cache.go b/cache.go index ba33fe258..890a38e0b 100644 --- a/cache.go +++ b/cache.go @@ -256,8 +256,10 @@ func (c *RankCache) recalculate() { length := len(c.rankings) c.stats.Gauge("RankCache", float64(length), 1.0) + var remove_items []BitmapPair // cached, ordered list if length > int(c.maxEntries) { c.thresholdValue = rankings[c.maxEntries].Count + remove_items = c.rankings[c.maxEntries:] c.rankings = c.rankings[0:c.maxEntries] } else { c.thresholdValue = 1 @@ -269,15 +271,8 @@ func (c *RankCache) recalculate() { // If size is larger than the threshold then trim it. if len(c.entries) > c.thresholdBuffer { c.stats.Count("cache.threshold", 1, 1.0) - for id, cnt := range c.entries { - if cnt <= c.thresholdValue { - delete(c.entries, id) - } - // prevent from deleting the whole cache if all the same value - if len(c.entries) <= int(c.maxEntries) { - break - } - + for _, pair := range remove_items { + delete(c.entries, pair.ID) } } } From 773019a0f33fc8d6b80742cec81f58bb5c80f341 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 28 Aug 2017 14:15:59 -0500 Subject: [PATCH 3/3] corrected nameing --- cache.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cache.go b/cache.go index 890a38e0b..2e66d35b9 100644 --- a/cache.go +++ b/cache.go @@ -256,10 +256,10 @@ func (c *RankCache) recalculate() { length := len(c.rankings) c.stats.Gauge("RankCache", float64(length), 1.0) - var remove_items []BitmapPair // cached, ordered list + var removeItems []BitmapPair // cached, ordered list if length > int(c.maxEntries) { c.thresholdValue = rankings[c.maxEntries].Count - remove_items = c.rankings[c.maxEntries:] + removeItems = c.rankings[c.maxEntries:] c.rankings = c.rankings[0:c.maxEntries] } else { c.thresholdValue = 1 @@ -271,7 +271,7 @@ func (c *RankCache) recalculate() { // If size is larger than the threshold then trim it. if len(c.entries) > c.thresholdBuffer { c.stats.Count("cache.threshold", 1, 1.0) - for _, pair := range remove_items { + for _, pair := range removeItems { delete(c.entries, pair.ID) } }