Better SIGCHLD handling, use correct user name.

- Defer SIGCHLD processing until the later stage in order to allow
  subprocess to run its own reaping of children and return the correct
  exit code from the process called.

- When changing the password at startup, do not assume the user postgres.
This commit is contained in:
Oleksii Kliukin
2015-09-02 12:56:23 +02:00
parent 3e4d2df33b
commit a5f2ab6f88
3 changed files with 26 additions and 16 deletions
+1 -1
View File
@@ -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'])
+23 -14
View File
@@ -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<year>\d{4})\-(?P<month>\d{2})\-(?P<day>\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
+2 -1
View File
@@ -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():