Skip to content

Commit 1c9c694

Browse files
authored
Add new command to fix flaky tests in PendingChannelsRateLimiterSpec (#2606)
1 parent df590d8 commit 1c9c694

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ object PendingChannelsRateLimiter {
3030
private case class WrappedGetNodeResponse(temporaryChannelId: ByteVector32, response: Router.GetNodeResponse, replyTo: Option[ActorRef[Response]]) extends Command
3131
private case class ReplaceChannelId(remoteNodeId: PublicKey, temporaryChannelId: ByteVector32, channelId: ByteVector32) extends Command
3232
private case class RemoveChannelId(remoteNodeId: PublicKey, channelId: ByteVector32) extends Command
33+
private[io] case class CountOpenChannelRequests(replyTo: ActorRef[Int], publicPeers: Boolean) extends Command
3334

3435
sealed trait Response
3536
case object AcceptOpenChannel extends Response
@@ -70,6 +71,10 @@ private class PendingChannelsRateLimiter(nodeParams: NodeParams, router: ActorRe
7071
restoring(channels.tail, pendingPublicNodeChannels + (announcement.nodeId -> pendingChannels.map(_.channelId)), pendingPrivateNodeChannels)
7172
case WrappedGetNodeResponse(_, UnknownNode(nodeId), _) =>
7273
restoring(channels.tail, pendingPublicNodeChannels, pendingPrivateNodeChannels + (nodeId -> pendingChannels.map(_.channelId)))
74+
case CountOpenChannelRequests(replyTo, publicPeers) =>
75+
val pendingChannels = if (publicPeers) pendingPublicNodeChannels else pendingPrivateNodeChannels
76+
replyTo ! pendingChannels.map(_._2.length).sum
77+
Behaviors.same
7378
}
7479
case None =>
7580
context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[ChannelIdAssigned](c => ReplaceChannelId(c.remoteNodeId, c.temporaryChannelId, c.channelId)))
@@ -150,6 +155,10 @@ private class PendingChannelsRateLimiter(nodeParams: NodeParams, router: ActorRe
150155
case None => Behaviors.same
151156
}
152157
}
158+
case CountOpenChannelRequests(replyTo, publicPeers) =>
159+
val pendingChannels = if (publicPeers) pendingPublicNodeChannels else pendingPrivateNodeChannels
160+
replyTo ! pendingChannels.map(_._2.length).sum
161+
Behaviors.same
153162
}
154163
}
155164
}

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ class PendingChannelsRateLimiterSpec extends ScalaTestWithActorTestKit(ConfigFac
9494
case p => router.expectMessageType[GetNode].replyTo ! UnknownNode(p._1)
9595
}
9696
router.expectNoMessage(10 millis)
97+
val requests = TestProbe[Int]()
9798

98-
withFixture(test.toNoArgTest(FixtureParam(router, nodeParams, probe, limiter, Seq(peerAtLimit1, peerAtLimit2), Seq(peerBelowLimit1, peerBelowLimit2), Seq(peerOnWhitelist, peerOnWhitelistAtLimit), Seq(privatePeer1, privatePeer2))))
99+
withFixture(test.toNoArgTest(FixtureParam(router, nodeParams, probe, limiter, Seq(peerAtLimit1, peerAtLimit2), Seq(peerBelowLimit1, peerBelowLimit2), Seq(peerOnWhitelist, peerOnWhitelistAtLimit), Seq(privatePeer1, privatePeer2), requests)))
99100
}
100101

101102
def announcement(nodeId: PublicKey): NodeAnnouncement = NodeAnnouncement(randomBytes64(), Features.empty, 1 unixsec, nodeId, Color(100.toByte, 200.toByte, 300.toByte), "node-alias", NodeAddress.fromParts("1.2.3.4", 42000).get :: Nil)
@@ -105,7 +106,7 @@ class PendingChannelsRateLimiterSpec extends ScalaTestWithActorTestKit(ConfigFac
105106
commitments.copy(params = commitments.params.copy(channelId = channelId))
106107
}
107108

