From c72ea5db3b1ef6e3825ec71b19235f39ca263c48 Mon Sep 17 00:00:00 2001 From: a10zn8 Date: Fri, 25 Nov 2022 13:35:56 +0400 Subject: [PATCH] check all actual upstreams before call --- src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt | 4 ++-- .../io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt | 5 ----- .../emeraldpay/dshackle/upstream/CurrentMultistreamHolder.kt | 4 ++-- .../kotlin/io/emeraldpay/dshackle/upstream/Multistream.kt | 4 ++++ .../io/emeraldpay/dshackle/upstream/MultistreamHolder.kt | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt b/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt index 288bfcb6..e999a150 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/rpc/NativeCall.kt @@ -166,7 +166,8 @@ open class NativeCall( } val matcher = Selector.convertToMatcher(request.selector) - if (!configuredUpstreams.hasMatchingUpstream(chain, matcher)) { + + if (!multistreamHolder.getUpstream(chain).hasMatchingUpstream(matcher)) { if (Global.metricsExtended) { Metrics.globalRegistry .counter("no_matching_upstream", "chain", chain.chainCode, "matcher", matcher.describeInternal()) @@ -176,7 +177,6 @@ open class NativeCall( } val upstream = multistreamHolder.getUpstream(chain) - ?: return Flux.error(CallFailure(0, SilentException.UnsupportedBlockchain(chain))) return prepareCall(request, upstream) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt index 1cfc3a57..97f63b74 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt @@ -117,11 +117,6 @@ open class ConfiguredUpstreams( } } - fun hasMatchingUpstream(chain: Chain, matcher: Selector.LabelSelectorMatcher): Boolean = - config.upstreams.any { up -> - (up.chain?.let { Global.chainById(it) == chain } ?: true) && matcher.matches(up.labels) - } - private fun buildDefaultOptions(config: UpstreamsConfig): HashMap { val defaultOptions = HashMap() config.defaultOptions.forEach { defaultsConfig -> diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/CurrentMultistreamHolder.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/CurrentMultistreamHolder.kt index a15ead29..165c20fe 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/CurrentMultistreamHolder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/CurrentMultistreamHolder.kt @@ -30,8 +30,8 @@ open class CurrentMultistreamHolder( private val chainMapping = multistreams.associateBy { it.chain } - override fun getUpstream(chain: Chain): Multistream? { - return chainMapping[chain] + override fun getUpstream(chain: Chain): Multistream { + return chainMapping.getValue(chain) } override fun getAvailable(): List { diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/Multistream.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/Multistream.kt index 4e239048..6d7d64df 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/Multistream.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/Multistream.kt @@ -352,6 +352,10 @@ abstract class Multistream( fun haveUpstreams(): Boolean = upstreams.isNotEmpty() + fun hasMatchingUpstream(matcher: Selector.LabelSelectorMatcher): Boolean { + return upstreams.any { matcher.matches(it) } + } + // -------------------------------------------------------------------------------------------------------- class UpstreamStatus(val upstream: Upstream, val status: UpstreamAvailability, val ts: Instant = Instant.now()) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/MultistreamHolder.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/MultistreamHolder.kt index b2c0a753..da409d1c 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/MultistreamHolder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/MultistreamHolder.kt @@ -22,7 +22,7 @@ import io.emeraldpay.dshackle.Chain * Holds Multistreams configured for a chain. */ interface MultistreamHolder { - fun getUpstream(chain: Chain): Multistream? + fun getUpstream(chain: Chain): Multistream fun getAvailable(): List fun isAvailable(chain: Chain): Boolean }