Skip to content

Commit a79f35a

Browse files
hughcapetCyberDem0n
authored andcommitted
Release 4.1.1 (patroni#3574)
- Release notes - Update version - Pyright 1.1.408
1 parent 0a045e0 commit a79f35a

5 files changed

Lines changed: 80 additions & 3 deletions

File tree

.github/workflows/tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ jobs:
196196

197197
- uses: jakebailey/pyright-action@v2
198198
with:
199-
version: 1.1.405
199+
version: 1.1.408
200200

201201
ydiff:
202202
name: Test compatibility with the latest version of ydiff

docs/index.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
You can adapt this file completely to your liking, but it should at least
44
contain the root `toctree` directive.
55
6+
Patroni: A Template for PostgreSQL HA with ZooKeeper, etcd or Consul
7+
====================================================================
8+
69
.. image:: _static/patroni-logo.png
710
:height: 128px
811
:width: 128px

docs/releases.rst

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,80 @@
33
Release notes
44
=============
55

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+
680
Version 4.1.0
781
-------------
882

patroni/postgresql/cancellable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def _kill_process(self) -> None:
4141
try:
4242
self._process.suspend() # Suspend the process before getting list of children
4343
except psutil.Error as e:
44-
logger.info('Failed to suspend the process: %s', e.msg)
44+
logger.info('Failed to suspend the process: %s', e)
4545

4646
try:
4747
self._process_children = self._process.children(recursive=True)

patroni/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
33
:var __version__: the current Patroni version.
44
"""
5-
__version__ = '4.1.0'
5+
__version__ = '4.1.1'

0 commit comments

Comments
 (0)