remove leader lock after stop of postgres to speed up failover

This commit is contained in:
Alexander Kukushkin
2015-09-29 12:59:26 +02:00
parent a259764458
commit 0572fec6a3
3 changed files with 11 additions and 10 deletions
+7 -5
View File
@@ -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')
+2 -2
View File
@@ -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(
+2 -3
View File
@@ -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))