Add options to chains.yaml (#185)

* Add options to chains.yaml
This commit is contained in:
KirillPamPam
2023-03-27 15:26:08 +04:00
committed by GitHub
parent 67ca1b85ea
commit eac5a4ccf8
7 changed files with 76 additions and 30 deletions

View File

@@ -8,27 +8,41 @@ data class ChainsConfig(private val chains: Map<Chain, RawChainConfig>, val curr
fun default(): ChainsConfig = ChainsConfig(emptyMap(), RawChainConfig.default()) fun default(): ChainsConfig = ChainsConfig(emptyMap(), RawChainConfig.default())
} }
data class RawChainConfig(val syncingLagSize: Int?, val laggingLagSize: Int?) { data class RawChainConfig(
var syncingLagSize: Int? = null,
var laggingLagSize: Int? = null,
var options: UpstreamsConfig.PartialOptions? = null
) {
companion object { companion object {
@JvmStatic @JvmStatic
fun default() = RawChainConfig(6, 1) fun default() = RawChainConfig(
syncingLagSize = 6,
laggingLagSize = 1
)
} }
} }
data class ChainConfig(val syncingLagSize: Int, val laggingLagSize: Int) { data class ChainConfig(
val syncingLagSize: Int,
val laggingLagSize: Int,
val options: UpstreamsConfig.PartialOptions
) {
companion object { companion object {
@JvmStatic @JvmStatic
fun default() = ChainConfig(6, 1) fun default() = ChainConfig(6, 1, UpstreamsConfig.PartialOptions())
} }
} }
fun resolve(chain: Chain): ChainConfig { fun resolve(chain: Chain): ChainConfig {
val default = currentDefault ?: panic() val default = currentDefault ?: panic()
val raw = chains[chain] ?: default val raw = chains[chain] ?: default
val options = default.options?.merge(raw.options) ?: raw.options ?: UpstreamsConfig.PartialOptions()
return ChainConfig( return ChainConfig(
laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: panic(), laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: panic(),
syncingLagSize = raw.syncingLagSize ?: default.syncingLagSize ?: panic(), syncingLagSize = raw.syncingLagSize ?: default.syncingLagSize ?: panic(),
options = options
) )
} }
@@ -42,7 +56,8 @@ data class ChainsConfig(private val chains: Map<Chain, RawChainConfig>, val curr
patch: RawChainConfig? patch: RawChainConfig?
) = RawChainConfig( ) = RawChainConfig(
syncingLagSize = patch?.syncingLagSize ?: current.syncingLagSize, syncingLagSize = patch?.syncingLagSize ?: current.syncingLagSize,
laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize,
options = patch?.options ?: current.options
) )
private fun merge( private fun merge(

View File

@@ -5,7 +5,9 @@ import org.yaml.snakeyaml.nodes.CollectionNode
import org.yaml.snakeyaml.nodes.MappingNode import org.yaml.snakeyaml.nodes.MappingNode
import java.io.InputStream import java.io.InputStream
class ChainsConfigReader : YamlConfigReader<ChainsConfig>() { class ChainsConfigReader(
private val upstreamsConfigReader: UpstreamsConfigReader
) : YamlConfigReader<ChainsConfig>() {
private val defaultConfig = this::class.java.getResourceAsStream("/chains.yaml")!! private val defaultConfig = this::class.java.getResourceAsStream("/chains.yaml")!!
@@ -41,12 +43,20 @@ class ChainsConfigReader : YamlConfigReader<ChainsConfig>() {
} }
private fun readChain(node: MappingNode): ChainsConfig.RawChainConfig? { private fun readChain(node: MappingNode): ChainsConfig.RawChainConfig? {
return getMapping(node, "lags")?.let { val rawConfig = ChainsConfig.RawChainConfig()
return ChainsConfig.RawChainConfig( getMapping(node, "lags")?.let { lagConfig ->
getValueAsInt(it, "syncing"), getValueAsInt(lagConfig, "syncing")?.let {
getValueAsInt(it, "lagging") rawConfig.syncingLagSize = it
) }
getValueAsInt(lagConfig, "lagging")?.let {
rawConfig.laggingLagSize = it
}
} }
upstreamsConfigReader.tryReadOptions(node)?.let {
rawConfig.options = it
}
return rawConfig
} }
private fun readChains(node: CollectionNode<MappingNode>): List<Pair<String, ChainsConfig.RawChainConfig>> { private fun readChains(node: CollectionNode<MappingNode>): List<Pair<String, ChainsConfig.RawChainConfig>> {

View File

@@ -32,7 +32,7 @@ class MainConfigReader(
private val healthConfigReader = HealthConfigReader() private val healthConfigReader = HealthConfigReader()
private val signatureConfigReader = SignatureConfigReader(fileResolver) private val signatureConfigReader = SignatureConfigReader(fileResolver)
private val compressionConfigReader = CompressionConfigReader() private val compressionConfigReader = CompressionConfigReader()
private val chainsConfigReader = ChainsConfigReader() private val chainsConfigReader = ChainsConfigReader(upstreamsConfigReader)
override fun read(input: MappingNode?): MainConfig { override fun read(input: MappingNode?): MainConfig {
val config = MainConfig() val config = MainConfig()

View File

@@ -102,7 +102,9 @@ open class ConfiguredUpstreams(
log.error("Chain is unknown: ${up.chain}") log.error("Chain is unknown: ${up.chain}")
return@forEach return@forEach
} }
val options = (defaultOptions[chain] ?: UpstreamsConfig.PartialOptions.getDefaults()) val chainConfig = chainsConfig.resolve(chain)
val options = chainConfig.options
.merge(defaultOptions[chain] ?: UpstreamsConfig.PartialOptions.getDefaults())
.merge(up.options ?: UpstreamsConfig.PartialOptions()) .merge(up.options ?: UpstreamsConfig.PartialOptions())
.buildOptions() .buildOptions()
val upstream = when (BlockchainType.from(chain)) { val upstream = when (BlockchainType.from(chain)) {
@@ -112,7 +114,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.EthereumPosConnection::class.java), up.cast(UpstreamsConfig.EthereumPosConnection::class.java),
chain, chain,
options, options,
chainsConfig.resolve(chain) chainConfig
) )
} }
BlockchainType.EVM_POW -> { BlockchainType.EVM_POW -> {
@@ -121,7 +123,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.EthereumConnection::class.java), up.cast(UpstreamsConfig.EthereumConnection::class.java),
chain, chain,
options, options,
chainsConfig.resolve(chain) chainConfig
) )
} }
BlockchainType.BITCOIN -> { BlockchainType.BITCOIN -> {
@@ -129,7 +131,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.BitcoinConnection::class.java), up.cast(UpstreamsConfig.BitcoinConnection::class.java),
chain, chain,
options, options,
chainsConfig.resolve(chain) chainConfig
) )
} }
} }

