Fix lower matcher - sort by lower bound type (#490)
This commit is contained in:
@@ -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(),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user