diff --git a/helpers/postgresql.py b/helpers/postgresql.py index ce8ca18f..695e45c1 100644 --- a/helpers/postgresql.py +++ b/helpers/postgresql.py @@ -354,7 +354,7 @@ primary_conninfo = '{}' self.query('CREATE ROLE "{0}" WITH LOGIN SUPERUSER PASSWORD %s'.format( self.superuser['username']), self.superuser['password']) else: - self.query('ALTER ROLE postgres WITH PASSWORD %s', self.superuser['password']) + self.query('ALTER ROLE "{0}" WITH PASSWORD %s'.format(os.environ['USER']), self.superuser['password']) if self.admin: self.query('CREATE ROLE "{0}" WITH LOGIN CREATEDB CREATEROLE PASSWORD %s'.format( self.admin['username']), self.admin['password']) diff --git a/helpers/utils.py b/helpers/utils.py index 5f09490e..db578de5 100644 --- a/helpers/utils.py +++ b/helpers/utils.py @@ -5,7 +5,8 @@ import signal import sys import time -received_sigchld = False +interrupted_sleep = False +reap_children = False _DATE_TIME_RE = re.compile(r'''^ (?P\d{4})\-(?P\d{2})\-(?P\d{2}) # date @@ -72,30 +73,38 @@ def sigterm_handler(signo, stack_frame): def sigchld_handler(signo, stack_frame): - global received_sigchld - received_sigchld = True - try: - while True: - ret = os.waitpid(-1, os.WNOHANG) - if ret == (0, 0): - break - except OSError: - pass + global interrupted_sleep, reap_children + reap_children = interrupted_sleep = True def sleep(interval): - global received_sigchld + global interrupted_sleep current_time = time.time() end_time = current_time + interval while current_time < end_time: - received_sigchld = False + interrupted_sleep = False time.sleep(end_time - current_time) - if not received_sigchld: # we will ignore only sigchld + if not interrupted_sleep: # we will ignore only sigchld break current_time = time.time() - received_sigchld = False + interrupted_sleep = False def setup_signal_handlers(): signal.signal(signal.SIGTERM, sigterm_handler) signal.signal(signal.SIGCHLD, sigchld_handler) + + +def reap_children(): + global reap_children + if reap_children: + try: + while True: + ret = os.waitpid(-1, os.WNOHANG) + print ret + if ret == (0, 0): + break + except OSError: + pass + finally: + reap_children = False diff --git a/patroni.py b/patroni.py index e26a4059..a15f535b 100755 --- a/patroni.py +++ b/patroni.py @@ -9,7 +9,7 @@ from helpers.api import RestApiServer from helpers.etcd import Etcd from helpers.ha import Ha from helpers.postgresql import Postgresql -from helpers.utils import setup_signal_handlers, sleep +from helpers.utils import setup_signal_handlers, sleep, reap_children from helpers.zookeeper import ZooKeeper logger = logging.getLogger(__name__) @@ -93,6 +93,7 @@ class Patroni: except: logger.exception('Exception when changing replication slots') self.schedule_next_run() + reap_children() def main():