@@ -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(
|
||||||
|
|||||||
@@ -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>> {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user