mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-02-22 22:36:34 +01:00
Make it so bitcoind backend exceptions don't get swallowed (#3697)
* Make it so bitcoind backend exceptions don't get swallowed when doing IBD against bitcoind * Move zmq polling into syncWalletWithBitcoindAndStartPolling() method
This commit is contained in:
parent
bf16bab881
commit
4e56fb7901
2 changed files with 41 additions and 17 deletions
|
@ -26,6 +26,7 @@ import org.bitcoins.feeprovider._
|
||||||
import org.bitcoins.node._
|
import org.bitcoins.node._
|
||||||
import org.bitcoins.node.config.NodeAppConfig
|
import org.bitcoins.node.config.NodeAppConfig
|
||||||
import org.bitcoins.node.models.Peer
|
import org.bitcoins.node.models.Peer
|
||||||
|
import org.bitcoins.rpc.client.common.BitcoindRpcClient
|
||||||
import org.bitcoins.rpc.config.{BitcoindRpcAppConfig, ZmqConfig}
|
import org.bitcoins.rpc.config.{BitcoindRpcAppConfig, ZmqConfig}
|
||||||
import org.bitcoins.server.routes.{BitcoinSServerRunner, CommonRoutes, Server}
|
import org.bitcoins.server.routes.{BitcoinSServerRunner, CommonRoutes, Server}
|
||||||
import org.bitcoins.server.util.BitcoinSAppScalaDaemon
|
import org.bitcoins.server.util.BitcoinSAppScalaDaemon
|
||||||
|
@ -210,23 +211,11 @@ class BitcoinSServerMain(override val serverArgParser: ServerArgParser)(implicit
|
||||||
if err.getMessage.contains("If we have spent a spendinginfodb") =>
|
if err.getMessage.contains("If we have spent a spendinginfodb") =>
|
||||||
handleMissingSpendingInfoDb(err, wallet)
|
handleMissingSpendingInfoDb(err, wallet)
|
||||||
}
|
}
|
||||||
_ = BitcoindRpcBackendUtil
|
|
||||||
.syncWalletToBitcoind(bitcoind, wallet)
|
|
||||||
.flatMap(_ => wallet.updateUtxoPendingStates())
|
|
||||||
.flatMap { _ =>
|
|
||||||
if (bitcoindRpcConf.zmqConfig == ZmqConfig.empty) {
|
|
||||||
BitcoindRpcBackendUtil.startBitcoindBlockPolling(wallet, bitcoind)
|
|
||||||
} else Future.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create callbacks for processing new blocks
|
|
||||||
_ =
|
|
||||||
if (bitcoindRpcConf.zmqConfig != ZmqConfig.empty) {
|
|
||||||
BitcoindRpcBackendUtil.startZMQWalletCallbacks(
|
|
||||||
wallet,
|
|
||||||
bitcoindRpcConf.zmqConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//intentionally doesn't map on this otherwise we
|
||||||
|
//wait until we are done syncing the entire wallet
|
||||||
|
//which could take 1 hour
|
||||||
|
_ = syncWalletWithBitcoindAndStartPolling(bitcoind, wallet)
|
||||||
dlcNode = dlcNodeConf.createDLCNode(wallet)
|
dlcNode = dlcNodeConf.createDLCNode(wallet)
|
||||||
_ <- dlcNode.start()
|
_ <- dlcNode.start()
|
||||||
|
|
||||||
|
@ -430,6 +419,40 @@ class BitcoinSServerMain(override val serverArgParser: ServerArgParser)(implicit
|
||||||
} yield clearedWallet
|
} yield clearedWallet
|
||||||
walletF.map(_ => ())
|
walletF.map(_ => ())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Syncs the bitcoin-s wallet against bitcoind and then
|
||||||
|
* starts rpc polling if zmq isn't enabled, otherwise it starts zmq polling.
|
||||||
|
*
|
||||||
|
* The key thing this helper method does is it logs errors based on the
|
||||||
|
* future returned by this method. This is needed because we don't want
|
||||||
|
* to block the rest of the application from starting if we have to
|
||||||
|
* do a ton of syncing. However, we don't want to swallow
|
||||||
|
* exceptions thrown by this method.
|
||||||
|
*/
|
||||||
|
private def syncWalletWithBitcoindAndStartPolling(
|
||||||
|
bitcoind: BitcoindRpcClient,
|
||||||
|
wallet: Wallet): Future[Unit] = {
|
||||||
|
val f = BitcoindRpcBackendUtil
|
||||||
|
.syncWalletToBitcoind(bitcoind, wallet)
|
||||||
|
.flatMap(_ => wallet.updateUtxoPendingStates())
|
||||||
|
.flatMap { _ =>
|
||||||
|
if (bitcoindRpcConf.zmqConfig == ZmqConfig.empty) {
|
||||||
|
BitcoindRpcBackendUtil
|
||||||
|
.startBitcoindBlockPolling(wallet, bitcoind)
|
||||||
|
.map(_ => ())
|
||||||
|
} else {
|
||||||
|
Future {
|
||||||
|
BitcoindRpcBackendUtil.startZMQWalletCallbacks(
|
||||||
|
wallet,
|
||||||
|
bitcoindRpcConf.zmqConfig)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.failed.foreach(err =>
|
||||||
|
logger.error(s"Error syncing bitcoin-s wallet with bitcoind", err))
|
||||||
|
f
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object BitcoinSServerMain extends BitcoinSAppScalaDaemon {
|
object BitcoinSServerMain extends BitcoinSAppScalaDaemon {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import akka.actor.{ActorSystem, Cancellable}
|
||||||
import akka.stream.scaladsl.{Keep, Sink, Source}
|
import akka.stream.scaladsl.{Keep, Sink, Source}
|
||||||
import grizzled.slf4j.Logging
|
import grizzled.slf4j.Logging
|
||||||
import org.bitcoins.core.api.node.NodeApi
|
import org.bitcoins.core.api.node.NodeApi
|
||||||
|
import org.bitcoins.core.api.wallet.WalletApi
|
||||||
import org.bitcoins.core.gcs.FilterType
|
import org.bitcoins.core.gcs.FilterType
|
||||||
import org.bitcoins.core.protocol.blockchain.Block
|
import org.bitcoins.core.protocol.blockchain.Block
|
||||||
import org.bitcoins.core.protocol.transaction.Transaction
|
import org.bitcoins.core.protocol.transaction.Transaction
|
||||||
|
@ -259,7 +260,7 @@ object BitcoindRpcBackendUtil extends Logging {
|
||||||
* as the wallet will need to process the new blocks
|
* as the wallet will need to process the new blocks
|
||||||
*/
|
*/
|
||||||
def startBitcoindBlockPolling(
|
def startBitcoindBlockPolling(
|
||||||
wallet: Wallet,
|
wallet: WalletApi,
|
||||||
bitcoind: BitcoindRpcClient,
|
bitcoind: BitcoindRpcClient,
|
||||||
interval: FiniteDuration = 10.seconds)(implicit
|
interval: FiniteDuration = 10.seconds)(implicit
|
||||||
system: ActorSystem,
|
system: ActorSystem,
|
||||||
|
|
Loading…
Add table
Reference in a new issue