From b165183503b581ef129d007f4fb80913457e83e9 Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Tue, 14 Aug 2018 17:08:08 +0200 Subject: [PATCH] Reset is_leader status on demote (#777) Make sure demoted cluster member stops responding with code 200 on the /master API call. Issue a new minor release. Fixes https://github.com/zalando/patroni/issues/776 --- docs/releases.rst | 17 +++++++++++++++++ patroni/ha.py | 4 ++++ patroni/version.py | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/releases.rst b/docs/releases.rst index da9e79e3..5533f6ad 100644 --- a/docs/releases.rst +++ b/docs/releases.rst @@ -3,6 +3,23 @@ Release notes ============= +Version 1.4.6 +------------- + +**Bug fixes and stability improvements** + +This release fixes a critical issue with Patroni API /master endpoint returning 200 for the non-master node. This is a +reporting issue, no actual split-brain, but under certain circumstances clients might be directed to the read-only node. + +- Reset is_leader status on demote (Alexander Kukushkin, Oleksii Kliukin) + + Make sure demoted cluster member stops responding with code 200 on the /master API call. + +- Add new "cluster_unlocked" field to the API output (Dmitry Dolgov) + + This field indicates whether the cluster has the master running. It can be used when it is not possible to query any + other node but one of the replicas. + Version 1.4.5 ------------- diff --git a/patroni/ha.py b/patroni/ha.py index e6a9797d..509b96e1 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -105,6 +105,9 @@ class Ha(object): self.old_cluster = cluster self.cluster = cluster + if self.cluster.is_unlocked() or self.cluster.leader.name != self.state_handler.name: + self.set_is_leader(False) + self._leader_timeline = None if cluster.is_unlocked() else cluster.leader.timeline def acquire_lock(self): @@ -620,6 +623,7 @@ class Ha(object): self.state_handler.stop(mode_control['stop'], checkpoint=mode_control['checkpoint'], on_safepoint=self.watchdog.disable if self.watchdog.is_running else None) self.state_handler.set_role('demoted') + self.set_is_leader(False) if mode_control['release']: self.release_leader_key_voluntarily() diff --git a/patroni/version.py b/patroni/version.py index 5e235ead..adf1ed52 100644 --- a/patroni/version.py +++ b/patroni/version.py @@ -1 +1 @@ -__version__ = '1.4.5' +__version__ = '1.4.6'