From ee529669d21fae5a2cb8aa9f9cc70f1e6a081a27 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Fri, 1 Jul 2016 12:28:02 +0200 Subject: [PATCH 1/3] Start readonly when holding leader lock Not starting of postgres was causeing situation when there were no master running... --- patroni/postgresql.py | 7 +++---- tests/test_postgresql.py | 2 -- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 97d91832..1da93eec 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -729,14 +729,13 @@ class Postgresql(object): return True change_role = self.role == 'master' - self._need_rewind = self._need_rewind or change_role and self.can_rewind + + self._need_rewind = (not leader or leader.name != self.name) \ + and (self._need_rewind or change_role and self.can_rewind) if self._need_rewind: logger.info("set the rewind flag after demote") - if leader and leader.name == self.name: - return logger.info('Can not rewind from myself') - if self.is_running(): stopped = self.stop() self.set_role('unknown') diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index dde9647c..81f31105 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -262,8 +262,6 @@ class TestPostgresql(unittest.TestCase): self.p.follow(None, None) # restart without rewind self.p.set_role('master') - self.p.follow(self.leader, self.me) # Can not rewind from myself - with patch.object(Postgresql, 'stop', Mock(return_value=False)): self.p.follow(self.leader, self.leader) # failed to stop postgres From b84e22c4ea0d9e45e416f286d1fc15b916f92191 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Mon, 4 Jul 2016 10:56:37 +0200 Subject: [PATCH 2/3] Implement more checks in the follow method Although such situation should not happen in reality (follow method is not supposed to be called when when the node is holding leader lock and postgres is running), but to be on the safe side it is better to implement as much checks as possible, because this method could potentially remove data directory. --- patroni/postgresql.py | 8 ++++++-- tests/test_postgresql.py | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 1da93eec..8b2ab861 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -730,8 +730,12 @@ class Postgresql(object): change_role = self.role == 'master' - self._need_rewind = (not leader or leader.name != self.name) \ - and (self._need_rewind or change_role and self.can_rewind) + if leader and leader.name == self.name: + self._need_rewind = False + if self.is_running(): + return + else: + self._need_rewind = self._need_rewind or change_role and self.can_rewind if self._need_rewind: logger.info("set the rewind flag after demote") diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index 81f31105..f744e401 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -257,6 +257,8 @@ class TestPostgresql(unittest.TestCase): with patch.object(Postgresql, 'check_recovery_conf', Mock(return_value=True)): self.assertTrue(self.p.follow(None, None)) # nothing to do, recovery.conf has good primary_conninfo + self.p.follow(self.me, self.me) # follow is called when the node is holding leader lock + with patch.object(Postgresql, 'restart', Mock(return_value=False)): self.p.set_role('replica') self.p.follow(None, None) # restart without rewind From 2944a4bcbd182c0c131db2e3e062d386c2de3fc5 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Mon, 4 Jul 2016 11:08:24 +0200 Subject: [PATCH 3/3] Start readonly when holding the leader lock --- patroni/postgresql.py | 1 + 1 file changed, 1 insertion(+) diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 8b2ab861..45ed5c92 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -732,6 +732,7 @@ class Postgresql(object): if leader and leader.name == self.name: self._need_rewind = False + member = None if self.is_running(): return else: