mirror of
https://github.com/pocoproject/poco.git
synced 2024-12-12 10:13:51 +01:00
fixed GH #2738: Poco::AccessExpireStrategy::onGet() must not extend expiration time after expiration
This commit is contained in:
parent
4c3351ea05
commit
12897d3d63
@ -31,7 +31,7 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <
|
||||
template <
|
||||
class TKey,
|
||||
class TValue
|
||||
>
|
||||
@ -55,11 +55,14 @@ public:
|
||||
typename ExpireStrategy<TKey, TValue>::Iterator it = this->_keys.find(key);
|
||||
if (it != this->_keys.end())
|
||||
{
|
||||
this->_keyIndex.erase(it->second);
|
||||
Timestamp now;
|
||||
typename ExpireStrategy<TKey, TValue>::IndexIterator itIdx =
|
||||
this->_keyIndex.insert(typename ExpireStrategy<TKey, TValue>::TimeIndex::value_type(now, key));
|
||||
it->second = itIdx;
|
||||
if (!it->second->first.isElapsed(this->_expireTime)) // don't extend if already expired
|
||||
{
|
||||
this->_keyIndex.erase(it->second);
|
||||
Timestamp now;
|
||||
typename ExpireStrategy<TKey, TValue>::IndexIterator itIdx =
|
||||
this->_keyIndex.insert(typename ExpireStrategy<TKey, TValue>::TimeIndex::value_type(now, key));
|
||||
it->second = itIdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -29,8 +29,8 @@ public:
|
||||
void testExpireN();
|
||||
void testAccessExpireN();
|
||||
void testExpireWithHas();
|
||||
void testAccessExpireGet();
|
||||
|
||||
|
||||
void setUp();
|
||||
void tearDown();
|
||||
static CppUnit::Test* suite();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -32,7 +32,8 @@ public:
|
||||
void testCacheSize2();
|
||||
void testCacheSizeN();
|
||||
void testDuplicateAdd();
|
||||
|
||||
void testAccessExpireGet();
|
||||
|
||||
void setUp();
|
||||
void tearDown();
|
||||
static CppUnit::Test* suite();
|
||||
|
Loading…
Reference in New Issue
Block a user