patroni.postgresql.config module

class patroni.postgresql.config.ConfigHandler(postgresql: Postgresql, config: Dict[str, Any])

Bases: object

CMDLINE_OPTIONS = <CaseInsensitiveDict{'listen_addresses': (None, <function _false_validator>, 90100), 'port': (None, <function _false_validator>, 90100), 'cluster_name': (None, <function _false_validator>, 90500), 'wal_level': ('hot_standby', <patroni.validator.EnumValidator object>, 90100), 'hot_standby': ('on', <function _bool_is_true_validator>, 90100), 'max_connections': (100, <patroni.validator.IntValidator object>, 90100), 'max_wal_senders': (10, <patroni.validator.IntValidator object>, 90100), 'wal_keep_segments': (8, <patroni.validator.IntValidator object>, 90100), 'wal_keep_size': ('128MB', <patroni.validator.IntValidator object>, 130000), 'max_prepared_transactions': (0, <patroni.validator.IntValidator object>, 90100), 'max_locks_per_transaction': (64, <patroni.validator.IntValidator object>, 90100), 'track_commit_timestamp': ('off', <function _bool_validator>, 90500), 'max_replication_slots': (10, <patroni.validator.IntValidator object>, 90400), 'max_worker_processes': (8, <patroni.validator.IntValidator object>, 90400), 'wal_log_hints': ('on', <function _bool_is_true_validator>, 90400)} at 7fe971b10250>
append_pg_hba(config: List[str])bool
build_recovery_params(member: Optional[Union[patroni.dcs.Leader, patroni.dcs.Member]])patroni.collections.CaseInsensitiveDict
check_directories()None
check_recovery_conf(member: Optional[Union[patroni.dcs.Leader, patroni.dcs.Member]]) → Tuple[bool, bool]

Returns a tuple. The first boolean element indicates that recovery params don’t match and the second is set to True if the restart is required in order to apply new values

property config_dir
config_writer(filename: str) → Iterator[patroni.postgresql.config.ConfigWriter]

Create ConfigWriter object and set permissions on a filename.

Parameters

filename – path to a config file.

Yields

ConfigWriter object.

property effective_configuration

It might happen that the current value of one (or more) below parameters stored in the controldata is higher than the value stored in the global cluster configuration.

Example: max_connections in global configuration is 100, but in controldata Current max_connections setting: 200. If we try to start postgres with max_connections=100, it will immediately exit. As a workaround we will start it with the values from controldata and set pending_restart to true as an indicator that current values of parameters are not matching expectations.

format_dsn(params: Dict[str, Any], include_dbname: bool = False)str
get(key: str, default: Optional[Any] = None) → Optional[Any]
get_server_parameters(config: Dict[str, Any])patroni.collections.CaseInsensitiveDict
property hba_file
property ident_file
property local_connect_kwargs
property pg_hba_conf
property postgresql_conf
primary_conninfo_params(member: Optional[Union[patroni.dcs.Leader, patroni.dcs.Member]]) → Optional[Dict[str, Any]]
recovery_conf_exists()bool
reload_config(config: Dict[str, Any], sighup: bool = False)None
remove_recovery_conf()None
replace_pg_hba() → Optional[bool]

Replace pg_hba.conf content in the PGDATA if hba_file is not defined in the postgresql.parameters and pg_hba is defined in postgresql configuration section.

Returns

True if pg_hba.conf was rewritten.

replace_pg_ident() → Optional[bool]

Replace pg_ident.conf content in the PGDATA if ident_file is not defined in the postgresql.parameters and pg_ident is defined in the postgresql section.

Returns

True if pg_ident.conf was rewritten.

property replication
resolve_connection_addresses()None
restore_command() → Optional[str]
restore_configuration_files()None

restore a previously saved postgresql.conf

property rewind_credentials
save_configuration_files(check_custom_bootstrap: bool = False)bool

copy postgresql.conf to postgresql.conf.backup to be able to retrieve configuration files - originally stored as symlinks, those are normally skipped by pg_basebackup - in case of WAL-E basebackup (see http://comments.gmane.org/gmane.comp.db.postgresql.wal-e/239)

set_file_permissions(filename: str)None

Set permissions of file filename according to the expected permissions if it resides under PGDATA.

Note

Do nothing if the file is not under PGDATA.

Parameters

filename – path to a file which permissions might need to be adjusted.

set_synchronous_standby_names(value: Optional[str]) → Optional[bool]

Updates synchronous_standby_names and reloads if necessary. :returns: True if value was updated.

setup_server_parameters()None
property superuser
property triggerfile_good_name
try_to_create_dir(d: str, msg: str)None
write_pgpass(record: Dict[str, Any]) → Dict[str, str]
write_postgresql_conf(configuration: Optional[patroni.collections.CaseInsensitiveDict] = None)None
write_recovery_conf(recovery_params: patroni.collections.CaseInsensitiveDict)None
class patroni.postgresql.config.ConfigWriter(filename: str)

Bases: object

static escape(value: Any)str
write_param(param: str, value: Any)None
writeline(line: str)None
writelines(lines: List[str])None
patroni.postgresql.config.conninfo_parse(dsn: str) → Optional[Dict[str, str]]
patroni.postgresql.config.conninfo_uri_parse(dsn: str) → Dict[str, str]
patroni.postgresql.config.mtime(filename: str) → Optional[float]
patroni.postgresql.config.parse_dsn(value: str) → Optional[Dict[str, str]]

Very simple equivalent of psycopg2.extensions.parse_dsn introduced in 2.7.0. We are not using psycopg2 function in order to remain compatible with 2.5.4+. There is one minor difference though, this function removes dbname from the result and sets the sslmode, ‘gssencmode’, and channel_binding to prefer if it is not present in the connection string. This is necessary to simplify comparison of the old and the new values.

>>> r = parse_dsn('postgresql://u%2Fse:pass@:%2f123,[::1]/db%2Fsdf?application_name=mya%2Fpp&ssl=true')
>>> r == {'application_name': 'mya/pp', 'host': ',::1', 'sslmode': 'require',              'password': 'pass', 'port': '/123,', 'user': 'u/se', 'gssencmode': 'prefer', 'channel_binding': 'prefer'}
True
>>> r = parse_dsn(" host = 'host' dbname = db\\ name requiressl=1 ")
>>> r == {'host': 'host', 'sslmode': 'require', 'gssencmode': 'prefer', 'channel_binding': 'prefer'}
True
>>> parse_dsn('requiressl = 0\\') == {'sslmode': 'prefer', 'gssencmode': 'prefer', 'channel_binding': 'prefer'}
True
>>> parse_dsn("host=a foo = '") is None
True
>>> parse_dsn("host=a foo = ") is None
True
>>> parse_dsn("1") is None
True
patroni.postgresql.config.read_param_value(value: str) → Union[Tuple[None, None], Tuple[str, int]]
patroni.postgresql.config.read_recovery_param_value(value: str) → Optional[str]
>>> read_recovery_param_value('') is None
True
>>> read_recovery_param_value("'") is None
True
>>> read_recovery_param_value("''a") is None
True
>>> read_recovery_param_value('a b') is None
True
>>> read_recovery_param_value("'''") is None
True
>>> read_recovery_param_value("'\\") is None
True
>>> read_recovery_param_value("'a' s#") is None
True
>>> read_recovery_param_value("'\\'''' #a")
"''"
>>> read_recovery_param_value('asd')
'asd'
patroni.postgresql.config.strip_comment(value: str)str