View File

@@ -15,18 +15,26 @@ chain-settings:
syncing: 20 syncing: 20
lagging: 10 lagging: 10
- id: arbitrum - id: arbitrum
options:
validate-peers: false
lags: lags:
syncing: 20 syncing: 20
lagging: 10 lagging: 10
- id: arbitrum-testnet - id: arbitrum-testnet
options:
validate-peers: false
lags: lags:
syncing: 20 syncing: 20
lagging: 10 lagging: 10
- id: optimism - id: optimism
options:
validate-peers: false
lags: lags:
syncing: 20 syncing: 20
lagging: 10 lagging: 10
- id: optimism-testnet - id: optimism-testnet
options:
validate-peers: false
lags: lags:
syncing: 20 syncing: 20
lagging: 10 lagging: 10

View File

@@ -17,11 +17,14 @@
package io.emeraldpay.dshackle.config package io.emeraldpay.dshackle.config
import io.emeraldpay.dshackle.Chain import io.emeraldpay.dshackle.Chain
import io.emeraldpay.dshackle.FileResolver
import spock.lang.Specification import spock.lang.Specification
class ChainsConfigReaderSpec extends Specification { class ChainsConfigReaderSpec extends Specification {
ChainsConfigReader reader = new ChainsConfigReader() ChainsConfigReader reader = new ChainsConfigReader(
new UpstreamsConfigReader(Stub(FileResolver))
)
def "Parse standard config"() { def "Parse standard config"() {
setup: setup:
@@ -41,6 +44,7 @@ class ChainsConfigReaderSpec extends Specification {
opt.laggingLagSize == 3 opt.laggingLagSize == 3
opt.syncingLagSize == 20 opt.syncingLagSize == 20
opt.options.validatePeers == false
sep.laggingLagSize == 1 sep.laggingLagSize == 1
sep.syncingLagSize == 10 sep.syncingLagSize == 10

View File

@@ -10,20 +10,20 @@ internal class ChainsConfigTest {
fun patch() { fun patch() {
val orig = ChainsConfig( val orig = ChainsConfig(
mapOf( mapOf(
Chain.BITCOIN to ChainsConfig.RawChainConfig(0, 0), Chain.BITCOIN to createRawChainConfig(0, 0),
Chain.ETHEREUM to ChainsConfig.RawChainConfig(1, 2), Chain.ETHEREUM to createRawChainConfig(1, 2),
Chain.POLYGON to ChainsConfig.RawChainConfig(3, 4) Chain.POLYGON to createRawChainConfig(3, 4)
), ),
ChainsConfig.RawChainConfig(1, 2) createRawChainConfig(1, 2)
) )
val patch = ChainsConfig( val patch = ChainsConfig(
mapOf( mapOf(
Chain.BITCOIN to ChainsConfig.RawChainConfig(null, 10000), Chain.BITCOIN to createRawChainConfig(null, 10000),
Chain.POLYGON to ChainsConfig.RawChainConfig(10, 11), Chain.POLYGON to createRawChainConfig(10, 11),
Chain.ARBITRUM to ChainsConfig.RawChainConfig(999, 999) Chain.ARBITRUM to createRawChainConfig(999, 999)
), ),
ChainsConfig.RawChainConfig(100, null) createRawChainConfig(100, null)
) )
val res = orig.patch(patch) val res = orig.patch(patch)
@@ -31,14 +31,21 @@ internal class ChainsConfigTest {
assertEquals( assertEquals(
ChainsConfig( ChainsConfig(
mapOf( mapOf(
Chain.BITCOIN to ChainsConfig.RawChainConfig(0, 10000), Chain.BITCOIN to createRawChainConfig(0, 10000),
Chain.ETHEREUM to ChainsConfig.RawChainConfig(1, 2), Chain.ETHEREUM to createRawChainConfig(1, 2),
Chain.POLYGON to ChainsConfig.RawChainConfig(10, 11), Chain.POLYGON to createRawChainConfig(10, 11),
Chain.ARBITRUM to ChainsConfig.RawChainConfig(999, 999) Chain.ARBITRUM to createRawChainConfig(999, 999)
), ),
ChainsConfig.RawChainConfig(100, 2) createRawChainConfig(100, 2)
), ),
res res
) )
} }
private fun createRawChainConfig(syncingLagSize: Int?, laggingLagSize: Int?) =
ChainsConfig.RawChainConfig()
.apply {
this.syncingLagSize = syncingLagSize
this.laggingLagSize = laggingLagSize
}
} }