Connection pool ergonomics: timeouts, idle/lifetime caps, sync pool

Open
#67 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
rust
Domain
backend, databases

Research direction

Start with hyperdb-api/src/pool.rs and §6 of docs/RUST_API_GAP_ANALYSIS.md to map the existing async pool and PoolConfig surface. Define the additive timeout, lifetime, idle, min-idle, and recycle options, then assess the sync ConnectionPool boundary and its lack of a Tokio dependency. Done means the listed options and sync pool are implemented with current defaults preserved, with tests covering timeout, idle-close, and health-check replacement behavior.

Written by the indexing model from the issue text.

Description

enhancement

Summary

PoolConfig is missing the standard set of options that deadpool / bb8 / r2d2 users expect (timeouts, idle/lifetime caps, min-idle, configurable health check). And there is no sync connection pool at all — pooling is async-only. Users with a sync app today either roll their own pool or block on the async one from a runtime.

Current state

hyperdb-api/src/pool.rsPoolConfig exposes only endpoint, database, create_mode, user, password, max_size. The recycle path unconditionally runs execute_command("SELECT 1").

$ grep -n "wait_timeout\|create_timeout\|recycle_timeout\|max_lifetime\|idle_timeout\|min_idle" \
    hyperdb-api/src/pool.rs
# (no output)

Original gap analysis: §6 of docs/RUST_API_GAP_ANALYSIS.md (predecessor repo).

Proposed work

  • Add timeouts to PoolConfig:
    • wait_timeout: Option<Duration> — how long acquire will block before erroring.
    • create_timeout: Option<Duration> — bound on a single Connection::connect.
    • recycle_timeout: Option<Duration> — bound on the health-check round-trip.
  • Add lifetime/idle caps:
    • max_lifetime: Option<Duration> — connection is closed when older than this.
    • idle_timeout: Option<Duration> — idle connection is closed after this duration.
    • min_idle: Option<u32> — pool keeps at least this many warm.
  • Pluggable health-check strategy: a recycle: RecycleStrategy enum (SelectOne, Ping, Custom(...), None) instead of hardcoded SELECT 1.
  • Add a sync ConnectionPool mirroring the async pool's surface — r2d2-style — for sync apps. Same PoolConfig, same semantics, no Tokio dependency in the sync path.
  • Tests covering each new option (timeout fires, idle close fires, health-check failure replaces the connection).

Backwards compatibility

Purely additive — new optional fields default to None (current behavior preserved). New sync pool is a new public type.

Performance note

The defaults must keep current behavior identical: None everywhere (no timeout, no idle cap), recycle = SelectOne. Existing users who specify only endpoint/database/max_size should see no change.

Dominant language
Rust
Stars
2
Forks
2
Avg merge
12h 2m
Merged PRs (30d)
60

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from tableau/hyper-api-rust

All issues in tableau/hyper-api-rust

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.