1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-13 11:35:47 +01:00

use db fee provider for faster startup

Instead of waiting for latest feerates from the fee provider at startup,
we use the previously stored feerates in the meantime, and proceed with
the initialization.

It makes sense because fees are asynchronous so we are "always late"
anyway.
This commit is contained in:
pm47 2020-07-23 18:12:25 +02:00
parent e0f99f9714
commit 7489251ffd
No known key found for this signature in database
GPG key ID: E434ED292E85643A
2 changed files with 32 additions and 20 deletions

View file

@ -26,8 +26,7 @@ import akka.Done
import akka.actor.{ActorRef, ActorSystem, Props, SupervisorStrategy}
import akka.util.Timeout
import com.softwaremill.sttp.okhttp.OkHttpFutureBackend
import com.typesafe.config.{Config, ConfigFactory}
import fr.acinq.bitcoin.{Block, ByteVector32}
import fr.acinq.bitcoin.Block
import fr.acinq.eclair.NodeParams.ELECTRUM
import fr.acinq.eclair.blockchain.electrum.ElectrumClient.SSL
import fr.acinq.eclair.blockchain.electrum.ElectrumClientPool.ElectrumServerAddress
@ -37,28 +36,28 @@ import fr.acinq.eclair.blockchain.fee.{ConstantFeeProvider, _}
import fr.acinq.eclair.blockchain.{EclairWallet, _}
import fr.acinq.eclair.channel.Register
import fr.acinq.eclair.crypto.LocalKeyManager
import fr.acinq.eclair.db.sqlite.SqliteFeeratesDb
import fr.acinq.eclair.db.{BackupHandler, Databases}
import fr.acinq.eclair.io.{ClientSpawner, Server, Switchboard}
import fr.acinq.eclair.io.{ClientSpawner, Switchboard}
import fr.acinq.eclair.payment.Auditor
import fr.acinq.eclair.payment.receive.PaymentHandler
import fr.acinq.eclair.payment.relay.{CommandBuffer, Relayer}
import fr.acinq.eclair.payment.send.{Autoprobe, PaymentInitiator}
import fr.acinq.eclair.payment.send.PaymentInitiator
import fr.acinq.eclair.router._
import grizzled.slf4j.Logging
import scodec.bits.ByteVector
import scala.concurrent._
import scala.concurrent.duration._
import scala.util.{Failure, Success}
/**
* Setup eclair from a data directory.
*
* Created by PM on 25/01/2016.
*
* @param datadir directory where eclair-core will write/read its data.
* @param seed_opt optional seed, if set eclair will use it instead of generating one and won't create a seed.dat file.
* @param db optional databases to use, if not set eclair will create the necessary databases
* @param datadir directory where eclair-core will write/read its data.
* @param seed_opt optional seed, if set eclair will use it instead of generating one and won't create a seed.dat file.
* @param db optional databases to use, if not set eclair will create the necessary databases
*/
class Setup(datadir: File,
seed_opt: Option[ByteVector] = None,
@ -126,6 +125,15 @@ class Setup(datadir: File,
logger.info(s"nodeid=${nodeParams.nodeId} alias=${nodeParams.alias}")
logger.info(s"using chain=$chain chainHash=${nodeParams.chainHash}")
def setFeerates(feerates: FeeratesPerKB, feeratesRetrieved: Promise[Done]): Unit = {
feeratesPerKB.set(feerates)
feeratesPerKw.set(FeeratesPerKw(feerates))
channel.Monitoring.Metrics.LocalFeeratePerKw.withoutTags().update(feeratesPerKw.get.feePerBlock(nodeParams.onChainFeeConf.feeTargets.commitmentBlockTarget))
system.eventStream.publish(CurrentFeerates(feeratesPerKw.get))
logger.info(s"current feeratesPerKB=${feeratesPerKB.get} feeratesPerKw=${feeratesPerKw.get}")
feeratesRetrieved.trySuccess(Done)
}
def bootstrap: Future[Kit] =
for {
_ <- Future.successful(true)
@ -182,18 +190,22 @@ class Setup(datadir: File,
feeProvider = (nodeParams.chainHash, bitcoin) match {
case (Block.RegtestGenesisBlock.hash, _) => new FallbackFeeProvider(new ConstantFeeProvider(defaultFeerates) :: Nil, minFeeratePerByte)
case _ =>
new FallbackFeeProvider(new SmoothFeeProvider(new BitgoFeeProvider(nodeParams.chainHash, readTimeout), smoothFeerateWindow) :: new SmoothFeeProvider(new EarnDotComFeeProvider(readTimeout), smoothFeerateWindow) :: new ConstantFeeProvider(defaultFeerates) :: Nil, minFeeratePerByte) // order matters!
val sqlite = DriverManager.getConnection(s"jdbc:sqlite:${new File(chaindir, "feerates.sqlite")}")
val db = new SqliteFeeratesDb(sqlite)
db.getFeerates().foreach { feerates =>
logger.info(s"starting with feerates previously stored in db: feeratesPerKB=$feeratesPerKB")
setFeerates(feerates, feeratesRetrieved)
}
new DbFeeProvider(
db,
new FallbackFeeProvider(
new SmoothFeeProvider(new BitgoFeeProvider(nodeParams.chainHash, readTimeout), smoothFeerateWindow) ::
new SmoothFeeProvider(new EarnDotComFeeProvider(readTimeout), smoothFeerateWindow) :: Nil, // order matters!
minFeeratePerByte)
)
}
_ = system.scheduler.schedule(0 seconds, 10 minutes)(feeProvider.getFeerates.map {
case feerates: FeeratesPerKB =>
feeratesPerKB.set(feerates)
feeratesPerKw.set(FeeratesPerKw(feerates))
channel.Monitoring.Metrics.LocalFeeratePerKw.withoutTags().update(feeratesPerKw.get.feePerBlock(nodeParams.onChainFeeConf.feeTargets.commitmentBlockTarget))
system.eventStream.publish(CurrentFeerates(feeratesPerKw.get))
logger.info(s"current feeratesPerKB=${feeratesPerKB.get} feeratesPerKw=${feeratesPerKw.get}")
feeratesRetrieved.trySuccess(Done)
})
_ <- feeratesRetrieved.future
_ = system.scheduler.schedule(0 seconds, 10 minutes)(feeProvider.getFeerates.map(feerates => setFeerates(feerates, feeratesRetrieved)))
_ <- feeratesRetrieved.future // if we're using a db fee provider and we already had stored a feerate, then the promise will already be completed
watcher = bitcoin match {
case Electrum(electrumClient) =>

View file

@ -21,7 +21,7 @@ import fr.acinq.eclair.db.FeeratesDb
import scala.concurrent.{ExecutionContext, Future}
class DbFeeProvider(db: FeeratesDb, provider: FeeProvider)(implicit ec: ExecutionContext) extends FeeProvider {
class DbFeeProvider(val db: FeeratesDb, provider: FeeProvider)(implicit ec: ExecutionContext) extends FeeProvider {
/** This method retrieves feerates from the provider, and store results in the database */
override def getFeerates: Future[FeeratesPerKB] =