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())
}
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 {
@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 {
@JvmStatic
fun default() = ChainConfig(6, 1)
fun default() = ChainConfig(6, 1, UpstreamsConfig.PartialOptions())
}
}
fun resolve(chain: Chain): ChainConfig {
val default = currentDefault ?: panic()
val raw = chains[chain] ?: default
val options = default.options?.merge(raw.options) ?: raw.options ?: UpstreamsConfig.PartialOptions()
return ChainConfig(
laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: 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?
) = RawChainConfig(
syncingLagSize = patch?.syncingLagSize ?: current.syncingLagSize,
laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize
laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize,
options = patch?.options ?: current.options
)
private fun merge(

View File

@@ -5,7 +5,9 @@ import org.yaml.snakeyaml.nodes.CollectionNode
import org.yaml.snakeyaml.nodes.MappingNode
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")!!
@@ -41,12 +43,20 @@ class ChainsConfigReader : YamlConfigReader<ChainsConfig>() {
}
private fun readChain(node: MappingNode): ChainsConfig.RawChainConfig? {
return getMapping(node, "lags")?.let {
return ChainsConfig.RawChainConfig(
getValueAsInt(it, "syncing"),
getValueAsInt(it, "lagging")
)
val rawConfig = ChainsConfig.RawChainConfig()
getMapping(node, "lags")?.let { lagConfig ->
getValueAsInt(lagConfig, "syncing")?.let {
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>> {

View File

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

View File

@@ -102,7 +102,9 @@ open class ConfiguredUpstreams(
log.error("Chain is unknown: ${up.chain}")
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())
.buildOptions()
val upstream = when (BlockchainType.from(chain)) {
@@ -112,7 +114,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.EthereumPosConnection::class.java),
chain,
options,
chainsConfig.resolve(chain)
chainConfig
)
}
BlockchainType.EVM_POW -> {
@@ -121,7 +123,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.EthereumConnection::class.java),
chain,
options,
chainsConfig.resolve(chain)
chainConfig
)
}
BlockchainType.BITCOIN -> {
@@ -129,7 +131,7 @@ open class ConfiguredUpstreams(
up.cast(UpstreamsConfig.BitcoinConnection::class.java),
chain,
options,
chainsConfig.resolve(chain)
chainConfig
)
}
}

View File

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

View File

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

View File

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