# Журнал изменений

> История версий PgBouncer и примечания к выпускам

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

--------

## PgBouncer 1.25.x {#pgbouncer-125x}

**2026-05-08  -  PgBouncer 1.25.2  -  «Человеческое прикосновение и новый поворот в полной неопределённости борьбе за титул»**

- Безопасность
  * Исправлена CVE-2026-6664: целочисленное переполнение в коде разбора сетевых
    пакетов в PgBouncer до 1.25.2 позволяло обойти проверку границ и могло
    привести к аварийному завершению. Неаутентифицированный удалённый злоумышленник
    мог вывести PgBouncer из строя некорректным пакетом аутентификации SCRAM.
  * Исправлена CVE-2026-6665: код SCRAM в PgBouncer до 1.25.2 неверно проверял
    возвращаемое значение `strlcat()` при построении содержимого SCRAM
    client-final-message. Злонамеренный бэкенд, отправивший SCRAM
    server-final-message с длинным nonce, мог вызвать переполнение стека.
  * Исправлена CVE-2026-6666: возможное обращение по нулевому указателю в
    PgBouncer до 1.25.2 могло привести к аварийному завершению, если сервер
    отправлял ответ об ошибке без поля SQLSTATE.
  * Исправлена CVE-2026-6667: PgBouncer до 1.25.2 не выполнял надлежащую проверку
    авторизации для административной команды `KILL_CLIENT`. Её могли выполнять
    все пользователи с доступом к административной консоли, хотя сама консоль
    требует авторизации. Команда должна быть разрешена только пользователям,
    перечисленным в параметре `admin_users`.

- Исправления
  * Уточнена документация параметра `default_pool_size`.
  * Исправлена документация `client_tls13_ciphers` и `server_tls13_ciphers`.

**2025-12-03  -  PgBouncer 1.25.1  -  «Исправляем множество ошибок перед Рождеством»**

- Безопасность
  * Исправлена CVE-2025-12819: до этого выпуска неаутентифицированный
    злоумышленник мог выполнить произвольный SQL во время аутентификации,
    передав вредоносный параметр search_path в StartupMessage. Уязвимы системы,
    в которых одновременно выполнены ВСЕ следующие условия:

    1. `track_extra_parameters` включает search_path (нестандартная конфигурация, вероятно, применяемая только в установках с Citus или PostgreSQL 18)
    2. `auth_user` содержит непустую строку (нестандартная конфигурация)
    3. `auth_query` настроен без полностью квалифицированных имён объектов (стандартная конфигурация, оператор < не квалифицирован схемой)

