diff --git a/bug.rb b/bug.rb new file mode 100644 index 00000000..9abc2bb9 --- /dev/null +++ b/bug.rb @@ -0,0 +1,15 @@ +require 'pg' +def clog_pool(time) + Thread.new do + conn = PG::connect("postgres://sharding_user:sharding_user@localhost:6432/sharded_db") + conn.exec_params("SELECT pg_sleep(#{time})") + end +end + +clog_pool(10) +conn = PG::connect("postgres://sharding_user:sharding_user@localhost:6432/sharded_db") +12.times do + conn.exec_params("SELECT $1", [1]) rescue PG::SystemError + sleep(1) +end + diff --git a/pgcat.toml b/pgcat.toml index 9125afd5..97a5f0d9 100644 --- a/pgcat.toml +++ b/pgcat.toml @@ -1,147 +1,30 @@ -# -# PgCat config example. -# - -# -# General pooler settings [general] -# What IP to run on, 0.0.0.0 means accessible from everywhere. host = "0.0.0.0" - -# Port to run on, same as PgBouncer used in this example. port = 6432 - -# Whether to enable prometheus exporter or not. enable_prometheus_exporter = true - -# Port at which prometheus exporter listens on. prometheus_exporter_port = 9930 - -# How long to wait before aborting a server connection (ms). -connect_timeout = 5000 - -# How much time to give the health check query to return with a result (ms). +connect_timeout = 500 healthcheck_timeout = 1000 - -# How long to keep connection available for immediate re-use, without running a healthcheck query on it healthcheck_delay = 30000 - -# How much time to give clients during shutdown before forcibly killing client connections (ms). -shutdown_timeout = 60000 - -# For how long to ban a server if it fails a health check (seconds). +shutdown_timeout = 1 ban_time = 60 # seconds - -# Reload config automatically if it changes. autoreload = false - -# TLS -# tls_certificate = "server.cert" -# tls_private_key = "server.key" - -# Credentials to access the virtual administrative database (pgbouncer or pgcat) -# Connecting to that database allows running commands like `SHOW POOLS`, `SHOW DATABASES`, etc.. admin_username = "admin_user" admin_password = "admin_pass" -# pool -# configs are structured as pool. -# the pool_name is what clients use as database name when connecting -# For the example below a client can connect using "postgres://sharding_user:sharding_user@pgcat_host:pgcat_port/sharded_db" [pools.sharded_db] -# Pool mode (see PgBouncer docs for more). -# session: one server connection per connected client -# transaction: one server connection per client transaction pool_mode = "transaction" - -# If the client doesn't specify, route traffic to -# this role by default. -# -# any: round-robin between primary and replicas, -# replica: round-robin between replicas only without touching the primary, -# primary: all queries go to the primary unless otherwise specified. default_role = "any" - -# Query parser. If enabled, we'll attempt to parse -# every incoming query to determine if it's a read or a write. -# If it's a read query, we'll direct it to a replica. Otherwise, if it's a write, -# we'll direct it to the primary. query_parser_enabled = true - -# If the query parser is enabled and this setting is enabled, the primary will be part of the pool of databases used for -# load balancing of read queries. Otherwise, the primary will only be used for write -# queries. The primary can always be explicitly selected with our custom protocol. primary_reads_enabled = true - -# So what if you wanted to implement a different hashing function, -# or you've already built one and you want this pooler to use it? -# -# Current options: -# -# pg_bigint_hash: PARTITION BY HASH (Postgres hashing function) -# sha1: A hashing function based on SHA1 -# sharding_function = "pg_bigint_hash" - -# Credentials for users that may connect to this cluster [pools.sharded_db.users.0] username = "sharding_user" password = "sharding_user" -# Maximum number of server connections that can be established for this user -# The maximum number of connection from a single Pgcat process to any database in the cluster -# is the sum of pool_size across all users. -pool_size = 9 - -# Maximum query duration. Dangerous, but protects against DBs that died in a non-obvious way. +pool_size = 1 statement_timeout = 0 - -[pools.sharded_db.users.1] -username = "other_user" -password = "other_user" -pool_size = 21 -statement_timeout = 15000 - -# Shard 0 [pools.sharded_db.shards.0] -# [ host, port, role ] servers = [ [ "127.0.0.1", 5432, "primary" ], - [ "localhost", 5432, "replica" ] ] -# Database name (e.g. "postgres") database = "shard0" - -[pools.sharded_db.shards.1] -servers = [ - [ "127.0.0.1", 5432, "primary" ], - [ "localhost", 5432, "replica" ], -] -database = "shard1" - -[pools.sharded_db.shards.2] -servers = [ - [ "127.0.0.1", 5432, "primary" ], - [ "localhost", 5432, "replica" ], -] -database = "shard2" - - -[pools.simple_db] -pool_mode = "session" -default_role = "primary" -query_parser_enabled = true -primary_reads_enabled = true -sharding_function = "pg_bigint_hash" - -[pools.simple_db.users.0] -username = "simple_user" -password = "simple_user" -pool_size = 5 -statement_timeout = 0 - -[pools.simple_db.shards.0] -servers = [ - [ "127.0.0.1", 5432, "primary" ], - [ "localhost", 5432, "replica" ] -] -database = "some_db"