From 1d513e7e04cc0c69113b9a94d37b0296ceae2906 Mon Sep 17 00:00:00 2001 From: Alex Kerney Date: Tue, 18 Apr 2017 06:45:48 -0400 Subject: [PATCH] Release the leader key when the leader restarts with an empty data dir (#420) * If the leader has an empty data directory it must have been recreated, so release the leader key --- patroni/ha.py | 5 +++++ tests/test_ha.py | 11 +++++++++++ 2 files changed, 16 insertions(+) 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'")