108-
case class FixtureParam(router: TestProbe[Router.GetNode], nodeParams: NodeParams, probe: TestProbe[PendingChannelsRateLimiter.Response], limiter: ActorRef[PendingChannelsRateLimiter.Command], peersAtLimit: Seq[PublicKey], peersBelowLimit: Seq[PublicKey], peersOnWhitelist: Seq[PublicKey], privatePeers: Seq[PublicKey])
109+
case class FixtureParam(router: TestProbe[Router.GetNode], nodeParams: NodeParams, probe: TestProbe[PendingChannelsRateLimiter.Response], limiter: ActorRef[PendingChannelsRateLimiter.Command], peersAtLimit: Seq[PublicKey], peersBelowLimit: Seq[PublicKey], peersOnWhitelist: Seq[PublicKey], privatePeers: Seq[PublicKey], requests: TestProbe[Int])
109110

110111
test("always accept requests from nodes on white list") { f =>
111112
import f._
@@ -175,9 +176,15 @@ class PendingChannelsRateLimiterSpec extends ScalaTestWithActorTestKit(ConfigFac
175176
}
176177

177178
// stop tracking channels that are confirmed/closed/aborted for a public peer
179+
limiter ! PendingChannelsRateLimiter.CountOpenChannelRequests(requests.ref, publicPeers = true)
180+
requests.expectMessage(10)
178181
system.eventStream ! Publish(ChannelOpened(null, peersAtLimit.head, channelIdAtLimit1))
179182
system.eventStream ! Publish(ChannelClosed(null, newChannelId1, null, commitments(peersBelowLimit.head, newChannelId1)))
180183
system.eventStream ! Publish(ChannelAborted(null, peersBelowLimit.last, newChannelId2))
184+
eventually {
185+
limiter ! PendingChannelsRateLimiter.CountOpenChannelRequests(requests.ref, publicPeers = true)
186+
requests.expectMessage(7)
187+
}
181188

182189
// new channel requests for peers below limit are accepted after matching confirmed/closed/aborted
183190
(peersBelowLimit :+ peersAtLimit.head).foreach { peer =>
@@ -236,8 +243,14 @@ class PendingChannelsRateLimiterSpec extends ScalaTestWithActorTestKit(ConfigFac
236243
probe.expectMessage(PendingChannelsRateLimiter.ChannelRateLimited)
237244

238245
// stop tracking channels that are confirmed/closed/aborted for a private peer
246+
limiter ! PendingChannelsRateLimiter.CountOpenChannelRequests(requests.ref, publicPeers = false)
247+
requests.expectMessage(2)
239248
system.eventStream ! Publish(ChannelOpened(null, privatePeers.head, newChannelIdPrivate1))
240249
system.eventStream ! Publish(ChannelClosed(null, channelIdPrivate2, null, commitments(privatePeers.last, channelIdPrivate2)))
250+
eventually {
251+
limiter ! PendingChannelsRateLimiter.CountOpenChannelRequests(requests.ref, publicPeers = false)
252+
requests.expectMessage(0)
253+
}
241254

242255
// new channel requests for peers below limit are accepted after matching confirmed/closed/aborted
243256
limiter ! PendingChannelsRateLimiter.AddOrRejectChannel(probe.ref, privatePeers.head, channelIdPrivate1)
@@ -251,6 +264,10 @@ class PendingChannelsRateLimiterSpec extends ScalaTestWithActorTestKit(ConfigFac
251264

252265
// abort the reused channel id for one private node; private channels now under the limit by one
253266
system.eventStream ! Publish(ChannelAborted(null, privatePeers.head, channelIdPrivate1))
267+
eventually {
268+
limiter ! PendingChannelsRateLimiter.CountOpenChannelRequests(requests.ref, publicPeers = false)
269+
requests.expectMessage(1)
270+
}
254271

255272
// new channels requests for untracked public peers do not increase the limit for private peers
256273
limiter ! PendingChannelsRateLimiter.AddOrRejectChannel(probe.ref, randomKey().publicKey, channelIdPrivate1)

0 commit comments

Comments
 (0)