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 7f93de072cd0>¶
- _RECOVERY_PARAMETERS = <CaseInsensitiveSet('archive_cleanup_command', 'pause_at_recovery_target', 'primary_conninfo', 'primary_slot_name', 'promote_trigger_file', 'recovery_end_command', 'recovery_min_apply_delay', 'recovery_target', 'recovery_target_action', 'recovery_target_inclusive', 'recovery_target_lsn', 'recovery_target_name', 'recovery_target_time', 'recovery_target_timeline', 'recovery_target_xid', 'restore_command', 'standby_mode', 'trigger_file') at 7f93de0715d0>¶
- _check_primary_conninfo(primary_conninfo: Dict[str, Any], wanted_primary_conninfo: Dict[str, Any]) bool ¶
- static _handle_wal_buffers(old_values: Dict[Any, Tuple[Any, ...]], changes: CaseInsensitiveDict) None ¶
- _read_recovery_params() Tuple[Optional[CaseInsensitiveDict], bool] ¶
Read current recovery parameters values.
Note
We query Postgres only if we detected that Postgresql was restarted or when at least one of the following files was updated:
postgresql.conf
;postgresql.auto.conf
;passfile
that is used in theprimary_conninfo
.
- Returns:
a tuple with two elements:
CaseInsensitiveDict
object with current values of recovery parameters, orNone
if no configuration files were updated;True
if new values of recovery parameters were queried,False
otherwise.
- _read_recovery_params_pre_v12() Tuple[Optional[CaseInsensitiveDict], bool] ¶
- property _recovery_parameters_to_compare: CaseInsensitiveSet¶
- _write_recovery_params(fd: ConfigWriter, recovery_params: CaseInsensitiveDict) None ¶
- check_recovery_conf(member: Optional[Union[Leader, 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
- config_writer(filename: str) Iterator[ConfigWriter] ¶
Create
ConfigWriter
object and set permissions on a filename.- Parameters:
filename – path to a config file.
- Yields:
ConfigWriter
object.
- property effective_configuration: CaseInsensitiveDict¶
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.
- get_server_parameters(config: Dict[str, Any]) CaseInsensitiveDict ¶
- load_current_server_parameters() None ¶
Read GUC’s values from
pg_settings
when Patroni is joining the the postgres that is already running.
- 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.
- resolve_connection_addresses() None ¶
Calculates and sets local and remote connection urls and options.
- This method sets:
Postgresql.connection_string
attribute, which is later written to the member key in DCS asconn_url
.ConfigHandler.local_replication_address
attribute, which is used for replication connections to local postgres.ConnectionPool.conn_kwargs
attribute, which is used for superuser connections to local postgres.
Note
If there is a valid directory in
postgresql.parameters.unix_socket_directories
in the Patroni configuration andpostgresql.use_unix_socket
and/orpostgresql.use_unix_socket_repl
are set toTrue
, we respectively use unix sockets for superuser and replication connections to local postgres.If there is a requirement to use unix sockets, but nothing is set in the
postgresql.parameters.unix_socket_directories
, we omit ahost
in connection parameters relying on the ability oflibpq
to connect via some default unix socket directory.If unix sockets are not requested we “switch” to TCP, prefering to use
localhost
if it is possible to deduce that Postgres is listening on a local interface address.Otherwise we just used the first address specified in the
listen_addresses
GUC.
- 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.
- write_postgresql_conf(configuration: Optional[CaseInsensitiveDict] = None) None ¶
- write_recovery_conf(recovery_params: CaseInsensitiveDict) None ¶
- 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_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'