From aa91557a80ebaca0e8da951ca5290f4435756513 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Thu, 17 Feb 2022 15:53:13 +0100 Subject: [PATCH] Fix bug in divergence timeline check (#2221) Patroni was falsely assuming that timelines have diverged. For pg_rewind it didn't create any problem, but if pg_rewind is not allowed and the `remove_data_directory_on_diverged_timelines` is set, it resulted in reinitializing the former leader. Close https://github.com/zalando/patroni/issues/2220 --- patroni/postgresql/rewind.py | 1 + tests/test_rewind.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/patroni/postgresql/rewind.py b/patroni/postgresql/rewind.py index b30d739f..ba6e4532 100644 --- a/patroni/postgresql/rewind.py +++ b/patroni/postgresql/rewind.py @@ -218,6 +218,7 @@ class Rewind(object): need_rewind = True else: need_rewind = switchpoint != self._get_checkpoint_end(local_timeline, local_lsn) + break elif parent_timeline > local_timeline: need_rewind = True break diff --git a/tests/test_rewind.py b/tests/test_rewind.py index 19e7e6ad..54fdae91 100644 --- a/tests/test_rewind.py +++ b/tests/test_rewind.py @@ -141,7 +141,10 @@ class TestRewind(BaseTestPostgresql): self.leader = self.leader.member self.assertFalse(self.r.rewind_or_reinitialize_needed_and_possible(self.leader)) mock_check_leader_is_not_in_recovery.return_value = True - self.assertTrue(self.r.rewind_or_reinitialize_needed_and_possible(self.leader)) + self.assertFalse(self.r.rewind_or_reinitialize_needed_and_possible(self.leader)) + self.r.trigger_check_diverged_lsn() + with patch.object(MockCursor, 'fetchone', Mock(side_effect=[('', 3, '0/0'), ('', b'4\t0/40159C0\tn\n')])): + self.assertTrue(self.r.rewind_or_reinitialize_needed_and_possible(self.leader)) self.r.reset_state() self.r.trigger_check_diverged_lsn() with patch('patroni.psycopg.connect', Mock(side_effect=Exception)):