diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-06-16 13:09:55 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-06-16 14:00:15 +0000 |
commit | 1404c7b201bbe59116126f196727e16d4f13ae1c (patch) | |
tree | 2e65807e1f013b643e3b2a9705eaa2db58ac1a53 /vespalib | |
parent | 9c52e2d04a56421f4f22f231d33a4ee4656d342f (diff) |
- Add explicit test that onInsert/onRemove is called correctly when cache is full,
do not rely on monitoring cache size.
- Call correct method for properly erasing an element, even if it is old :)
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/cache_test.cpp | 60 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/lrucache_map.hpp | 4 |
2 files changed, 61 insertions, 3 deletions
diff --git a/vespalib/src/tests/stllike/cache_test.cpp b/vespalib/src/tests/stllike/cache_test.cpp index 358a3591dbf..715fda1cbfd 100644 --- a/vespalib/src/tests/stllike/cache_test.cpp +++ b/vespalib/src/tests/stllike/cache_test.cpp @@ -136,4 +136,64 @@ TEST("testThatMultipleRemoveOnOverflowIsFine") { EXPECT_EQUAL(2924u, cache.sizeBytes()); } +class ExtendedCache : public cache< CacheParam<P, B> > { +public: + ExtendedCache(BackingStore & b, size_t maxBytes) + : cache<CacheParam<P, B>>(b, maxBytes), + _insert_count(0), + _remove_count(0) + {} + size_t _insert_count; + size_t _remove_count; +private: + void onRemove(const K &) override { + _remove_count++; + } + + void onInsert(const K &) override { + _insert_count++; + } +}; + +TEST("testOnInsertonRemoveCalledWhenFull") { + B m; + ExtendedCache cache(m, 200); + EXPECT_EQUAL(0u, cache._insert_count); + EXPECT_EQUAL(0u, cache._remove_count); + cache.write(1, "15 bytes string"); + EXPECT_EQUAL(1u, cache.size()); + EXPECT_EQUAL(80u, cache.sizeBytes()); + EXPECT_EQUAL(1u, cache._insert_count); + EXPECT_EQUAL(0u, cache._remove_count); + cache.write(2, "16 bytes stringg"); + EXPECT_EQUAL(2u, cache.size()); + EXPECT_EQUAL(160u, cache.sizeBytes()); + EXPECT_EQUAL(2u, cache._insert_count); + EXPECT_EQUAL(0u, cache._remove_count); + cache.write(3, "17 bytes stringgg"); + EXPECT_EQUAL(3u, cache.size()); + EXPECT_EQUAL(240u, cache.sizeBytes()); + EXPECT_EQUAL(3u, cache._insert_count); + EXPECT_EQUAL(0u, cache._remove_count); + EXPECT_TRUE(cache.hasKey(1)); + cache.write(4, "18 bytes stringggg"); + EXPECT_EQUAL(3u, cache.size()); + EXPECT_EQUAL(240u, cache.sizeBytes()); + EXPECT_EQUAL(4u, cache._insert_count); + EXPECT_EQUAL(1u, cache._remove_count); + EXPECT_FALSE(cache.hasKey(1)); + cache.invalidate(2); + EXPECT_EQUAL(2u, cache.size()); + EXPECT_EQUAL(160u, cache.sizeBytes()); + EXPECT_EQUAL(4u, cache._insert_count); + EXPECT_EQUAL(2u, cache._remove_count); + EXPECT_FALSE(cache.hasKey(2)); + cache.invalidate(3); + EXPECT_EQUAL(1u, cache.size()); + EXPECT_EQUAL(80u, cache.sizeBytes()); + EXPECT_EQUAL(4u, cache._insert_count); + EXPECT_EQUAL(3u, cache._remove_count); + EXPECT_FALSE(cache.hasKey(3)); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/vespalib/src/vespa/vespalib/stllike/lrucache_map.hpp b/vespalib/src/vespa/vespalib/stllike/lrucache_map.hpp index ca1b075d68b..f063f277e3e 100644 --- a/vespalib/src/vespa/vespalib/stllike/lrucache_map.hpp +++ b/vespalib/src/vespa/vespalib/stllike/lrucache_map.hpp @@ -204,9 +204,7 @@ lrucache_map<P>::removeOld() { (_tail != _head) && removeOldest(*last); last = & HashTable::getByInternalIndex(_tail)) { - _tail = last->second._prev; - HashTable::getByInternalIndex(_tail).second._next = LinkedValueBase::npos; - HashTable::erase(*this, HashTable::hash(last->first), HashTable::find(last->first)); + erase(last->first); } } } |