cache on depth
This commit is contained in:
parent
fbf7de9fb2
commit
c309f811c1
3 changed files with 21 additions and 16 deletions
|
@ -547,26 +547,34 @@ std::vector<std::string> extractChildren(CClaimPrefixTrie::const_iterator it)
|
|||
return children;
|
||||
}
|
||||
|
||||
static std::size_t cacheHits = 0;
|
||||
static std::size_t cacheMisses = 0;
|
||||
bool CClaimTrie::find(const std::string& key, CClaimTrieDataNode& node) const
|
||||
{
|
||||
if (auto it = cacheNodes.find(key)) {
|
||||
if (it.hasChildren()) {
|
||||
cacheHits++;
|
||||
node.hash = it->hash;
|
||||
node.children = extractChildren(it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return db->Read(std::make_pair(TRIE_NODE_CHILDREN, key), node);
|
||||
auto ret = db->Read(std::make_pair(TRIE_NODE_CHILDREN, key), node);
|
||||
if (ret) ++cacheMisses;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CClaimTrie::find(const std::string& key, CClaimTrieData& data) const
|
||||
{
|
||||
if (auto it = cacheNodes.find(key)) {
|
||||
cacheHits++;
|
||||
data = it.data();
|
||||
data.flags |= CAME_FROM_NODE_CACHE;
|
||||
return true;
|
||||
}
|
||||
return db->Read(std::make_pair(TRIE_NODE_CLAIMS, key), data);
|
||||
auto ret = db->Read(std::make_pair(TRIE_NODE_CLAIMS, key), data);
|
||||
if (ret) ++cacheMisses;
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <typename K, typename T>
|
||||
|
@ -604,18 +612,10 @@ bool CClaimTrieCacheBase::flush()
|
|||
|
||||
getMerkleHash();
|
||||
|
||||
if (!nodesToDelete.empty() || !nodesToAddOrUpdate.empty()) {
|
||||
base->cacheNodes.clear();
|
||||
if (auto it = nodesToAddOrUpdate.begin()) {
|
||||
if (it->flags & HASH_DIRTY) {
|
||||
for (auto& child : it.children())
|
||||
base->cacheNodes.copy(child);
|
||||
base->cacheNodes.copy(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto it = nodesToAddOrUpdate.begin(); it != nodesToAddOrUpdate.end(); ++it) {
|
||||
if (it.depth() < 4) {
|
||||
base->cacheNodes.copy(it, it.depth() == 3 || (it->flags & HASH_DIRTY && !it.hasChildren()));
|
||||
}
|
||||
bool removed = forDeleteFromBase.erase(it.key());
|
||||
if (it->flags & HASH_DIRTY) {
|
||||
CClaimTrieDataNode node;
|
||||
|
@ -636,6 +636,9 @@ bool CClaimTrieCacheBase::flush()
|
|||
batch.Erase(std::make_pair(TRIE_NODE_CLAIMS, name));
|
||||
}
|
||||
|
||||
fprintf(stderr, "Height: %d, Hits: %zu, Misses: %zu, Cache Size: %zu\n", nNextHeight, cacheHits, cacheMisses, base->cacheNodes.height());
|
||||
cacheHits = cacheMisses = 0;
|
||||
|
||||
BatchWriteQueue(batch, SUPPORT, supportCache);
|
||||
|
||||
BatchWriteQueue(batch, CLAIM_QUEUE_ROW, claimQueueCache);
|
||||
|
|
|
@ -320,12 +320,14 @@ typename CPrefixTrie<TKey, TData>::iterator CPrefixTrie<TKey, TData>::insert(con
|
|||
}
|
||||
|
||||
template <typename TKey, typename TData>
|
||||
typename CPrefixTrie<TKey, TData>::iterator CPrefixTrie<TKey, TData>::copy(CPrefixTrie<TKey, TData>::const_iterator it)
|
||||
typename CPrefixTrie<TKey, TData>::iterator CPrefixTrie<TKey, TData>::copy(CPrefixTrie<TKey, TData>::const_iterator it, bool wipeChildren)
|
||||
{
|
||||
auto& key = it.key();
|
||||
auto& node = key.empty() ? root : insert(key, root);
|
||||
node->data = it.node.lock()->data;
|
||||
return key.empty() ? begin() : iterator{key, node};
|
||||
if (wipeChildren)
|
||||
node->children.clear();
|
||||
return iterator{key, node};
|
||||
}
|
||||
|
||||
template <typename TKey, typename TData>
|
||||
|
|
|
@ -133,7 +133,7 @@ public:
|
|||
template <typename TDataUni>
|
||||
iterator insert(iterator& it, const TKey& key, TDataUni&& data);
|
||||
|
||||
iterator copy(const_iterator it);
|
||||
iterator copy(const_iterator it, bool wipeChildren);
|
||||
|
||||
iterator find(const TKey& key);
|
||||
const_iterator find(const TKey& key) const;
|
||||
|
|
Loading…
Reference in a new issue