FLASH storage no longer keeps evicted keys in memory

Former-commit-id: 65c2b47c895d57231bbd3f451ecf1f6d9871f5f7
This commit is contained in:
John Sully 2019-12-19 17:30:31 -05:00
parent d83bffed8f
commit ac8450b332
2 changed files with 13 additions and 19 deletions

View File

@ -1910,10 +1910,6 @@ void redisDbPersistentData::setStorageProvider(IStorage *pstorage)
{ {
serverAssert(m_spstorage == nullptr); serverAssert(m_spstorage == nullptr);
m_spstorage = std::unique_ptr<IStorage>(pstorage); m_spstorage = std::unique_ptr<IStorage>(pstorage);
m_spstorage->enumerate([&](const char *key, size_t cchkey, const void *, size_t){
sds sdsKey = sdsnewlen(key, cchkey);
dictAdd(m_pdict, sdsKey, nullptr);
});
} }
void redisDb::initialize(int id) void redisDb::initialize(int id)
@ -2032,6 +2028,9 @@ void redisDbPersistentData::ensure(const char *key)
void redisDbPersistentData::ensure(const char *sdsKey, dictEntry **pde) void redisDbPersistentData::ensure(const char *sdsKey, dictEntry **pde)
{ {
serverAssert(sdsKey != nullptr); serverAssert(sdsKey != nullptr);
serverAssert(FImplies(*pde != nullptr, dictGetVal(*pde) != nullptr)); // early versions set a NULL object, this is no longer valid
// First see if the key can be obtained from a snapshot
if (*pde == nullptr && m_pdbSnapshot != nullptr) if (*pde == nullptr && m_pdbSnapshot != nullptr)
{ {
dictEntry *deTombstone = dictFind(m_pdictTombstone, sdsKey); dictEntry *deTombstone = dictFind(m_pdictTombstone, sdsKey);
@ -2067,14 +2066,16 @@ void redisDbPersistentData::ensure(const char *sdsKey, dictEntry **pde)
} }
} }
if (*pde != nullptr && dictGetVal(*pde) == nullptr) // If we haven't found it yet check our storage engine
if (*pde == nullptr && m_spstorage != nullptr)
{ {
serverAssert(m_spstorage != nullptr); serverAssert(m_spstorage != nullptr);
m_spstorage->retrieve(sdsKey, sdslen(sdsKey), [&](const char *, size_t, const void *data, size_t cb){ m_spstorage->retrieve(sdsKey, sdslen(sdsKey), [&](const char *, size_t, const void *data, size_t cb){
robj *o = deserializeStoredObject(this, (const char*)dictGetKey(*pde), data, cb); robj *o = deserializeStoredObject(this, sdsKey, data, cb);
serverAssert(o != nullptr); serverAssert(o != nullptr);
dictSetVal(m_pdict, *pde, o); dictAdd(m_pdict, sdsdupshared(sdsKey), o);
}); });
*pde = dictFind(m_pdict, sdsKey);
} }
if (*pde != nullptr && dictGetVal(*pde) != nullptr) if (*pde != nullptr && dictGetVal(*pde) != nullptr)
@ -2208,15 +2209,9 @@ bool redisDbPersistentData::removeCachedValue(const char *key)
return false; // NOP return false; // NOP
} }
dictEntry *de = dictFind(m_pdict, key); // since we write ASAP the database already has a valid copy so safe to delete
serverAssert(de != nullptr); dictDelete(m_pdict, key);
if (dictGetVal(de) != nullptr) return true;
{
decrRefCount((robj*)dictGetVal(de));
dictSetVal(m_pdict, de, nullptr);
return true;
}
return false;
} }
void redisDbPersistentData::trackChanges() void redisDbPersistentData::trackChanges()

View File

@ -35,9 +35,8 @@ void RocksDBStorageProvider::retrieve(const char *key, size_t cchKey, callback f
{ {
std::string value; std::string value;
auto status = m_spdb->Get(ReadOptions(), m_spcolfamily.get(), rocksdb::Slice(key, cchKey), &value); auto status = m_spdb->Get(ReadOptions(), m_spcolfamily.get(), rocksdb::Slice(key, cchKey), &value);
if (!status.ok()) if (status.ok())
throw status.ToString(); fn(key, cchKey, value.data(), value.size());
fn(key, cchKey, value.data(), value.size());
} }
size_t RocksDBStorageProvider::clear() size_t RocksDBStorageProvider::clear()