diff --git a/patroni/ha.py b/patroni/ha.py index a03c71cb..c7cbe3c8 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -886,6 +886,11 @@ class Ha(object): # is data directory empty? if self.state_handler.data_directory_empty(): + # is this instance the leader? + if self.has_lock(): + self.release_leader_key_voluntarily() + return 'released leader key voluntarily as data dir empty and currently leader' + return self.bootstrap() # new node # "bootstrap", but data directory is not empty elif not self.sysid_valid(self.cluster.initialize) and self.cluster.is_unlocked() and not self.is_paused(): diff --git a/tests/test_ha.py b/tests/test_ha.py index 901f24e2..0dbfab6f 100644 --- a/tests/test_ha.py +++ b/tests/test_ha.py @@ -771,3 +771,14 @@ class TestHa(unittest.TestCase): def test_wakup(self): self.ha.wakeup() + + def test_leader_with_empty_directory(self): + self.ha.cluster = get_cluster_initialized_with_leader() + self.ha.has_lock = true + self.p.data_directory_empty = true + self.assertEquals(self.ha.run_cycle(), 'released leader key voluntarily as data dir empty and currently leader') + + # as has_lock is mocked out, we need to fake the leader key release + self.ha.has_lock = false + # will not say bootstrap from leader as replica can't self elect + self.assertEquals(self.ha.run_cycle(), "trying to bootstrap from replica 'other'")