- Исправления
    - Исправлены ошибки специальной аутентификации SCRAM после переподключения к серверу ([#1432], появились в 1.25.0)
    - Добавлены отсутствовавшие typedef для экзотических архитектур без поддержки SIMD ([#1414], появились в 1.25.0)
    - Удалено шумное предупреждение, когда клиент закрывает соединение до отправки данных ([#1420], появилось в 1.25.0)
    - Предотвращено потенциальное разыменование указателя NULL ([#1423], появилось в 1.25.0)
    - Исправлена потенциальная утечка памяти ([#1422], появилась в 1.25.0)
    - Исправлен разбор серверных сообщений SCRAM ([#1431], появился в 1.25.0)

[#1414]: https://github.com/pgbouncer/pgbouncer/pull/1414
[#1420]: https://github.com/pgbouncer/pgbouncer/pull/1420
[#1422]: https://github.com/pgbouncer/pgbouncer/pull/1422
[#1423]: https://github.com/pgbouncer/pgbouncer/pull/1423
[#1431]: https://github.com/pgbouncer/pgbouncer/pull/1431
[#1432]: https://github.com/pgbouncer/pgbouncer/pull/1432

**2025-11-09  -  PgBouncer 1.25.0  -  «Тот самый выпуск с поддержкой LDAP»**

- Возможности
    * Добавлена аутентификация LDAP! Её можно настроить с помощью файла HBA или `auth_ldap_options`. ([#731])
    * Добавлена поддержка прямых TLS-соединений на стороне клиента. Клиенты могут использовать ускоренное установление TLS-соединения, появившееся в PostgreSQL 17. PgBouncer пока не может подключаться к серверам PostgreSQL таким ускоренным способом. ([#1359])
    * В `SHOW CLIENTS` добавлено состояние idle. ([#1191])
    * Добавлен параметр `transaction_timeout` — глобальный и на уровне пользователя. ([#1242])
    * Клиенту отправляется сообщение NOTICE, если он находится в очереди без соединения более 5 секунд. Длительность можно изменить или отключить через `query_wait_notify`. ([#1264])
    * Добавлен параметр `scram_iterations`, позволяющий операторам выбирать компромисс между безопасностью и скоростью аутентификации. ([#1339])
    * Добавлены `client_tls13_ciphers` и `server_tls13_ciphers` для выбора включаемых наборов шифров TLSv1.3. ([#1352])
- Изменения
    * Значительно повышена производительность специальной аутентификации SCRAM. ([#1338])
    * Команду `KILL` можно вызывать без базы данных, что теперь означает `KILL` для всех баз. ([#1317])
    * Запрос проверки работоспособности по умолчанию отправляет пустой запрос вместо `SELECT 1`. ([#1233])
    * Переполнение очереди PAM записывается как предупреждение, что упрощает поиск причины вызванных им медленных запросов. ([#1297])
    * Команда `RELOAD` теперь сообщает обо всех ошибках во время перезагрузки. ([#1231])
    * Во время завершения работы административным соединениям разрешён доступ к UNIX-сокету PgBouncer. Оператору проще выяснить, почему процесс PgBouncer не завершается, и вручную выполнить `KILL_CLIENT` для зависших соединений. ([#1305])
    * `mkauth.py` больше не добавляет устаревшее третье поле. ([#1365])
    * Улучшены сообщения `FATAL` в функциях `disconnect_client` и `disconnect_server`. ([#1382])
    * Прекращено использование устаревшей функции OpenSSL `EVP_PKEY_get0_EC_KEY`, способной вызывать проблемы в некоторых реализациях FIPS. ([#1384])
- Исправления
    * Исправлено аварийное завершение при паролях длиной 1024 символа и более. ([#1215])
    * Исправлены соединения с несколькими узлами при `server_tls_sslmode=verify-full`. ([#1303])
    * Исправлена редкая ошибка `FATAL` при передаче запросов отмены. ([#1383])
    * Исправлена сортировка параметров в `SHOW CONFIG`. ([#1403])
    * Усилен разбор пакета запуска. ([#1407])

[#731]: https://github.com/pgbouncer/pgbouncer/pull/731
[#1191]: https://github.com/pgbouncer/pgbouncer/pull/1191
[#1215]: https://github.com/pgbouncer/pgbouncer/pull/1215
[#1231]: https://github.com/pgbouncer/pgbouncer/pull/1231
[#1233]: https://github.com/pgbouncer/pgbouncer/pull/1233
[#1242]: https://github.com/pgbouncer/pgbouncer/pull/1242
[#1264]: https://github.com/pgbouncer/pgbouncer/pull/1264
[#1297]: https://github.com/pgbouncer/pgbouncer/pull/1297
[#1303]: https://github.com/pgbouncer/pgbouncer/pull/1303
[#1305]: https://github.com/pgbouncer/pgbouncer/pull/1305
[#1317]: https://github.com/pgbouncer/pgbouncer/pull/1317
[#1338]: https://github.com/pgbouncer/pgbouncer/pull/1338
[#1339]: https://github.com/pgbouncer/pgbouncer/pull/1339
[#1352]: https://github.com/pgbouncer/pgbouncer/pull/1352
[#1359]: https://github.com/pgbouncer/pgbouncer/pull/1359
[#1365]: https://github.com/pgbouncer/pgbouncer/pull/1365
[#1382]: https://github.com/pgbouncer/pgbouncer/pull/1382
[#1383]: https://github.com/pgbouncer/pgbouncer/pull/1383
[#1384]: https://github.com/pgbouncer/pgbouncer/pull/1384
[#1403]: https://github.com/pgbouncer/pgbouncer/pull/1403
[#1407]: https://github.com/pgbouncer/pgbouncer/pull/1407

--------

## PgBouncer 1.24.x {#pgbouncer-124x}

**2025-04-16  -  PgBouncer 1.24.1  -  «CVE-2025-2291: VALID UNTIL было вчера»**

- Безопасность
  * Исправлена CVE-2025-2291: ранее PgBouncer не учитывал VALID UNTIL пароля
    пользователя при запросе хешей паролей через auth_query. Если PgBouncer
    использовался как прозрачный прокси перед Postgres, он мог разрешать уже
    просроченные пароли. Для устранения проблемы запрос auth_query по умолчанию
    и примеры пользовательских функций auth_query в документации изменены так,
    чтобы учитывать VALID UNTIL. Если используется пользовательский auth_query,
    его следует обновить. При стандартном auth_query можно обновиться до
    PgBouncer 1.24.1 или в предыдущем выпуске изменить конфигурацию, указав новый
    запрос auth_query по умолчанию.

- Исправления
  * Исправлена поддержка PAM: поддержка аутентификации `pam` в файле HBA отменена. ([#1291]) (ошибка появилась в 1.24.0)
  * Исправлена ошибка уменьшения счётчика соединений пользователя. Исправление присутствовало в теге 1.24.0 на GitHub, но отсутствовало в архиве выпуска. ([#1238]) (ошибка появилась в 1.24.0)
  * `test_load_balance_hosts.py` добавлен в архив выпуска. ([#1282])
  * Исправлены тесты для запуска сборщиками пакетов Debian. ([#1266], [#1250])

- Документация
  * Пример `auth_query` обновлён для задания безопасного `search_path`. ([#1245])

[#1238]: https://github.com/pgbouncer/pgbouncer/pull/1238
[#1291]: https://github.com/pgbouncer/pgbouncer/pull/1291
[#1282]: https://github.com/pgbouncer/pgbouncer/pull/1282
[#1266]: https://github.com/pgbouncer/pgbouncer/pull/1266
[#1250]: https://github.com/pgbouncer/pgbouncer/pull/1250
[#1245]: https://github.com/pgbouncer/pgbouncer/pull/1245

**2025-01-10  -  PgBouncer 1.24.0  -  «Новый год, новый баунсер»**

- Возможности
  * Добавлена поддержка `Type=notify-reload` для systemd. Требуется systemd версии 253 или новее. ([#1148])
  * В административную консоль добавлена команда `KILL_CLIENT` для принудительного завершения клиентского соединения. ([#1147])
  * Добавлен параметр `max_user_client_connections` — глобальный и на уровне пользователя. ([#1137])
  * Добавлен параметр `max_db_client_connections` — глобальный и на уровне базы данных. ([#1138])
  * В вывод `SHOW USERS` и `SHOW DATABASES` добавлен счётчик `current_client_connections`. ([#1137], [#1138])
  * Добавлен параметр `load_balance_hosts`, позволяющий **не** балансировать нагрузку между узлами. ([#736])
  * В `SHOW STATS` доступны счётчики использования подготовленных операторов. ([#1192])
  * Добавлен параметр `client_idle_timeout`. ([#1189])
  * Добавлены пользовательские `query_timeout` и `reserve_pool_size`. ([#1180], [#1228])
  * В файле HBA включена поддержка аутентификации `pam`. ([#326])

- Изменения
  * Соединения не пересоздаются при RELOAD, если конфигурация TLS не изменилась. Ранее все соединения TLS пересоздавались при RELOAD, что могло вызвать временное, но серьёзное падение производительности. Теперь это происходит только при фактическом изменении параметров TLS. ([#1157])
  * Поддержка подготовленных операторов включена по умолчанию: `max_prepared_statements` теперь равен 200. Изменение должно затронуть только клиентов, действительно использующих подготовленные операторы. Таким клиентам рекомендуется изучить ограничения поддержки в [документации][prepared-docs]. ([#1144])
  * Сокеты, клиенты и серверы в административном выводе теперь имеют уникальный ID. Раньше их определяли по указателям, которые после отключения часто повторно использовались новыми клиентами. ([#1172])
  * Сообщение об ошибке пустого pidfile стало понятнее. ([#1195])
  * При ошибке `server_login_retry` клиенту возвращается исходная ошибка. ([#1152])
  * При ошибке `auth_query` исходная ошибка сервера записывается в журнал. ([#1187])
  * Значение `default_pool_size` 0 означает неограниченный размер. ([#1227])
  * Параметр базы данных `reserve_pool` переименован в `reserve_pool_size`. Прежнее имя остаётся его псевдонимом. ([#1232])

- Исправления
  * Улучшена обработка различных маловероятных ошибок, например OOM, которые раньше могли приводить к аварийному завершению или утечке памяти. ([#1108], [#1101], [#1099], [#1169], [#1202])
  * Исправлено значение `server_tls_sslmode` по умолчанию в примере файла конфигурации. ([#1133])
  * Из документации удалено упоминание недопустимого псевдонима `server_tls_protocols`. ([#1155])
  * Исправлена ошибка совместного использования `auth_query` и соединений репликации, вызывавшая сбои соединений. ([#1166])
  * Запросы отмены клиентов игнорируются, пока PgBouncer настраивает параметры сервера. ([#298])

[prepared-docs]: /ru/docs/pgbouncer/config/#max_prepared_statements

[#1148]: https://github.com/pgbouncer/pgbouncer/pull/1148
[#1147]: https://github.com/pgbouncer/pgbouncer/pull/1147
[#1137]: https://github.com/pgbouncer/pgbouncer/pull/1137
[#1138]: https://github.com/pgbouncer/pgbouncer/pull/1138
[#736]: https://github.com/pgbouncer/pgbouncer/pull/736
[#1192]: https://github.com/pgbouncer/pgbouncer/pull/1192
[#1189]: https://github.com/pgbouncer/pgbouncer/pull/1189
[#1180]: https://github.com/pgbouncer/pgbouncer/pull/1180
[#1228]: https://github.com/pgbouncer/pgbouncer/pull/1228
[#326]: https://github.com/pgbouncer/pgbouncer/pull/326
[#1157]: https://github.com/pgbouncer/pgbouncer/pull/1157
[#1144]: https://github.com/pgbouncer/pgbouncer/pull/1144
[#1172]: https://github.com/pgbouncer/pgbouncer/pull/1172
[#1195]: https://github.com/pgbouncer/pgbouncer/pull/1195
[#1152]: https://github.com/pgbouncer/pgbouncer/pull/1152
[#1187]: https://github.com/pgbouncer/pgbouncer/pull/1187
[#1227]: https://github.com/pgbouncer/pgbouncer/pull/1227
[#1232]: https://github.com/pgbouncer/pgbouncer/pull/1232
[#1108]: https://github.com/pgbouncer/pgbouncer/pull/1108
[#1101]: https://github.com/pgbouncer/pgbouncer/pull/1101
[#1099]: https://github.com/pgbouncer/pgbouncer/pull/1099
[#1169]: https://github.com/pgbouncer/pgbouncer/pull/1169
[#1202]: https://github.com/pgbouncer/pgbouncer/pull/1202
[#1133]: https://github.com/pgbouncer/pgbouncer/pull/1133
[#1155]: https://github.com/pgbouncer/pgbouncer/pull/1155
[#1166]: https://github.com/pgbouncer/pgbouncer/pull/1166
[#298]: https://github.com/pgbouncer/pgbouncer/pull/298

--------
## PgBouncer 1.23.x {#pgbouncer-123x}
**2024-08-02  -  PgBouncer 1.23.1  -  «Всё снова приведено в порядок»**
- Исправления
  * Исправлена возможная ошибка сегментации после перезагрузки конфигурации PgBouncer. ([#1105]) (ошибка появилась в 1.23.0)
  * Исправлены все известные аварийные завершения в put_in_order. ([#1120])
    (новые ошибки были введены в версии 1.23.0)
  * В архив выпуска добавлены отсутствовавшие файлы, необходимые для тестирования. ([#1124]) (файлы отсутствовали начиная с 1.23.0)
[#1120]: https://github.com/pgbouncer/pgbouncer/pull/1120
[#1105]: https://github.com/pgbouncer/pgbouncer/pull/1105
[#1124]: https://github.com/pgbouncer/pgbouncer/pull/1124
**2024-07-03  -  PgBouncer 1.23.0  -  «К новым начинаниям»**
- Возможности
  * Добавлена поддержка поэтапных перезапусков. SIGTERM больше не вызывает немедленное завершение процесса PgBouncer. Теперь выполняется «сверхбезопасное завершение»: процесс ждёт отключения всех клиентов. Новое поведение SIGTERM позволяет поэтапно перезапускать несколько процессов PgBouncer за балансировщиком нагрузки или на одном порту с `so_reuseport`. Это **незначительное нарушение обратной совместимости**. Если Dockerfile или служба Systemd рассчитывали на прежнее поведение SIGTERM, теперь следует использовать SIGQUIT. ([#902])
  * Добавлена поддержка карт пользовательских имен для методов аутентификации `cert` и `peer`. Эта функция предоставляет гибкость, так как пользователь, инициирующий соединение, не обязательно должен быть пользователем базы данных. Поддержка PgBouncer для карт пользовательских имен работает очень похоже на postgres, с исключениями, описанными в документации. ([#996])
  * Добавлена поддержка репликационных соединений через PgBouncer. ([#876])
- Изменения
  * Улучшен список соединений в выводе `SHOW USERS`. ([#1040])
  * Разрешена настройка `pool_size` на уровне пользователя. ([#1049])
  * Разрешена настройка `server_lifetime` на уровне базы данных. ([#1057])
  * Добавлена поддержка вывода динамически созданных пользователей в выводе `SHOW USERS`. ([#1052])
  * Добавлена поддержка типа адреса `all` в конфигурации HBA. ([#1078])
  * Добавлена поддержка автоматического перезапуска при использовании systemd. ([#1080])
  * Минимальная требуемая версия c-ares повышена до 1.9.0 ([#1076])
- Исправления
  * Исправлены проблемы с обработкой больших и частичных пакетов при старте. ([#1058])
  * Добавлена поддержка формата `--config=value` в параметре startup-опции. ([#1064])
  * Исправлен расчет метрики `avg_wait_time`. ([#727])
  * Добавлена поддержка переговоров о версии протокола PostgreSQL с клиентом. ([#1007])
  * Добавлено отслеживание ожидающего запроса `auth_query`. ([#1034])
  * Улучшения документации и CI.
[#996]: https://github.com/pgbouncer/pgbouncer/pull/996
[#1040]: https://github.com/pgbouncer/pgbouncer/pull/1040
[#1049]: https://github.com/pgbouncer/pgbouncer/pull/1049
[#1057]: https://github.com/pgbouncer/pgbouncer/pull/1057
[#1052]: https://github.com/pgbouncer/pgbouncer/pull/1052
[#1058]: https://github.com/pgbouncer/pgbouncer/pull/1058
[#1007]: https://github.com/pgbouncer/pgbouncer/pull/1007
[#876]: https://github.com/pgbouncer/pgbouncer/pull/876
[#902]: https://github.com/pgbouncer/pgbouncer/pull/902
[#1064]: https://github.com/pgbouncer/pgbouncer/pull/1064
[#1078]: https://github.com/pgbouncer/pgbouncer/pull/1078
[#1080]: https://github.com/pgbouncer/pgbouncer/pull/1080
[#727]: https://github.com/pgbouncer/pgbouncer/pull/727
[#1076]: https://github.com/pgbouncer/pgbouncer/pull/1076
[#1034]: https://github.com/pgbouncer/pgbouncer/pull/1034
--------
## PgBouncer 1.22.x {#pgbouncer-122x}
**2024-03-04  -  PgBouncer 1.22.1  -  «В Бангалоре лето»**
- Исправления
  * Исправлены проблемы, вызванные некоторыми клиентами использованием запросов `COPY FROM STDIN`. Такие запросы могли приводить к утечкам памяти, регрессиям производительности и неправильному поведению подготовленных операторов. ([#1025])
    (ошибка появилась в 1.21.0)
  * В архив выпуска добавлены отсутствовавшие тесты ([#1026])
    (пропущенные тесты были добавлены в версиях 1.19.0 и 1.21.0)
[#1025]: https://github.com/pgbouncer/pgbouncer/pull/1025
[#1026]: https://github.com/pgbouncer/pgbouncer/pull/1026
**2024-01-31  -  PgBouncer 1.22.0  -  «DEALLOCATE ALL»**
- Возможности
  * Добавлена поддержка `DEALLOCATE ALL` и `DISCARD ALL` при установке `max_prepared_statements` в значение, отличное от нуля (стандартная поддержка `DEALLOCATE` все еще не поддерживается) ([#972])
  * Добавлена настройка `auth_query` на уровне базы данных. ([#979])
- Изменения
  * Улучшены настройки в рекомендуемом файле systemd ([#983])
  * Логика быстрого отказа теперь обрабатывает все ситуации, когда рабочих соединений с базой данных больше нет и установить новые невозможно. ([#998])
  * Внесены многочисленные улучшения документации.
- Исправления
  * Исправлена проблема в PG14+, из-за которой PgBouncer отправлял `SET DateStyle='ISO'` для каждой транзакции. ([#879])
  * Исправлена обработка пустого `application_name`. ([#999])
  * Исправлена сборка в Windows с OpenSSL 3.2.0. ([#1009])
[#972]: https://github.com/pgbouncer/pgbouncer/pull/972
[#979]: https://github.com/pgbouncer/pgbouncer/pull/979
[#983]: https://github.com/pgbouncer/pgbouncer/pull/983
[#998]: https://github.com/pgbouncer/pgbouncer/pull/998
[#879]: https://github.com/pgbouncer/pgbouncer/pull/879
[#999]: https://github.com/pgbouncer/pgbouncer/pull/999
[#1009]: https://github.com/pgbouncer/pgbouncer/pull/1009
--------
## PgBouncer 1.21.x {#pgbouncer-121x}
**2023-10-16  -  PgBouncer 1.21.0  -  «Тот самый выпуск с подготовленными операторами»**
- Возможности
  * Добавлена поддержка именованных подготовленных операторов на уровне протокола! Вероятно,
    это одна из самых востребованных возможностей PgBouncer. Использование подготовленных операторов
    вместе с PgBouncer позволяет значительно снизить нагрузку на CPU системы — как со стороны
    PgBouncer, так и со стороны PostgreSQL. В синтетических тестах эта возможность повышала
    пропускную способность запросов от 15% до 250% в зависимости от нагрузки. Чтобы воспользоваться
    ею, необходимо установить для нового параметра `max_prepared_statements` ненулевое значение
    (точное значение зависит от нагрузки, но 100, вероятно, будет разумным). Подробнее о работе,
    ограничениях и настройке этой возможности см. в [документации по
    `max_prepared_statements`](/ru/docs/pgbouncer/config/#max_prepared_statements). После этого следует
    убедиться, что клиентская библиотека действительно использует подготовленные операторы.
    Способ их включения зависит от конкретного клиента, поэтому обратитесь к его документации.
    Перед выпуском возможность была тщательно протестирована, однако из-за её сложности всё ещё
    возможны проблемы с производительностью или ошибки. Сообщайте о найденных проблемах. ([#845])
- Изменения
  * Повышена безопасность параметров OpenSSL: прежние значения по умолчанию были крайне устаревшими. Теперь они совпадают со стандартными значениями OpenSSL в системе, где работает PgBouncer. ([#948] & [libusual/#41])
  * PgBouncer теперь использует OpenSSL для вычисления MD5-хешей, когда это возможно. Это необходимо для использования PgBouncer в FIPS-совместимом режиме. ([#949])
  * `min_pool_size` поддерживается для пулов с принудительным пользователем, даже если к PgBouncer не подключены клиенты. ([#947])
  * Изменено кодирование `peer_id` в токене отмены. Поэтому одноранговое взаимодействие разных версий PgBouncer не работает, если версии находятся по разные стороны границы v1.21.0. ([#945])
- Исправления
  * Исправлено аварийное завершение с сообщением: "FATAL in function client\_proto(): bad
    client state: 6/7" ([#928]) (ошибка появилась в 1.18.0)
  * Исправлено аварийное завершение с сообщением: "FATAL in function server\_proto(): server in
    bad state: 11" ([#927]) (ошибка появилась в 1.18.0)
  * Снижен уровень журналирования при отправке запросов отмены. ([#903])
  * Исправлен префикс журнала slog для одноранговых узлов. ([#922])
  * Исправлены опечатки в документации ([#932])
  * Исправлены ошибки, выявленные статическим анализатором ([#943])
  * При временных ошибках FATAL во время входа больше не отключаются все ожидающие клиенты. ([#946])
  * Если база из `auth_dbname` не настроена явно, используется автоматически созданная база данных. ([#921])
- Внутренняя переработка
  * Удалена поддержка библиотеки udns ([#938])
[#845]: https://github.com/pgbouncer/pgbouncer/pull/845
[#948]: https://github.com/pgbouncer/pgbouncer/pull/948
[#949]: https://github.com/pgbouncer/pgbouncer/pull/949
[#947]: https://github.com/pgbouncer/pgbouncer/pull/947
[#945]: https://github.com/pgbouncer/pgbouncer/pull/945
[#903]: https://github.com/pgbouncer/pgbouncer/pull/903
[#922]: https://github.com/pgbouncer/pgbouncer/pull/922
[#932]: https://github.com/pgbouncer/pgbouncer/pull/932
[#928]: https://github.com/pgbouncer/pgbouncer/pull/928
[#927]: https://github.com/pgbouncer/pgbouncer/pull/927
[#943]: https://github.com/pgbouncer/pgbouncer/pull/943
[#946]: https://github.com/pgbouncer/pgbouncer/pull/946
[#921]: https://github.com/pgbouncer/pgbouncer/pull/921
[#938]: https://github.com/pgbouncer/pgbouncer/pull/938
[libusual/#41]: https://github.com/libusual/libusual/pull/41
--------
## PgBouncer 1.20.x {#pgbouncer-120x}
**2023-08-09  -  PgBouncer 1.20.1  -  «Необязательные опции»**
- Исправления
  * Исправлена ошибка, при которой включение `options` внутри `ignore_startup_parameters` больше не игнорировало неизвестные параметры внутри параметра запуска `options`. ([#908]) (ошибка была введена в версии 1.20.0)
  * Исправлена вводящая в заблуждение опечатка в документации. ([#917])
[#908]: https://github.com/pgbouncer/pgbouncer/pull/908
[#917]: https://github.com/pgbouncer/pgbouncer/pull/917
**2023-07-20  -  PgBouncer 1.20.0  -  «Здесь должно быть забавное название»**
- Устаревшие функции
  * Опция перезапуска без остановки обслуживания теперь считается устаревшей. Эта функция получила очень мало внимания в последние годы. У нее известны несколько проблем, и новые функции часто не поддерживают ее. Рекомендуемый метод для выполнения перезапусков без остановки обслуживания в настоящее время — использование функций `so_reuseport` и `peers`. Таким образом, вы можете запускать несколько различных процессов PgBouncer на одном порту. Затем, перезапуская эти процессы по одному, вы можете быть уверены, что всегда будет работать процесс PgBouncer на нужном порту. ([#894])
- Возможности
  * Добавлен параметр `track_extra_parameters`, позволяющий отслеживать больше параметров
    в транзакционном режиме пула. Ранее PgBouncer отслеживал только `application_name`,
    `DateStyle`, `TimeZone` и `standard_conforming_strings`. Теперь по умолчанию также
    отслеживается `IntervalStyle`. Изменив `track_extra_parameters`, можно отслеживать
    дополнительные параметры, но только [те, о которых PostgreSQL сообщает
    клиенту][guc_report]. При использовании Citus 12.0+ Citus обеспечивает передачу
    PostgreSQL параметра `search_path` клиенту. Поэтому при использовании Citus можно
    добавить `search_path` в параметр `track_extra_parameters`. ([#867])
  * SQLSTATE передаётся на этапе аутентификации. Это позволяет Npgsql, поставщику данных .NET для PostgreSQL, обнаруживать отсутствие базы данных. ([#814])
  * Значение `server_tls_sslmode` по умолчанию изменено на `prefer`. ([#866])
  * Добавлена поддержка стартового параметра `options`. Это позволяет использовать [переменную
    окружения `PGOPTIONS`, известную `psql` и `libpq`][pgoptions]. С помощью этой переменной
    при запуске можно задать любой параметр PostgreSQL. Это работает только для параметров
    PostgreSQL, которые PgBouncer отслеживает через `track_extra_parameters`. ([#878])
- Исправления
  * Устранено аварийное завершение при использовании административной базы `pgbouncer` как auth_dbname. Это по-прежнему не поддерживается, но теперь вместо сбоя выдаётся понятная ошибка. ([#817])
  * Исправлено имя `peer_cache` в `SHOW MEM`: раньше оно ошибочно отображалось как `db_cache`. ([#864])
  * Исправлена путаница исходного и целевого IP в журнале: PgBouncer записывал адрес источника вместо назначения. ([#880])
  * Административные соединения через Unix-сокеты записываются в журнал только при `log_connections` со значением `1`. ([#883])
[guc_report]: https://www.postgresql.org/docs/15/protocol-flow.html#PROTOCOL-ASYNC
[pgoptions]: https://www.postgresql.org/docs/current/config-setting.html#id-1.6.7.4.5
[#867]: https://github.com/pgbouncer/pgbouncer/pull/867
[#814]: https://github.com/pgbouncer/pgbouncer/pull/814
[#866]: https://github.com/pgbouncer/pgbouncer/pull/866
[#878]: https://github.com/pgbouncer/pgbouncer/pull/878
[#817]: https://github.com/pgbouncer/pgbouncer/pull/817
[#864]: https://github.com/pgbouncer/pgbouncer/pull/864
[#880]: https://github.com/pgbouncer/pgbouncer/pull/880
[#883]: https://github.com/pgbouncer/pgbouncer/pull/883
[#894]: https://github.com/pgbouncer/pgbouncer/pull/894
--------
## PgBouncer 1.19.x {#pgbouncer-119x}
**2023-05-31  -  PgBouncer 1.19.1  -  «Солнечная весна»**
Это небольшой выпуск, который исправляет несколько недавно появившихся ошибок.
- Исправления
  * Исправлено: FATAL in function disconnect_client(): bad client state: 0 ([#846])
    (ошибка была введена в версии 1.18.0)
  * Исправлено: FATAL in function server_proto(): server in bad state: 14 ([#849])
    (ошибка была введена в версии 1.18.0)
  * В архив выпуска добавлены файлы, необходимые для тестов на Python. ([#852]) (тесты появились в 1.19.0)
[#846]: https://github.com/pgbouncer/pgbouncer/pull/846
[#849]: https://github.com/pgbouncer/pgbouncer/pull/849
[#852]: https://github.com/pgbouncer/pgbouncer/pull/852
**2023-05-04  -  PgBouncer 1.19.0  -  «Старомодный, ручной вид»**
- Возможности
  * Добавлен параметр `auth_dbname`, задающий базу данных, в которой выполняется `auth_query`. ([#764])
  * Добавлена команда `SHOW STATE`, показывающая, находится ли PgBouncer в состоянии active, paused или suspended. ([#528])
  * Добавлена поддержка однорангового взаимодействия процессов PgBouncer. Благодаря ей запросы отмены продолжают работать, когда несколько процессов PgBouncer находятся за одним балансировщиком нагрузки. ([#666])
  * Добавлена специальная настройка `cancel_wait_timeout`, которая определяет, через какое время прекращать попытки передачи запроса отмены. По умолчанию значение равно 10 секундам. ([#833])
  * Добавлена новая среда тестирования. ([#792])
- Исправления
  * Исправлена возможная утечка памяти при ошибке рукопожатия TLS. ([#796])
  * Уточнены сообщения об ошибках для неподдерживаемых параметров командной строки в Windows. ([#620])
  * Исправлена ошибка при вызове `disconnect_server` на сервере, находящемся в состоянии `BEING_CANCELED`. ([#815]) (введено в 1.18.0)
  * При получении `SIGTERM` процесс больше не завершается с ненулевым статусом. ([#834])
  * Запуск завершается ошибкой, если сокет в `unix_socket_dir` создать невозможно. ([#830])
  * Запуск завершается ошибкой, если невозможно прослушивать ни один адрес из `listen_addr`. ([#838])
  * При ошибке `sbuf_connect` выводятся более информативные предупреждения, особенно полезные при сбое создания Unix-сокетов. ([#837])
- Внутренняя переработка
  * Различные обновления CI для улучшения производительности
  * Удалена AppVeyor
[#528]: https://github.com/pgbouncer/pgbouncer/issues/528
[#620]: https://github.com/pgbouncer/pgbouncer/pull/620
[#666]: https://github.com/pgbouncer/pgbouncer/pull/666
[#764]: https://github.com/pgbouncer/pgbouncer/pull/764
[#792]: https://github.com/pgbouncer/pgbouncer/pull/792
[#796]: https://github.com/pgbouncer/pgbouncer/pull/796
[#815]: https://github.com/pgbouncer/pgbouncer/pull/815
[#830]: https://github.com/pgbouncer/pgbouncer/pull/830
[#833]: https://github.com/pgbouncer/pgbouncer/pull/833
[#834]: https://github.com/pgbouncer/pgbouncer/pull/834
[#837]: https://github.com/pgbouncer/pgbouncer/pull/837
[#838]: https://github.com/pgbouncer/pgbouncer/pull/838
--------
## PgBouncer 1.18.x {#pgbouncer-118x}
**2022-12-12  -  PgBouncer 1.18.0  -  «Никакой настоящей тайны»**
- Возможности
  * `application_name` добавлено в вывод `SHOW CLIENTS`/`SERVERS`/`SOCKETS`. ([#449](https://github.com/pgbouncer/pgbouncer/pull/449))
  * Добавлена информация о запросах отмены в вывод `SHOW
    CLIENTS `/` SERVERS `/` POOLS`
    ([#782](https://github.com/pgbouncer/pgbouncer/pull/782))
- Исправления
  * Операция `sbuf_send_pending` завершается ошибкой, если целевой сокет закрыт
  ([#652](https://github.com/pgbouncer/pgbouncer/pull/652))
  * Исправлено несколько возможных сбоев ([#700](https://github.com/pgbouncer/pgbouncer/pull/700), [#730](https://github.com/pgbouncer/pgbouncer/pull/730))
  * Исправлено переполнение при обработке списка узлов через запятую, из-за которого соединение перенаправлялось в Unix-сокет. ([#747](https://github.com/pgbouncer/pgbouncer/pull/747))
  * Соединения больше не удаляются ради достижения `min_pool_size`
    ([#648](https://github.com/pgbouncer/pgbouncer/pull/648))
  * Исправлено `SHOW HELP` с PostgreSQL 15
    ([#769](https://github.com/pgbouncer/pgbouncer/issues/769))
  * Исправлено состояние гонки при обработке отмены запросов. Раньше отмена запроса одного клиента могла отменить запрос другого, если PgBouncer получал её после самостоятельного завершения целевого запроса.
    ([#717](https://github.com/pgbouncer/pgbouncer/pull/717))
- Внутренняя переработка
  * Разные обновления CI
--------
## PgBouncer 1.17.x {#pgbouncer-117x}
**2022-03-23  -  PgBouncer 1.17.0  -  «Черта проведена»**
- Возможности
  * Определение базы данных может включать список узлов через запятую. Соединения с ними устанавливаются циклически.
  * При подключении к несуществующей базе ошибка ("no such
    database") теперь сообщается после аутентификации. Это не позволяет неаутентифицированным клиентам выяснять, какие базы существуют. (Изменение аналогично переносу сообщения об отсутствующем пользователе после аутентификации в версии 1.15.0.)
  * Ошибки отключения сервера не отправляются клиенту до входа.
    Это может раскрыть не совсем конфиденциальную информацию, такую как
    детали конфигурации, клиенту, который еще не вошел в систему.
  * Максимальная длина пароля снова увеличена: предыдущего увеличения оказалось недостаточно.
  * Удалена автоматическая перезагрузка `auth_file`. Теперь файл конфигурации `auth_file` будет перечитываться только при перезагрузке конфигурации, а не автоматически при любом изменении.
  * Теперь сборка для Windows включает файл ресурса с информацией о версии.
  * Сборки для Windows, создаваемые на CI, теперь статически связанные, поэтому их можно использовать напрямую без необходимости в дополнительных зависимостях.
- Исправления
  * Исправлена поддержка OpenSSL 3. Предыдущие выпуски могли вызывать сбой.
  * Быстрый отказ больше не применяется при подключении. Это часть описанного выше переноса ошибок сервера после аутентификации. Изменение также исправляет сквозную аутентификацию SCRAM: клиентский обмен должен состояться, чтобы серверное соединение можно было исправить повторной аутентификацией. Сразу после аутентификации механизм быстрого отказа по-прежнему действует, поэтому в большинстве случаев наблюдаемое поведение не изменится.
  * Параметр `auth_type` в образце `pgbouncer.ini` изменён на `md5`, чтобы
    соответствовать встроенному значению по умолчанию. Некоторые используют этот
    файл как основной конфигурационный файл, поэтому проверьте, подходит ли вам
    изменённая конфигурация.
  * Исправлен сбой при выходе в сборках с включенной проверкой assert.
  * Улучшены документация и поведение `tcp_defer_accept`. Документация неверно описывала значение по умолчанию, а "show config" иногда показывал неправильное значение. Если параметр задан, но не поддерживается, теперь выдаётся ошибка вместо молчаливого игнорирования, как и для других платформенных параметров сокета.
  * Исправлена сборка с c-ares в Windows. Теперь в Windows требуется c-ares версии >=1.18.0.
- Внутренняя переработка
  * Большинство предупреждений о deprecation от Autoconf >=2.70 были устранены. Поддержка более старых версий Autoconf по-прежнему сохраняется.
  * Использование Cirrus CI расширено на дополнительные платформы.
  * Поддержка Travis CI была удалена.
  * Обновлены локации поиска по умолчанию файла корневого CA, чтобы поддерживать больше платформ, таких как Fedora, RHEL и CentOS.
  * Все сценарии Python теперь по умолчанию используют `python3`; совместимость с Python 2 больше не поддерживается.
  * Скрипты тестового набора используют `command -v` вместо `which`, который устарел.
  * Несколько сообщений об ошибках переформулированы, чтобы яснее указывать соответствующую команду или параметр.
  * Скрипты тестового набора больше не требуют GNU sed.
  * `make check` теперь поддерживается на Windows (хотя тестовый набор SSL пока не работает).
  * Документировано, что административная консоль поддерживает только простой протокол запросов; соответствующие сообщения об ошибках улучшены.
--------
## PgBouncer 1.16.x {#pgbouncer-116x}
**2021-11-11  -  PgBouncer 1.16.1  -  «Тест глубины против тихой эффективности»**
Это небольшой выпуск с исправлением безопасности.
* PgBouncer, действующий как сервер, отклоняет лишние данные после
  рукопожатия шифрования SSL или GSS.

  Злоумышленник, способный внедрять данные в TCP-соединение, может поместить
  открытые данные в начало предположительно защищённого шифрованием сеанса
  базы данных. Это можно использовать для отправки серверу поддельных команд
  SQL, хотя атака сработает только в том случае, если PgBouncer не запрашивает
  никаких данных аутентификации. (Однако конфигурация PgBouncer, использующая
  аутентификацию по сертификатам SSL, вполне может их не запрашивать.)
  (CVE-2021-3935)
**2021-08-09  -  PgBouncer 1.16.0  -  «Отбились от ягуара»**
- Возможности
  * Поддерживается горячая перезагрузка параметров TLS: после перезагрузки файла конфигурации изменения автоматически вступают в силу.
  * Добавлены Unix-сокеты в абстрактном пространстве имён. Для их использования путь начинается с `@`. Это соответствует аналогичной возможности PostgreSQL 14.
  * Длина паролей и имен пользователей была увеличена до 996 символов и 128 символов соответственно. Различные облаковые сервисы требуют этого.
  * Минимальный размер пула теперь можно настроить для каждой базы данных, как основной и резервный размеры.
  * Число ожидающих отмен запросов отображается в `SHOW
    POOLS`.
- Исправления
  * Разбор конфигурации теперь строже обрабатывает ошибки. Раньше ошибка могла лишь записываться в журнал, после чего выполнение продолжалось; теперь такие ошибки препятствуют запуску. Это всегда было предполагаемым поведением, поэтому некоторые пользователи могут обнаружить давно существовавшие ошибки в своих конфигурациях.
  * Обработка запросов отмены была исправлена. В некоторых случаях запросы отмены могли казаться заблокированными на длительное время. Теперь это больше не должно происходить. В действительности, запросы отмены могут превышать размер пула в два раза, поэтому они действительно не должны застревать. ([#542](https://github.com/pgbouncer/pgbouncer/pull/542), [#543](https://github.com/pgbouncer/pgbouncer/pull/543))
  * Исправлено совместное использование md5 и scram через hba.conf.
  * Исправлена сборка с c-ares в Windows.
  * Ожидаемые сообщения "FIXME: query end, but query_start == 0" были исправлены. Теперь мы знаем, почему они возникают, и вы их больше не увидите. ([#565](https://github.com/pgbouncer/pgbouncer/pull/565))
  * Исправлена перезагрузка параметров `default_pool_size`, `min_pool_size` и `res_pool_size`.
- Внутренняя переработка
  * Cirrus CI теперь
    [используется](https://cirrus-ci.com/github/pgbouncer/pgbouncer) вместо Travis CI.
  * Как обычно, было добавлено множество тестов.
  * Уточнено сообщение журнала "unclean server". Теперь выводится "client disconnect while server was not ready" или "client
    disconnect before everything was sent to the server". Первое возникает, если клиентское соединение закрывается при открытом блоке транзакции на сервере.
  * Имя базы данных "pgbouncer" теперь явно запрещено: оно зарезервировано для административной консоли и никогда корректно не работало как обычная база.
  * Ошибки, отправляемые клиентам перед закрытием соединения, теперь имеют уровень FATAL, а не ERROR. ([#564](https://github.com/pgbouncer/pgbouncer/pull/564))
  * Исправлены предупреждения компилятора GCC 11. ([#623](https://github.com/pgbouncer/pgbouncer/issues/623))
--------
## PgBouncer 1.15.x {#pgbouncer-115x}
**2020-11-19  -  PgBouncer 1.15.0  -  «У меня ещё остался чемодан в Берлине»**
- Возможности
  * Улучшена отчетность об ошибках аутентификации. Сообщения об ошибке аутентификации, отправляемые клиенту, теперь содержат только информацию о том, что аутентификация не прошла, и не предоставляют дополнительных деталей. Полные детали доступны в логах PgBouncer. Кроме того, даже если запрашиваемого пользователя не существует, аутентификация все равно обрабатывается до конца и приводит к тому же общему сообщению об ошибке. Это предотвращает попытки клиентов выявить пользователей и другие аутентификационные детали в PgBouncer. Это поведение аналогично тому, как это работает в PostgreSQL.
  * Немедленное отключение клиента больше не записывается в журнал. Это устраняет лишние сообщения от систем мониторинга, которые открывают TCP/IP-соединение и закрывают его, не отправив данных.
  * Если stderr направлен в журнал systemd, для ведения журнала используются собственные функции systemd. Это устраняет повторные отметку времени и PID и добавляет метаданные, например уровень важности, полезные при пересылке в syslog.
  * Часть тестового набора теперь может выполняться под Windows.
  * `SHOW CONFIG` теперь также показывает значения по умолчанию для параметров.
- Исправления
  * Исправлен параметр `so_reuseport` во FreeBSD. Исходный код PgBouncer 1.12.0 там не работал. ([#504](https://github.com/pgbouncer/pgbouncer/pull/504))
  * Исправлена компиляция со старыми версиями systemd, нарушенная в 1.14.0. ([#505](https://github.com/pgbouncer/pgbouncer/issues/505))
  * Исправлена цель makefile для сборки двоичных ZIP-архивов Windows.
  * Длинные командные строки теперь также работают на Windows.
  * Исправлено поведение глобального `auth_user`. Раньше оно было неясным и ненадёжным из-за зависимости от порядка в файле конфигурации; теперь порядок не влияет. ([#391](https://github.com/pgbouncer/pgbouncer/issues/391), [#393](https://github.com/pgbouncer/pgbouncer/issues/393))
- Внутренняя переработка
  * Улучшена стабильность и портативность тестов.
  * Обновлён код, связанный с Autoconf.
  * Отключены предупреждения компилятора об устаревших возможностях OpenSSL 3.0.0.
--------
## PgBouncer 1.14.x {#pgbouncer-114x}
**2020-06-11  -  PgBouncer 1.14.0  -  «Вновь обретённая магия»**
- Возможности
  * Добавлена сквозная аутентификация SCRAM. Зашифрованные секреты SCRAM из `userlist.txt` или `auth_query` можно использовать для входа на серверы.
  * Добавлена активация сокетов systemd. Она особенно полезна, когда systemd должна создавать Unix-сокеты в системах с ограниченным доступом к `/var/run/postgresql`.
  * Добавлена поддержка Unix-сокетов в Windows.
- Внутренняя переработка
  * Добавлен альтернативный более компактный образец конфигурационного файла `pgbouncer-minimal.ini` для тестирования или развертывания.
--------
## PgBouncer 1.13.x {#pgbouncer-113x}

**2020-04-27  -  PgBouncer 1.13.0  -  «Моя любимая игра»**

- Возможности
  * Добавлен параметр конфигурации `tcp_user_timeout`, задающий соответствующий
    параметр сокета.
  * Значением `client_tls_protocols` и `server_tls_protocols` по умолчанию стало
    `secure`, то есть включены только TLS 1.2 и TLS 1.3. Старые версии по-прежнему
    поддерживаются, но не включены по умолчанию.
  * Добавлена поддержка уведомлений службы systemd. Сейчас она позволяет
    использовать службы с `Type=notify`. В будущих версиях планируется более
    тесная интеграция.

- Исправления
  * Исправлены многострочные сообщения журнала.
    ([libusual #24](https://github.com/libusual/libusual/pull/24))
  * Правильно обрабатываются пустые имена пользователей, возвращённые `auth_query`.
    ([#340](https://github.com/pgbouncer/pgbouncer/pull/340))

- Очистка
  * Файлы пакета Debian в каталоге `debian` удалены. Рекомендуется использовать
    пакеты из https://apt.postgresql.org/.
  * В набор тестов внесены многочисленные исправления и улучшения.
  * По умолчанию тесты больше не пытаются использовать sudo. Теперь это можно
    явно включить переменной окружения `USE_SUDO`.
  * Использование API libevent обновлено до интерфейсов в стиле версии 2;
    устаревшие интерфейсы версии 1 больше не применяются.

--------

## PgBouncer 1.12.x {#pgbouncer-112x}

**2019-10-17  -  PgBouncer 1.12.0  -  «Учимся и становимся лучше»**

Этот выпуск содержит различные небольшие улучшения и исправления.

- Возможности
  * Добавлен параметр для включения параметра сокета `SO_REUSEPORT`. В некоторых
    операционных системах это позволяет запускать на одном узле несколько
    экземпляров PgBouncer, прослушивающих один порт, а ядро автоматически
    распределяет соединения.
  * Добавлен параметр для использования файла `resolv.conf`, отдельного от
    системного. Он позволяет задавать пользовательские серверы DNS и, возможно,
    другие параметры DNS.
  * Вывод `SHOW VERSION` отправляется как обычная строка результата, а не
    сообщение NOTICE. Так его проще обрабатывать, и поведение соответствует
    другим командам `SHOW`.

- Исправления
  * Столбцы статистики отправляются как `numeric`, а не `bigint`. Это устраняет
    сбои некоторых клиентских библиотек при значениях, выходящих за диапазон
    `bigint`.
    ([#360](https://github.com/pgbouncer/pgbouncer/pull/360),
    [#401](https://github.com/pgbouncer/pgbouncer/pull/401))
  * Исправлена потеря пароля пользователями PAM.
    ([#285](https://github.com/pgbouncer/pgbouncer/issues/285))
  * Принимаются клиенты SCRAM с включённой привязкой канала. Ранее клиент с
    поддержкой привязки канала, то есть PostgreSQL 11+, в некоторых ситуациях
    получал ошибку соединения с PgBouncer. Сам PgBouncer не поддерживает привязку
    канала; изменение лишь исправляет поддержку предлагающих её клиентов.
  * Исправлена компиляция с новыми версиями musl-libc, используемой Alpine Linux.

- Очистка
  * Добавлена цель `make check`, запускающая все тесты одной командой.
  * Удалены ссылки на вики PostgreSQL. Теперь вся информация находится в
    документации PgBouncer или на сайте.
  * Удалена поддержка Libevent версии 1.x. Теперь требуется Libevent 2.x,
    обнаруживаемый с помощью pkg-config.
  * Исправлены предупреждения компилятора в macOS и Windows. Теперь сборка на
    этих платформах не должна выдавать предупреждений.
  * Исправлены некоторые предупреждения LLVM scan-build.

--------

## PgBouncer 1.11.x {#pgbouncer-111x}

**2019-08-27  -  PgBouncer 1.11.0  -  «Инстинкт величия»**

- Возможности
  * Добавлена поддержка аутентификации SCRAM для клиентов и серверов. Добавлен
    тип аутентификации `scram-sha-256`.
  * `auth_type=password` при хранимом пароле md5 обрабатывается так же, как
    сервером PostgreSQL.
    ([#129](https://github.com/pgbouncer/pgbouncer/pull/129))
  * Добавлен параметр `log_stats`, отключающий вывод статистики в журнал.
    ([#287](https://github.com/pgbouncer/pgbouncer/pull/287))
  * В отметки времени журнала добавлен часовой пояс.
  * PID в префиксе журнала заключён в квадратные скобки.
- Исправления
  * Исправлен тест OpenSSL в configure при работе с новыми версиями OpenSSL и `-Werror`.
  * Исправлен расчёт времени ожидания с `auth_user`. Ошибка приводила к аварийному
    завершению или мусорным значениям времени ожидания.
    ([#393](https://github.com/pgbouncer/pgbouncer/pull/393))
  * Обрабатывается пакет GSSENCRequest, добавленный в PostgreSQL 12. Сейчас он
    ничего не делает, но предотвращает непонятные сообщения об ошибке
    "bad packet header".
- Очистка
  * В набор тестов внесено множество улучшений и добавлено несколько тестов.
  * Исправлено несколько предупреждений компилятора в Windows.
  * Расширена документация секции `[users]`, и она добавлена в пример файла конфигурации.
    ([#330](https://github.com/pgbouncer/pgbouncer/pull/330))

--------

## PgBouncer 1.10.x {#pgbouncer-110x}

**2019-07-01  -  PgBouncer 1.10.0  -  «Боится мира»**

- Возможности
  * Добавлено включение и отключение TLS 1.3. Поддержка TLS 1.3 уже зависела от
    библиотеки OpenSSL, но теперь эта версия поддерживается и параметрами выбора
    версий протокола TLS.
- Исправления
  * Исправлена поддержка TLS 1.3, нарушенная с OpenSSL 1.1.1 и 1.1.1a, но не в
    более ранних или поздних версиях.
  * Исправлено редкое аварийное завершение в `SHOW FDS`.
    ([#311](https://github.com/pgbouncer/pgbouncer/issues/311))
  * Исправлена проблема, способная приводить к длительному простою при поступлении
    множества запросов отмены.
    ([#329](https://github.com/pgbouncer/pgbouncer/issues/329))
  * После перезагрузки Postgres больше не появляется сообщение
    "unexpected response from login query".
    ([#220](https://github.com/pgbouncer/pgbouncer/issues/220))
  * Исправлен расчёт `idle_transaction_timeout`.
    ([#125](https://github.com/pgbouncer/pgbouncer/issues/125)) Ошибка приводила
    к преждевременным тайм-аутам в отдельных ситуациях.
- Очистка
  * Различные сообщения журнала и ошибки сделаны точнее.
  * Исправлены проблемы, найденные Coverity; ни одна не оказывала существенного
    влияния на практике.
  * Все тестовые сценарии улучшены и документированы.
  * В документацию добавлены дополнительные команды SHOW.
  * Документация преобразована из rst в Markdown.
  * Все сценарии Python в дереве исходного кода теперь совместимы с Python 3.

--------
## PgBouncer 1.9.x {#pgbouncer-19x}

**2018-08-13  -  PgBouncer 1.9.0  -  «Выживание в хаосе»**

- Возможности
  * Команда RECONNECT.
  * Команда WAIT_CLOSE.
  * Быстрое закрытие: немедленно отключать сервер в сеансовом режиме пула, если
    он находится в состоянии "close_needed" (reconnect).
  * В SHOW SERVERS добавлен столбец close_needed.
- Исправления
  * Устранено двойное освобождение памяти в parse_filename.
  * Устранено разыменование указателя NULL в parse_line.
- Очистка
  * mkauth.py перенесён на Python 3.
  * Улучшена документация сигналов.
  * Улучшена документация быстрого запуска.
  * Документирована команда SET.
  * Исправлен список необходимого ПО.
  * Исправлены предупреждения -Wimplicit-fallthrough.
  * Добавлена отсутствовавшая документация различных полей SHOW.
  * Документировано поведение переподключения при перезагрузке и изменении DNS.
  * Документировано, что после KILL требуется RESUME.
  * Уточнена документация server_lifetime.
  * Исправлены опечатки и регистр букв в сообщениях и документации.
  * Исправлен вызов psql в тестах.
  * Внесены прочие улучшения настройки тестов.

--------

## PgBouncer 1.8.x {#pgbouncer-18x}

**2017-12-20  -  PgBouncer 1.8.1  -  «Тактика добивания в партере»**

- Исправления
  * Файл `include/pam.h` включён в архив дистрибутива. Из-за его отсутствия
    архив 1.8 вообще не собирался.

**2017-12-19  -  PgBouncer 1.8  -  «Уверенно у штурвала»**

- Возможности
  * Поддерживается аутентификация PAM. (Включается через `--with-pam`.)
  * В вывод `SHOW DATABASES` добавлены поля `paused` и `disabled`.
  * В вывод `SHOW POOLS` добавлено поле `maxwait_us`.
  * В вывод команд `SHOW` добавлены поля `wait` и `wait_us`.
  * Добавлены команды `SHOW STATS_TOTALS` и `SHOW STATS_AVERAGES`.
  * Запросы и транзакции в `SHOW STATS` отслеживаются отдельно. Поля
    `total_requests`, `avg_req` и `avg_query` заменены новыми полями.
  * В `SHOW STATS` добавлено `wait_time`.
- Исправления
  * Обновлённая libusual поддерживает OpenSSL 1.1.
  * Попытки использовать TLS в Unix-сокетах больше не выполняются.
  * При разборе `pg_hba.conf` ошибочные строки больше не приводят к отклонению
    всего файла; разбор продолжается.
    ([#118](https://github.com/pgbouncer/pgbouncer/issues/118))
  * Исправлено несколько других ошибок разбора hba.
  * Исправлено состояние гонки при отмене запроса.
    ([#141](https://github.com/pgbouncer/pgbouncer/issues/141))
- Очистка
  * Параметр `auth_user` теперь разрешён и глобально, а не только для отдельных баз данных.
    ([#142](https://github.com/pgbouncer/pgbouncer/issues/142))
  * Для клиента и сервера консоли задана кодировка `UTF8`.

--------

## PgBouncer 1.7.x {#pgbouncer-17x}

**2016-02-26  -  PgBouncer 1.7.2  -  «Наконец в воздухе»**

- Исправления
  * Исправлено аварийное завершение при удалении устаревшего pidfile. Проблема появилась в 1.7.1.
  * Очистка отключена: она нарушает перехват и бесполезна для производственной
    нагрузки. Проблема появилась в 1.7.1.
  * После перехвата запуск ожидает исчезновения pidfile. Медленное завершение
    из-за очистки памяти выявило существующее состояние гонки.
    ([#113](https://github.com/pgbouncer/pgbouncer/issues/113))
- Очистка
  * Сборка стала воспроизводимой благодаря удалению обработки DBGVER.
    ([#112](https://github.com/pgbouncer/pgbouncer/issues/112))
  * Antimake: список файлов из $(wildcard) сортируется, поскольку новые версии gmake
    больше этого не делают.
    ([#111](https://github.com/pgbouncer/pgbouncer/issues/111))
  * Версия libssl выводится в журнал.
  * deb: включено полное усиление защиты.

**2016-02-18  -  PgBouncer 1.7.1  -  «Перешли пяти друзьям, иначе...»**

ПРЕДУПРЕЖДЕНИЕ: начиная с версии 1.7, `server_reset_query` не выполняется,
когда база данных работает в транзакционном режиме пула. По-видимому, в
объявлении 1.7 это было подчёркнуто недостаточно. Если приложения зависят от
такого поведения, восстановите его через `server_reset_query_always`.

Основной работой этого выпуска был поиск утечки памяти, связанной с TLS, которой,
как выяснилось, не существует. Вместо неё обнаружена сборка libssl в
Debian/wheezy с накладными расходами 600k на соединение без утечки вместо
ожидаемых 20-30k. При использовании TLS за этим следует следить.

- Исправления
  * TLS: sslmode "disabled" переименован в "disable", как в PostgreSQL.
  * TLS: `client_tls_sslmode=verify-ca/-full` теперь отклоняет соединения без
    клиентского сертификата.
    ([#104](https://github.com/pgbouncer/pgbouncer/issues/104))
  * TLS: `client_tls_sslmode=allow/require` проверяет клиентский сертификат,
    если он отправлен. Ранее проверка сертификата оставалась ненастроенной,
    поэтому соединения с клиентским сертификатом завершались ошибкой.
    ([#105](https://github.com/pgbouncer/pgbouncer/issues/105))
  * Исправлена утечка памяти при освобождении базы данных.
  * Исправлена потенциальная утечка памяти в tls_handshake().
  * Исправлена обработка EOF в tls_handshake().
  * Исправлен слишком маленький memset в совместимой реализации asn1_time_parse.
  * Исправлена сборка без TLS (`--without-openssl`).
    ([#101](https://github.com/pgbouncer/pgbouncer/issues/101))
  * Исправлены различные проблемы сборки в Windows.
    ([#100](https://github.com/pgbouncer/pgbouncer/issues/100))
- Очистка
  * TLS: для снижения потребления памяти неактивными соединениями используется
    SSL_MODE_RELEASE_BUFFERS.
  * Выделенная память очищается при завершении. Это помогает запускать средства поиска утечек памяти.
  * Улучшена документация `server_reset_query`.
    ([#110](https://github.com/pgbouncer/pgbouncer/issues/110))
  * Параметры TLS добавлены в пример конфигурации.

**2015-12-18  -  PgBouncer 1.7  -  «Цвета меняются после воскрешения»**

- Возможности
  * Поддерживаются соединения TLS. В качестве реализации бэкенда используется OpenSSL/LibreSSL.
  * Поддерживается аутентификация с помощью клиентского сертификата TLS.
  * Поддерживается аутентификация "peer" в Unix-сокетах.
  * Поддерживается файл управления доступом по узлам, подобный
    [pg_hba.conf](http://www.postgresql.org/docs/9.4/static/auth-pg-hba-conf.html)
    в Postgres. Он позволяет настроить TLS для сетевых соединений и
    аутентификацию "peer" для локальных.
- Очистка
  * Значение `query_wait_timeout` по умолчанию установлено в 120s. Текущее
    значение по умолчанию (0) приводит к бесконечному ожиданию в очереди, что
    бесполезно. Теперь, если у клиента есть ожидающий запрос, но ему не назначено
    серверное соединение, клиентское соединение будет закрыто.
  * `server_reset_query_always` по умолчанию отключён. Теперь запрос сброса
    используется только в пулах сеансового режима.
  * pkt_buf увеличен до 4096 bytes. Это повышает производительность с TLS.
    Поведение, вероятно, зависит от нагрузки, но изменение должно быть безопасным:
    начиная с v1.2, буферы пакетов отделены от соединений и лениво берутся из пула.
  * Поддерживается конвейерная обработка с подсчётом ожидаемых пакетов ReadyForQuery.
    Это предотвращает слишком раннее освобождение сервера и исправляет
    [#52](https://github.com/pgbouncer/pgbouncer/issues/52).
  * Улучшена логика sbuf_loopcnt: сокет гарантированно обрабатывается повторно,
    даже если от него нет событий. Это необходимо для TLS с собственной буферизацией.
  * Системные тесты адаптированы к современным BSD и MacOS.
    (Eric Radman)
  * Удалена аутентификация **crypt**. Она устарела и не поддерживается PostgreSQL начиная с 8.4.
  * Исправлен обычный параметр configure "--with-cares": без аргумента он не работал.

--------

## PgBouncer 1.6.x {#pgbouncer-16x}

**2015-09-03  -  PgBouncer 1.6.1  -  «Студийная аудитория одобряет»**

- Возможности
  * Добавлен параметр `server_reset_query_always`. При его включении
    `server_reset_query` не используется в пулах, отличных от сеансового режима.
    PgBouncer вводит отдельный pool_mode для каждого пула, но сеансовый и
    транзакционный режимы не должны использовать одинаковый запрос сброса.
    Более того, транзакционный режим вообще не должен использовать запрос сброса.

    Параметр включён в 1.6.x, но будет отключён в 1.7.

- Исправления
  * [SECURITY] Удалено недопустимое назначение `auth_user`. (#69)
    Когда задан `auth_user`, а клиент запрашивает несуществующее имя пользователя,
    клиент входил как `auth_user`. Это небезопасно.

    [CVE-2015-6817](https://access.redhat.com/security/cve/cve-2015-6817)

  * NoticeResponse пропускается в handle_auth_response. Иначе подробные уровни
    журнала сервера приводили к ошибкам входа.

  * Консоль: при auth_type=any заполняется `auth_user`, иначе ведение журнала
    могло завершиться аварийно (#67).

  * Исправлены различные проблемы переносимости (OpenBSD, Solaris, OSX).

**2015-08-01  -  PgBouncer 1.6  -  «Зомби будущего»**

- Возможности

  * Хеш пароля пользователя загружается из базы данных Postgres.
    Новые параметры:

    auth_user
        пользователь для подключения к той же базе и получения сведений о пользователе.
        Также можно задать для отдельной базы данных.

    auth_query
        Запрос SQL, выполняемый от auth_user.
        По умолчанию: "SELECT usename, passwd FROM pg_shadow WHERE usename=$1"

    (Cody Cutrer)

  * Режим пула можно настраивать и для отдельной базы данных, и для пользователя.
    (Cody Cutrer)

  * Добавлены ограничения соединений по базе данных и пользователю:
    max_db_connections и max_user_connections.
    (Cody Cutrer / Pavel Stehule)

  * Добавлены команды DISABLE/ENABLE для запрета новых соединений.
    (William Grant)

  * Добавлен новый бэкенд DNS: c-ares. Это единственный бэкенд DNS, поддерживающий
    все важные возможности: /etc/hosts с обновлением, поиск SOA, большие ответы
    через TCP/EDNS+UDP и IPv6. Теперь это предпочтительный бэкенд, и, вероятно,
    в будущем он станет **единственным**, поскольку поддерживать множество
    неполноценных библиотек бессмысленно.

    SNAFU: версии c-ares <= 1.10 содержат ошибку, нарушающую поддержку CNAME
    при включённом IPv6. Ошибка исправлена в исходном проекте. В качестве обхода
    c-ares <= 1.10 используется только с IPv4. Поэтому PgBouncer откажется от
    других бэкендов лишь после того, как c-ares >1.10, ещё не выпущенный на тот
    момент, будет доступен некоторое время...

  * remote_pid отображается в SHOW CLIENTS/SERVERS. Он доступен для клиентов,
    подключённых через Unix-сокеты, а также для серверов с TCP- и Unix-сокетами.
    Для TCP-сервера PID берётся из ключа отмены.

  * Добавлен отдельный параметр конфигурации dns_nxdomain_ttl для управления
    отрицательным кэшированием DNS.
    (Cody Cutrer)

  * IP-адрес и порт клиентского узла добавляются к application_name. Это
    включается параметром application_name_add_host со значением по умолчанию 'off'.
    (Andrew Dunstan)

  * Файлы конфигурации поддерживают директиву '%include FILENAME', позволяющую
    разделить конфигурацию на несколько файлов.
    (Andrew Dunstan)

- Очистка

  * Журнал: адрес IPv6 заключён в [].
  * Журнал: при соединении с сервером показываются локальные IP и порт.
  * win32: для длинных аргументов используется стиль GNU: --foo.
  * В имени узла разрешены цифры; всегда выполняется попытка разбора через inet_pton.
  * Исправлен deallocate_all() в FAQ.
  * Исправлено неверное ключевое слово в примере файла конфигурации.
    (Magnus Hagander)
  * В файлах аутентификации разрешены комментарии с ';'.
    (Guillaume Aubert)
  * Исправлены орфографические ошибки в сообщениях журнала и комментариях.
    (Dmitriy Olshevskiy)

- Исправления

  * Исправлен запуск новых соединений во время обслуживания.
    (Cody Cutrer)
  * Файл аутентификации больше не загружается дважды при запуске.
    (Cody Cutrer)
  * Реализована правильная инвалидация автоматически созданных баз данных.
  * IPv6: для прослушивающего сокета задан IPV6_V6ONLY.
  * win32: для прослушивающего сокета не задаётся SO_REUSEADDR.
  * Исправлен memcpy адреса IPv6.
  * Исправлена отмена ожидающих клиентов.
    (Mathieu Fenniak)
  * Небольшое исправление: результат calloc обязательно проверяется.
    (Heikki Linnakangas)
  * В конец файла PID добавлен перевод строки.
    (Peter Eisentraut)
  * Новые серверные соединения запрещены после команды PAUSE <db>.
    (Petr Jelinek)
  * Исправлено сообщение "bad packet" при входе, когда заголовок задерживается.
    (Michal Trojnara, Marko Kreen)
  * Исправлены ошибки, обнаруженные Coverty.
    (Euler Taveira)
  * server_idle_timeout отключается, когда число серверов становится меньше min_pool (#60).
    (Marko Kreen)

--------

## PgBouncer 1.5.x {#pgbouncer-15x}

**2015-04-09  -  PgBouncer 1.5.5  -  «Прикинься мёртвым, чтобы победить»**

- Исправления
  * Исправлено удалённое аварийное завершение: неверный порядок пакетов приводил
    к обращению по указателю NULL. Ошибка не эксплуатируется, это лишь DoS.

**2012-11-28  -  PgBouncer 1.5.4  -  «Утечек нет, приучение к горшку прошло успешно»**

- Исправления
  * DNS: исправлена утечка памяти в бэкенде getaddrinfo_a().
  * DNS: исправлена утечка памяти в бэкенде udns.
  * DNS: исправлен расчёт статистики.
  * DNS: улучшена обработка сообщений об ошибках getaddrinfo_a().
  * Исправлена компиляция win32.
  * Исправлена проверка поддержки зависимостей компилятора в configure.
  * Исправлена документация.

**2012-09-12  -  PgBouncer 1.5.3  -  «Квантовый тостер»**

- Критическое исправление

  * Слишком длинные имена баз данных могли приводить к удалённо вызываемому
    аварийному завершению при включённых автоматически создаваемых базах данных.

    Исходные проверки предполагали, что все имена поступают из файлов конфигурации,
    поэтому использование fatal() было допустимо, но при включении автоматически
    создаваемых баз
    - через '*' в секции [databases] - имя базы может прийти из сети, что делает
    возможным удалённое завершение работы.

    [CVE-2012-4575](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-4575)

- Небольшие возможности

  * max_packet_size — параметр конфигурации максимального разрешённого размера
    пакета. Значение по умолчанию осталось прежним: (2G-1), но теперь его можно уменьшить.
  * Если заголовок пакета невозможно разобрать, он выводится в журнал и сообщение
    об ошибке в шестнадцатеричном виде.

- Исправления

  * AntiMake использовал $(relpath) и $(abspath) для работы с путями, но при
    символических ссылках в пути дерева исходного кода сборка завершалась
    ошибкой. Теперь код работает только с обычными строками.
  * Консоль: SET теперь может задавать значения пустых строк.
  * config.txt: указано, что все тайм-ауты можно задавать дробными числами.
    Эта малозаметная возможность появилась в 1.4.

**2012-05-29  -  PgBouncer 1.5.2  -  «Не жуй, просто глотай»**

- Исправления
  * Из-за ошибки reserve_pool_timeout воспринимался в микросекундах, а не в
    секундах, фактически немедленно активируя резервный пул при заполнении
    основного. Теперь, как и предполагалось, значение используется в секундах.
    (Обнаружил Keyur Govande)

**2012-04-17  -  PgBouncer 1.5.1  -  «Прервать, повторить, игнорировать?»**

- Возможности
  * Добавлены параметры прав доступа к Unix-сокету:
    unix_socket_mode=0777, unix_socket_group=''.
- Исправления
  * Для серверной переменной разрешена пустая строка. Это необходимо для
    правильной работы "application_name", поскольку только у этого параметра
    нет серверного значения по умолчанию.
  * При изменении строки соединения требуется обновить параметры сервера.
    Ранее PgBouncer продолжал использовать старые параметры, что нарушало
    работу при обновлении Postgres.
  * При изменении строки соединения автоматически созданной базы старые соединения удаляются.
  * cf_setint: для разбора целочисленных параметров конфигурации используется
    strtol() вместо atoi(). Это поддерживает шестнадцатеричную и восьмеричную
    запись и лучше обнаруживает ошибки.
  * Для обнаружения union sigval используется sigqueue(), что исправляет компиляцию в HPUX.
  * Команда 'git' удалена из Makefile: при сборке из обычного архива она выдавала случайные ошибки.
  * Документирован параметр stats_period, задающий период вывода статистики.
  * Требуется Asciidoc >= 8.4: документация, по-видимому, больше не совместима
    с более ранними версиями.
  * Прекращены повторные попытки при EINTR от close().

**2012-01-05  -  PgBouncer 1.5  -  «Довольные клиенты с 2007 года»**

Если за одним именем DNS находится более 8 IP-адресов, теперь для запросов
необходимо использовать протокол EDNS0. Его поддерживают только бэкенды
getaddrinfo_a()/getaddrinfo() и UDNS; libevent 1.x/2.x не поддерживает.
Чтобы включить его для libc, добавьте 'options edns0' в /etc/resolv.conf.

Для сборки требуется GNU Make 3.81+.

- Возможности
  * Изменения ответов DNS распознаются, а соединения с IP-адресами, отсутствующими
    в последнем ответе, признаются недействительными.
    (Petr Jelinek)
  * Инвалидация имён узлов по серийному номеру зоны DNS. Когда задан
    dns_zone_check_period, у всех зон DNS запрашивается SOA; после изменения
    серийного номера повторно запрашиваются все имена узлов. Это обеспечивает
    детерминированную инвалидацию соединений, поскольку инвалидация при поиске
    бесполезна, если поиск не выполняется. Работает только с новым бэкендом UDNS.
  * Добавлены команды SHOW DNS_HOSTS и SHOW DNS_ZONES для просмотра кэша DNS.
  * Добавлен параметр min_pool_size, предотвращающий закрытие всех соединений
    при отсутствии нагрузки.
    (Filip Rembialkowski)
  * idle_in_transaction_timeout закрывает слишком долго неактивную транзакцию.
    По умолчанию не задан.
  * Добавлен бэкенд libudns для поиска DNS. Он функциональнее evdns. Включается
    через --with-udns. IPv6 пока не поддерживается.
  * Команда KILL немедленно закрывает все соединения одной базы данных.
    (Michael Tharp)
  * Выполнен переход на систему сборки Antimake для более удобных Makefile.
    Теперь для сборки требуется GNU Make 3.81+.
- Исправления
  * DNS теперь работает с именами узлов IPv6.
  * Состояние соединения не меняется при поступлении NOTIFY от сервера.
  * Внесены различные исправления документации.
    (Dan McGee)
  * Консоль: поддерживаются кавычки идентификаторов с "". Изначально команд,
    принимающих имена баз данных, не было, поэтому кавычки не требовались.
  * Консоль: цифры разрешены в начале регулярного выражения слова. Строгий
    анализатор здесь чрезмерно усложняет работу.
  * Приостановленные автоматически созданные базы данных не удаляются по сроку.
    (Michael Tharp)
  * Автоматические базы создаются при необходимости во время PAUSE.
    (Michael Tharp)
  * Исправлено неверное сообщение журнала команды RESUME.
    (Peter Eisentraut)
  * Если строка соединения базы содержит user= без password=, пароль берётся из userlist.
  * '*' правильно разбирается в коде перехвата.
  * autogen.sh работает со старыми autoconf/automake.
  * Исправлено аварийное завершение службы win32 из-за неверного basename() из
    среды выполнения mingw/msvc. Теперь всегда используется совместимая реализация basename().

--------

## PgBouncer 1.4.x {#pgbouncer-14x}

**2011-06-16  -  PgBouncer 1.4.2  -  «Алгоритм первого удара»**

Затронутые операционные системы: \*BSD, Solaris, Win32.

- Исправления переносимости
  * CFLAGS передаётся компоновщику. Это необходимо при использовании резервной
    реализации getaddrinfo_a() на основе pthread.
  * lib/find_modules.sh: split() заменён на index()+substr(). Это должно
    обеспечить работу со старыми версиями AWK.
  * <usual/endian.h>: системные определения htoX/Xtoh игнорируются, поскольку
    может быть определено лишь подмножество макросов.
  * <usual/signal.h>: совместимый sigval отделён от совместимого sigevent.
  * <usual/socket.h>: для получения iovec включён <sys/uio.h>.
  * <usual/time.h>: улучшено автоматическое обнаружение функций в win32.
  * <usual/base_win32.h>: удалено повторное объявление sigval/sigevent.

**2011-04-01  -  PgBouncer 1.4.1  -  «Всё это было представлением»**

- Возможности

  * Поддерживается прослушивание и подключение по адресам IPv6.
    (Hannu Krosing)
  * В 'listen_addr' поддерживается несколько адресов прослушивания. Для каждого
    вызывается getaddrinfo(), поэтому можно использовать и имена.
  * Консоль: версия PgBouncer отправляется клиенту как 'server_version'.

- Важные исправления

  * getaddrinfo_a() отключён в glibc < 2.9, поскольку в старых версиях он
    вызывает аварийное завершение.

    Среди затронутых систем: RHEL/CentOS 5.x (glibc 2.5), Ubuntu 8.04 (glibc 2.7),
    а также Debian/lenny (glibc 2.7), где getaddrinfo_a() не завершается аварийно,
    но надёжно обнаружить это невозможно.

    В таких системах используйте libevent 2.x: резервный getaddrinfo_a() не
    предназначен для производственной эксплуатации. Изучите новый раздел
    «Поддержка поиска DNS» в README, где описан выбор бэкенда DNS.

    (Hubert Depesz Lubaczewski, Dominique Hermsdorff, David Sommerseth)

  * При использовании libevent 2.x по умолчанию включается --enable-evdns.

  * tcp_keepalive включён по умолчанию, как и в Postgres.
    (Hubert Depesz Lubaczewski)

  * Значением server_reset_query по умолчанию стало DISCARD ALL для стандартной
    совместимости с Postgres.

  * win32: исправлены аварийные завершения при адресе Unix-сокета NULL.
    (Hiroshi Saito)

  * Исправлена очистка автоматически созданных баз данных: старый код путал базы
    и пулы. При обнаружении одного пустого пула база помечалась как 'idle', что
    позднее могло удалить базу с активными пользователями.

    Сообщил: Hubert Depesz Lubaczewski

- Исправления

  * Совместимый getaddrinfo_a() сделан неблокирующим: для поиска используется
    один параллельный поток.
  * Компиляция с pthread включается при использовании совместимого getaddrinfo_a.
  * release_server не задавал ->last_lifetime_disconnect при отключении по сроку существования.
    (Emmanuel Courreges)
  * win32: исправлен файл аутентификации с окончаниями строк DOS — load_file()
    не учитывал уменьшение файла при загрузке.
    (Rich Schaaf)
  * <usual/endian.h>: добавлено обнаружение функций enc/dec через autoconf,
    чтобы избежать конфликтов в BSD.
    (James Pye)
  * Устранено аварийное завершение при отсутствии файла конфигурации.
    (Lou Picciano)
  * Устранено аварийное завершение при ошибке поиска DNS и ведении журнала на
    уровне noise (-v -v).
    (Hubert Depesz Lubaczewski, Dominique Hermsdorff)
  * В find_modules.sh используются обратные кавычки вместо $(cmd) для лучшей переносимости.
    (Lou Picciano)
  * В find_modules.sh используется 'awk' вместо 'sed' для лучшей переносимости.
    (Giorgio Valoti)
  * При запуске в журнал выводятся сведения об активном асинхронном бэкенде DNS.
  * Исправлен --disable-evdns: теперь он означает 'no', а не 'yes'.
  * В документации указано, что -R требует unix_socket_dir.
  * server_reset_query рассмотрен в faq.txt.
  * В slab-аллокатор восстановлен утраченный memset.
  * В libusual внесены различные небольшие исправления переносимости.

**2011-01-11  -  PgBouncer 1.4  -  «Кровавый код»**

- Возможности

  * Асинхронный поиск DNS: имена разрешаются не при перезагрузке, а при
    установлении соединения, с настраиваемым кэшированием.
    (См. параметр dns_max_ttl.)

    По умолчанию в качестве бэкенда используется getaddrinfo_a() из glibc.
    При его отсутствии getaddrinfo_a() эмулируется через блокирующий(!) getaddrinfo().

    Если configure передан аргумент --enable-evdns, используется evdns из
    libevent. По умолчанию он не применяется, поскольку libevent 1.3/1.4
    содержит ошибочную реализацию. Приемлемым выглядит только evdns из libevent 2.0.

  * Добавлена переменная конфигурации syslog_ident для настройки имени syslog.

  * Реализована полноценная поддержка параметра запуска `application_name`.

  * Добавлены длинные параметры командной строки (Guillaume Lelarge).

  * Исправлена переносимость в Solaris (Hubert Depesz Lubaczewski).

  * Добавлена переменная конфигурации disable_pqexec. В средах с повышенными
    требованиями можно отключить Simple Query Protocol. Тогда приложения
    должны использовать только Extended Query Protocol.

  * Совместимость с Postgres: если имя базы данных в пакете запуска пусто,
    используется имя пользователя.

- Исправления

  * Параметры сервера DateStyle и TimeZone должны иметь точный регистр.
  * Консоль: клиенту отправляются параметры сервера datetime, timezone и stdstr.

- Внутренняя очистка

  * Для низкоуровневых вспомогательных функций используется библиотека libusual.
  * Из параметров сервера удалено ограничение фиксированной длины.

--------
## PgBouncer 1.3.x {#pgbouncer-13x}

**2010-09-09  -  PgBouncer 1.3.4  -  «Баунсер всегда прав»**

- Исправления
  * Логика быстрого отказа применяется при установлении соединения. Если сервер
    не работает, клиенты получают ошибку при подключении.
  * Автоматически созданные базы данных больше не помечаются для проверки при
    перезагрузке, иначе они удалялись, поскольку отсутствуют в конфигурации.
  * Параметр application_name по умолчанию игнорируется. Поэтому пользователям
    Postgres 9.0 не требуется самостоятельно добавлять его в ignore_startup_parameters=.
  * Исправлено заключение pg_auth в кавычки. Символ '\' там не используется.
  * Улучшены сообщения об ошибках в консоли: пользователю показывается входящий запрос.
  * Поддерживаются операционные системы (OpenBSD), где tv_sec не имеет тип time_t.
  * Устранены излишне шумные предупреждения gcc 4.5.

**2010-05-10  -  PgBouncer 1.3.3  -  «NSFW»**

- Улучшения
  * Аргумент listen(2) теперь настраивается через listen_backlog. Это полезно
    в операционных системах, где можно менять максимально допустимое системное значение.
  * Сообщения об отключении теперь показывают имя пользователя или базы данных,
    из-за которых вход завершился неудачно.
- Исправления
  * Переработана логика повторного запуска после быстрого отказа. Прежняя логика
    мешала при постоянно неисправных базах данных или пользователях, выполняя
    повторные попытки даже без клиентов, желающих войти.
  * Функции ведения журнала сохраняют прежнее значение errno, иначе при высоких
    уровнях журналирования и проблемах записи PgBouncer мог вести себя непредсказуемо.
  * Увеличены различные буферы, относящиеся к запуску, для обработки более
    многословного запуска EDB.
  * Запрос запуска протокола V2 распознаётся и сопровождается понятной причиной отключения.

**2010-03-15  -  PgBouncer 1.3.2  -  «Пуля-бумеранг»**

- Исправления

  * Добавлена переменная конфигурации 'query_wait_timeout'. Если клиент не получает
    серверное соединение за указанное число секунд, он будет отключён.

  * Если в пуле нет серверного соединения, а последняя попытка подключения
    завершилась неудачно, клиентские соединения не переводятся в ожидание —
    ошибка отправляется сразу.

    Вместе с предыдущим исправлением это устраняет ненужные задержки при
    недоступности базы данных.

  * Состояние libevent отслеживается в sbuf.c, чтобы избежать двойного вызова
    event_del(). Хотя обычно это безопасно, такой вызов работает не в 100%
    случаев. Теперь всегда должно быть известно, был ли он уже выполнен.

  * Во время SUSPEND обслуживание отключается. Иначе при коротких тайм-аутах
    старый процесс PgBouncer мог закрыть несколько соединений после их передачи.

  * client_login_timeout применяется к клиентам, ожидающим приветственного
    пакета — первого серверного соединения. Иначе они могли ждать бесконечно,
    если не задан query_timeout.

  * win32: к -regservice добавлены ключи -U/-P, позволяющие выбрать учётную
    запись для запуска службы. Прежний автоматический выбор между Local Service
    и Local System был недостаточно надёжен.

  * Консоль: из конца текстовых столбцов удалён \0. Проблему было трудно заметить,
    поскольку клиенты C корректно его обрабатывали.

  * Улучшена документация. (Greg Sabino Mullane)

  * Уточнено несколько сообщений журнала, связанных со входом.

  * Уровень журналирования ошибок, отправляемых пулом обычно при отключении,
    изменён с INFO на WARNING, поскольку они указывают на проблемы.

  * Сообщение журнала для query_timeout изменено на "query timeout".

**2009-07-06  -  PgBouncer 1.3.1  -  «Теперь полностью соответствует требованиям мониторинга NSA»**

- Исправления
  * Исправлена проблема sbuf_loopcnt, из-за которой соединения могли зависать.
    Если длина запроса или результата близка к кратному (pktlen*sbuf_loopcnt)
    [10k по умолчанию], соединение могло продолжать ждать данные, которые уже
    не появятся.
  * Изменение конфигурации базы данных применяется немедленно. Ранее старые
    соединения могли повторно использоваться после SIGHUP.
  * Исправлена команда SHOW DATABASES, нарушенная добавлением столбца.
  * При "auth_type=any" доступ к консоли был отключён, поскольку PgBouncer
    отбрасывал имя пользователя. Исправление: при "auth_type=any" любой
    пользователь допускается в консоль как администратор.
  * Исправлен неверный макрос CUSTOM_ALIGN. К счастью, он не используется, если
    операционная система уже определяет ALIGN, поэтому ошибка, по-видимому,
    не проявлялась на практике.
  * win32: WSAStartup() всегда вызывается, а не только в режиме демона, поскольку
    при разборе конфигурации необходимо разрешать имена узлов.
  * win32: имя файла конфигурации в командной строке службы заключено в кавычки,
    чтобы пути могли содержать пробелы. Путь исполняемого файла, судя по всему,
    в этом не нуждается благодаря особенностям win32.
  * STATS добавлено в текст SHOW HELP.
  * doc/usage.txt: единицы времени в результатах консоли — микросекунды, а не миллисекунды.

**2009-02-18  -  PgBouncer 1.3  -  «Новый завершающий приём Ki-Smash»**

- Возможности

  * IANA назначила порт 6432 официальным портом PgBouncer. Поэтому номер порта
    по умолчанию изменён на 6432. Отдельным существующим пользователям ничего
    менять не требуется, но распространителям пакетов PgBouncer следует изменить
    значение пакета по умолчанию на официальный порт.

  * Динамическое создание баз данных (David Galoyan)

    Теперь можно определить базу данных с именем "*". Если она определена,
    её строка соединения используется для всех неопределённых баз. Это особенно
    полезно в тестовых средах и средах разработки.

  * Поддержка Windows (Hiroshi Saito)

    Теперь PgBouncer работает в Windows 2000+. Использование командной строки
    остаётся прежним, но запуск в режиме демона и перезапуск без остановки
    обслуживания недоступны. Для запуска как службы задайте в конфигурации
    параметр service_name. Затем выполните:

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

    Для остановки и отмены регистрации:

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

    Для использования журнала событий Windows сначала необходимо зарегистрировать DLL событий:

        > regsrv32 pgbevent.dll

    После этого в конфигурации можно задать "syslog = 1".

- Небольшие возможности

  * Имена баз данных в файле конфигурации теперь можно заключать в стандартные
    кавычки идентификаторов SQL, что позволяет использовать нестандартные символы.

  * Добавлены параметры 'reserve_pool_size' и 'reserve_pool_timeout'. Если
    клиенты пула ждут дольше 'reserve_pool_timeout' секунд, 'reserve_pool_size'
    задаёт число соединений, которые можно добавить в пул. Значение также можно
    задать для отдельного пула переменной соединения 'reserve_pool'.

  * Добавлен параметр 'sbuf_loopcnt', ограничивающий время обработки одного сокета.

    В некоторых ситуациях — например на SMP-сервере с локальным Postgres и
    быстрой сетью — PgBouncer может многократно выполнять цикл recv()->send()
    без блокировки с обеих сторон. Тогда другие соединения надолго задерживаются.
    Для более справедливой обработки ограничивается число циклов recv()->send()
    на одном сокете. После достижения предела обрабатываются другие сокеты,
    а работа с прежним возобновляется в следующем цикле событий.

    Спасибо Alexander Schocke за сообщение и тестирование.

  * Аутентификация crypt() теперь необязательна, поскольку она удалена из
    Postgres. Если операционная система её не предоставляет, PgBouncer работает без неё.

  * В отметки времени журнала добавлены миллисекунды.

  * Прежняя реализация MD5 заменена более компактной.

  * Лицензия ISC обновлена разъяснением FSF.

- Исправления

  * Если event_del() сообщает об ошибке, очистка всё равно продолжается. Ранее
    PgBouncer повторял вызов на случай ошибки из-за ENOMEM. Это приводило к
    переполнению журнала бесконечными повторами, поэтому, по-видимому, libevent
    такое поведение не поддерживает.

    Причина ошибки первого вызова event_del() по-прежнему неизвестна.

  * Теперь --enable-debug лишь определяет, удаляются ли отладочные сведения из
    двоичного файла. Параметр больше не меняет -fomit-frame-pointer, поскольку
    это опасно.

  * Исправлен порядок включения: иначе системные включаемые файлы могли
    предшествовать внутренним. Проблема затрагивала новый включаемый файл md5.h.

  * Файл COPYRIGHT включён в .tgz...

--------

## PgBouncer 1.2.x {#pgbouncer-12x}

**2008-08-08  -  PgBouncer 1.2.3  -  «Тщательно отобранные байты»**

- Исправления
  * Код SO_ACCEPTFILTER отключён для BSD, где он не работал.
  * Пример etc/userlist.txt включён в tgz.
  * Для рекурсивного вызова используется '$(MAKE)' вместо 'make' (Jorgen Austvik).
  * Определяется _GNU_SOURCE, без которого glibc бесполезна.
  * libevent 1.1 разрешено пройти тест компоновки, чтобы позднее можно было
    вывести сообщение "1.3b+ needed".
  * Устаревший pidfile распознаётся и удаляется.

Спасибо Devrim GUNDUZ и Bjoern Metzdorf за сообщения о проблемах и тестирование.

**2008-08-06  -  PgBouncer 1.2.2  -  «Гигиенический пакет в комплекте»**

- Исправления
  * Удалён 'drop_on_error': это была плохая идея. Параметр добавили как обходной
    путь для нарушенного поведения кэша планов Postgres, но он мог причинить
    вред в обычной ситуации, когда некоторые запросы всегда возвращают ошибку.

**2008-08-04  -  PgBouncer 1.2.1  -  «Водонепроницаемый»**

- Возможности
  * Добавлен параметр 'drop_on_error': если сервер выдаёт ошибку, соединение не
    используется повторно, а закрывается после завершения работы клиента с ним.
    Это необходимо для обновления кэша планов. Автоматическое обновление не
    работает даже в 8.3. Значение по умолчанию — 1.
- Исправления
  * SHOW SOCKETS/CLIENTS/SERVERS: устранено аварийное завершение, если у сокета нет буфера.
  * Исправлен бесконечный цикл SUSPEND при срабатывании suspend_timeout.
- Небольшая очистка
  * Для 'struct iovec' используется <sys/uio.h>.
  * Завершение работы, начатое SIGINT, отменяется при RESUME/SIGUSR2, иначе оно
    сработало бы при следующем PAUSE.
  * Добавлено правильное сообщение журнала при отмене операции консоли.

**2008-07-29  -  PgBouncer 1.2  -  «Обычная волшебная флейта»**

PgBouncer 1.2 теперь требует libevent версии 1.3b или новее.
Старые версии libevent аварийно завершаются с новым кодом перезапуска.

- Возможности

  * Параметр командной строки (-u) и параметр конфигурации (user=) поддерживают
    переключение пользователя при запуске. Кроме того, PgBouncer теперь
    отказывается работать от root.

    (Jacob Coby)

  * Добавлен более подробный текст справки (-h). (Jacob Coby)

  * Добавлен параметр базы данных connect_query для выполнения запроса в новых
    соединениях до начала их использования.

    (Teodor Sigaev)

  * Добавлена переменная конфигурации 'ignore_startup_parameters', разрешающая
    и игнорирующая дополнительные параметры пакета запуска. По умолчанию
    разрешены только 'database' и 'user', все остальные вызывают ошибку. Это
    необходимо для чрезмерно инициативного JDBC, безусловно задающего
    'extra_float_digits=2' в пакете запуска.

  * Ведение журнала в syslog: добавлены параметры syslog=0/1 и
    syslog_facility=daemon/user/local0.

  * Менее пугающий перезапуск без остановки обслуживания (-R)

    - Загрузка FD перенесена до fork, чтобы вывод шёл в консоль и операцию можно было отменить через ^C.

    - SHUTDOWN остаётся после fork, поэтому ^C будет безопасным.

    - Выполняется попытка connect() к Unix-сокету, чтобы определить наличие
      слушателя. Теперь -R можно использовать, даже если предыдущий процесс не
      работал. Если предыдущий процесс есть, но -R не указан, запуск завершается ошибкой.

  * Добавлены команды консоли:

    - SHOW TOTALS показывает сводную статистику, записываемую в журнал, и использование памяти.

    - SHOW ACTIVE_SOCKETS аналогична SHOW SOCKETS, но оставляет только активные сокеты.

- Менее заметные возможности

  * suspend_timeout закрывает зависшие соединения и затянувшиеся входы, повышая
    безопасность перезапуска.

  * Когда удалённая база данных выдаёт ошибку при входе, клиенты получают уведомление.

  * Удаление базы данных из конфигурации с перезагрузкой работает: все соединения
    закрываются, а база удаляется.

  * Для большего сходства с Postgres подделываются некоторые параметры команд
    SHOW/SET в консоли. Это потребовалось, чтобы psycopg мог подключаться к консоли.
    (client_encoding/default_transaction_isolation/datestyle/timezone)

  * server_lifetime=0 теперь закрывает серверное соединение сразу после первого
    использования. Ранее "0" заставлял PgBouncer игнорировать возраст сервера.
    Поскольку это поведение не было документировано, зависеть от него никто не должен.

  * Внутренние улучшения:

    - Буферы пакетов выделяются лениво и используются повторно. Это должно
      значительно уменьшить потребление памяти и делает практичным большой
      pktbuf при множестве соединений.

    - Внесено множество улучшений обработки ошибок; теперь PgBouncer должен
      корректно переживать ситуации OOM.

    - Для управления памятью используется slab-аллокатор.

    - Выполнена значительная очистка кода.

- Исправления

  * За один цикл событий выполнялся только один accept(), что могло создавать
    очередь соединений при большом числе попыток. Теперь прослушивающий сокет
    всегда опустошается полностью, что должно устранить проблему.
  * Обрабатывается EINTR от connect().
  * configure.ac совместим с autoconf 2.59.
  * Исправлена совместимость с Solaris (Magne Maehre).

--------

## PgBouncer 1.1.x {#pgbouncer-11x}

**2007-12-10  -  PgBouncer 1.1.2  -  «Молот»**

- Возможности
  * Отключения из-за server_lifetime теперь разнесены на
    (server_lifetime / pool_size) секунд. Это не позволяет PgBouncer создавать
    всплески повторных подключений.
- Исправления
  * Проблемы обновления без остановки обслуживания с 1.0 до 1.1:
    - 1.0 не отслеживает параметры сервера, поэтому они остаются NULL, но 1.1
      этого не ожидала и аварийно завершалась.
    - Если параметры сервера неизвестны, а клиентские заданы, для них выполняется
      SET вместо сообщения об ошибке.
  * Удалены временные отладочные операторы, случайно оставленные в коде на уровне
    INFO и засорявшие журналы.
  * Исправлен debian/changelog.
- Очистка
  * Поля структуры SBuf переставлены для лучшего выравнивания буфера.

**2007-10-26  -  PgBouncer 1.1.1  -  «Пчела-брейкдансер»**

- Исправления
  * Кэш параметров сервера мог оставаться неинициализированным, вызывая ненужный
    SET. Это создавало проблему в 8.1, где нельзя изменять
    standard_conforming_strings.
    (Спасибо Dimitri Fontaine за сообщение и тестирование.)
  * Исправлена документация.
  * doc/fixman.py включён в .tgz.

**2007-10-09  -  PgBouncer 1.1  -  «Набор инструментов Безумной Шляпы»**

- Возможности

  * Отслеживаются следующие параметры сервера:

        client_encoding  datestyle, timezone, standard_conforming_strings

  * Улучшения строки соединения базы данных:

    - В host= принимается имя узла.
    - В host= принимается пользовательское местоположение Unix-сокета.
    - Принимаются значения в кавычках: password=' asd''foo'.

  * Добавлена переменная конфигурации server_reset_query, отправляемая сразу после освобождения.
  * Добавлена переменная конфигурации server_round_robin для переключения между LIFO и RR.
  * Пакет отмены для неактивного соединения больше не закрывает его.
  * Отмена через ^C из psql работает для SUSPEND / PAUSE.
  * При запуске выводятся ограничения FD.
  * При приостановке предпринимается попытка как можно скорее достичь границы пакета.
  * В параметры базы данных добавлен 'timezone'.
  * Используется долгоживущий fd файла журнала, повторно открываемый при SIGHUP / RELOAD.
  * Локальные сведения о конечных точках соединения добавлены в SHOW SERVERS/CLIENTS/SOCKETS.

- Очистка кода

  * Больше отладочных сообщений журнала содержат сведения о сокете.
  * Удалены магические числа и очищены сообщения об ошибках. (David Fetter)
  * Добавлена структура-обёртка для текущих сведений о пакете, значительно уменьшающая сложность.

- Исправления

  * Улучшено обнаружение недопустимых заголовков пакетов.
  * Проверка изменения auth_file была нарушена, из-за чего PgBouncer слишком часто перезагружал файл.

--------

## PgBouncer 1.0.x {#pgbouncer-10x}

**2007-06-18  -  PgBouncer 1.0.8  -  «Дзюцу лопаты нежити»**

- Исправления
  * Исправлено аварийное завершение при обработке пакета отмены. (^C из psql)
- Возможности
  * Теперь работают PAUSE <db>; RESUME <db>;.
  * Очищен разбор команд консоли.
  * Отключена дорогостоящая проверка assert для поиска в списке.

**2007-04-19  -  PgBouncer 1.0.7  -  «С витаминами A-Z»**

- Исправления
  * Несколько пакетов ошибок/уведомлений с блокировкой send() между ними вызывали
    assert. Проблема исправлена полным удалением логики сброса. PgBouncer ничего
    активно не буферизует, поэтому она не нужна и оставалась со времён, когда
    буферизация передавалась ядру с MSG_MORE.
  * Кроме того, вызов логики recv() не выполняется при разблокировке отправки.
  * Код поиска в списке для admin_users и stats_users неверно обрабатывал
    частичные совпадения. Это исправлено.
  * Поиск UID однорангового узла Unix-сокета стандартизирован на getpeereid().

**2007-04-12  -  PgBouncer 1.0.6  -  «Ежедневная доза»**

- Исправления
  * Исправление «Отключить обслуживание во время перехвата» могло полностью
    отключить обслуживание. Это исправлено.
  * Исправлена компиляция во FreeBSD, где <sys/ucred.h> требует <sys/param.h>.
    Спасибо Robert Gogolok за сообщение.

**2007-04-11  -  PgBouncer 1.0.5  -  «На сегодня достаточно»**

- Исправления
  * Исправлены ошибки перезапуска без остановки обслуживания:
    - Для неактивных серверов задаётся ->ready.
    - Удалён устаревший код из use_client_socket().
    - Обслуживание отключается во время перехвата.

**2007-04-11  -  PgBouncer 1.0.4  -  «Последняя “последняя” ошибка»**

- Исправления
  * Уведомление от неактивного сервера помечало сервер как загрязнённый.
    release_server() этого не ожидал. Теперь такие уведомления отбрасываются.

**2007-04-11  -  PgBouncer 1.0.3  -  «Бесстрашный fork»**

- Исправления
  * В пути входа отсутствовала часть обработки ошибок, поэтому умирающее
    соединение могло вызывать assert.
  * Очищены assert в sbuf.c для более раннего обнаружения проблем.
  * При срабатывании Assert() создаётся core.

- Новое
  * Добавлены переменные конфигурации log_connections, log_disconnections и
    log_pooler_errors для включения и отключения шума.
  * Добавлена переменная конфигурации client_login_timeout для закрытия мёртвых
    соединений на этапе входа, которые могли блокировать SUSPEND и тем самым
    перезапуск без остановки обслуживания.

**2007-03-28  -  PgBouncer 1.0.2  -  «Сверхзвуковая ложка»**

- Исправления
  * libevent может сообщить об удалённом событии в том же цикле. Повторное
    использование сокета откладывается на один цикл.
  * release_server() из disconnect_client() не проверял, был ли пакет действительно отправлен.

**2007-03-15  -  PgBouncer 1.0.1  -  «Инопланетная технология»**

- Исправления
  * Смешанное использование кэшированного и некэшированного времени вместе с
    беззнаковым typedef usec_t создавало ложные ошибки query_timeout.
  * Исправлен редкий случай, когда сокет, разбуженный из ожидания отправки,
    продолжал зависать.
  * Реализована более справедливая очередь серверных соединений. Ранее новый
    запрос мог получить серверное соединение раньше старого.
  * Освобождение сервера откладывается, пока отправка всего содержимого не гарантирована.

- Возможности
  * Команда SHOW SOCKETS предоставляет подробные сведения о состоянии.
  * Указатель PgSocket добавлен в журнал, чтобы отслеживать отдельное соединение.
  * В консоли разрешён SELECT вместо SHOW.
  * Выполнена различная очистка кода.

**2007-03-13  -  PgBouncer 1.0  -  «Tuunitud bemm»**

- Первый публичный выпуск.
