Skip to content

Commit aacfecc

Browse files
committed
Address @thomash-acinq comments
- Use separate function when updating features only - Remove DB write before channel ready for incoming connection
1 parent 5df3734 commit aacfecc

File tree

8 files changed

+95
-86
lines changed

8 files changed

+95
-86
lines changed

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import fr.acinq.eclair.payment._
1212
import fr.acinq.eclair.payment.relay.OnTheFlyFunding
1313
import fr.acinq.eclair.payment.relay.Relayer.RelayFees
1414
import fr.acinq.eclair.router.Router
15-
import fr.acinq.eclair.wire.protocol.{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, NodeInfo}
16-
import fr.acinq.eclair.{CltvExpiry, MilliSatoshi, Paginated, RealShortChannelId, ShortChannelId, TimestampMilli, TimestampSecond}
15+
import fr.acinq.eclair.wire.protocol._
16+
import fr.acinq.eclair.{CltvExpiry, Features, InitFeature, MilliSatoshi, Paginated, RealShortChannelId, ShortChannelId, TimestampMilli, TimestampSecond}
1717
import grizzled.slf4j.Logging
1818
import scodec.bits.ByteVector
1919

@@ -264,9 +264,14 @@ case class DualPeersDb(primary: PeersDb, secondary: PeersDb) extends PeersDb {
264264

265265
private implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("db-peers").build()))
266266

267-
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, nodeInfo: NodeInfo): Unit = {
268-
runAsync(secondary.addOrUpdatePeer(nodeId, nodeInfo))
269-
primary.addOrUpdatePeer(nodeId, nodeInfo)
267+
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, address: NodeAddress, features: Features[InitFeature]): Unit = {
268+
runAsync(secondary.addOrUpdatePeer(nodeId, address, features))
269+
primary.addOrUpdatePeer(nodeId, address, features)
270+
}
271+
272+
override def addOrUpdatePeerFeatures(nodeId: Crypto.PublicKey, features: Features[InitFeature]): Unit = {
273+
runAsync(secondary.addOrUpdatePeerFeatures(nodeId, features))
274+
primary.addOrUpdatePeerFeatures(nodeId, features)
270275
}
271276

272277
override def removePeer(nodeId: Crypto.PublicKey): Unit = {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,19 @@
1717
package fr.acinq.eclair.db
1818

1919
import fr.acinq.bitcoin.scalacompat.Crypto.PublicKey
20-
import fr.acinq.eclair.{Features, InitFeature, TimestampSecond}
2120
import fr.acinq.eclair.payment.relay.Relayer.RelayFees
2221
import fr.acinq.eclair.wire.protocol.{NodeAddress, NodeInfo}
22+
import fr.acinq.eclair.{Features, InitFeature, TimestampSecond}
2323
import scodec.bits.ByteVector
2424

2525
/** The PeersDb contains information about our direct peers, with whom we have or had channels. */
2626
trait PeersDb {
2727

28-
def addOrUpdatePeer(nodeId: PublicKey, nodeInfo: NodeInfo): Unit
28+
/** Update our DB with a verified address and features for the given peer. */
29+
def addOrUpdatePeer(nodeId: PublicKey, address: NodeAddress, features: Features[InitFeature]): Unit
30+
31+
/** Update our DB with the features for the given peer, without updating its address. */
32+
def addOrUpdatePeerFeatures(nodeId: PublicKey, features: Features[InitFeature]): Unit
2933

3034
def removePeer(nodeId: PublicKey): Unit
3135

eclair-core/src/main/scala/fr/acinq/eclair/db/pg/PgPeersDb.scala

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import fr.acinq.eclair.db.PeersDb
2424
import fr.acinq.eclair.db.pg.PgUtils.PgLock
2525
import fr.acinq.eclair.payment.relay.Relayer.RelayFees
2626
import fr.acinq.eclair.wire.protocol._
27-
import fr.acinq.eclair.{Features, MilliSatoshi, TimestampSecond}
27+
import fr.acinq.eclair.{Features, InitFeature, MilliSatoshi, TimestampSecond}
2828
import grizzled.slf4j.Logging
2929
import scodec.bits.ByteVector
3030

@@ -95,37 +95,38 @@ class PgPeersDb(implicit ds: DataSource, lock: PgLock) extends PeersDb with Logg
9595
}
9696
}
9797

