diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 97d91832..45ed5c92 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -729,14 +729,18 @@ class Postgresql(object): return True change_role = self.role == 'master' - self._need_rewind = self._need_rewind or change_role and self.can_rewind + + if leader and leader.name == self.name: + self._need_rewind = False + member = None + 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") - 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..f744e401 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -257,13 +257,13 @@ 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 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