mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-26 18:36:28 +00:00
We have encountered a case where PgCat pools were stuck following a database incident. Our best understanding at this point is that the PgCat -> Postgres connections died silently and because Tokio defaults to disabling keepalives, connections in the pool were marked as busy forever. Only when we deployed PgCat did we see recovery. This PR introduces tcp_keepalives to PgCat. This sets the defaults to be keepalives_idle: 5 # seconds keepalives_interval: 5 # seconds keepalives_count: 5 # a count These settings can detect the death of an idle connection within 30 seconds of its death. Please note that the connection can remain idle forever (from an application perspective) as long as the keepalive packets are flowing so disconnection will only occur if the other end is not acknowledging keepalive packets (keepalive packet acks are handled by the OS, the application does not need to do anything). I plan to add tcp_user_timeout in a follow-up PR.
83 lines
3.1 KiB
YAML
83 lines
3.1 KiB
YAML
# Use the latest 2.1 version of CircleCI pipeline process engine.
|
|
# See: https://circleci.com/docs/2.0/configuration-reference
|
|
version: 2.1
|
|
|
|
# Define a job to be invoked later in a workflow.
|
|
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
|
|
jobs:
|
|
build:
|
|
# Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
|
|
# See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor
|
|
docker:
|
|
- image: levkk/pgcat-ci:latest
|
|
environment:
|
|
RUST_LOG: info
|
|
RUSTFLAGS: "-C instrument-coverage"
|
|
LLVM_PROFILE_FILE: "pgcat-%m.profraw"
|
|
- image: postgres:14
|
|
command: ["postgres", "-p", "5432", "-c", "shared_preload_libraries=pg_stat_statements"]
|
|
environment:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_HOST_AUTH_METHOD: scram-sha-256
|
|
- image: postgres:14
|
|
command: ["postgres", "-p", "7432", "-c", "shared_preload_libraries=pg_stat_statements"]
|
|
environment:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_HOST_AUTH_METHOD: scram-sha-256
|
|
- image: postgres:14
|
|
command: ["postgres", "-p", "8432", "-c", "shared_preload_libraries=pg_stat_statements"]
|
|
environment:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_HOST_AUTH_METHOD: scram-sha-256
|
|
- image: postgres:14
|
|
command: ["postgres", "-p", "9432", "-c", "shared_preload_libraries=pg_stat_statements"]
|
|
environment:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_HOST_AUTH_METHOD: scram-sha-256
|
|
|
|
# Add steps to the job
|
|
# See: https://circleci.com/docs/2.0/configuration-reference/#steps
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: cargo-lock-2-{{ checksum "Cargo.lock" }}
|
|
- run:
|
|
name: "Lint"
|
|
command: "cargo fmt --check"
|
|
- run:
|
|
name: "Install dependencies"
|
|
command: "sudo apt-get update && sudo apt-get install -y psmisc postgresql-contrib-12 postgresql-client-12 ruby ruby-dev libpq-dev python3 python3-pip lcov llvm-11 iproute2 && sudo apt-get upgrade curl"
|
|
- run:
|
|
name: "Install rust tools"
|
|
command: "cargo install cargo-binutils rustfilt && rustup component add llvm-tools-preview"
|
|
- run:
|
|
name: "Build"
|
|
command: "cargo build"
|
|
- run:
|
|
name: "Tests"
|
|
command: "cargo test && bash .circleci/run_tests.sh && .circleci/generate_coverage.sh"
|
|
- store_artifacts:
|
|
path: /tmp/cov
|
|
destination: coverage-data
|
|
- save_cache:
|
|
key: cargo-lock-2-{{ checksum "Cargo.lock" }}
|
|
paths:
|
|
- target
|
|
- ~/.cargo
|
|
|
|
|
|
# Invoke jobs via workflows
|
|
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
|
|
workflows:
|
|
build:
|
|
jobs:
|
|
- build
|