From bb070763437b59c0a714809e238b6d8922aba7cc Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Tue, 27 Sep 2016 16:25:53 +0200 Subject: [PATCH] Write all postgres parameters into postgresql.conf (#323) It will make possible to start postgres easily with pg_ctl (without Patroni). Previously if you tried to start such postgres manually it was usually failing because some of the parameters does not much with values written into xlog (for example max_connections). --- patroni/api.py | 3 ++- patroni/postgresql.py | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/patroni/api.py b/patroni/api.py index b09d4185..eb410c91 100644 --- a/patroni/api.py +++ b/patroni/api.py @@ -381,7 +381,8 @@ class RestApiHandler(BaseHTTPRequestHandler): pg_xlog_location_diff(pg_last_xlog_replay_location(), '0/0')::bigint, to_char(pg_last_xact_replay_timestamp(), 'YYYY-MM-DD HH24:MI:SS.MS TZ'), pg_is_in_recovery() AND pg_is_xlog_replay_paused(), - (SELECT json_agg(row_to_json(ri)) FROM replication_info ri)""", retry=retry)[0] + (SELECT array_to_json(array_agg(row_to_json(ri))) FROM replication_info ri)""", + retry=retry)[0] result = { 'state': self.server.patroni.postgresql.state, diff --git a/patroni/postgresql.py b/patroni/postgresql.py index 7264d371..852faa8b 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -80,6 +80,9 @@ class Postgresql(object): self._database = config.get('database', 'postgres') self._data_dir = config['data_dir'] self._pending_restart = False + + self._version_file = os.path.join(self._data_dir, 'PG_VERSION') + self._major_version = self.get_major_version() self._server_parameters = self.get_server_parameters(config) self._connect_address = config.get('connect_address') @@ -89,8 +92,6 @@ class Postgresql(object): self._need_rewind = False self._use_slots = config.get('use_slots', True) - self._version_file = os.path.join(self._data_dir, 'PG_VERSION') - self._major_version = self.get_major_version() self._schedule_load_slots = self.use_slots self._pgpass = config.get('pgpass') or os.path.join(os.path.expanduser('~'), 'pgpass') @@ -154,7 +155,8 @@ class Postgresql(object): parameters = config['parameters'].copy() listen_addresses, port = (config['listen'] + ':5432').split(':')[:2] parameters.update({'cluster_name': self.scope, 'listen_addresses': listen_addresses, 'port': port}) - return parameters + return {k: v for k, v in parameters.items() if not self._major_version or + self._major_version >= self.CMDLINE_OPTIONS.get(k, (0, 1, 9.1))[2]} def resolve_connection_addresses(self): self._local_address = self.get_local_address() @@ -647,8 +649,7 @@ class Postgresql(object): f.write('# Do not edit this file manually!\n# It will be overwritten by Patroni!\n') f.write("include '{0}'\n\n".format(self.config.get('custom_conf') or self._postgresql_base_conf_name)) for name, value in sorted(self._server_parameters.items()): - if name not in self.CMDLINE_OPTIONS: - f.write("{0} = '{1}'\n".format(name, value)) + f.write("{0} = '{1}'\n".format(name, value)) def is_healthy(self): if not self.is_running():