-
-
Notifications
You must be signed in to change notification settings - Fork 85
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the issue
The connection pool crashes when a lot of requests occur in a burst
Vapor version
n/a
Operating system and version
macOS 14.4.1
Swift version
Swift Package Manager - Swift 5.10.0-dev
Steps to reproduce
Run the following script:
let config = PostgresClient.Configuration(...)
var logger = Logger(label: "connection-pool-crash")
logger.logLevel = .debug
let client = PostgresClient(
configuration: config,
backgroundLogger: logger
)
let task = Task {
await client.run()
}
func runOnce() async throws {
let logger = logger
try await withThrowingDiscardingTaskGroup { group in
for _ in 0..<20 {
group.addTask {
let hello = try await client.withConnection { db in
try await db.query("SELECT 'hello'", logger: logger)
}.collect().first?.decode(String.self)
print(hello)
// wait for the connection pool to do ping pong and close
try await Task.sleep(for: .seconds(idleTimeout + 1))
}
}
}
}
for i in 0..<50 {
try await runOnce()
print("Burst done: \(i + 1)/50")
}
task.cancel()
Outcome
A crash happens (typically on the start of the second burst, after running the script for approx. 1.5 min), the crash occurs in PoolStateMachine.connectionKeepAliceTimerTriggered(_:)
due to a non-empty request queue. My assumption is, that there's a race condition when the timer triggers the ping and the next batch of requests is "inserted" into the pool.
Additional notes
No response
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working