mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-25 23:49:35 -05:00
improved cache management to avoid clearing it unless strictly necessary
This commit is contained in:
parent
ccd6df5c5f
commit
39a8de9bb9
@ -1308,8 +1308,13 @@ int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaRes
|
||||
auto meta = locked_getMsgMeta(*c, 0);
|
||||
|
||||
if(meta)
|
||||
{
|
||||
metaSet.push_back(meta);
|
||||
|
||||
if(mUseCache)
|
||||
mMsgMetaDataCache[grpId].updateMeta(msgId,meta);
|
||||
}
|
||||
|
||||
delete c;
|
||||
}
|
||||
}
|
||||
@ -1438,8 +1443,13 @@ int RsDataService::retrieveGxsGrpMetaData(std::map<RsGxsGroupId,std::shared_ptr<
|
||||
auto meta = locked_getGrpMeta(*c, 0);
|
||||
|
||||
if(meta)
|
||||
{
|
||||
mit->second = meta;
|
||||
|
||||
if(mUseCache)
|
||||
mGrpMetaDataCache.updateMeta(grpId,meta);
|
||||
}
|
||||
|
||||
#ifdef RS_DATA_SERVICE_DEBUG_TIME
|
||||
++resultCount;
|
||||
#endif
|
||||
@ -1503,9 +1513,20 @@ int RsDataService::updateGroupMetaData(const GrpLocMetaData& meta)
|
||||
std::cerr << (void*)this << ": erasing old entry from cache." << std::endl;
|
||||
#endif
|
||||
|
||||
mGrpMetaDataCache.clear(meta.grpId);
|
||||
if( mDb->sqlUpdate(GRP_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "'", meta.val))
|
||||
{
|
||||
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "grpId='" + grpId.toStdString() + "'", "");
|
||||
|
||||
return mDb->sqlUpdate(GRP_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "'", meta.val) ? 1 : 0;
|
||||
c->moveToFirst();
|
||||
|
||||
auto meta = locked_getGrpMeta(*c, 0);
|
||||
|
||||
if(meta)
|
||||
mGrpMetaDataCache.updateMeta(grpId,meta);
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RsDataService::updateMessageMetaData(const MsgLocMetaData& metaData)
|
||||
@ -1518,9 +1539,24 @@ int RsDataService::updateMessageMetaData(const MsgLocMetaData& metaData)
|
||||
const RsGxsGroupId& grpId = metaData.msgId.first;
|
||||
const RsGxsMessageId& msgId = metaData.msgId.second;
|
||||
|
||||
mMsgMetaDataCache[grpId].clear(msgId);
|
||||
if(mDb->sqlUpdate(MSG_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "' AND " + KEY_MSG_ID + "='" + msgId.toStdString() + "'", metaData.val) )
|
||||
{
|
||||
// If we use the cache, update the meta data immediately.
|
||||
|
||||
return mDb->sqlUpdate(MSG_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "' AND " + KEY_MSG_ID + "='" + msgId.toStdString() + "'", metaData.val) ? 1 : 0;
|
||||
if(mUseCache)
|
||||
{
|
||||
RetroCursor* c = mDb->sqlQuery(MSG_TABLE_NAME, mMsgMetaColumns, KEY_GRP_ID+ "='" + grpId.toStdString() + "' AND " + KEY_MSG_ID + "='" + msgId.toStdString() + "'", "");
|
||||
|
||||
c->moveToFirst();
|
||||
auto meta = locked_getMsgMeta(*c, 0);
|
||||
|
||||
if(meta)
|
||||
mMsgMetaDataCache[grpId].updateMeta(msgId,meta);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RsDataService::removeMsgs(const GxsMsgReq& msgIds)
|
||||
|
@ -79,9 +79,14 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void updateMeta(const ID& id,const MetaDataClass& meta)
|
||||
{
|
||||
void updateMeta(const ID& id,const MetaDataClass& meta)
|
||||
{
|
||||
mMetas[id] = std::make_shared<MetaDataClass>(meta); // create a new shared_ptr to possibly replace the previous one
|
||||
}
|
||||
|
||||
void updateMeta(const ID& id,const std::shared_ptr<MetaDataClass>& meta)
|
||||
{
|
||||
mMetas[id] = meta; // create a new shared_ptr to possibly replace the previous one
|
||||
}
|
||||
|
||||
void clear(const ID& id)
|
||||
@ -101,8 +106,11 @@ public:
|
||||
#endif
|
||||
|
||||
mMetas.erase(it) ;
|
||||
mCache_ContainsAllMetas = false;
|
||||
}
|
||||
|
||||
// No need to modify mCache_ContainsAllMetas since, assuming that the cache always contains
|
||||
// all possible elements from the DB, clearing one from the cache means that it is also deleted from the db, so
|
||||
// the property is preserved.
|
||||
}
|
||||
}
|
||||
|
||||
void debug_computeSize(uint32_t& nb_items, uint64_t& total_size) const
|
||||
|
Loading…
Reference in New Issue
Block a user