From 0572fec6a3b77137e1400adede3affddfae87257 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Tue, 29 Sep 2015 12:59:26 +0200 Subject: [PATCH] remove leader lock after stop of postgres to speed up failover --- patroni/ha.py | 12 +++++++----- patroni/postgresql.py | 4 ++-- tests/test_postgresql.py | 5 ++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/patroni/ha.py b/patroni/ha.py index 628b9c41..a5f68068 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -214,12 +214,14 @@ class Ha: if not failover.member or failover.member != self.state_handler.name: members = [m for m in self.cluster.members if not failover.member or m.name == failover.member] if self.is_failover_possible(members): # check that there are healthy members + self.state_handler.stop() + if self.dcs.delete_leader(): + ret = 'manual failover: demoted self and released leader lock' + else: + ret = 'manual failover: demoted self but failed to release leader lock' self.state_handler.follow_the_leader(None) self.cluster = None - if self.dcs.delete_leader(): - return 'manual failover: demoted self and released leader lock' - else: - return 'manual failover: demoted self but failed to release leader lock' + return ret else: logger.warning('manual failover: no healthy members found, failover is not possible') else: @@ -360,7 +362,7 @@ class Ha: except DCSError: logger.error('Error communicating with DCS') if self.state_handler.is_running() and self.state_handler.is_leader(): - self.state_handler.demote(None) + self.state_handler.demote() return 'demoted self because DCS is not accessible and i was a leader' except (psycopg2.Error, PostgresConnectionException): logger.exception('Error communicating with Postgresql. Will try again') diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 97d37515..b2b93f72 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -354,8 +354,8 @@ recovery_target_timeline = 'latest' self.call_nowait(ACTION_ON_ROLE_CHANGE) return ret - def demote(self, leader): - self.follow_the_leader(leader) + def demote(self): + self.follow_the_leader(None) def create_replication_user(self): self.query('CREATE USER "{}" WITH REPLICATION ENCRYPTED PASSWORD %s'.format( diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index 9fe012a7..f1ddea8e 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -137,9 +137,8 @@ class TestPostgresql(unittest.TestCase): self.assertTrue(self.p.sync_from_leader(self.leader)) def test_follow_the_leader(self): - self.p.demote(self.leader) - self.p.follow_the_leader(None) - self.p.demote(self.leader) + self.p.follow_the_leader(self.leader) + self.p.demote() self.p.follow_the_leader(self.leader) self.p.follow_the_leader(Leader(-1, None, 28, self.other))