Skip to content

Commit 89d9f72

Browse files
authored
Limit connection growth by all streams plus incoming connections (#615)
1 parent 98c87ef commit 89d9f72

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

Sources/ConnectionPoolModule/PoolStateMachine.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,9 @@ struct PoolStateMachine<
684684
if !requests.isEmpty {
685685
let leaseResult = self.connections.leaseConnection(at: index, streams: UInt16(requests.count))
686686
let connectionsRequired: Int
687-
if self.requestQueue.count <= self.connections.stats.availableStreams + self.connections.stats.leasedStreams {
687+
// if request count is less than available streams and leased streams plus incoming connections then only
688+
// ensure we have minimum connections otherwise grow the number of connections
689+
if (self.requestQueue.count + 1) <= self.connections.stats.availableStreams + self.connections.stats.leasedStreams + self.connections.stats.connecting {
688690
connectionsRequired = self.configuration.minimumConnectionCount - Int(self.connections.stats.active)
689691
} else {
690692
connectionsRequired = 1

Tests/ConnectionPoolModuleTests/PoolStateMachineTests.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -679,16 +679,22 @@ typealias TestPoolStateMachine = PoolStateMachine<
679679
#expect(leaseRequests[i].request == .none)
680680
}
681681

682-
let connections = (0..<5).map { MockConnection(id: $0) }
683-
let connectedActions = (0..<5).map { stateMachine.connectionEstablished(connections[$0], maxStreams: 1) }
682+
// only 4 connections are created as once 4 are created we have enough streams and connections available to serve
683+
// all requests
684+
let connections = (0..<4).map { MockConnection(id: $0) }
685+
let connectedActions = (0..<4).map { stateMachine.connectionEstablished(connections[$0], maxStreams: 1) }
684686
#expect(connectedActions[0].connection == .makeConnectionsCancelAndScheduleTimers(.init(element: .init(connectionID: 3)), [], []))
685-
#expect(connectedActions[1].connection == .makeConnectionsCancelAndScheduleTimers(.init(element: .init(connectionID: 4)), [], []))
687+
#expect(connectedActions[1].connection == .cancelTimers([]))
686688
#expect(connectedActions[2].connection == .cancelTimers([]))
687689
#expect(connectedActions[3].connection == .cancelTimers([]))
688-
#expect(connectedActions[4].connection == .cancelTimers([]))
689-
for i in 0..<5 {
690+
for i in 0..<4 {
690691
#expect(connectedActions[i].request == .leaseConnection([requests[i]], connections[i]))
691692
}
693+
let releaseActions = (0..<4).map { stateMachine.releaseConnection(connections[$0], streams: 1)}
694+
#expect(releaseActions[0].request == .leaseConnection([requests[4]], connections[0]))
695+
#expect(releaseActions[1].request == .none)
696+
#expect(releaseActions[2].request == .none)
697+
#expect(releaseActions[3].request == .none)
692698
}
693699

694700
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)

0 commit comments

Comments
 (0)