Skip to content

Commit df24044

Browse files
committed
Update storage even for peers without active channel
but only persist it to DB when there is an active channel.
1 parent ca2c7f2 commit df24044

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ class Peer(val nodeParams: NodeParams,
147147
stay() using d.copy(peerStorage = d.peerStorage.copy(written = true))
148148

149149
case Event(e: ChannelReadyForPayments, d: DisconnectedData) =>
150+
if (d.peerStorage.written == false && !isTimerActive("peer-storage-write")) {
151+
startSingleTimer("peer-storage-write", WritePeerStorage, nodeParams.peerStorageConfig.writeDelay)
152+
}
150153
stay() using d.copy(activeChannels = d.activeChannels + e.channelId)
151154

152155
case Event(e: LocalChannelDown, d: DisconnectedData) =>
@@ -441,6 +444,9 @@ class Peer(val nodeParams: NodeParams,
441444
}
442445
}
443446
}
447+
if (d.peerStorage.written == false && !isTimerActive("peer-storage-write")) {
448+
startSingleTimer("peer-storage-write", WritePeerStorage, nodeParams.peerStorageConfig.writeDelay)
449+
}
444450
stay() using d.copy(activeChannels = d.activeChannels + e.channelId)
445451

446452
case Event(e: LocalChannelDown, d: ConnectedData) =>
@@ -539,17 +545,19 @@ class Peer(val nodeParams: NodeParams,
539545
stay()
540546

541547
case Event(store: PeerStorageStore, d: ConnectedData) =>
542-
if (nodeParams.features.hasFeature(Features.ProvideStorage) && d.activeChannels.nonEmpty) {
548+
if (nodeParams.features.hasFeature(Features.ProvideStorage)) {
543549
// If we don't have any pending write operations, we write the updated peer storage to disk after a delay.
544550
// This ensures that when we receive a burst of peer storage updates, we will rate-limit our IO disk operations.
545551
// If we already have a pending write operation, we must not reset the timer, otherwise we may indefinitely delay
546552
// writing to the DB and may never store our peer's backup.
547-
if (d.peerStorage.written) {
553+
if (d.activeChannels.isEmpty) {
554+
log.debug("received peer storage from peer with no active channel")
555+
} else if (!isTimerActive("peer-storage-write")) {
548556
startSingleTimer("peer-storage-write", WritePeerStorage, nodeParams.peerStorageConfig.writeDelay)
549557
}
550558
stay() using d.copy(peerStorage = PeerStorage(Some(store.blob), written = false))
551559
} else {
552-
log.debug("ignoring peer storage (feature={}, channels={})", nodeParams.features.hasFeature(Features.ProvideStorage), d.activeChannels.mkString(","))
560+
log.debug("ignoring peer storage, feature disabled")
553561
stay()
554562
}
555563

eclair-core/src/test/scala/fr/acinq/eclair/io/PeerSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ class PeerSpec extends FixtureSpec {
784784
// Our channel closes, so we stop storing backups for that peer.
785785
peer ! LocalChannelDown(ActorRef.noSender, channel.channelId, channel.shortIds, channel.remoteNodeId)
786786
peerConnection3.send(peer, PeerStorageStore(hex"2222"))
787-
peer ! WritePeerStorage
787+
assert(!peer.isTimerActive("peer-storage-write"))
788788
assert(nodeParams.db.peers.getStorage(remoteNodeId).contains(hex"1111"))
789789
}
790790

0 commit comments

Comments
 (0)