fixed GH #2738: Poco::AccessExpireStrategy::onGet() must not extend expiration time after expiration

This commit is contained in:
Günter Obiltschnig
2019-07-01 17:51:38 +02:00
parent 4c3351ea05
commit 12897d3d63
5 changed files with 44 additions and 9 deletions

View File

@@ -54,6 +54,8 @@ public:
// get triggers an update to the expiration time
typename ExpireStrategy<TKey, TValue>::Iterator it = this->_keys.find(key);
if (it != this->_keys.end())
{
if (!it->second->first.isElapsed(this->_expireTime)) // don't extend if already expired
{
this->_keyIndex.erase(it->second);
Timestamp now;
@@ -62,6 +64,7 @@ public:
it->second = itIdx;
}
}
}
};

View File

@@ -183,7 +183,22 @@ void ExpireCacheTest::testExpireWithHas()
aCache.add(1, 2); // 1
assertTrue (aCache.has(1));
Thread::sleep(DURWAIT);
assertTrue (!aCache.has(1));
assert (!aCache.has(1));
}
void ExpireCacheTest::testAccessExpireGet()
{
AccessExpireCache<int, int> aCache(DURSLEEP);
aCache.add(1, 2); // 1
assertTrue (aCache.has(1));
SharedPtr<int> tmp = aCache.get(1);
assertTrue (!tmp.isNull());
assertTrue (*tmp == 2);
assertTrue (aCache.size() == 1);
Thread::sleep(DURWAIT);
tmp = aCache.get(1);
assertTrue (tmp.isNull());
}
@@ -207,6 +222,7 @@ CppUnit::Test* ExpireCacheTest::suite()
CppUnit_addTest(pSuite, ExpireCacheTest, testDuplicateAdd);
CppUnit_addTest(pSuite, ExpireCacheTest, testAccessExpireN);
CppUnit_addTest(pSuite, ExpireCacheTest, testExpireWithHas);
CppUnit_addTest(pSuite, ExpireCacheTest, testAccessExpireGet);
return pSuite;
}

View File

@@ -29,7 +29,7 @@ public:
void testExpireN();
void testAccessExpireN();
void testExpireWithHas();
void testAccessExpireGet();
void setUp();
void tearDown();

View File

@@ -303,6 +303,20 @@ void ExpireLRUCacheTest::testDuplicateAdd()
}
void ExpireLRUCacheTest::testAccessExpireGet()
{
ExpireLRUCache<int, int> aCache(3, DURSLEEP);
aCache.add(1, 2); // 1
assertTrue (aCache.has(1));
SharedPtr<int> tmp = aCache.get(1);
assertTrue (!tmp.isNull());
assertTrue (*tmp == 2);
Thread::sleep(DURWAIT);
tmp = aCache.get(1);
assertTrue (tmp.isNull());
}
void ExpireLRUCacheTest::setUp()
{
}
@@ -326,6 +340,7 @@ CppUnit::Test* ExpireLRUCacheTest::suite()
CppUnit_addTest(pSuite, ExpireLRUCacheTest, testCacheSize2);
CppUnit_addTest(pSuite, ExpireLRUCacheTest, testCacheSizeN);
CppUnit_addTest(pSuite, ExpireLRUCacheTest, testDuplicateAdd);
CppUnit_addTest(pSuite, ExpireLRUCacheTest, testAccessExpireGet);
return pSuite;
}

View File

@@ -32,6 +32,7 @@ public:
void testCacheSize2();
void testCacheSizeN();
void testDuplicateAdd();
void testAccessExpireGet();
void setUp();
void tearDown();