Merge pull request #43 from p2p-org/check-actual-upstreams-before-call

check all actual upstreams before call
This commit is contained in:
a10zn8
2022-11-25 13:55:25 +04:00
committed by GitHub
5 changed files with 9 additions and 10 deletions

View File

@@ -166,7 +166,8 @@ open class NativeCall(
} }
val matcher = Selector.convertToMatcher(request.selector) val matcher = Selector.convertToMatcher(request.selector)
if (!configuredUpstreams.hasMatchingUpstream(chain, matcher)) {
if (!multistreamHolder.getUpstream(chain).hasMatchingUpstream(matcher)) {
if (Global.metricsExtended) { if (Global.metricsExtended) {
Metrics.globalRegistry Metrics.globalRegistry
.counter("no_matching_upstream", "chain", chain.chainCode, "matcher", matcher.describeInternal()) .counter("no_matching_upstream", "chain", chain.chainCode, "matcher", matcher.describeInternal())
@@ -176,7 +177,6 @@ open class NativeCall(
} }
val upstream = multistreamHolder.getUpstream(chain) val upstream = multistreamHolder.getUpstream(chain)
?: return Flux.error(CallFailure(0, SilentException.UnsupportedBlockchain(chain)))
return prepareCall(request, upstream) return prepareCall(request, upstream)
} }

View File

@@ -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<Chain, UpstreamsConfig.Options> { private fun buildDefaultOptions(config: UpstreamsConfig): HashMap<Chain, UpstreamsConfig.Options> {
val defaultOptions = HashMap<Chain, UpstreamsConfig.Options>() val defaultOptions = HashMap<Chain, UpstreamsConfig.Options>()
config.defaultOptions.forEach { defaultsConfig -> config.defaultOptions.forEach { defaultsConfig ->

View File

@@ -30,8 +30,8 @@ open class CurrentMultistreamHolder(
private val chainMapping = multistreams.associateBy { it.chain } private val chainMapping = multistreams.associateBy { it.chain }
override fun getUpstream(chain: Chain): Multistream? { override fun getUpstream(chain: Chain): Multistream {
return chainMapping[chain] return chainMapping.getValue(chain)
} }
override fun getAvailable(): List<Chain> { override fun getAvailable(): List<Chain> {

View File

@@ -352,6 +352,10 @@ abstract class Multistream(
fun haveUpstreams(): Boolean = fun haveUpstreams(): Boolean =
upstreams.isNotEmpty() 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()) class UpstreamStatus(val upstream: Upstream, val status: UpstreamAvailability, val ts: Instant = Instant.now())

View File

@@ -22,7 +22,7 @@ import io.emeraldpay.dshackle.Chain
* Holds Multistreams configured for a chain. * Holds Multistreams configured for a chain.
*/ */
interface MultistreamHolder { interface MultistreamHolder {
fun getUpstream(chain: Chain): Multistream? fun getUpstream(chain: Chain): Multistream
fun getAvailable(): List<Chain> fun getAvailable(): List<Chain>
fun isAvailable(chain: Chain): Boolean fun isAvailable(chain: Chain): Boolean
} }