Fix lower matcher - sort by lower bound type (#490)

This commit is contained in:
KirillPamPam
2024-05-29 14:53:22 +04:00
committed by GitHub
parent 5e35a8880d
commit f3ab6b3443
11 changed files with 180 additions and 3 deletions

View File

@@ -342,6 +342,10 @@ abstract class Multistream(
return lowerBounds.values
}
override fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? {
return lowerBounds[lowerBoundType]
}
override fun getUpstreamSettingsData(): Upstream.UpstreamSettingsData? {
return Upstream.UpstreamSettingsData(
nodeId(),

View File

@@ -27,6 +27,7 @@ import io.emeraldpay.dshackle.upstream.MatchesResponse.NotMatchedResponse
import io.emeraldpay.dshackle.upstream.MatchesResponse.SameNodeResponse
import io.emeraldpay.dshackle.upstream.MatchesResponse.SlotHeightResponse
import io.emeraldpay.dshackle.upstream.MatchesResponse.Success
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import org.apache.commons.lang3.StringUtils
import java.util.Collections
@@ -72,13 +73,27 @@ class Selector {
selectors.forEach { selector ->
if (selector.hasHeightSelector() && selector.heightSelector.height == -1L) {
return Sort(compareByDescending { it.getHead().getCurrentHeight() })
} else if (selector.hasLowerHeightSelector() && selector.lowerHeightSelector.height == 0L) {
return Sort(compareBy(nullsLast()) { it.getHead().getCurrentHeight() })
} else if (selector.hasLowerHeightSelector()) {
return Sort(
compareBy(nullsLast()) {
it.getLowerBound(fromProtoType(selector.lowerHeightSelector.lowerBoundType))?.lowerBound
},
)
}
}
return Sort.default
}
private fun fromProtoType(type: BlockchainOuterClass.LowerBoundType): LowerBoundType {
return when (type) {
BlockchainOuterClass.LowerBoundType.LOWER_BOUND_SLOT -> LowerBoundType.SLOT
BlockchainOuterClass.LowerBoundType.LOWER_BOUND_UNSPECIFIED -> LowerBoundType.UNKNOWN
BlockchainOuterClass.LowerBoundType.LOWER_BOUND_STATE -> LowerBoundType.STATE
BlockchainOuterClass.LowerBoundType.LOWER_BOUND_BLOCK -> LowerBoundType.BLOCK
BlockchainOuterClass.LowerBoundType.UNRECOGNIZED -> LowerBoundType.UNKNOWN
}
}
@JvmStatic
fun convertToMatcher(req: BlockchainOuterClass.Selector?): LabelSelectorMatcher {
return when {

View File

@@ -47,6 +47,7 @@ interface Upstream : Lifecycle {
fun getCapabilities(): Set<Capability>
fun isGrpc(): Boolean
fun getLowerBounds(): Collection<LowerBoundData>
fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData?
fun getUpstreamSettingsData(): UpstreamSettingsData?
fun updateLowerBound(lowerBound: Long, type: LowerBoundType)

View File

@@ -29,6 +29,7 @@ import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.UpstreamAvailability
import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundData
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import reactor.core.Disposable
open class BitcoinRpcUpstream(
@@ -76,6 +77,10 @@ open class BitcoinRpcUpstream(
return emptyList()
}
override fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? {
return null
}
override fun getUpstreamSettingsData(): Upstream.UpstreamSettingsData? {
return null
}

View File

@@ -95,6 +95,10 @@ open class GenericUpstream(
return lowerBoundService.getLowerBounds()
}
override fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? {
return lowerBoundService.getLowerBound(lowerBoundType)
}
override fun getUpstreamSettingsData(): Upstream.UpstreamSettingsData? {
return Upstream.UpstreamSettingsData(
nodeId(),

View File

@@ -38,6 +38,7 @@ import io.emeraldpay.dshackle.upstream.bitcoin.ExtractBlock
import io.emeraldpay.dshackle.upstream.ethereum.rpc.RpcException
import io.emeraldpay.dshackle.upstream.forkchoice.MostWorkForkChoice
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundData
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcGrpcClient
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.reactivestreams.Publisher
@@ -154,6 +155,10 @@ class BitcoinGrpcUpstream(
return emptyList()
}
override fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? {
return null
}
override fun getUpstreamSettingsData(): Upstream.UpstreamSettingsData? {
return null
}

View File

@@ -36,6 +36,7 @@ import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
import io.emeraldpay.dshackle.upstream.forkchoice.NoChoiceWithPriorityForkChoice
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundData
import io.emeraldpay.dshackle.upstream.lowerbound.LowerBoundType
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcGrpcClient
import reactor.core.publisher.Flux
import reactor.core.scheduler.Scheduler
@@ -183,6 +184,10 @@ open class GenericGrpcUpstream(
return emptyList()
}
override fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? {
return null
}
override fun getUpstreamSettingsData(): Upstream.UpstreamSettingsData? {
return null
}

View File

@@ -35,5 +35,7 @@ abstract class LowerBoundService(
fun getLowerBounds(): Collection<LowerBoundData> = lowerBounds.values
fun getLowerBound(lowerBoundType: LowerBoundType): LowerBoundData? = lowerBounds[lowerBoundType]
protected abstract fun detectors(): List<LowerBoundDetector>
}