mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-25 14:53:37 +00:00
followers without a leader based on feedback from @CyberDem0n and closes #3
This commit is contained in:
+1
-1
@@ -55,7 +55,7 @@ if postgresql.data_directory_empty():
|
||||
else:
|
||||
time.sleep(5)
|
||||
else:
|
||||
postgresql.write_recovery_conf({"address": "postgres://169.0.0.1:5432"})
|
||||
postgresql.follow_no_leader()
|
||||
postgresql.start()
|
||||
|
||||
while True:
|
||||
|
||||
@@ -59,6 +59,7 @@ class Ha:
|
||||
self.state_handler.demote(self.fetch_current_leader())
|
||||
return "demoting self because i am not the healthiest node"
|
||||
elif self.fetch_current_leader() is None:
|
||||
self.state_handler.follow_no_leader()
|
||||
return "waiting on leader to be elected because i am not the healthiest node"
|
||||
else:
|
||||
self.state_handler.follow_the_leader(self.fetch_current_leader())
|
||||
|
||||
+15
-4
@@ -158,15 +158,18 @@ class Postgresql:
|
||||
f.close()
|
||||
|
||||
def write_recovery_conf(self, leader_hash):
|
||||
leader = urlparse(leader_hash["address"])
|
||||
|
||||
f = open("%s/recovery.conf" % self.data_dir, "w")
|
||||
f.write("""
|
||||
standby_mode = 'on'
|
||||
primary_slot_name = '%(recovery_slot)s'
|
||||
primary_conninfo = 'user=%(user)s password=%(password)s host=%(hostname)s port=%(port)s sslmode=prefer sslcompression=1'
|
||||
recovery_target_timeline = 'latest'
|
||||
""" % {"recovery_slot": self.name, "user": leader.username, "password": leader.password, "hostname": leader.hostname, "port": leader.port})
|
||||
""" % {"recovery_slot": self.name})
|
||||
if leader_hash is not None:
|
||||
leader = urlparse(leader_hash["address"])
|
||||
f.write("""
|
||||
primary_conninfo = 'user=%(user)s password=%(password)s host=%(hostname)s port=%(port)s sslmode=prefer sslcompression=1'
|
||||
""" % {"user": leader.username, "password": leader.password, "hostname": leader.hostname, "port": leader.port})
|
||||
|
||||
if "recovery_conf" in self.config:
|
||||
for name, value in self.config["recovery_conf"].iteritems():
|
||||
f.write("%s = '%s'\n" % (name, value))
|
||||
@@ -179,6 +182,14 @@ recovery_target_timeline = 'latest'
|
||||
self.restart()
|
||||
return True
|
||||
|
||||
def follow_no_leader(self):
|
||||
print "initing leaderless follower"
|
||||
if os.system("grep primary_conninfo %(data_dir)s/recovery.conf > /dev/null" % {"data_dir": self.data_dir}) == 0:
|
||||
self.write_recovery_conf(None)
|
||||
if self.is_running():
|
||||
self.restart()
|
||||
return True
|
||||
|
||||
def promote(self):
|
||||
return os.system("pg_ctl promote -w -D %s" % self.data_dir) == 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user