-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle trace and debug bounds (#570)
- Loading branch information
1 parent
f916f0a
commit f739920
Showing
11 changed files
with
166 additions
and
35 deletions.
There are no files selected for viewing
Submodule emerald-grpc
updated
from 1934aa to c11034
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
src/main/kotlin/io/emeraldpay/dshackle/upstream/error/EthereumLowerBoundErrorHandler.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package io.emeraldpay.dshackle.upstream.error | ||
|
||
import io.emeraldpay.dshackle.upstream.ChainRequest | ||
import io.emeraldpay.dshackle.upstream.Upstream | ||
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType | ||
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams | ||
import org.slf4j.LoggerFactory | ||
|
||
abstract class EthereumLowerBoundErrorHandler : ErrorHandler { | ||
protected val log = LoggerFactory.getLogger(this::class.java) | ||
|
||
override fun handle(upstream: Upstream, request: ChainRequest, errorMessage: String?) { | ||
try { | ||
if (canHandle(request, errorMessage)) { | ||
parseTagParam(request, tagIndex(request.method))?.let { | ||
upstream.updateLowerBound(it, type()) | ||
} | ||
} | ||
} catch (e: RuntimeException) { | ||
log.warn("Couldn't update the {} lower bound of {}, reason - {}", type(), upstream.getId(), e.message) | ||
} | ||
} | ||
|
||
protected abstract fun tagIndex(method: String): Int | ||
|
||
protected abstract fun type(): LowerBoundType | ||
|
||
private fun parseTagParam(request: ChainRequest, tagIndex: Int): Long? { | ||
if (tagIndex != -1 && request.params is ListParams) { | ||
val params = request.params.list | ||
if (params.size >= tagIndex) { | ||
val tag = params[tagIndex] | ||
if (tag is String && tag.startsWith("0x")) { | ||
return tag.substring(2).toLong(16) | ||
} | ||
} | ||
} | ||
return null | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
src/main/kotlin/io/emeraldpay/dshackle/upstream/error/EthereumTraceLowerBoundErrorHandler.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package io.emeraldpay.dshackle.upstream.error | ||
|
||
import io.emeraldpay.dshackle.upstream.ChainRequest | ||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumLowerBoundStateDetector.Companion.stateErrors | ||
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType | ||
|
||
object EthereumTraceLowerBoundErrorHandler : EthereumLowerBoundErrorHandler() { | ||
private val zeroTagIndexMethods = setOf( | ||
"trace_block", | ||
"arbtrace_block", | ||
"debug_traceBlockByNumber", | ||
) | ||
private val firstTagIndexMethods = setOf( | ||
"trace_callMany", | ||
"arbtrace_callMany", | ||
"debug_traceCall", | ||
) | ||
private val secondTagIndexMethods = setOf( | ||
"trace_call", | ||
"arbtrace_call", | ||
) | ||
|
||
private val applicableMethods = zeroTagIndexMethods + firstTagIndexMethods + secondTagIndexMethods | ||
|
||
private val errors = stateErrors | ||
.plus( | ||
setOf( | ||
"historical state not available", | ||
), | ||
) | ||
private val errorRegexp = Regex("block .* not found") | ||
|
||
override fun canHandle(request: ChainRequest, errorMessage: String?): Boolean { | ||
return (errors.any { errorMessage?.contains(it) ?: false } || (errorMessage?.matches(errorRegexp) ?: false)) && | ||
applicableMethods.contains(request.method) | ||
} | ||
|
||
override fun tagIndex(method: String): Int { | ||
return if (firstTagIndexMethods.contains(method)) { | ||
1 | ||
} else if (secondTagIndexMethods.contains(method)) { | ||
2 | ||
} else if (zeroTagIndexMethods.contains(method)) { | ||
0 | ||
} else { | ||
-1 | ||
} | ||
} | ||
|
||
override fun type(): LowerBoundType = LowerBoundType.TRACE | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
...t/kotlin/io/emeraldpay/dshackle/upstream/error/EthereumTraceLowerBoundErrorHandlerTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package io.emeraldpay.dshackle.upstream.error | ||
|
||
import io.emeraldpay.dshackle.upstream.ChainRequest | ||
import io.emeraldpay.dshackle.upstream.Upstream | ||
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType | ||
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams | ||
import org.junit.jupiter.api.Test | ||
import org.junit.jupiter.params.ParameterizedTest | ||
import org.junit.jupiter.params.provider.Arguments | ||
import org.junit.jupiter.params.provider.Arguments.of | ||
import org.junit.jupiter.params.provider.MethodSource | ||
import org.mockito.Mockito.mock | ||
import org.mockito.kotlin.verify | ||
|
||
class EthereumTraceLowerBoundErrorHandlerTest { | ||
|
||
@ParameterizedTest | ||
@MethodSource("requests") | ||
fun `update lower bound`(request: ChainRequest) { | ||
val upstream = mock<Upstream>() | ||
val handler = EthereumTraceLowerBoundErrorHandler | ||
|
||
handler.handle(upstream, request, "missing trie node d5648cc9aef48154159d53800f2f") | ||
|
||
verify(upstream).updateLowerBound(213229736, LowerBoundType.TRACE) | ||
} | ||
|
||
@Test | ||
fun `update lower bound base on regexp`() { | ||
val upstream = mock<Upstream>() | ||
val handler = EthereumTraceLowerBoundErrorHandler | ||
|
||
handler.handle(upstream, ChainRequest("trace_block", ListParams("0xCB5A0A8")), "block #1 not found") | ||
|
||
verify(upstream).updateLowerBound(213229736, LowerBoundType.TRACE) | ||
} | ||
|
||
companion object { | ||
@JvmStatic | ||
fun requests(): List<Arguments> = | ||
listOf( | ||
of(ChainRequest("trace_block", ListParams("0xCB5A0A8"))), | ||
of(ChainRequest("arbtrace_block", ListParams("0xCB5A0A8"))), | ||
of(ChainRequest("debug_traceBlockByNumber", ListParams("0xCB5A0A8", mapOf("tracer" to "tracer")))), | ||
of(ChainRequest("trace_callMany", ListParams(arrayOf(mapOf("val" to 1)), "0xCB5A0A8"))), | ||
of(ChainRequest("arbtrace_callMany", ListParams(arrayOf(mapOf("val" to 1)), "0xCB5A0A8"))), | ||
of(ChainRequest("debug_traceCall", ListParams(mapOf("val" to 1), "0xCB5A0A8", mapOf("val" to 1)))), | ||
of(ChainRequest("trace_call", ListParams(mapOf("val" to 1), arrayOf(mapOf("val" to 1)), "0xCB5A0A8"))), | ||
of(ChainRequest("arbtrace_call", ListParams(mapOf("val" to 1), arrayOf(mapOf("val" to 1)), "0xCB5A0A8"))), | ||
) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters