check all actual upstreams before call

This commit is contained in:
a10zn8
2022-11-25 13:35:56 +04:00
parent eae628afb4
commit c72ea5db3b
5 changed files with 9 additions and 10 deletions

View File

@@ -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)
}

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

View File

@@ -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<Chain> {

View File

@@ -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())

View File

@@ -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<Chain>
fun isAvailable(chain: Chain): Boolean
}