problem: doesn't cache block by height for old blocks

This commit is contained in:
Igor Artamonov
2020-07-20 20:55:27 -04:00
parent 3dd105eb1c
commit ce010e50ce

View File

@@ -106,22 +106,8 @@ open class Caches(
fun cache(tag: Tag, block: BlockContainer) { fun cache(tag: Tag, block: BlockContainer) {
val job = ArrayList<Mono<Void>>() val job = ArrayList<Mono<Void>>()
if (tag == Tag.LATEST) { if (tag == Tag.LATEST) {
//for LATEST data cache in memory, it will be short living so better to avoid Redis //for LATEST data cache it in memory, it may be short living so better to avoid Redis
memBlocksByHash.add(block) memoizeBlock(block)
val replaced = blocksByHeight.add(block)
//evict cached transactions if an existing block was updated
replaced?.let { replacedBlockHash ->
var evicted = false
redisBlocksByHash?.evict(replacedBlockHash)
memBlocksByHash.get(replacedBlockHash)?.let { block ->
memTxsByHash.evict(block)
redisTxsByHash?.evict(block)
evicted = true
}
if (!evicted) {
memTxsByHash.evict(replacedBlockHash)
}
}
} else if (tag == Tag.REQUESTED) { } else if (tag == Tag.REQUESTED) {
var blockOnlyContainer: BlockContainer? = null var blockOnlyContainer: BlockContainer? = null
var jsonValue: BlockJson<*>? = null var jsonValue: BlockJson<*>? = null
@@ -133,6 +119,7 @@ open class Caches(
} else { } else {
blockOnlyContainer = block blockOnlyContainer = block
} }
memoizeBlock(blockOnlyContainer)
memBlocksByHash.add(blockOnlyContainer) memBlocksByHash.add(blockOnlyContainer)
redisBlocksByHash?.add(blockOnlyContainer)?.let(job::add) redisBlocksByHash?.add(blockOnlyContainer)?.let(job::add)
@@ -155,6 +142,29 @@ open class Caches(
Flux.fromIterable(job).flatMap { it }.subscribe() //TODO move out to a caller Flux.fromIterable(job).flatMap { it }.subscribe() //TODO move out to a caller
} }
/**
* Cache the block only in memory
*/
fun memoizeBlock(block: BlockContainer) {
memBlocksByHash.add(block)
val replaced = blocksByHeight.add(block)
//evict cached transactions if an existing block was updated
replaced?.let { evict(it) }
}
fun evict(blockId: BlockId) {
var evicted = false
redisBlocksByHash?.evict(blockId)
memBlocksByHash.get(blockId)?.let { block ->
memTxsByHash.evict(block)
redisTxsByHash?.evict(block)
evicted = true
}
if (!evicted) {
memTxsByHash.evict(blockId)
}
}
fun getBlocksByHash(): Reader<BlockId, BlockContainer> { fun getBlocksByHash(): Reader<BlockId, BlockContainer> {
return blocksByHash return blocksByHash
} }