Skip to content

Changelog

PgBouncer version history and release notes
PgBouncer version history and release notes

Source: https://www.pgbouncer.org/changelog.html · 1.26.0 source


PgBouncer 1.26.x

2026-09-23 - PgBouncer 1.26.0 - “Ignore all previous search_path”

  • Security
    • Fix CVE-2026-19888: PgBouncer before 1.26.0 did not check that the SCRAM client-final-message contained a nonce. An unauthenticated remote attacker could crash PgBouncer by sending a client-final-message without one. This also applies to users that do not exist, because PgBouncer runs a mock SCRAM exchange for those. This bug has existed since SCRAM support was added in PgBouncer 1.11.0.
    • Fix CVE-2026-6668: Before 1.26.0, integer overflow in packet buffer growth could make PgBouncer loop indefinitely. This required a large amount of data in one packet buffer. With default max_packet_size, an unauthenticated client could trigger it. Because PgBouncer is single-threaded, it stopped serving all clients until the process was killed.
    • Fix CVE-2026-6669: Before 1.26.0, PgBouncer accepted an unbounded SCRAM iteration count from servers. A malicious or compromised PostgreSQL server could force unlimited work during one login. This blocked service for all other clients and databases. The iteration count must now be at most 1000000.
  • Features
    • Track all parameters that PostgreSQL reports by default. These include search_path on PostgreSQL 18+ and default_transaction_read_only on PostgreSQL 14+. Previously, SET search_path or SET default_transaction_read_only = true in transaction pooling affected later clients that used the same server connection. (#1580, #1573)
    • Add pool_idle_timeout to remove pools unused for a configured period. This helps when many users connect infrequently and pool counts otherwise grow without limit. The default disables this setting because pool removal also removes its statistics. (#1491)
    • Allow query_wait_timeout to be configured per user and per database. (#1449)
    • Add client_login_count stat to SHOW STATS, which counts successful client logins. This makes it possible to detect clients that churn connections. (#1457)
    • Send PgBouncer-specific ParameterStatus messages at client login: pgbouncer.version, pgbouncer.pool_mode, and pgbouncer.max_prepared_statements. Clients and drivers can use these to detect PgBouncer and adjust their behavior. (#1490)
    • Add login_notify_message setting. When set, its value is sent to clients as a NOTICE message after they log in. This can be used to make it clear to clients that they are connected through PgBouncer instead of directly to PostgreSQL. (#1488)
    • Add support for building PgBouncer with meson, including a Windows build using the UCRT64 environment. Autoconf builds continue to be supported. (#1524, #1426, #1568, #1585, #1602, #1607)
    • Add a logo. (#1609)
  • Changes
    • Remove the deprecated online restart (-R, aka takeover) functionality, together with the SHOW FDS and SUSPEND admin commands that only existed to support it. Use rolling restarts with so_reuseport instead. (#1581)
    • Increase the maximum length of passwords to 65535 bytes, matching libpq. (#1310, #1520)
    • Treat a NULL user name returned by auth_query the same as no rows being returned, instead of treating it as an error. (#1569)
    • Accept SET extra_float_digits on the admin database, which newer PostgreSQL JDBC drivers send during connection setup. (#1550)
    • Allow mkauth.py to write to stdout by passing - as the output file. (#1514)
    • Stop logging noisy errors on unexpected EOF from clients when built against OpenSSL 3. (#1507)
    • Include the underlying system error in TLS error messages when built against OpenSSL 3. (#1492)
    • Require a C11 compiler. (#1417)
    • Log which limit caused a server connection to be evicted. The disconnect reason is now evicted for max_db_connections, evicted for pool_size or evicted for max_user_connections instead of the bare evicted. (#1597)
  • Fixes
    • Fix late COPY messages causing pool exhaustion in transaction pooling mode. This also makes COPY work outside of an explicit transaction in transaction pooling mode. (#1471)
    • Fix LDAP authentication failures with long DNs by increasing the maximum LDAP URL length. (#1497)
    • Fix SCRAM pass-through corruption of cached forced-user credentials. This caused server login failures because the real server rejected the SCRAM proof. (#1612)
    • Fix SCRAM pass-through with stored SCRAM secrets after server reconnection. It failed with “password is SCRAM secret but client authentication did not provide SCRAM keys”. (#1504, bug introduced in 1.25.1)
    • Fix use-after-free crash when a replication client disconnects while its server connection is still logging in. (#1577)
    • Fix idle server eviction for replication clients when the pool is full. Previously, one replication client could evict every idle server instead of one. No eviction occurred when reserve pools or cancel requests made the server count exceed pool_size. (#1597)
    • Fix stalled TLS connections when a packet straddles the packet buffer boundary, for example a SET application_name with a long value. (#1531)
    • Fix prepared statement responses being sent in the wrong order when a batch mixes Parse and Close messages without a Sync in between. (#1555)
    • Fix parameters listed in track_extra_parameters that are not reported by the server causing incorrect behaviour when a client sets them in its startup packet. (#1576)
    • Fix login failures when the server splits its login packets across multiple TCP packets, for example when there is another proxy between PgBouncer and PostgreSQL. (#1446)
    • Fix query_timeout closing connections when no query was in flight. (#1395)
    • Fix sending a duplicate NegotiateProtocolVersion message when no server was available right away. (#1460)
    • Fix pool_size column in SHOW USERS showing a value for users that do not have one configured. (#1489)
    • Fix error message for ENABLE admin command. (#1308)
    • Fix compilation against future OpenSSL versions that make struct asn1_string_st opaque. (#1440)
    • Prevent the compiler from optimizing away the erasure of sensitive cryptographic data from the stack. (#1508)
    • Fix linking of pgbevent.dll with clang on Windows. (#1571)
    • Fix paths of root-level files in the release tarball, which were stored as pgbouncer-X.Y.Z/./configure instead of pgbouncer-X.Y.Z/configure. (#1549)
    • Fix a memory leak when reading track_extra_parameters from the config. (#1510)
    • Fix a memory leak for every startup packet that contained a protocol extension parameter (_pq_. prefix), which could be triggered by unauthenticated clients. (#1540)

PgBouncer 1.25.x

2026-05-08 - PgBouncer 1.25.2 - “Human touch with fresh twist in title race full of uncertainties”

  • Security

    • Fix CVE-2026-6664: An integer overflow in network packet parsing code in PgBouncer before 1.25.2 bypasses a boundary check and can lead to a crash. An unauthenticated remote attacker can crash PgBouncer with a malformed SCRAM authentication packet.
    • Fix CVE-2026-6665: Before 1.25.2, SCRAM client-final-message construction checked the strlcat() return value incorrectly. A malicious backend could trigger stack overflow with a long nonce in its SCRAM server-final-message.
    • Fix CVE-2026-6666: A possible null pointer reference in PgBouncer before 1.25.2 could lead to a crash if a server sends an error response without an SQLSTATE field.
    • Fix CVE-2026-6667: PgBouncer before 1.25.2 did not perform an appropriate authorization check for the KILL_CLIENT admin command. All users with access to the administration console, which itself requires authorization, could run this command. It should only be allowed for users listed in the admin_users parameter.
  • Fixes

    • Clarify documentation of the default_pool_size parameter.
    • Correct documentation for client_tls13_ciphers and server_tls13_ciphers.

2025-12-03 - PgBouncer 1.25.1 - “Fixing a bunch of bugs before Christmas”

  • Security

    • Fix CVE-2025-12819: An unauthenticated attacker could previously execute arbitrary SQL during authentication with a malicious search_path in StartupMessage. Systems are vulnerable only when ALL the following conditions apply:

      1. track_extra_parameters includes search_path (non-default configuration, probably only configured in setups involving Citus or PostgreSQL 18)
      2. auth_user is set to a non-empty string (non-default configuration)
      3. auth_query is configured without fully-qualified object names (default configuration, the < operator is not schema qualified)
  • Fixes

    • Fix errors with ad-hoc SCRAM auth after reconnect to server (#1432, introduced in 1.25.0)
    • Add missing typedefs for exotic architectures without SIMD support (#1414, introduced in 1.25.0)
    • Remove noisy warning log when client closes the connection before sending any data (#1420, introduced in 1.25.0)
    • Prevent potential NULL pointer dereference (#1423, introduced in 1.25.0)
    • Fix potential memory leak (#1422, introduced in 1.25.0)
    • Fix SCRAM parsing of server messages (#1431, introduced in 1.25.0)

2025-11-09 - PgBouncer 1.25.0 - “The one with LDAP support”

  • Features
    • Add LDAP authentication! You can configure it using an HBA file or using auth_ldap_options. (#731)
    • Add client-side direct TLS connections using the faster setup introduced in PostgreSQL 17. PgBouncer cannot yet use this setup for its PostgreSQL server connections. (#1359)
    • Add idle state to SHOW CLIENTS. (#1191)
    • Add transaction_timeout setting, both globally and at the user level. (#1242)
    • Send a NOTICE message to the client if it is queued without receiving a connection for more than 5 seconds. This duration can be changed/disabled using query_wait_notify. (#1264)
    • Add scram_iterations setting to allow operators to trade security for authentication speed (#1339)
    • Add client_tls13_ciphers and server_tls13_ciphers to choose which TLSv1.3 cipher suites to enable. (#1352)
  • Changes
    • Greatly improve performance of ad hoc SCRAM authentication. (#1338)
    • Allow KILL to not take any database, which now means to KILL all databases. (#1317)
    • Health check query defaults to sending empty query instead of SELECT 1. (#1233)
    • Log full PAM queue as a warning. This makes it easier to find the cause of slow queries caused by this. (#1297)
    • The RELOAD command now reports any errors that happened during the reload. (#1231)
    • Allow admin connections through the PgBouncer UNIX socket during shutdown. Operators can inspect why shutdown is delayed or use KILL_CLIENT on stuck connections. (#1305)
    • Change mkauth.py to not add an obsolete third field anymore (#1365)
    • Improve FATAL messages in disconnect_client and disconnect_server functions. (#1382)
    • Stop using deprecated OpenSSL function EVP_PKEY_get0_EC_KEY. This could cause issues with certain FIPS implementatinos. (#1384)
  • Fixes
    • Fix crash involving long passwords (1024 characters or more). (#1215)
    • Fix multi-host connections when using server_tls_sslmode=verify-full. (#1303)
    • Fix rare FATAL error when forwarding cancel requests. (#1383)
    • Fix sorting of parameters in SHOW CONFIG. (#1403)
    • Harden parsing of the startup packet. (#1407)

PgBouncer 1.24.x

2025-04-16 - PgBouncer 1.24.1 - “CVE-2025-2291 VALID UNTIL yesterday”

  • Security

    • Fix CVE-2025-2291: Previously, auth_query ignored password VALID UNTIL when fetching hashes. PgBouncer acting as a transparent Postgres proxy could therefore accept expired passwords. The default auth_query and documented custom function examples now check VALID UNTIL. Update custom auth_query definitions accordingly. For the default auth_query, upgrade to PgBouncer 1.24.1 or configure the new default query on an earlier release.
  • Fixes

    • Fix PAM support by reverting pam authentication support in HBA file. (#1291) (bug introduced in 1.24.0)
    • Fix bug when decrementing user connection count. This was included in the tag of 1.24.0 on GitHub, but the release tarball did not contain this fix. (#1238) (bug introduced in 1.24.0)
    • Add test_load_balance_hosts.py to the tarball. (#1282)
    • Fix issues with tests to allow them to be run by Debian packagers. (#1266, #1250)
  • Docs

    • Update auth_query example to set a safe search_path. (#1245)

2025-01-10 - PgBouncer 1.24.0 - “New year, new bouncer”

  • Features

    • Add support for Type=notify-reload for systemd. This requires systemd version 253 or later. (#1148)
    • Add KILL_CLIENT command to the admin console. This allows terminating a client connection by force. (#1147)
    • Add max_user_client_connections setting, both globally and at the user level. (#1137)
    • Add max_db_client_connections setting, both globally and at the database level. (#1138)
    • Add current_client_connections counter to SHOW USERS and SHOW DATABASES output. (#1137, #1138)
    • Add load_balance_hosts parameter, to support not load balancing between hosts. (#736)
    • Expose prepared statement usage counters in SHOW STATS. (#1192)
    • Add client_idle_timeout setting. (#1189)
    • Add user level query_timeout and reserve_pool_size. (#1180, #1228)
    • Enable pam authentication support in HBA file. (#326)
  • Changes

    • Retain connections on RELOAD when TLS configuration is unchanged. Previously, RELOAD recycled all TLS connections and could cause a severe temporary performance drop. Connections now recycle only when TLS settings change. (#1157)
    • Enable prepared statement support by default, with max_prepared_statements set to 200. This default change should affect only clients that use prepared statements. If you use them, read the limitations in our documentation. (#1144)
    • Sockets/clients/servers can now be identified by a unique ID in the admin output. Previously they could be identified by their pointer, but these would often be reused by new clients after disconnect. (#1172)
    • Clearer error for empty pidfile. (#1195)
    • Return original error to client in case of server_login_retry failure. (#1152)
    • Log original server error in case of error from auth_query. (#1187)
    • Setting default_pool_size to 0 means unlimited size. (#1227)
    • Change the name of the reserve_pool setting for databases, to reserve_pool_size. The previous name is still an alias for the new name. (#1232)
  • Fixes

    • Handle various unlikely error cases better, such as OOM errors. These could previously cause crashes or memory leaks. (#1108, #1101, #1099, #1169, #1202)
    • Correct default value for server_tls_sslmode in sample config file. (#1133)
    • Remove mention in docs of invalid alias for server_tls_protocols. (#1155)
    • Fix bug when using auth_query and replication connections together. This bug would cause connection failures in such setups. (#1166)
    • Ignore client cancel requests while PgBouncer is configuring server setting. (#298)

PgBouncer 1.23.x

2024-08-02 - PgBouncer 1.23.1 - “Everything is put back in order”

  • Fixes
    • Fix a possible segmentation fault after PgBouncer reloads its configuration. (#1105) (bug introduced in 1.23.0)
    • Fix all known put_in_order crashes. (#1120) (new crashes were introduced in 1.23.0)
    • Add missing files to release tarball that are required for testing. (#1124) (missing files were introduced in 1.23.0)

2024-07-03 - PgBouncer 1.23.0 - “Into the new beginnings”

  • Features

    • Add rolling restarts. SIGTERM now waits for all clients to disconnect before shutdown, instead of stopping PgBouncer immediately. This permits rolling restarts behind a load balancer or on a shared port with so_reuseport. This is a minor breaking change. If a Dockerfile or Systemd service file requires the old SIGTERM behavior, use SIGQUIT. (#902)
    • Add user name maps for cert and peer authentication. The connecting user no longer has to be the database user. These maps work similarly to Postgres maps, with exceptions listed in the documentation. (#996)
    • Add support for replication connections through PgBouncer. (#876)
  • Changes

    • Improve SHOW USERS output listing the connections. (#1040)
    • Allow pool_size configuration per user. (#1049)
    • Allow server_lifetime configuration per database. (#1057)
    • Add support for listing dynamically created users in the output of SHOW USERS. (#1052)
    • Add support for all address type in hba configuration. (#1078)
    • Add support for automatically restarting when using systemd. (#1080)
    • Increase c-ares minimum version requirement to 1.9.0 (#1076)
  • Fixes

    • Fix issues handling large and partial startup packets. (#1058)
    • Add support for --config=value format in options startup parameter. (#1064)
    • Fix avg_wait_time metric calculation. (#727)
    • Add support for negotiating the postgres protocol version with the client. (#1007)
    • Add outstanding request for auth_query. (#1034)
    • Multiple documentation and CI improvements.

PgBouncer 1.22.x

2024-03-04 - PgBouncer 1.22.1 - “It’s summer in Bangalore”

  • Fixes
    • Fix issues caused by some clients using COPY FROM STDIN queries. Such queries could introduce memory leaks, performance regressions and prepared statement misbehavior. (#1025) (bug introduced in 1.21.0)
    • Add missing tests to release tarball (#1026) (missing tests were introduced in 1.19.0 & 1.21.0)

2024-01-31 - PgBouncer 1.22.0 - “DEALLOCATE ALL”

  • Features

    • Adds support for DEALLOCATE ALL and DISCARD ALL when max_prepared_statements is set to a non-zero value (normal DEALLOCATE is still unsupported) (#972)
    • Support configuring auth_query per database (#979)
  • Changes

    • Improve settings in the recommended systemd unit file (#983)
    • Make fail fast logic handle all scenarios where no working connections to the database exist anymore and none can be established (#998)
    • Multiple documentation improvements
  • Fixes

    • Fix issue in PG14+ where PgBouncer would send SET DateStyle='ISO' for every transaction (#879)
    • Fix handling of empty application_name (#999)
    • Fix building on Windows with OpenSSL 3.2.0 (#1009)

PgBouncer 1.21.x

2023-10-16 - PgBouncer 1.21.0 - “The one with prepared statements”

  • Features

    • Add protocol-level named prepared statements, a frequently requested PgBouncer feature. Prepared statements can greatly reduce CPU use in PgBouncer and PostgreSQL. Synthetic benchmarks showed query throughput gains from 15% to 250%, depending on workload. To enable support, set max_prepared_statements above zero; the correct value depends on workload, but 100 is probably reasonable. See the docs on max_prepared_statements for behavior, limitations, and tuning.

      Then configure your client library to use prepared statements, following its documentation. Although this feature received extensive testing before release, its complexity can still cause bugs or performance problems. Report any problems that you find. (#845)

  • Changes

    • Improve security of OpenSSL settings, the defaults used were VERY outdated. With this release the defaults are now the same as the OpenSSL defaults of the system that runs PgBouncer. (#948 & libusual/#41)
    • PgBouncer now uses OpenSSL to calculate MD5 hashes when possible. This is necessary to use PgBouncer in a FIPS compliant way. (#949)
    • Maintain min_pool_size for pools with a forced user even if no clients are connected to PgBouncer (#947)
    • Change peer_id encoding in cancellation tokens. Peering no longer works across the v1.21.0 boundary. All peers must run versions either before this boundary or at/after it. (#945)
  • Fixes

    • Fix crash with error message: “FATAL in function client_proto(): bad client state: 6/7” (#928) (bug introduced in 1.18.0)
    • Fix crash with error message: “FATAL in function server_proto(): server in bad state: 11” (#927) (bug introduced in 1.18.0)
    • Reduce cancellation sending log level (#903)
    • Fix slog log prefix for peers (#922)
    • Fix typos in docs (#932)
    • Fix errors pointed out by static analyzer (#943)
    • Don’t kill all waiting clients on temporary FATAL errors during login (#946)
    • Use auto-database when database in auth_dbname is not explicitly configured (#921)
  • Cleanup

    • Remove support for udns (#938)

PgBouncer 1.20.x

2023-08-09 - PgBouncer 1.20.1 - “Optional options”

  • Fixes
    • Fix regression where putting options inside ignore_startup_parameters would not ignore unknown parameters inside the options startup parameter anymore. (#908) (regression was introduced in 1.20.0)
    • Fix confusing typo in the docs (#917)

2023-07-20 - PgBouncer 1.20.0 - “A funny name goes here”

  • Deprecations

    • Deprecate online restart. It has received little recent maintenance, has known issues, and often does not support new features. Use so_reuseport and peers to run multiple PgBouncer processes on one port. Restart them one at a time so that a process always listens on the required port. (#894)
  • Features

    • Add track_extra_parameters to track more transaction-pooling parameters. Previously, PgBouncer tracked only application_name, DateStyle, TimeZone, and standard_conforming_strings. It now also tracks IntervalStyle by default. Additional settings must be reported by PostgreSQL to clients. Citus 12.0+ makes PostgreSQL report search_path, so Citus users can add it to track_extra_parameters. (#867)
    • Forward SQLSTATE in authentication phase. This allows the detection of database not existing, which is done by Npgsql (a .NET data provider for PostgreSQL). (#814)
    • Change default server_tls_sslmode to prefer. (#866)
    • Add the options startup parameter. This enables the PGOPTIONS environment variable used by psql and libpq. It can set PostgreSQL parameters at startup, but only parameters tracked through track_extra_parameters. (#878)
  • Fixes

    • Don’t crash when the pgbouncer admin database is used as auth_dbname. It’s still not supported, but this now gives a clear error instead of crashing. (#817)
    • Fix name of peer_cache in SHOW MEM. It was incorrectly showing up as db_cache before. (#864)
    • Fix src/dst confusion in log. PgBouncer was logging a source IP when it meant to log the destination IP. (#880)
    • Only log admin connections over unix sockets when log_connections is set to 1. (#883)

PgBouncer 1.19.x

2023-05-31 - PgBouncer 1.19.1 - “Sunny Spring”

This is a minor release that fixes a few recently introduced bugs:

  • Fixes
    • Fix: FATAL in function disconnect_client(): bad client state: 0 (#846) (bug introduced in 1.18.0)
    • Fix: FATAL in function server_proto(): server in bad state: 14 (#849) (bug introduced in 1.18.0)
    • Add files required to run python based tests to release tarball (#852) (new tests introduced in 1.19.0)

2023-05-04 - PgBouncer 1.19.0 - “The old-fashioned, human-generated kind”

  • Features

    • Add auth_dbname option, which specifies against which database to run the auth_query. (#764)
    • Add the SHOW STATE command, which shows if PgBouncer is active, paused or suspended. (#528)
    • Add peering between PgBouncer processes. Cancellation requests can then work across multiple PgBouncer processes behind one load balancer. (#666)
    • Add a dedicated cancel_wait_timeout setting, which determines after how long to give up on forwarding a cancel request. Default is 10 seconds. (#833)
    • New testing framework (#792)
  • Fixes

    • Fix possible memory leak on TLS handshake failure. (#796)
    • Give more accurate error messages for unsupported command-line options on Windows. (#620)
    • Fix calling disconnect_server on a server in BEING_CANCELED state. (#815) (introduced in 1.18.0)
    • Don’t exit with a non-zero status when a SIGTERM is received. (#834)
    • Fail hard during startup when a socket could not be created in unix_socket_dir. (#830)
    • Fail hard during startup when none of the addresses in listen_addr could be listened on. (#838)
    • Give more warning messages with more information when sbuf_connect fails. This is especially useful when failing to create Unix sockets. (#837)
  • Cleanups

    • Various CI updates for better performance
    • Removed AppVeyor

PgBouncer 1.18.x

2022-12-12 - PgBouncer 1.18.0 - “No real mystery”

  • Features

    • Add application_name to SHOW CLIENTS/SERVERS/SOCKETS output (#449)
    • Add information about cancel requests to SHOW CLIENTS /SERVERS/ POOLS output (#782)
  • Fixes

    • Fail sbuf_send_pending operation if destination socket is closed (#652)
    • Fix a few possible crashes (#700, #730)
    • Fix for overflow bug in comma-separated host list feature, causing connection to get re-routed to Unix socket (#747)
    • Don’t evict connections to achieve min_pool_size (#648)
    • Fix SHOW HELP with PostgreSQL 15 (#769)
    • Fix a query cancellation race. A cancel request could arrive after its target query finished and cancel another client’s query instead. (#717)
  • Cleanups

    • Various CI updates

PgBouncer 1.17.x

2022-03-23 - PgBouncer 1.17.0 - “A line has been drawn”

  • Features

    • A database definition can specify a comma-separated host list. The hosts will be connected to in a round-robin manner.
    • When connecting to a non-existing database, the error (“no such database”) is now reported after authentication. This prevents unauthenticated clients from probing what databases exist. (This is similar to the change in version 1.15.0 to report missing users after authentication.)
    • Don’t send server disconnect errors to the client before login. This could reveal not-quite-public information, such as configuration details, to a client that is not logged in yet.
    • Increase the maximum password length again because the previous limit was still insufficient.
    • Remove automatic auth_file reload. The auth_file is now reread only on configuration file reload, no longer automatically as soon as it is changed.
    • The Windows build now includes a version-information resource file.
    • The Windows builds created on CI are now statically linked, so they can be used directly without requiring any dependencies.
  • Fixes

    • OpenSSL 3 support has been fixed. Previous releases would crash.
    • Do not apply fast-fail before authentication, to avoid reporting server errors to unauthenticated clients. This also fixes SCRAM pass-through cases that need a client authentication exchange to repair a server connection through reauthentication. Fast-fail still applies immediately after authentication, so observed behavior is usually unchanged.
    • Change auth_type in sample pgbouncer.ini to md5 to match the built-in default. Some deploy this file as the default configuration file, so check if this changed configuration still makes sense for you.
    • Fix crash at exit in assert-enabled builds.
    • Correct tcp_defer_accept documentation and behavior. The documented default was incorrect, and “show config” sometimes showed the wrong value. If configured on an unsupported platform, it now reports an error, consistent with other platform-specific socket options.
    • Fix build with c-ares on Windows. c-ares >=1.18.0 is now required on Windows.
  • Cleanups

    • Most deprecation warnings from Autoconf >=2.70 have been cleaned up. Older Autoconf versions are still supported.
    • Cirrus CI use has been expanded to more platforms.
    • Travis CI support has been removed.
    • Update locations to search for default root CA file, to cover more platforms, such as Fedora/RHEL/CentOS.
    • Python scripts now all use python3 by default. Python 2 compatibility is no longer maintained.
    • The test suite scripts use command -v instead of which, which is deprecated.
    • Several error messages have been reworded to make it clearer which command or configuration setting they relate to.
    • The test suite scripts no longer require GNU sed.
    • make check now works on Windows (but not the SSL test suite yet).
    • Document that the admin console only supports the simple query protocol, and give better error messages about this.

PgBouncer 1.16.x

2021-11-11 - PgBouncer 1.16.1 - “Test of depth against quiet efficiency”

This is a minor release with a security fix.

  • Make PgBouncer acting as a server reject extraneous data after an SSL or GSS encryption handshake.

    An attacker able to inject data into the TCP connection could insert cleartext at the start of an apparently encrypted database session. This could send forged SQL commands to the server if PgBouncer required no authentication data. SSL certificate authentication could allow such a setup. (CVE-2021-3935)

2021-08-09 - PgBouncer 1.16.0 - “Fended off a jaguar”

  • Features

    • Support hot reloading of TLS settings. When the configuration file is reloaded, changed TLS settings automatically take effect.
    • Add support for abstract Unix-domain sockets. Prefix a Unix-domain socket path with @ to use a socket in the abstract namespace. This matches the corresponding PostgreSQL 14 feature.
    • The maximum lengths of passwords and user names have been increased to 996 and 128, respectively. Various cloud services require this.
    • The minimum pool size can now be set per database, similar to the regular pool size and the reserve pool size.
    • The number of pending query cancellations is shown in SHOW POOLS.
  • Fixes

    • Enforce configuration errors more consistently. Previously, some paths logged errors and continued instead of failing startup. These errors now cause startup failure as intended. Existing invalid configurations might therefore stop working.
    • Fix query cancellation that could remain blocked for a long time. Cancel requests can now exceed pool size by a factor of two, which should prevent this delay. (#542, #543)
    • Mixed use of md5 and scram via hba has been fixed.
    • The build with c-ares on Windows has been fixed.
    • Fix the causes of “FIXME: query end, but query_start == 0” messages. These messages should no longer appear. (#565)
    • Fix reloading of default_pool_size, min_pool_size, and res_pool_size. Reloading these settings previously didn’t work.
  • Cleanups

    • Cirrus CI is now used instead of Travis CI.
    • As usual, many tests have been added.
    • Replace “unclean server” with clearer messages: “client disconnect while server was not ready” or “client disconnect before everything was sent to the server”. The first can occur when a client disconnects while its server has an open transaction block. The old message confused some users.
    • You can no longer use “pgbouncer” as a database name. This name is reserved for the admin console, and using it as a normal database name never really worked right. This is now explicitly prohibited.
    • Errors sent to clients before the connection is closed are now labeled as FATAL instead of just ERROR. Some clients were confused otherwise. (#564)
    • Fix compiler warnings with GCC 11. (#623)

PgBouncer 1.15.x

2020-11-19 - PgBouncer 1.15.0 - “Ich hab noch einen Koffer in Berlin”

  • Features

    • Return only a generic authentication failure to clients; details remain in the PgBouncer log. For nonexistent users, complete the authentication exchange and return the same failure. This prevents clients from probing user names or other authentication details, as in PostgreSQL.
    • Don’t log anything if client disconnects immediately. This avoids log spam when monitoring systems just open a TCP/IP connection but don’t send anything before disconnecting.
    • Use systemd native logging when stderr goes to the systemd journal. This avoids duplicate timestamps and PIDs. It also adds metadata such as severity, which remains useful if the journal is forwarded to syslog.
    • A subset of the test suite can now be run under Windows.
    • SHOW CONFIG now also shows the default values of the settings.
  • Fixes

    • Fix the so_reuseport option on FreeBSD. The original code in PgBouncer 1.12.0 didn’t actually work on FreeBSD. (#504)
    • Repair compilation on systems with older systemd versions. This was broken in 1.14.0. (#505)
    • The makefile target to build Windows binary zip packages has been repaired.
    • Long command-line options now also work on Windows.
    • Fix the behavior of the global auth_user setting. The old behavior was confusing and fragile as it depended on the order in the configuration file. This is no longer the case. (#391, #393)
  • Cleanups

    • Improve test stability and portability.
    • Modernize Autoconf-related code.
    • Disable deprecation compiler warnings from OpenSSL 3.0.0.

PgBouncer 1.14.x

2020-06-11 - PgBouncer 1.14.0 - “La ritrovata magia”

  • Features

    • Add SCRAM authentication pass-through. This allows using encrypted SCRAM secrets in PgBouncer (either in userlist.txt or from auth_query) for logging into servers.
    • Add support for systemd socket activation. This is especially useful to let systemd handle the creation of the Unix-domain sockets on systems where access to /var/run/postgresql is restricted.
    • Add support for Unix-domain sockets on Windows.
  • Cleanups

    • Add an alternative smaller sample configuration file pgbouncer-minimal.ini for testing or deployment.

PgBouncer 1.13.x

2020-04-27 - PgBouncer 1.13.0 - “My favourite game”

  • Features

    • Add configuration setting tcp_user_timeout, to set the corresponding socket option.
    • client_tls_protocols and server_tls_protocols now default to secure, which means only TLS 1.2 and TLS 1.3 are enabled. Older versions are still supported, they are just not turned on by default.
    • Add support for systemd service notifications. Right now, this allows using Type=notify service units. More integration is planned for future versions.
  • Fixes

    • Fix multiline log messages (libusual #24)
    • Handle null user names returned from auth_query properly (#340)
  • Cleanups

    • The Debian packaging files under debian have been removed. It is recommended to use the packages from https://apt.postgresql.org/.
    • Numerous fixes and improvements in the test suite
    • The tests no longer try to use sudo by default. This can now be activated explicitly by setting the environment variable USE_SUDO.
    • The libevent API use was updated to use version 2 style interfaces and to no longer use deprecated interfaces from version 1.

PgBouncer 1.12.x

2019-10-17 - PgBouncer 1.12.0 - “It’s about learning and getting better”

This release contains a variety of minor enhancements and fixes.

  • Features

    • Add a setting to turn on the SO_REUSEPORT socket option. On some operating systems, this allows running multiple PgBouncer instances on the same host listening on the same port and having the kernel distribute the connections automatically.
    • Add a setting to use a resolv.conf file separate from the operating system. This allows setting custom DNS servers and perhaps other DNS options.
    • Send the output of SHOW VERSION as a normal result row instead of a NOTICE message. This makes it easier to consume and is consistent with other SHOW commands.
  • Fixes

    • Send statistics columns as numeric instead of bigint. This avoids some client libraries failing on values that overflow the bigint range. (#360, #401)
    • Fix issue with PAM users losing their password. (#285)
    • Accept clients that offer SCRAM channel binding, such as PostgreSQL 11+ clients. Previously, they could fail to connect in some cases. PgBouncer still does not support channel binding; this change permits clients that offer it.
    • Fix compilation with newer versions of musl-libc (used by Alpine Linux).
  • Cleanups

    • Add make check target. This allows running all the tests from a single command.
    • Remove references to the PostgreSQL wiki. All information is now either in the PgBouncer documentation or on the web site.
    • Remove support for Libevent version 1.x. Libevent 2.x is now required. Libevent is now detected using pkg-config.
    • Fix compiler warnings on macOS and Windows. The build on these platforms should now be free of warnings.
    • Fix some warnings from LLVM scan-build.

PgBouncer 1.11.x

2019-08-27 - PgBouncer 1.11.0 - “Instinct for Greatness”

  • Features
    • Add support for SCRAM authentication for clients and servers. A new authentication type scram-sha-256 is added.
    • Handle auth_type=password when the stored password is md5, like a PostgreSQL server would. (#129)
    • Add option log_stats to disable printing stats to log. (#287)
    • Add time zone to log timestamps.
    • Put PID into [brackets] in log prefix.
  • Fixes
    • Fix OpenSSL configure test when running against newer OpenSSL with -Werror.
    • Fix wait time computation with auth_user. This would either crash or report garbage values for wait time. (#393)
    • Handle GSSENCRequest packet, added in PostgreSQL 12. It doesn’t do anything right now, but it avoids confusing error messages about “bad packet header”.
  • Cleanups
    • Many improvements in the test suite and several new tests
    • Fix several compiler warnings on Windows.
    • Expand documentation of the [users] section and add to example config file. (#330)

PgBouncer 1.10.x

2019-07-01 - PgBouncer 1.10.0 - “Afraid of the World”

  • Features
    • Allow TLS protocol settings to enable or disable TLS 1.3. TLS 1.3 support previously depended on the OpenSSL library, but these settings did not include it.
  • Fixes
    • Fix TLS 1.3 support. This was broken with OpenSSL 1.1.1 and 1.1.1a (but not before or after).
    • Fix a rare crash in SHOW FDS (#311).
    • Fix an issue that could lead to prolonged downtime if many cancel requests arrive (#329).
    • Avoid “unexpected response from login query” after a postgres reload (#220).
    • Fix idle_transaction_timeout calculation (#125). The bug would lead to premature timeouts in specific situations.
  • Cleanups
    • Make various log and error messages more precise.
    • Fix issues found by Coverity (none had a significant impact in practice).
    • Improve and document all test scripts.
    • Add additional SHOW commands to the documentation.
    • Convert the documentation from rst to Markdown.
    • Python scripts in the source tree are all compatible with Python 3 now.

PgBouncer 1.9.x

2018-08-13 - PgBouncer 1.9.0 - “Chaos Survival”

  • Features
    • RECONNECT command
    • WAIT_CLOSE command
    • Fast close - Disconnect a server in session pool mode immediately if it is in “close_needed” (reconnect) mode.
    • Add close_needed column to SHOW SERVERS
  • Fixes
    • Avoid double-free in parse_filename
    • Avoid NULL pointer deref in parse_line
  • Cleanups
    • Port mkauth.py to Python 3
    • Improve signals documentation
    • Improve quick start documentation
    • Document SET command
    • Correct list of required software
    • Fix -Wimplicit-fallthrough warnings
    • Add missing documentation for various SHOW fields
    • Document reconnect behavior on reload and DNS change
    • Document that KILL requires RESUME afterwards
    • Clarify documentation of server_lifetime
    • Typos and capitalization fixes in messages and docs
    • Fix psql invocation in tests
    • Various other test setup improvements

PgBouncer 1.8.x

2017-12-20 - PgBouncer 1.8.1 - “Ground-and-pound Mentality”

  • Fixes
    • Include file include/pam.h into distribution tarball. This prevented the 1.8 tarball from building at all.

2017-12-19 - PgBouncer 1.8 - “Confident at the Helm”

  • Features
    • Support PAM authentication. (Enable with --with-pam.)
    • Add paused and disabled fields to SHOW DATABASES output.
    • Add maxwait_us field to SHOW POOLS output.
    • Add wait and wait_us fields to SHOW commands output.
    • Add new commands SHOW STATS_TOTALS and SHOW STATS_AVERAGES.
    • Track queries and transactions separately in SHOW STATS. The fields total_requests, avg_req, and avg_query have been replaced by new fields.
    • Add wait_time to SHOW STATS.
  • Fixes
    • Updated libusual supports OpenSSL 1.1.
    • Do not attempt to use TLS on Unix sockets.
    • When parsing pg_hba.conf, keep parsing after erroneous lines instead of rejecting the whole file. (#118)
    • Several other hba parsing fixes.
    • Fix race condition when canceling query. (#141)
  • Cleanups
    • auth_user setting is now also allowed globally, not only per database. (#142)
    • Set console client and server encoding to UTF8.

PgBouncer 1.7.x

2016-02-26 - PgBouncer 1.7.2 - “Finally Airborne”

  • Fixes
    • Fix crash on stale pidfile removal. Problem introduced in 1.7.1.
    • Disable cleanup - it breaks takeover and is not useful for production loads. Problem introduced in 1.7.1.
    • After takeover, wait until pidfile is gone before booting. Slow shutdown due to memory cleanup exposed existing race. (#113)
  • Cleanups
    • Make build reproducible by dropping DBGVER handling. (#112)
    • Antimake: Sort file list from $(wildcard), newer gmake does not sort it anymore. (#111)
    • Show libssl version in log.
    • deb: Turn on full hardening.

2016-02-18 - PgBouncer 1.7.1 - “Forward To Five Friends Or Else”

WARNING: Since 1.7, PgBouncer does not execute server_reset_query in transaction pooling mode. The 1.7 announcement did not sufficiently highlight this change. If your applications require the old behavior, enable server_reset_query_always.

This release investigated a suspected TLS memory leak, but no leak was found. The Debian/wheezy libssl build uses 600k per connection instead of the expected 20-30k. Consider this overhead when using TLS.

  • Fixes
    • TLS: Rename sslmode “disabled” to “disable” as that is what PostgreSQL uses.
    • TLS: client_tls_sslmode=verify-ca/-full now reject connections without client certificate. (#104)
    • TLS: client_tls_sslmode=allow/require do validate client certificate if sent. Previously they left cert validation unconfigured so connections with client cert failed. (#105)
    • Fix memleak when freeing database.
    • Fix potential memleak in tls_handshake().
    • Fix EOF handling in tls_handshake().
    • Fix too small memset in asn1_time_parse compat.
    • Fix non-TLS (--without-openssl) build. (#101)
    • Fix various issues with Windows build. (#100)
  • Cleanups
    • TLS: Use SSL_MODE_RELEASE_BUFFERS to decrease memory usage of inactive connections.
    • Clean allocated memory on exit. Helps to run memory-leak checkers.
    • Improve server_reset_query documentation. (#110)
    • Add TLS options to sample config.

2015-12-18 - PgBouncer 1.7 - “Colors Vary After Resurrection”

  • Features
    • Support TLS connections. OpenSSL/LibreSSL is used as backend implementation.
    • Support authentication via TLS client certificate.
    • Support “peer” authentication on Unix sockets.
    • Support Host Based Access control file, like pg_hba.conf in Postgres. This allows to configure TLS for network connections and “peer” authentication for local connections.
  • Cleanups
    • Set the default query_wait_timeout to 120s. The previous default, 0, allowed an unlimited wait. PgBouncer now drops clients whose pending query cannot obtain a server connection within the limit.
    • Disable server_reset_query_always by default. Now reset query is used only in pools that are in session mode.
    • Increase pkt_buf to 4096 bytes to improve TLS performance. The effect probably depends on load. Since v1.2, packet buffers are separate from connections and allocated lazily from a pool, so this should be safe.
    • Support pipelining count expected ReadyForQuery packets. This avoids releasing server too early. Fixes #52.
    • Improved sbuf_loopcnt logic - socket is guarateed to be reprocessed even if there are no event from socket. Required for TLS as it has it’s own buffering.
    • Adapt system tests to work with modern BSD and MacOS. (Eric Radman)
    • Remove crypt auth. It’s obsolete and not supported by PostgreSQL since 8.4.
    • Fix plain “–with-cares” configure option - without argument it was broken.

PgBouncer 1.6.x

2015-09-03 - PgBouncer 1.6.1 - “Studio Audience Approves”

  • Features

    • New setting: server_reset_query_always. When set, disables server_reset_query use on non-session pools. PgBouncer introduces per-pool pool_mode, but session-pooling and transaction-pooling should not use same reset query. In fact, transaction-pooling should not use any reset query.

      It is set in 1.6.x, but will be disabled in 1.7.

  • Fixes

    • [SECURITY] Remove invalid assignment of auth_user. (#69) When auth_user is set and client asks non-existing username, client will log in as auth_user. Not good.

      CVE-2015-6817

    • Skip NoticeResponse in handle_auth_response. Otherwise verbose log levels on server cause login failures.

    • console: Fill auth_user when auth_type=any. Otherwise logging can crash (#67).

    • Various portability fixes (OpenBSD, Solaris, OSX).

2015-08-01 - PgBouncer 1.6 - “Zombies of the future”

  • Features

    • Load user password hash from postgres database. New parameters:

      auth_user user to use for connecting same db and fetching user info. Can be set per-database too.

      auth_query SQL query to run under auth_user. Default: “SELECT usename, passwd FROM pg_shadow WHERE usename=$1”

      (Cody Cutrer)

    • Pooling mode can be configured both per-database and per-user. (Cody Cutrer)

    • Per-database and per-user connection limits: max_db_connections and max_user_connections. (Cody Cutrer / Pavel Stehule)

    • Add DISABLE/ENABLE commands to prevent new connections. (William Grant)

    • Add c-ares as a DNS backend. It supports /etc/hosts refresh, SOA lookup, large replies through TCP or EDNS+UDP, and IPv6. It is now preferred and will probably become the only backend, replacing libraries with incomplete support.

      c-ares versions <= 1.10 have a CNAME bug when IPv6 is enabled. Upstream has fixed it. As a workaround, PgBouncer uses c-ares <= 1.10 in IPv4-only mode. Other backends will remain until c-ares >1.10, still unreleased at this point, has been available for some time.

    • Show remote_pid in SHOW CLIENTS/SERVERS. Available for clients that connect over unix sockets and both tcp and unix socket server. In case of tcp-server, the pid is taken from cancel key.

    • Add separate config param (dns_nxdomain_ttl) for controlling negative dns caching. (Cody Cutrer)

    • Add the client host IP address and port to application_name. This is enabled by a config parameter application_name_add_host which defaults to ‘off’. (Andrew Dunstan)

    • Config files have ‘%include FILENAME’ directive to allow configuration to be split into several files. (Andrew Dunstan)

  • Cleanups

    • log: wrap ipv6 address with []
    • log: On connect to server, show local ip and port
    • win32: use gnu-style for long args: –foo
    • Allow numbers in hostname, always try to parse with inet_pton
    • Fix deallocate_all() in FAQ
    • Fix incorrect keyword in example config file (Magnus Hagander)
    • Allow comments (with ‘;’) in auth files. (Guillaume Aubert)
    • Fix spelling mistakes in log messages and comments. (Dmitriy Olshevskiy)
  • Fixes

    • fix launching new connections during maintenance (Cody Cutrer)
    • don’t load auth file twice at boot (Cody Cutrer)
    • Proper invalidation for autodbs
    • ipv6: Set IPV6_V6ONLY on listen socket.
    • win32: Don’t set SO_REUSEADDR on listen socket.
    • Fix IPv6 address memcpy
    • Fix cancellation of waiting clients. (Mathieu Fenniak)
    • Small bug fix, must check calloc result (Heikki Linnakangas)
    • Add newline at the end of the PID file (Peter Eisentraut)
    • Don’t allow new server connections when PAUSE was issued. (Petr Jelinek)
    • Fix ‘bad packet’ during login when header is delayed. (Michał Trojnara, Marko Kreen)
    • Fix errors detected by Coverty. (Euler Taveira)
    • Disable server_idle_timeout when server count gets below min_pool (#60) (Marko Kreen)

PgBouncer 1.5.x

2015-04-09 - PgBouncer 1.5.5 - “Play Dead To Win”

  • Fixes
    • Fix remote crash - invalid packet order causes lookup of NULL pointer. Not exploitable, just DoS.

2012-11-28 - PgBouncer 1.5.4 - “No Leaks, Potty-Training Successful”

  • Fixes
    • DNS: Fix memory leak in getaddrinfo_a() backend.
    • DNS: Fix memory leak in udns backend.
    • DNS: Fix stats calculation.
    • DNS: Improve error message handling for getaddrinfo_a().
    • Fix win32 compile.
    • Fix compiler dependency support check in configure.
    • Few documentation fixes.

2012-09-12 - PgBouncer 1.5.3 - “Quantum Toaster”

  • Critical fix

    • Overlong database names can crash PgBouncer. Remote clients can trigger this when autodbs are enabled.

      The original checks assumed that all names came from configuration files, so fatal() was acceptable. With ‘*’ in [databases], autodbs accept database names from the network. This allowed remote shutdown.

      CVE-2012-4575

  • Minor Features

    • max_packet_size - config parameter to tune maximum packet size that is allowed through. Default is kept same: (2G-1), but now it can be made smaller.
    • In case of unparsable packet header, show it in hex in log and error message.
  • Fixes

    • AntiMake used $(relpath) and $(abspath) for path manipulation. Builds failed when the source path contained symlinks. The code now operates on plain strings.
    • console: now SET can be used to set empty string values.
    • config.txt: show that all timeouts can be set in floats. This is well-hidden feature introduced in 1.4.

2012-05-29 - PgBouncer 1.5.2 - “Don’t Chew, Just Swallow”

  • Fixes
    • Interpret reserve_pool_timeout in seconds as intended. Previously, it used microseconds and activated the reserve pool almost immediately when the pool filled. (Noticed by Keyur Govande)

2012-04-17 - PgBouncer 1.5.1 - “Abort, Retry, Ignore?”

  • Features
    • Parameters to tune permissions on unix socket: unix_socket_mode=0777, unix_socket_group=’’.
  • Fixes
    • Allow empty string for server-side variable - this is needed to get “application_name” properly working, as it’s the only parameter that does not have server-side default.
    • If connect string changes, require refresh of server parameters. Previously PgBouncer continued with old parameters, which breaks in case of Postgres upgrade.
    • If autodb connect string changes, drop old connections.
    • cf_setint: Use strtol() instead atoi() to parse integer config parameters. It allows hex, octal and better error detection.
    • Use sigqueue() to detect union sigval existence - fixes compilation on HPUX.
    • Remove ‘git’ command from Makefile, it throws random errors in case of plain-tarball build.
    • Document stats_period parameter. This tunes the period for stats output.
    • Require Asciidoc >= 8.4, seems docs are not compatible with earlier versions anymore.
    • Stop trying to retry on EINTR from close().

2012-01-05 - PgBouncer 1.5 - “Bouncing Satisfied Clients Since 2007”

If you use more than 8 IPs behind one DNS name, you now need to use EDNS0 protocol to query. Only getaddrinfo_a()/getaddrinfo() and UDNS backends support it, libevent 1.x/2.x does not. To enable it for libc, add ‘options edns0’ to /etc/resolv.conf.

GNU Make 3.81+ is required for building.

  • Features
    • Detect DNS reply changes and invalidate connections to IPs no longer present in latest reply. (Petr Jelinek)
    • Add DNS zone serial-based hostname invalidation. With dns_zone_check_period set, PgBouncer queries all DNS zones for SOA and queries all hostnames when the serial changes. This gives deterministic invalidation even when normal lookups do not occur. It requires the new UDNS backend.
    • New SHOW DNS_HOSTS, SHOW DNS_ZONES commands to examine DNS cache.
    • New param: min_pool_size - avoids dropping all connections when there is no load. (Filip Rembiałkowski)
    • idle_in_transaction_timeout - kill transaction if idle too long. Not set by default.
    • New libudns backend for DNS lookups. More featureful than evdns. Use –with-udns to activate. Does not work with IPv6 yet.
    • KILL command, to immediately kill all connections for one database. (Michael Tharp)
    • Move to Antimake build system to have better looking Makefiles. Now GNU Make 3.81+ is required for building.
  • Fixes
    • DNS now works with IPv6 hostnames.
    • Don’t change connection state when NOTIFY arrives from server.
    • Various documentation fixes. (Dan McGee)
    • Console: Support ident quoting with “”. Originally we did not have any commands that took database names, so no quoting was needed.
    • Console: allow numbers at the start of word regex. Trying to use strict parser makes things too complex here.
    • Don’t expire auto DBs that are paused. (Michael Tharp)
    • Create auto databases as needed when doing PAUSE. (Michael Tharp)
    • Fix wrong log message issued by RESUME command. (Peter Eisentraut)
    • When user= without password= is in database connect string, password will be taken from userlist.
    • Parse ‘*’ properly in takeover code.
    • autogen.sh: work with older autoconf/automake.
    • Fix run-as-service crash on win32 due to bad basename() from mingw/msvc runtime. Now compat basename() is always used.

PgBouncer 1.4.x

2011-06-16 - PgBouncer 1.4.2 - “Strike-First Algorithm”

Affected OS-es: *BSD, Solaris, Win32.

  • Portability Fixes
    • Give CFLAGS to linker. Needed when using pthread-based getaddrinfo_a() fallback.
    • lib/find_modules.sh: Replace split() with index()+substr(). This should make it work with older AWKs.
    • <usual/endian.h>: Ignore system htoX/Xtoh defines. There may be only subset of macros defined.
    • <usual/signal.h>: Separate compat sigval from compat sigevent
    • <usual/socket.h>: Include <sys/uio.h> to get iovec
    • <usual/time.h>: Better function autodetection on win32
    • <usual/base_win32.h>: Remove duplicate sigval/sigevent declaration

2011-04-01 - PgBouncer 1.4.1 - “It Was All An Act”

  • Features

    • Support listening/connect for IPv6 addresses. (Hannu Krosing)
    • Multiple listen addresses in ’listen_addr’. For each getaddrinfo() is called, so names can also be used.
    • console: Send PgBouncer version as ‘server_version’ to client.
  • Important Fixes

    • Disable getaddrinfo_a() on glibc < 2.9 as it crashes on older versions.

      Affected systems include RHEL/CentOS 5.x (glibc 2.5) and Ubuntu 8.04 (glibc 2.7). Debian/lenny (glibc 2.7) has a non-crashing getaddrinfo_a(), but the build cannot reliably detect this exception.

      Use libevent 2.x on these systems. The fallback getaddrinfo_a() is not intended for production. Read the new ‘DNS lookup support’ section in README for backend selection details.

      (Hubert Depesz Lubaczewski, Dominique Hermsdorff, David Sommerseth)

    • Default to –enable-evdns if libevent 2.x is used.

    • Turn on tcp_keepalive by default, as that’s what Postgres also does. (Hubert Depesz Lubaczewski)

    • Set default server_reset_query to DISCARD ALL to be compatible with Postgres by default.

    • win32: Fix crashes with NULL unix socket addr. (Hiroshi Saito)

    • Fix autodb cleanup confusion between databases and pools. Previously, one empty pool marked the database idle. Later cleanup could then kill a database with active users.

      Reported-By: Hubert Depesz Lubaczewski

  • Fixes

    • Make compat getaddrinfo_a() non-blocking, by using single parallel thread to do lookups.
    • Enable pthread compilation if compat getaddrinfo_a is used.
    • release_server missed setting ->last_lifetime_disconnect on lifetime disconnect. (Emmanuel Courreges)
    • win32: fix auth file on DOS line endings - load_file() did not take account of file shringage when loading. (Rich Schaaf)
    • <usual/endian.h>: add autoconf detection for enc/dec functions so it would not create conflicts on BSD. (James Pye)
    • Don’t crash when config file does not exist. (Lou Picciano)
    • Don’t crash on DNS lookup failure when logging on noise level (-v -v). (Hubert Depesz Lubaczewski, Dominique Hermsdorff)
    • Use backticks instead of $(cmd) in find_modules.sh to make it more portable. (Lou Picciano)
    • Use ‘awk’ instead of ‘sed’ in find_modules.sh to make it more portable. (Giorgio Valoti)
    • Log active async DNS backend info on startup.
    • Fix –disable-evdns to mean ’no’ instead ‘yes’.
    • Mention in docs that -R requires unix_socket_dir.
    • Discuss server_reset_query in faq.txt.
    • Restore lost memset in slab allocator
    • Various minor portability fixes in libusual.

2011-01-11 - PgBouncer 1.4 - “Gore Code”

  • Features

    • Async DNS lookup - instead of resolving hostnames at reload time, the names are now resolved at connect time, with configurable caching. (See dns_max_ttl parameter.)

      By default it uses getaddrinfo_a() (glibc) as backend, if it does not exist, then getaddrinfo_a() is emulated via blocking(!) getaddrinfo().

      When –enable-evdns argument to configure, libevent’s evdns is used as backend. It is not used by default, because libevent 1.3/1.4 contain buggy implementation. Only evdns in libevent 2.0 seems OK.

    • New config var: syslog_ident, to tune syslog name.

    • Proper support for application_name startup parameter.

    • Command line long options (Guillaume Lelarge)

    • Solaris portability fixes (Hubert Depesz Lubaczewski)

    • Add disable_pqexec to disable Simple Query Protocol where required. Applications must then use only Extended Query Protocol.

    • Postgres compat: if database name is empty in startup packet, use user name as database.

  • Fixes

    • DateStyle and TimeZone server params need to use exact case.
    • Console: send datetime, timezone and stdstr server params to client.
  • Internal cleanups

    • Use libusual library for low-level utility functions.
    • Remove fixed-length limit from server params.

PgBouncer 1.3.x

2010-09-09 - PgBouncer 1.3.4 - “Bouncer is always right”

  • Fixes
    • Apply fast-fail logic at connect time. So if server is failing, the clients get error when connecting.
    • Don’t tag automatically generated databases for checking on reload time, otherwise they get killed, because they don’t exist in config.
    • Ignore application_name parameter by default. This avoids the need for all Postgres 9.0 users to add it into ignore_startup_parameters= themselves.
    • Correct pg_auth quoting. ‘' is not used there.
    • Better error reporting on console, show incoming query to user.
    • Support OS’es (OpenBSD) where tv_sec is not time_t.
    • Avoid too noisy warnings on gcc 4.5.

2010-05-10 - PgBouncer 1.3.3 - “NSFW”

  • Improvements
    • Make listen(2) argument configurable: listen_backlog. This is useful on OS’es, where system max allowed is configurable.
    • Improve disconnect messages to show what username or dbname caused login to fail.
  • Fixes
    • Adjust fast-fail relaunch. Previously, permanently invalid databases or users caused retries even without waiting clients.
    • Preserve errno in logging functions. Changing it could cause incorrect PgBouncer behavior at high log levels or after logging errors.
    • Increase the size of various startup-related buffers to handle EDB more noisy startup.
    • Detect V2 protocol startup request and give clear reason for disconnect.

2010-03-15 - PgBouncer 1.3.2 - “Boomerang Bullet”

  • Fixes

    • New config var ‘query_wait_timeout’. If client does not get server connection in this many seconds, it will be killed.

    • If no server connection in pool and last connect failed, then don’t put client connections on hold but send error immediately.

      This together with previous fix avoids unnecessary stalls if a database has gone down.

    • Track libevent state in sbuf.c to avoid double event_del(). Although it usually is safe, it does not seem to work 100%. Now we should always know whether it has been called or not.

    • Disable maintenance during SUSPEND. Otherwise with short timeouts the old bouncer could close few connections after sending them over.

    • Apply client_login_timeout to clients waiting for welcome packet (first server connection). Otherwise they can stay waiting infinitely, unless there is query_timeout set.

    • win32: Add switch -U/-P to -regservice to let user pick account to run service under. Old automatic choice between Local Service and Local System was not reliable enough.

    • console: Remove \0 from end of text columns. It was hard to notice, as C clients were fine with it.

    • Documentation improvements. (Greg Sabino Mullane)

    • Clarify few login-related log messages.

    • Change logging level for pooler-sent errors (usually on disconnect) from INFO to WARNING, as they signify problems.

    • Change log message for query_timeout to “query timeout”.

2009-07-06 - PgBouncer 1.3.1 - “Now fully conforming to NSA monitoring requirements”

  • Fixes
    • Fix sbuf_loopcnt connection hangs. A query or result near a multiple of (pktlen*sbuf_loopcnt), 10k by default, could wait indefinitely for nonexistent extra data.
    • Make database reconfigure immediate. Currently old connections could be reused after SIGHUP.
    • Fix SHOW DATABASES which was broken due to column addition.
    • Console access was disabled when “auth_type=any” as pgbouncer dropped username. Fix: if “auth_type=any”, allow any user to console as admin.
    • Fix bad CUSTOM_ALIGN macro. Luckily it’s unused if OS already defines ALIGN macro thus seems the bug has not happened in wild.
    • win32: call WSAStartup() always, not only in daemon mode as config parsing wants to resolve hosts.
    • win32: put quotes around config filename in service cmdline to allow spaces in paths. Executable path does not seem to need it due to some win32 magic.
    • Add STATS to SHOW HELP text.
    • doc/usage.txt: the time units in console results are in microseconds, not milliseconds.

2009-02-18 - PgBouncer 1.3 - “New Ki-Smash Finishing Move”

  • Features

    • IANA assigned official PgBouncer port 6432, which is now the default. Existing individual users do not need to change ports. Package distributors should change their package default to 6432.

    • Dynamic database creation (David Galoyan)

      Now you can define database with name “*”. If defined, it’s connect string will be used for all undefined databases. Useful mostly for test / dev environments.

    • Windows support (Hiroshi Saito)

      PgBouncer runs on Windows 2000+ now. Command line usage stays same, except it cannot run as daemon and cannot do online reboot. To run as service, define parameter service_name in config. Then:

      > pgbouncer.exe config.ini -regservice
      > net start SERVICE_NAME
      

      To stop and unregister:

      > net stop SERVICE_NAME
      > pgbouncer.exe config.ini -unregservice
      

      To use Windows Event Log, event DLL needs to be registered first:

      > regsrv32 pgbevent.dll
      

      Afterwards you can set “syslog = 1” in config.

  • Minor features

    • Database names in config file can now be quoted with standard SQL ident quoting, to allow non-standard characters in db names.

    • Add ‘reserve_pool_size’ and ‘reserve_pool_timeout’. If clients wait longer than ‘reserve_pool_timeout’ seconds, PgBouncer can add ‘reserve_pool_size’ connections. Set this per pool with the ‘reserve_pool’ connection variable.

    • New tunable ‘sbuf_loopcnt’ to limit time spent on one socket.

      On an SMP server with local Postgres and a fast network, recv()->send() can repeat without blocking. This delays other connections. Limit iterations per socket to distribute processing more evenly. At the limit, process other sockets and resume this socket on the next event loop.

      Thanks to Alexander Schöcke for report and testing.

    • crypt() authentication is now optional, as it was removed from Postgres. If OS does not provide it, pgbouncer works fine without it.

    • Add milliseconds to log timestamps.

    • Replace old MD5 implementation with more compact one.

    • Update ISC licence with the FSF clarification.

  • Fixes

    • Continue cleanup after event_del() failure. Previously, PgBouncer retried because failure could indicate ENOMEM. Repeated retries caused infinite log output, which suggests libevent does not support this behavior.

      The cause of the initial event_del() failure remains unknown.

    • –enable-debug now just toggles whether debug info is stripped from binary. It no longer plays with -fomit-frame-pointer as it’s dangerous.

    • Fix include order, as otherwise system includes could come before internal ones. Was problem for new md5.h include file.

    • Include COPYRIGHT file in .tgz…


PgBouncer 1.2.x

2008-08-08 - PgBouncer 1.2.3 - “Carefully Selected Bytes”

  • Fixes
    • Disable SO_ACCEPTFILTER code for BSDs which did not work.
    • Include example etc/userlist.txt in tgz.
    • Use ‘$(MAKE)’ instead ‘make’ for recursion (Jørgen Austvik)
    • Define _GNU_SOURCE as glibc is useless otherwise.
    • Let the libevent 1.1 pass link test so we can later report “1.3b+ needed”
    • Detect stale pidfile and remove it.

Thanks to Devrim GÜNDÜZ and Bjoern Metzdorf for problem reports and testing.

2008-08-06 - PgBouncer 1.2.2 - “Barf-bag Included”

  • Fixes
    • Remove ‘drop_on_error’. This workaround for broken Postgres plan cache behavior can cause problems when queries consistently return errors.

2008-08-04 - PgBouncer 1.2.1 - “Waterproof”

  • Features
    • New parameter ‘drop_on_error’ - if server throws error the connection will not be reused but dropped after client finished with it. This is needed to refresh plan cache. Automatic refresh does not work even in 8.3. Defaults to 1.
  • Fixes
    • SHOW SOCKETS/CLIENTS/SERVERS: Don’t crash if socket has no buffer.
    • Fix infinite loop on SUSPEND if suspend_timeout triggers.
  • Minor cleanups
    • Use <sys/uio.h> for ‘struct iovec’.
    • Cancel shutdown (from SIGINT) on RESUME/SIGUSR2, otherwise it will trigger on next PAUSE.
    • Proper log message if console operation is canceled.

2008-07-29 - PgBouncer 1.2 - “Ordinary Magic Flute”

PgBouncer 1.2 now requires libevent version 1.3b or newer. Older libevent versions crash with new restart code.

  • Features

    • Command line option (-u) and config parameter (user=) to support user switching at startup. Also now pgbouncer refuses to run as root.

      (Jacob Coby)

    • More descriptive usage text (-h). (Jacob Coby)

    • New database option: connect_query to allow run a query on new connections before they are taken into use.

      (Teodor Sigaev)

    • Add ‘ignore_startup_parameters’ to accept and ignore additional startup parameters. By default, only ‘database’ and ‘user’ are accepted. Other parameters cause errors. This supports JDBC clients that always set ’extra_float_digits=2’ at startup.

    • Logging to syslog: new parameters syslog=0/1 and syslog_facility=daemon/user/local0.

    • Less scary online restart (-R)

      • Move FD loading before fork, so it logs to console and can be canceled by ^C

      • Keep SHUTDOWN after fork, so ^C would be safe

      • A connect() is attempted to unix socket to see if anyone is listening. Now -R can be used even when no previous process was running. If there is previous process, but -R is not used, startup fails.

    • New console commands:

      • SHOW TOTALS that shows stats summary (as goes to log) plus mem usage.

      • SHOW ACTIVE_SOCKETS - like show sockets; but filter only active ones.

  • Less visible features

    • suspend_timeout - drop stalled conns and long logins. This brings additional safety to reboot.

    • When remote database throws error on logging in, notify clients.

    • Removing a database from config and reloading works - all connections are killed and the database is removed.

    • Fake some parameters on console SHOW/SET commands to be more Postgres-like. That was needed to allow psycopg to connect to console. (client_encoding/default_transaction_isolation/datestyle/timezone)

    • Make server_lifetime=0 disconnect server connection immediately after first use. Previously “0” made PgBouncer ignore server age. As this behavior was undocumented, there should not be any users depending on it.

    • Internal improvements:

      • Packet buffers are allocated lazily and reused. This should bring huge decrease in memory usage. This also makes realistic to use big pktbuf with lot of connections.

      • Lot’s of error handling improvements, PgBouncer should now survive OOM situations gracefully.

      • Use slab allocator for memory management.

      • Lots of code cleanups.

  • Fixes

    • Drain the listening socket fully on each event loop. Previously, one accept() per loop could create a backlog under heavy connection load. This should resolve that backlog.
    • Handle EINTR from connect().
    • Make configure.ac compatible with autoconf 2.59.
    • Solaris compatibility fixes (Magne Mæhre)

PgBouncer 1.1.x

2007-12-10 - PgBouncer 1.1.2 - “The Hammer”

  • Features
    • Disconnects because of server_lifetime are now separated by (server_lifetime / pool_size) seconds. This avoids pgbouncer causing reconnect floods.
  • Fixes
    • Online upgrade 1.0 -> 1.1 problems:
      • 1.0 does not track server parameters, so they stay NULL but 1.1 did not expect it and crashed.
      • If server params are unknown, but client ones are set, then issue a SET for them, instead complaining.
    • Remove temp debug statements that were accidentally left in code on INFO level, so they polluted logs.
    • Unbroke debian/changelog
  • Cleanup
    • reorder struct SBuf fields to get better alignment for buffer.

2007-10-26 - PgBouncer 1.1.1 - “Breakdancing Bee”

  • Fixes
    • Server parameter cache could stay uninitialized, which caused unnecessary SET of them. This caused problem on 8.1 which does not allow touching standard_conforming_strings. (Thanks to Dimitri Fontaine for report & testing.)
    • Some doc fixes.
    • Include doc/fixman.py in .tgz.

2007-10-09 - PgBouncer 1.1 - “Mad-Hat Toolbox”

  • Features

    • Keep track of following server parameters:

      client_encoding  datestyle, timezone, standard_conforming_strings
      
    • Database connect string enhancements:

      • Accept hostname in host=
      • Accept custom unix socket location in host=
      • Accept quoted values: password=’ asd’‘foo’
    • New config var: server_reset_query, to be sent immediately after release

    • New config var: server_round_robin, to switch between LIFO and RR.

    • Cancel pkt sent for idle connection does not drop it anymore.

    • Cancel with ^C from psql works for SUSPEND / PAUSE.

    • Print FD limits on startup.

    • When suspending, try to hit packet boundary ASAP.

    • Add ’timezone’ to database parameters.

    • Use longlived logfile fd. Reopened on SIGHUP / RELOAD;

    • Local connection endpoint info in SHOW SERVERS/CLIENTS/SOCKETS.

  • Code cleanup

    • More debug log messages include socket info.
    • Magic number removal and error message cleanup. (David Fetter)
    • Wrapper struct for current pkt info. Removes a lot of complexity.
  • Fixes

    • Detect invalid pkt headers better.
    • auth_file modification check was broken, which made pgbouncer reload it too often.

PgBouncer 1.0.x

2007-06-18 - PgBouncer 1.0.8 - “Undead Shovel Jutsu”

  • Fixes
    • Fix crash in cancel packet handling. (^C from psql)
  • Features
    • PAUSE ; RESUME ; works now.
    • Cleanup of console command parsing.
    • Disable expensive in-list assert check.

2007-04-19 - PgBouncer 1.0.7 - “With Vitamin A-Z”

  • Fixes
    • Remove obsolete flushing logic that caused assertions when send() blocked between error or notice packets. PgBouncer does not actively buffer data, so this logic is unnecessary. It remained from kernel buffering with MSG_MORE.
    • Additionally avoid calling recv() logic when sending unblocks.
    • List search code for admin_users and stats_users mishandled partial finds. Fix it.
    • Standardise UNIX socket peer UID finding to getpeereid().

2007-04-12 - PgBouncer 1.0.6 - “Daily Dose”

  • Fixes
    • The “Disable maintenance during the takeover” fix could disable maintenance altogether. Fix it.
    • Compilation fix for FreeBSD, <sys/ucred.h> requires <sys/param.h> there. Thanks go to Robert Gogolok for report.

2007-04-11 - PgBouncer 1.0.5 - “Enough for today”

  • Fixes
    • Fix online-restart bugs:
      • Set ->ready for idle servers.
      • Remove obsolete code from use_client_socket()
      • Disable maintenance during the takeover.

2007-04-11 - PgBouncer 1.0.4 - “Last ’last’ bug”

  • Fixes
    • Notice from idle server tagged server dirty. release_server() did not expect it. Fix it by dropping them.

2007-04-11 - PgBouncer 1.0.3 - “Fearless Fork”

  • Fixes

    • Some error handling was missing in login path, so dying connection there could trigger asserts.
    • Cleanup of asserts in sbuf.c to catch problems earlier.
    • Create core when Assert() triggers.
  • New stuff

    • New config vars: log_connections, log_disconnections, log_pooler_errors to turn on/off noise.
    • Config var: client_login_timeout to kill dead connections in login phase that could stall SUSPEND and thus online restart.

2007-03-28 - PgBouncer 1.0.2 - “Supersonic Spoon”

  • Fixes
    • libevent may report a deleted event inside same loop. Avoid socket reuse for one loop.
    • release_server() from disconnect_client() didn’t look it the packet was actually sent.

2007-03-15 - PgBouncer 1.0.1 - “Alien technology”

  • Fixes

    • Mixed usage of cached and non-cached time, plus unsigned usec_t typedef created spurious query_timeout errors.
    • Fix rare case when socket woken up from send-wait could stay stalling.
    • More fair queueing of server connections. Before, a new query could get a server connections before older one.
    • Delay server release until everything is guaranteed to be sent.
  • Features

    • SHOW SOCKETS command to have detailed info about state.
    • Put PgSocket ptr to log, to help tracking one connection.
    • In console, allow SELECT in place of SHOW.
    • Various code cleanups.

2007-03-13 - PgBouncer 1.0 - “Tuunitud bemm”

  • First public release.