1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-12 19:01:39 +01:00

Allow override peer storage write delay (#3022)

We provide the remote `node_id` and `init_features` to allow feature
branches to override the default write delay used for peer storage.
This commit is contained in:
Bastien Teinturier 2025-03-04 13:45:33 +01:00 committed by GitHub
parent 21917f55dd
commit 37a3f9d56c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 10 additions and 5 deletions

View file

@ -23,7 +23,7 @@ import fr.acinq.eclair.Setup.Seeds
import fr.acinq.eclair.blockchain.fee._ import fr.acinq.eclair.blockchain.fee._
import fr.acinq.eclair.channel.fsm.Channel import fr.acinq.eclair.channel.fsm.Channel
import fr.acinq.eclair.channel.fsm.Channel.{BalanceThreshold, ChannelConf, UnhandledExceptionStrategy} import fr.acinq.eclair.channel.fsm.Channel.{BalanceThreshold, ChannelConf, UnhandledExceptionStrategy}
import fr.acinq.eclair.channel.{ChannelFlags, ChannelTypes} import fr.acinq.eclair.channel.{ChannelFlags, ChannelType, ChannelTypes}
import fr.acinq.eclair.crypto.Noise.KeyPair import fr.acinq.eclair.crypto.Noise.KeyPair
import fr.acinq.eclair.crypto.keymanager.{ChannelKeyManager, NodeKeyManager, OnChainKeyManager} import fr.acinq.eclair.crypto.keymanager.{ChannelKeyManager, NodeKeyManager, OnChainKeyManager}
import fr.acinq.eclair.db._ import fr.acinq.eclair.db._
@ -163,7 +163,12 @@ case class PaymentFinalExpiryConf(min: CltvExpiryDelta, max: CltvExpiryDelta) {
* @param removalDelay we keep our peer's data in our DB even after closing all of our channels with them, up to this duration. * @param removalDelay we keep our peer's data in our DB even after closing all of our channels with them, up to this duration.
* @param cleanUpFrequency frequency at which we go through the DB to remove unused storage. * @param cleanUpFrequency frequency at which we go through the DB to remove unused storage.
*/ */
case class PeerStorageConfig(writeDelay: FiniteDuration, removalDelay: FiniteDuration, cleanUpFrequency: FiniteDuration) case class PeerStorageConfig(writeDelay: FiniteDuration, removalDelay: FiniteDuration, cleanUpFrequency: FiniteDuration) {
// NB: we don't use the arguments here, but they can be used in feature branches to override the default value.
def getWriteDelay(nodeId: PublicKey, remoteFeatures_opt: Option[Features[InitFeature]]): FiniteDuration = {
writeDelay
}
}
object NodeParams extends Logging { object NodeParams extends Logging {

View file

@ -154,7 +154,7 @@ class Peer(val nodeParams: NodeParams,
case Event(e: ChannelReadyForPayments, d: DisconnectedData) => case Event(e: ChannelReadyForPayments, d: DisconnectedData) =>
if (!d.peerStorage.written && !isTimerActive(WritePeerStorageTimerKey)) { if (!d.peerStorage.written && !isTimerActive(WritePeerStorageTimerKey)) {
startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.writeDelay) startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.getWriteDelay(remoteNodeId, d.remoteFeatures_opt.map(_.features)))
} }
val remoteFeatures_opt = d.remoteFeatures_opt match { val remoteFeatures_opt = d.remoteFeatures_opt match {
case Some(remoteFeatures) if !remoteFeatures.written => case Some(remoteFeatures) if !remoteFeatures.written =>
@ -459,7 +459,7 @@ class Peer(val nodeParams: NodeParams,
} }
} }
if (!d.peerStorage.written && !isTimerActive(WritePeerStorageTimerKey)) { if (!d.peerStorage.written && !isTimerActive(WritePeerStorageTimerKey)) {
startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.writeDelay) startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.getWriteDelay(remoteNodeId, Some(d.remoteFeatures)))
} }
if (!d.remoteFeaturesWritten) { if (!d.remoteFeaturesWritten) {
// We have a channel, so we can write to the DB without any DoS risk. // We have a channel, so we can write to the DB without any DoS risk.
@ -580,7 +580,7 @@ class Peer(val nodeParams: NodeParams,
if (d.activeChannels.isEmpty) { if (d.activeChannels.isEmpty) {
log.debug("received peer storage from peer with no active channel") log.debug("received peer storage from peer with no active channel")
} else if (!isTimerActive(WritePeerStorageTimerKey)) { } else if (!isTimerActive(WritePeerStorageTimerKey)) {
startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.writeDelay) startSingleTimer(WritePeerStorageTimerKey, WritePeerStorage, nodeParams.peerStorageConfig.getWriteDelay(remoteNodeId, Some(d.remoteFeatures)))
} }
stay() using d.copy(peerStorage = PeerStorage(Some(store.blob), written = false)) stay() using d.copy(peerStorage = PeerStorage(Some(store.blob), written = false))
} else { } else {