From 7f67171ad6174d8b769900bbac14d43f8af85513 Mon Sep 17 00:00:00 2001 From: Igor Artamonov Date: Thu, 21 Jul 2022 22:07:12 -0400 Subject: [PATCH] problem: doesn't request Bitcoin balancer from a remote Grpc node --- .../io/emeraldpay/dshackle/rpc/TrackBitcoinAddress.kt | 11 +++++------ .../dshackle/startup/ConfiguredUpstreams.kt | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/rpc/TrackBitcoinAddress.kt b/src/main/kotlin/io/emeraldpay/dshackle/rpc/TrackBitcoinAddress.kt index 31490ee9..1a535c45 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/rpc/TrackBitcoinAddress.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/rpc/TrackBitcoinAddress.kt @@ -57,7 +57,7 @@ class TrackBitcoinAddress( /** * Keep tracking of the current state of local upstreams. True for a chain that has an upstream with balance data. */ - private val balanceAvailable: MutableMap = ConcurrentHashMap() + private val localBalanceAvailable: MutableMap = ConcurrentHashMap() /** * Criteria for a remote grpc upstream that can provide a balance @@ -72,7 +72,7 @@ class TrackBitcoinAddress( multistreamHolder.observeChains().subscribe { chain -> multistreamHolder.getUpstream(chain)?.let { mup -> val available = mup.getAll().any { up -> - !up.isGrpc() && (up.getOptions().providesBalance ?: false) + !up.isGrpc() && up.getCapabilities().contains(Capability.BALANCE) } setBalanceAvailability(chain, available) } @@ -80,14 +80,14 @@ class TrackBitcoinAddress( } fun setBalanceAvailability(chain: Chain, enabled: Boolean) { - balanceAvailable[chain] = enabled + localBalanceAvailable[chain] = enabled } /** * @return true if the current instance has data sources to provide the balance */ fun isBalanceAvailable(chain: Chain): Boolean { - return balanceAvailable[chain] ?: false + return localBalanceAvailable[chain] ?: false } fun allAddresses(api: BitcoinMultistream, request: BlockchainOuterClass.BalanceRequest): Flux { @@ -179,8 +179,7 @@ class TrackBitcoinAddress( } .timeout(Defaults.timeoutInternal, Mono.empty()) .switchIfEmpty( - Mono.just(0) - .doOnNext { + Mono.fromCallable { log.warn("No upstream providing balance for ${api.chain}") } .then(Mono.error(SilentException.DataUnavailable("BALANCE"))) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt index 48e4f189..264294be 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/startup/ConfiguredUpstreams.kt @@ -257,7 +257,7 @@ open class ConfiguredUpstreams( log.info("Using ALL CHAINS (gRPC) upstream, at ${endpoint.host}:${endpoint.port}") ds.start() .doOnNext { - log.info("Chain ${it.chain} has ${it.type} through gRPC at ${endpoint.host}:${endpoint.port}") + log.info("Chain ${it.chain} ${it.type} through gRPC at ${endpoint.host}:${endpoint.port}. With caps: ${it.upstream.getCapabilities()}") } .subscribe(currentUpstreams::update) }