98-
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, nodeInfo: NodeInfo): Unit = withMetrics("peers/add-or-update", DbBackends.Postgres) {
98+
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, address: NodeAddress, features: Features[InitFeature]): Unit = withMetrics("peers/add-or-update", DbBackends.Postgres) {
9999
withLock { pg =>
100-
nodeInfo.address_opt match {
101-
case Some(address) =>
102-
val encodedAddress = CommonCodecs.nodeaddress.encode(address).require.toByteArray
103-
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(nodeInfo.features).require.toByteArray
104-
using(pg.prepareStatement(
105-
"""
106-
| INSERT INTO local.peers (node_id, node_address, node_features)
107-
| VALUES (?, ?, ?)
108-
| ON CONFLICT (node_id)
109-
| DO UPDATE SET node_address = EXCLUDED.node_address, node_features = EXCLUDED.node_features
110-
|""".stripMargin)) { statement =>
111-
statement.setString(1, nodeId.value.toHex)
112-
statement.setBytes(2, encodedAddress)
113-
statement.setBytes(3, encodedFeatures)
114-
statement.executeUpdate()
115-
}
116-
case None =>
117-
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(nodeInfo.features).require.toByteArray
118-
using(pg.prepareStatement(
119-
"""
120-
| INSERT INTO local.peers (node_id, node_address, node_features)
121-
| VALUES (?, NULL, ?)
122-
| ON CONFLICT (node_id)
123-
| DO UPDATE SET node_features = EXCLUDED.node_features
124-
|""".stripMargin)) { statement =>
125-
statement.setString(1, nodeId.value.toHex)
126-
statement.setBytes(2, encodedFeatures)
127-
statement.executeUpdate()
128-
}
100+
val encodedAddress = CommonCodecs.nodeaddress.encode(address).require.toByteArray
101+
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(features).require.toByteArray
102+
using(pg.prepareStatement(
103+
"""
104+
| INSERT INTO local.peers (node_id, node_address, node_features)
105+
| VALUES (?, ?, ?)
106+
| ON CONFLICT (node_id)
107+
| DO UPDATE SET node_address = EXCLUDED.node_address, node_features = EXCLUDED.node_features
108+
|""".stripMargin)) { statement =>
109+
statement.setString(1, nodeId.value.toHex)
110+
statement.setBytes(2, encodedAddress)
111+
statement.setBytes(3, encodedFeatures)
112+
statement.executeUpdate()
113+
}
114+
}
115+
}
116+
117+
override def addOrUpdatePeerFeatures(nodeId: Crypto.PublicKey, features: Features[InitFeature]): Unit = withMetrics("peers/add-or-update", DbBackends.Postgres) {
118+
withLock { pg =>
119+
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(features).require.toByteArray
120+
using(pg.prepareStatement(
121+
"""
122+
| INSERT INTO local.peers (node_id, node_address, node_features)
123+
| VALUES (?, NULL, ?)
124+
| ON CONFLICT (node_id)
125+
| DO UPDATE SET node_features = EXCLUDED.node_features
126+
|""".stripMargin)) { statement =>
127+
statement.setString(1, nodeId.value.toHex)
128+
statement.setBytes(2, encodedFeatures)
129+
statement.executeUpdate()
129130
}
130131
}
131132
}

eclair-core/src/main/scala/fr/acinq/eclair/db/sqlite/SqlitePeersDb.scala

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

1919
import fr.acinq.bitcoin.scalacompat.Crypto
2020
import fr.acinq.bitcoin.scalacompat.Crypto.PublicKey
21-
import fr.acinq.eclair.{Features, InitFeature, MilliSatoshi, TimestampSecond}
2221
import fr.acinq.eclair.db.Monitoring.Metrics.withMetrics
2322
import fr.acinq.eclair.db.Monitoring.Tags.DbBackends
2423
import fr.acinq.eclair.db.PeersDb
2524
import fr.acinq.eclair.db.sqlite.SqliteUtils.{getVersion, setVersion, using}
2625
import fr.acinq.eclair.payment.relay.Relayer.RelayFees
2726
import fr.acinq.eclair.wire.protocol._
27+
import fr.acinq.eclair.{Features, InitFeature, MilliSatoshi, TimestampSecond}
2828
import grizzled.slf4j.Logging
29-
import scodec.bits.{BitVector, ByteVector}
29+
import scodec.bits.ByteVector
3030

3131
import java.sql.{Connection, Statement}
3232

@@ -82,30 +82,35 @@ class SqlitePeersDb(val sqlite: Connection) extends PeersDb with Logging {
8282
setVersion(statement, DB_NAME, CURRENT_VERSION)
8383
}
8484

85-
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, nodeInfo: NodeInfo): Unit = withMetrics("peers/add-or-update", DbBackends.Sqlite) {
86-
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(nodeInfo.features).require.toByteArray
87-
val encodedAddress_opt = nodeInfo.address_opt.map(address => CommonCodecs.nodeaddress.encode(address).require.toByteArray)
88-
val unknownPeer = encodedAddress_opt match {
89-
case Some(encodedAddress) =>
90-
using(sqlite.prepareStatement("UPDATE peers SET node_address=?, node_features=? WHERE node_id=?")) { update =>
91-
update.setBytes(1, encodedAddress)
92-
update.setBytes(2, encodedFeatures)
93-
update.setBytes(3, nodeId.value.toArray)
94-
update.executeUpdate() == 0
95-
}
96-
case None =>
97-
using(sqlite.prepareStatement("UPDATE peers SET node_features=? WHERE node_id=?")) { update =>
98-
update.setBytes(1, encodedFeatures)
99-
update.setBytes(2, nodeId.value.toArray)
100-
update.executeUpdate() == 0
85+
override def addOrUpdatePeer(nodeId: Crypto.PublicKey, address: NodeAddress, features: Features[InitFeature]): Unit = withMetrics("peers/add-or-update", DbBackends.Sqlite) {
86+
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(features).require.toByteArray
87+
val encodedAddress = CommonCodecs.nodeaddress.encode(address).require.toByteArray
88+
using(sqlite.prepareStatement("UPDATE peers SET node_address=?, node_features=? WHERE node_id=?")) { update =>
89+
update.setBytes(1, encodedAddress)
90+
update.setBytes(2, encodedFeatures)
91+
update.setBytes(3, nodeId.value.toArray)
92+
if (update.executeUpdate() == 0) {
93+
using(sqlite.prepareStatement("INSERT INTO peers VALUES (?, ?, ?)")) { statement =>
94+
statement.setBytes(1, nodeId.value.toArray)
95+
statement.setBytes(2, encodedAddress)
96+
statement.setBytes(3, encodedFeatures)
97+
statement.executeUpdate()
10198
}
99+
}
102100
}
103-
if (unknownPeer) {
104-
using(sqlite.prepareStatement("INSERT INTO peers VALUES (?, ?, ?)")) { statement =>
105-
statement.setBytes(1, nodeId.value.toArray)
106-
statement.setBytes(2, encodedAddress_opt.orNull)
107-
statement.setBytes(3, encodedFeatures)
108-
statement.executeUpdate()
101+
}
102+
103+
override def addOrUpdatePeerFeatures(nodeId: Crypto.PublicKey, features: Features[InitFeature]): Unit = withMetrics("peers/add-or-update", DbBackends.Sqlite) {
104+
val encodedFeatures = CommonCodecs.initFeaturesCodec.encode(features).require.toByteArray
105+
using(sqlite.prepareStatement("UPDATE peers SET node_features=? WHERE node_id=?")) { update =>
106+
update.setBytes(1, encodedFeatures)
107+
update.setBytes(2, nodeId.value.toArray)
108+
if (update.executeUpdate() == 0) {
109+
using(sqlite.prepareStatement("INSERT INTO peers VALUES (?, NULL, ?)")) { statement =>
110+
statement.setBytes(1, nodeId.value.toArray)
111+
statement.setBytes(2, encodedFeatures)
112+
statement.executeUpdate()
113+
}
109114
}
110115
}
111116
}

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class Peer(val nodeParams: NodeParams,
159159
val remoteFeatures_opt = d.remoteFeatures_opt match {
160160
case Some(remoteFeatures) if !remoteFeatures.written =>
161161
// We have a channel, so we can write to the DB without any DoS risk.
162-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(remoteFeatures.features, None))
162+
nodeParams.db.peers.addOrUpdatePeerFeatures(remoteNodeId, remoteFeatures.features)
163163
Some(remoteFeatures.copy(written = true))
164164
case _ => d.remoteFeatures_opt
165165
}
@@ -463,7 +463,7 @@ class Peer(val nodeParams: NodeParams,
463463
}
464464
if (!d.remoteFeaturesWritten) {
465465
// We have a channel, so we can write to the DB without any DoS risk.
466-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(d.remoteFeatures, None))
466+
nodeParams.db.peers.addOrUpdatePeerFeatures(remoteNodeId, d.remoteFeatures)
467467
}
468468
stay() using d.copy(activeChannels = d.activeChannels + e.channelId, remoteFeaturesWritten = true)
469469

@@ -836,14 +836,8 @@ class Peer(val nodeParams: NodeParams,
836836
if (connectionReady.outgoing) {
837837
// We store the node address and features upon successful outgoing connection, so we can reconnect later.
838838
// The previous address is overwritten: we don't need it since the current one works.
839-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(connectionReady.remoteInit.features, Some(connectionReady.address)))
840-
} else if (channels.nonEmpty) {
841-
// If this is an incoming connection, we only store the peer details in our DB if we have channels with them.
842-
// Otherwise nodes could DoS by simply connecting to us to force us to store data in our DB.
843-
// We don't update the remote address, we don't know if we would successfully connect using the current one.
844-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(connectionReady.remoteInit.features, None))
839+
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, connectionReady.address, connectionReady.remoteInit.features)
845840
}
846-
val remoteFeaturesWritten = connectionReady.outgoing || channels.nonEmpty
847841

848842
// If we have some data stored from our peer, we send it to them before doing anything else.
849843
peerStorage.data.foreach(connectionReady.peerConnection ! PeerStorageRetrieval(_))
@@ -865,7 +859,7 @@ class Peer(val nodeParams: NodeParams,
865859
connectionReady.peerConnection ! CurrentFeeCredit(nodeParams.chainHash, feeCredit.getOrElse(0 msat))
866860
}
867861

868-
goto(CONNECTED) using ConnectedData(connectionReady.address, connectionReady.peerConnection, connectionReady.localInit, connectionReady.remoteInit, channels, activeChannels, feerates, None, peerStorage, remoteFeaturesWritten)
862+
goto(CONNECTED) using ConnectedData(connectionReady.address, connectionReady.peerConnection, connectionReady.localInit, connectionReady.remoteInit, channels, activeChannels, feerates, None, peerStorage, remoteFeaturesWritten = connectionReady.outgoing)
869863
}
870864

871865
/**

eclair-core/src/test/scala/fr/acinq/eclair/db/PeersDbSpec.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,24 +60,24 @@ class PeersDbSpec extends AnyFunSuite {
6060
val peer3 = TestCase(randomKey().publicKey, NodeInfo(Features.empty, Some(Tor3("mrl2d3ilhctt2vw4qzvmz3etzjvpnc6dczliq5chrxetthgbuczuggyd", 4231))))
6161

6262
assert(db.listPeers().isEmpty)
63-
db.addOrUpdatePeer(peer1a.nodeId, peer1a.nodeInfo)
63+
db.addOrUpdatePeer(peer1a.nodeId, peer1a.nodeInfo.address_opt.get, peer1a.nodeInfo.features)
6464
assert(db.getPeer(peer1a.nodeId).contains(peer1a.nodeInfo))
6565
assert(db.getPeer(peer2a.nodeId).isEmpty)
66-
db.addOrUpdatePeer(peer1a.nodeId, peer1a.nodeInfo) // duplicate is ignored
66+
db.addOrUpdatePeer(peer1a.nodeId, peer1a.nodeInfo.address_opt.get, peer1a.nodeInfo.features) // duplicate is ignored
6767
assert(db.listPeers().size == 1)
68-
db.addOrUpdatePeer(peer2a.nodeId, peer2a.nodeInfo)
69-
db.addOrUpdatePeer(peer3.nodeId, peer3.nodeInfo)
68+
db.addOrUpdatePeerFeatures(peer2a.nodeId, peer2a.nodeInfo.features)
69+
db.addOrUpdatePeer(peer3.nodeId, peer3.nodeInfo.address_opt.get, peer3.nodeInfo.features)
7070
assert(db.listPeers().map(p => TestCase(p._1, p._2)).toSet == Set(peer1a, peer2a, peer3))
71-
db.addOrUpdatePeer(peer2b.nodeId, peer2b.nodeInfo)
71+
db.addOrUpdatePeer(peer2b.nodeId, peer2b.nodeInfo.address_opt.get, peer2b.nodeInfo.features)
7272
assert(db.listPeers().map(p => TestCase(p._1, p._2)).toSet == Set(peer1a, peer2b, peer3))
7373
db.removePeer(peer2b.nodeId)
7474
assert(db.listPeers().map(p => TestCase(p._1, p._2)).toSet == Set(peer1a, peer3))
7575
// The first peer updates its address without changing its features.
76-
db.addOrUpdatePeer(peer1b.nodeId, peer1b.nodeInfo)
76+
db.addOrUpdatePeer(peer1b.nodeId, peer1b.nodeInfo.address_opt.get, peer1b.nodeInfo.features)
7777
assert(db.getPeer(peer1b.nodeId).contains(peer1b.nodeInfo))
7878
assert(db.listPeers().map(p => TestCase(p._1, p._2)).toSet == Set(peer1b, peer3))
7979
// The first peer updates its features without an address: the previous address should be kept.
80-
db.addOrUpdatePeer(peer1c.nodeId, peer1c.nodeInfo.copy(address_opt = None))
80+
db.addOrUpdatePeerFeatures(peer1c.nodeId, peer1c.nodeInfo.features)
8181
assert(db.getPeer(peer1c.nodeId).contains(peer1c.nodeInfo))
8282
assert(db.listPeers().map(p => TestCase(p._1, p._2)).toSet == Set(peer1c, peer3))
8383
}
@@ -89,7 +89,7 @@ class PeersDbSpec extends AnyFunSuite {
8989
implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(8))
9090
val Success(peerAddress) = NodeAddress.fromParts("127.0.0.1", 42000)
9191
val futures = for (_ <- 0 until 10000) yield {
92-
Future(db.addOrUpdatePeer(randomKey().publicKey, NodeInfo(Features.empty, Some(peerAddress))))
92+
Future(db.addOrUpdatePeer(randomKey().publicKey, peerAddress, Features.empty))
9393
}
9494
val res = Future.sequence(futures)
9595
Await.result(res, 60 seconds)
@@ -187,7 +187,7 @@ class PeersDbSpec extends AnyFunSuite {
187187
val postMigrationDb = new SqlitePeersDb(connection)
188188
assert(postMigrationDb.listPeers() == peerInfos)
189189
val updatedPeerInfo1 = peerInfos(peerId1).copy(features = Features(Features.DataLossProtect -> FeatureSupport.Mandatory))
190-
postMigrationDb.addOrUpdatePeer(peerId1, updatedPeerInfo1.copy(address_opt = None))
190+
postMigrationDb.addOrUpdatePeerFeatures(peerId1, updatedPeerInfo1.features)
191191
assert(postMigrationDb.getPeer(peerId1).contains(updatedPeerInfo1))
192192
}
193193
)
@@ -215,7 +215,7 @@ class PeersDbSpec extends AnyFunSuite {
215215
val postMigrationDb = dbs.peers
216216
assert(postMigrationDb.listPeers() == peerInfos)
217217
val updatedPeerInfo1 = peerInfos(peerId1).copy(features = Features(Features.ChannelType -> FeatureSupport.Optional))
218-
postMigrationDb.addOrUpdatePeer(peerId1, updatedPeerInfo1.copy(address_opt = None))
218+
postMigrationDb.addOrUpdatePeerFeatures(peerId1, updatedPeerInfo1.features)
219219
assert(postMigrationDb.getPeer(peerId1).contains(updatedPeerInfo1))
220220
}
221221
)

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
@@ -862,7 +862,7 @@ class PeerSpec extends FixtureSpec {
862862

863863
// We have information about one of our peers in our DB.
864864
val nodeInfo = NodeInfo(TestConstants.Bob.nodeParams.features.initFeatures(), None)
865-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, nodeInfo)
865+
nodeParams.db.peers.addOrUpdatePeerFeatures(remoteNodeId, nodeInfo.features)
866866

867867
// We initialize ourselves after a restart, but our peer doesn't reconnect immediately to us.
868868
switchboard.send(peer, Peer.Init(Set(ChannelCodecsSpec.normal), Map.empty))

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class ReconnectionTaskSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike
112112

113113
val probe = TestProbe()
114114
val peer = TestProbe()
115-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(Features.empty, Some(fakeIPAddress)))
115+
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, fakeIPAddress, Features.empty)
116116
peer.send(reconnectionTask, Peer.Transition(PeerNothingData, PeerDisconnectedData))
117117
val TransitionWithData(ReconnectionTask.IDLE, ReconnectionTask.WAITING, _, _) = monitor.expectMsgType[TransitionWithData]
118118
probe.send(reconnectionTask, ReconnectionTask.TickReconnect)
@@ -161,7 +161,7 @@ class ReconnectionTaskSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike
161161
import f._
162162

163163
val peer = TestProbe()
164-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(Features.empty, Some(fakeIPAddress)))
164+
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, fakeIPAddress, Features.empty)
165165
peer.send(reconnectionTask, Peer.Transition(PeerNothingData, PeerDisconnectedData))
166166
val TransitionWithData(ReconnectionTask.IDLE, ReconnectionTask.WAITING, _, _) = monitor.expectMsgType[TransitionWithData]
167167
val TransitionWithData(ReconnectionTask.WAITING, ReconnectionTask.CONNECTING, _, connectingData: ReconnectionTask.ConnectingData) = monitor.expectMsgType[TransitionWithData]
@@ -189,7 +189,7 @@ class ReconnectionTaskSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike
189189
import f._
190190

191191
val peer = TestProbe()
192-
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, NodeInfo(Features.empty, Some(fakeIPAddress)))
192+
nodeParams.db.peers.addOrUpdatePeer(remoteNodeId, fakeIPAddress, Features.empty)
193193
peer.send(reconnectionTask, Peer.Transition(PeerNothingData, PeerDisconnectedData))
194194
val TransitionWithData(ReconnectionTask.IDLE, ReconnectionTask.WAITING, _, _) = monitor.expectMsgType[TransitionWithData]
195195
val TransitionWithData(ReconnectionTask.WAITING, ReconnectionTask.CONNECTING, _, _: ReconnectionTask.ConnectingData) = monitor.expectMsgType[TransitionWithData]

0 commit comments

Comments
 (0)