Skip to content

PostgresClient.query() does not throw upon PostgresClient.options.connectTimeout! #574

@ah-row

Description

@ah-row

Describe the issue

PostgresClient.query() nor PostgresConnection.query() do not throw upon PostgresClient.options.connectTimeout!

Vapor version

postgres-nio 1.26.2

Operating system and version

macOS 15.5

Swift version

Apple Swift version 6.1 (swift-6.1-RELEASE)

Steps to reproduce

Expected

postgres-nio should throw an error once PostgresClient.options.connectTimeout has elapsed.

Observed

While postgres-nio does log an error, it does not throw an error. This prevents any caller from dealing with any potential problem of an unreachable server.

How was this conclusion reached?

By using code similar to what can be found in Tests/IntegrationTests/PostgresClientTests.swift, we can create a PostgresClient.Configuration pointing to a non-responding server with the goal to ensure the library fails predictably! It does not!

@Test("Postgres Connection Timeout! This should throw!")
func connectionTimeout() async throws {
    let nonRespondingServer = PostgresClient.Configuration()
    let client = PostgresClient(configuration: nonRespondingServer, backgroundLogger: logger)
    try await withThrowingTaskGroup(of: Void.self) { taskGroup in
        defer {
            taskGroup.cancelAll()
        }

        taskGroup.addTask {
            await client.run()  // Only returns once the taskGroup is canceled;
        }
        // Give `client.run()` a few seconds for the client to setup. (In case of Fragile API?!)
        try await Task.sleep(for: .seconds(5))

        taskGroup.addTask {
            //⚠️ Following call does not throw after timeout!
            
            //try await client.query("SELECT 1", logger: logger)
            
            try await client.withConnection() { connection in
                _ = try await connection.query("SELECT 1", logger: logger)
            }
        }
        do {
            try await taskGroup.next()  // Wait until *any* task in group returns/throws
            logger.debug("A task completed!")
            // ⚠️ This is NEVER reached because the query can't run (server doesn't respond)
            // nor does it give-up (and throw) after `PostgresClient.options.connectTimeout` has elapsed.
        } catch let e {
            print("client.next() threw an error!")
            // ⚠️ This is NEVER reached because an error is not thrown after
            // after `PostgresClient.options.connectTimeout` has elapsed.
            taskGroup.cancelAll()
            throw e
        }
    }
}

Outcome

No error is thrown,

Additional notes

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions