|
3 | 3 | Release notes |
4 | 4 | ============= |
5 | 5 |
|
| 6 | +Version 4.1.1 |
| 7 | +------------- |
| 8 | + |
| 9 | +Released 2026-04-08 |
| 10 | + |
| 11 | +**Stability improvements** |
| 12 | + |
| 13 | +- Compatibility with threading changes in python 3.11+ (Alexander Kukushkin) |
| 14 | + |
| 15 | + Avoid starting/stopping threads at runtime. Introduce thread pools for REST API and for executing async tasks. Allow configuring global ``thread_pool_size`` and ``restapi.thread_pool_size``. |
| 16 | + |
| 17 | +- Compatibility with python 3.14 (Alexander Kukushkin) |
| 18 | + |
| 19 | + Run tests against python 3.14 and fix compatibility issues. |
| 20 | + |
| 21 | +- Compatibility with Etcd security fixes in v3.6.9, v3.5.28, and v3.4.42 (Alexander Kukushkin) |
| 22 | + |
| 23 | + These Etcd releases addressed CVEs and changed behavior so cluster topology reads and lease keepalive are no longer allowed without authentication. Patroni now handles this by authenticating in member-discovery and lease-keepalive paths, re-authenticating on auth failures, and retrying requests accordingly. |
| 24 | + |
| 25 | +- Improvements for Etcd3 error handling (Alexander Kukushkin) |
| 26 | + |
| 27 | + Handle broken JSON responses, be flexible in how JSON error is parsed, and improve reporting for etcd internal errors. |
| 28 | + |
| 29 | +**Bugfixes** |
| 30 | + |
| 31 | +- Retry leader update on temporary Kubernetes ``403`` error (Sophia Ruan, Alexander Kukushkin) |
| 32 | + |
| 33 | + When the Kubernetes API temporarily returns ``403 Permission Denied`` (for example during transient RBAC issues), Patroni now verifies whether the current node still holds leadership and retries the leader update within ``retry_timeout`` instead of immediately demoting. |
| 34 | + |
| 35 | +- Fix issue with renaming leader node in sync mode and pause (Alexander Kukushkin) |
| 36 | + |
| 37 | + ``/sync`` key wasn't updated after renaming the leader node with Patroni restart in pause (without Postgres restart). It prevented Patroni from promoting after the next restart without pause. |
| 38 | + |
| 39 | +- Trigger ``pg_rewind`` check when the same primary increased timeline (Alexander Kukushkin) |
| 40 | + |
| 41 | + Such timeline increase may happen as a result of crash recovery in a single user mode + promote after taking a leader key while other replica nodes are isolated from DCS. In this case replica nodes didn't trigger ``pg_rewind`` state machine because the leader and therefore ``primary_conninfo`` didn't change. |
| 42 | + |
| 43 | +- Only write superuser password during ``initdb`` bootstrap if it is non-empty (Michael Banck) |
| 44 | + |
| 45 | + Writing an empty password during ``initdb`` bootstrap was causing issues. |
| 46 | + |
| 47 | +- Fix bug with ``failover_priority`` with ``synchronous_mode=on`` (Alexander Kukushkin) |
| 48 | + |
| 49 | + ``tag.failover_priority`` values were ignored when ``synchronous_node_count > 1``. |
| 50 | + |
| 51 | +- Fix bug with ``primary_conninfo`` password comparison (Alexander Kukushkin) |
| 52 | + |
| 53 | + Starting from PostgreSQL 10, Patroni uses passfile in ``primary_conninfo`` and failed to update the passfile after the replication password was updated in yaml-file configuration with reload. |
| 54 | + |
| 55 | +- Don't restart replica with ``nofailover`` tag in pause mode (Alexander Kukushkin) |
| 56 | + |
| 57 | + Patroni used to start a manually shut down PostgreSQL replica in pause mode when it had ``nofailover`` tag set to ``true``. |
| 58 | + |
| 59 | +- Fix ``check_recovery_conf()`` when PostgreSQL is in the starting state (Alexander Kukushkin) |
| 60 | + |
| 61 | + For PostgreSQL v12 and newer, ``pg_settings`` cannot be queried while the server is still starting and not yet accepting connections. Missing recovery parameters are now added to the internal state when writing ``postgresql.conf``. Additionally, restore the ``Postgresql.is_starting()`` check in ``Ha.is_healthiest_node()``. |
| 62 | + |
| 63 | +- Validate user options in dictionary format for ``initdb``/``basebackup`` (m4rrypro) |
| 64 | + |
| 65 | + When ``initdb`` or ``basebackup`` options were provided as a dictionary (instead of a list), the ``option_is_allowed()`` validation was bypassed, allowing blocked options to be used. |
| 66 | + |
| 67 | +- Allow server-side compression for ``basebackup`` option (m4rrypro) |
| 68 | + |
| 69 | + The ``compress`` option was completely blocked for ``basebackup``, but since PostgreSQL 15, server-side compression is useful and works transparently with plain format. Client-side compression is still rejected. |
| 70 | + |
| 71 | +- Don't reload PostgreSQL config while running custom bootstrap (Alexander Kukushkin) |
| 72 | + |
| 73 | + Custom bootstrap could be complex and involve PosgreSQL starting and stopping multiple times. Reloads of PostgreSQL config during this process could lead to unexpected behavior. |
| 74 | + |
| 75 | +- Check that ``postgresql.parameters`` is a dictionary (Alexander Kukushkin) |
| 76 | + |
| 77 | + Discard new config if ``postgresql.parameters`` is not a dictionary. |
| 78 | + |
| 79 | + |
6 | 80 | Version 4.1.0 |
7 | 81 | ------------- |
8 | 82 |
|
|
0 commit comments