Skip to content

Commit 8e0b34f

Browse files
committed
Make frequency of storage DB clean-up configurable
Added to the peer storage configuration section of `eclair.conf`.
1 parent 1884408 commit 8e0b34f

File tree

5 files changed

+25
-17
lines changed

5 files changed

+25
-17
lines changed

eclair-core/src/main/resources/reference.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,8 @@ eclair {
609609
// A long delay here guarantees that peers who are offline while their channels are closed will be able to get their funds
610610
// back if they restore from seed on a different device after the channels have been closed.
611611
removal-delay = 30 days
612+
// Frequency at which we clean our DB to remove peer storage from nodes with whom we don't have channels anymore.
613+
cleanup-frequency = 1 day
612614
}
613615
}
614616

eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,11 @@ case class PaymentFinalExpiryConf(min: CltvExpiryDelta, max: CltvExpiryDelta) {
158158
}
159159

160160
/**
161-
* @param writeDelay delay before writing the peer's data to disk, which avoids doing multiple writes during bursts of storage updates.
162-
* @param removalDelay we keep our peer's data in our DB even after closing all of our channels with them, up to this duration.
161+
* @param writeDelay delay before writing the peer's data to disk, which avoids doing multiple writes during bursts of storage updates.
162+
* @param removalDelay we keep our peer's data in our DB even after closing all of our channels with them, up to this duration.
163+
* @param cleanUpFrequency frequency at which we go through the DB to remove unused storage.
163164
*/
164-
case class PeerStorageConfig(writeDelay: FiniteDuration, removalDelay: FiniteDuration)
165+
case class PeerStorageConfig(writeDelay: FiniteDuration, removalDelay: FiniteDuration, cleanUpFrequency: FiniteDuration)
165166

166167
object NodeParams extends Logging {
167168

@@ -690,6 +691,7 @@ object NodeParams extends Logging {
690691
peerStorageConfig = PeerStorageConfig(
691692
writeDelay = FiniteDuration(config.getDuration("peer-storage.write-delay").getSeconds, TimeUnit.SECONDS),
692693
removalDelay = FiniteDuration(config.getDuration("peer-storage.removal-delay").getSeconds, TimeUnit.SECONDS),
694+
cleanUpFrequency = FiniteDuration(config.getDuration("peer-storage.cleanup-frequency").getSeconds, TimeUnit.SECONDS),
693695
)
694696
)
695697
}

eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ class Setup(val datadir: File,
357357
system.deadLetters
358358
}
359359
_ = if (nodeParams.features.hasFeature(Features.ProvideStorage)) {
360-
system.spawn(Behaviors.supervise(PeerStorageCleaner(nodeParams.db.peers, nodeParams.peerStorageConfig.removalDelay)).onFailure(typed.SupervisorStrategy.restart), name = "peer-storage-cleaner")
360+
system.spawn(Behaviors.supervise(PeerStorageCleaner(nodeParams.db.peers, nodeParams.peerStorageConfig)).onFailure(typed.SupervisorStrategy.restart), name = "peer-storage-cleaner")
361361
}
362362
dbEventHandler = system.actorOf(SimpleSupervisor.props(DbEventHandler.props(nodeParams), "db-event-handler", SupervisorStrategy.Resume))
363363
register = system.actorOf(SimpleSupervisor.props(Register.props(), "register", SupervisorStrategy.Resume))

eclair-core/src/main/scala/fr/acinq/eclair/db/PeerStorageCleaner.scala

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,27 @@ package fr.acinq.eclair.db
1818

1919
import akka.actor.typed.Behavior
2020
import akka.actor.typed.scaladsl.Behaviors
21-
import fr.acinq.eclair.TimestampSecond
22-
23-
import scala.concurrent.duration.{DurationInt, FiniteDuration}
21+
import fr.acinq.eclair.{PeerStorageConfig, TimestampSecond}
2422

23+
/**
24+
* This actor frequently deletes from our DB peer storage from nodes with whom we don't have channels anymore, after a
25+
* grace period.
26+
*/
2527
object PeerStorageCleaner {
28+
// @formatter:off
2629
sealed trait Command
2730
private case object CleanPeerStorage extends Command
31+
// @formatter:on
2832

29-
def apply(db: PeersDb, removalDelay: FiniteDuration): Behavior[Command] = {
30-
Behaviors.withTimers { timers =>
31-
timers.startTimerWithFixedDelay(CleanPeerStorage, 1 day)
32-
Behaviors.receiveMessage {
33-
case CleanPeerStorage =>
34-
db.removePeerStorage(TimestampSecond.now() - removalDelay)
35-
Behaviors.same
36-
}
33+
def apply(db: PeersDb, config: PeerStorageConfig): Behavior[Command] = {
34+
Behaviors.withTimers { timers =>
35+
timers.startTimerWithFixedDelay(CleanPeerStorage, config.cleanUpFrequency)
36+
Behaviors.receiveMessage {
37+
case CleanPeerStorage =>
38+
db.removePeerStorage(TimestampSecond.now() - config.removalDelay)
39+
Behaviors.same
3740
}
3841
}
42+
}
3943

4044
}

eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ object TestConstants {
241241
willFundRates_opt = Some(defaultLiquidityRates),
242242
peerWakeUpConfig = PeerReadyNotifier.WakeUpConfig(enabled = false, timeout = 30 seconds),
243243
onTheFlyFundingConfig = OnTheFlyFunding.Config(proposalTimeout = 90 seconds),
244-
peerStorageConfig = PeerStorageConfig(writeDelay = 5 seconds, removalDelay = 10 seconds)
244+
peerStorageConfig = PeerStorageConfig(writeDelay = 5 seconds, removalDelay = 10 seconds, cleanUpFrequency = 1 hour)
245245
)
246246

247247
def channelParams: LocalParams = OpenChannelInterceptor.makeChannelParams(
@@ -418,7 +418,7 @@ object TestConstants {
418418
willFundRates_opt = Some(defaultLiquidityRates),
419419
peerWakeUpConfig = PeerReadyNotifier.WakeUpConfig(enabled = false, timeout = 30 seconds),
420420
onTheFlyFundingConfig = OnTheFlyFunding.Config(proposalTimeout = 90 seconds),
421-
peerStorageConfig = PeerStorageConfig(writeDelay = 5 seconds, removalDelay = 10 seconds)
421+
peerStorageConfig = PeerStorageConfig(writeDelay = 5 seconds, removalDelay = 10 seconds, cleanUpFrequency = 1 hour)
422422
)
423423

424424
def channelParams: LocalParams = OpenChannelInterceptor.makeChannelParams(

0 commit comments

Comments
 (0)