patroni.postgresql package
Subpackages
- patroni.postgresql.available_parameters package
- patroni.postgresql.mpp package
- Submodules
- Module contents
AbstractMPPAbstractMPP.__init__()AbstractMPP._abc_implAbstractMPP._get_handler_cls()AbstractMPP.coordinator_group_idAbstractMPP.get_handler_impl()AbstractMPP.groupAbstractMPP.group_reAbstractMPP.is_coordinator()AbstractMPP.is_enabled()AbstractMPP.is_worker()AbstractMPP.k8s_group_labelAbstractMPP.typeAbstractMPP.validate_config()
AbstractMPPHandlerAbstractMPPHandler.__init__()AbstractMPPHandler._abc_implAbstractMPPHandler.adjust_postgres_gucs()AbstractMPPHandler.bootstrap()AbstractMPPHandler.handle_event()AbstractMPPHandler.ignore_replication_slot()AbstractMPPHandler.on_demote()AbstractMPPHandler.schedule_cache_rebuild()AbstractMPPHandler.sync_meta_data()
NullNullHandlerget_mpp()iter_mpp_classes()
Submodules
- patroni.postgresql.bootstrap module
BootstrapBootstrap.__init__()Bootstrap._custom_bootstrap()Bootstrap._initdb()Bootstrap._post_restore()Bootstrap.basebackup()Bootstrap.bootstrap()Bootstrap.call_post_bootstrap()Bootstrap.clone()Bootstrap.create_or_update_role()Bootstrap.create_replica()Bootstrap.keep_existing_recovery_confBootstrap.post_bootstrap()Bootstrap.process_user_options()Bootstrap.running_custom_bootstrap
- patroni.postgresql.callback_executor module
- patroni.postgresql.cancellable module
- patroni.postgresql.config module
ConfigHandlerConfigHandler.CMDLINE_OPTIONSConfigHandler._RECOVERY_PARAMETERSConfigHandler.__init__()ConfigHandler._adjust_recovery_parameters()ConfigHandler._check_passfile()ConfigHandler._check_primary_conninfo()ConfigHandler._configuration_to_saveConfigHandler._get_pg_settings()ConfigHandler._get_tcp_local_address()ConfigHandler._get_unix_local_address()ConfigHandler._handle_wal_buffers()ConfigHandler._pgpass_content()ConfigHandler._read_recovery_params()ConfigHandler._read_recovery_params_pre_v12()ConfigHandler._recovery_parameters_to_compareConfigHandler._remove_file_if_exists()ConfigHandler._sanitize_auto_conf()ConfigHandler._triggerfile_wrong_nameConfigHandler._write_recovery_params()ConfigHandler.append_pg_hba()ConfigHandler.build_recovery_params()ConfigHandler.check_directories()ConfigHandler.check_recovery_conf()ConfigHandler.config_dirConfigHandler.config_writer()ConfigHandler.effective_configurationConfigHandler.format_dsn()ConfigHandler.get()ConfigHandler.get_server_parameters()ConfigHandler.hba_fileConfigHandler.ident_fileConfigHandler.load_current_server_parameters()ConfigHandler.pg_hba_confConfigHandler.pg_versionConfigHandler.postgresql_confConfigHandler.primary_conninfo_params()ConfigHandler.recovery_conf_exists()ConfigHandler.reload_config()ConfigHandler.remove_recovery_conf()ConfigHandler.replace_pg_hba()ConfigHandler.replace_pg_ident()ConfigHandler.replicationConfigHandler.resolve_connection_addresses()ConfigHandler.restore_command()ConfigHandler.restore_configuration_files()ConfigHandler.rewind_credentialsConfigHandler.save_configuration_files()ConfigHandler.set_file_permissions()ConfigHandler.set_synchronous_standby_names()ConfigHandler.setup_server_parameters()ConfigHandler.superuserConfigHandler.synchronous_standby_namesConfigHandler.triggerfile_good_nameConfigHandler.try_to_create_dir()ConfigHandler.write_pgpass()ConfigHandler.write_postgresql_conf()ConfigHandler.write_recovery_conf()
ConfigWriter_bool_is_true_validator()_bool_validator()_conninfo_dsn_parse()_conninfo_parse()_conninfo_uri_parse()_false_validator()get_param_diff()mtime()parse_dsn()read_param_value()read_recovery_param_value()strip_comment()
- patroni.postgresql.connection module
- patroni.postgresql.misc module
- patroni.postgresql.postmaster module
PostmasterProcessPostmasterProcess.__init__()PostmasterProcess._from_pidfile()PostmasterProcess._is_postmaster_process()PostmasterProcess._read_postmaster_pidfile()PostmasterProcess.from_pid()PostmasterProcess.from_pidfile()PostmasterProcess.pg_ctl_kill()PostmasterProcess.signal_kill()PostmasterProcess.signal_stop()PostmasterProcess.start()PostmasterProcess.wait_for_user_backends_to_close()
pg_ctl_start()
- patroni.postgresql.rewind module
REWIND_STATUSRewindRewind.__checkpoint()Rewind.__init__()Rewind._archive_ready_wals()Rewind._build_archiver_command()Rewind._check_timeline_and_lsn()Rewind._conn_kwargs()Rewind._fetch_missing_wal()Rewind._find_missing_wal()Rewind._get_checkpoint_end()Rewind._get_local_timeline_lsn()Rewind._get_local_timeline_lsn_from_controldata()Rewind._log_primary_history()Rewind._maybe_clean_pg_replslot()Rewind.can_rewindRewind.can_rewind_or_reinitialize_allowedRewind.check_leader_has_run_checkpoint()Rewind.check_leader_is_not_in_recovery()Rewind.checkpoint_after_promote()Rewind.cleanup_archive_status()Rewind.configuration_allows_rewind()Rewind.enabledRewind.ensure_checkpoint_after_promote()Rewind.ensure_clean_shutdown()Rewind.execute()Rewind.executedRewind.failedRewind.is_neededRewind.pg_rewind()Rewind.read_postmaster_opts()Rewind.reset_state()Rewind.rewind_or_reinitialize_needed_and_possible()Rewind.should_remove_data_directory_on_diverged_timelinesRewind.single_user_mode()Rewind.trigger_check_diverged_lsn()
- patroni.postgresql.slots module
SlotsAdvanceThreadSlotsHandlerSlotsHandler.__init__()SlotsHandler._copy_items()SlotsHandler._drop_incorrect_slots()SlotsHandler._ensure_logical_slots_primary()SlotsHandler._ensure_logical_slots_replica()SlotsHandler._ensure_physical_slots()SlotsHandler._get_leader_connection_cursor()SlotsHandler._query()SlotsHandler._ready_logical_slots()SlotsHandler._update_pending_logical_slot_primary()SlotsHandler.check_logical_slots_readiness()SlotsHandler.copy_logical_slots()SlotsHandler.drop_replication_slot()SlotsHandler.get_local_connection_cursor()SlotsHandler.ignore_replication_slot()SlotsHandler.load_replication_slots()SlotsHandler.on_promote()SlotsHandler.process_permanent_slots()SlotsHandler.schedule()SlotsHandler.sync_replication_slots()
compare_slots()
- patroni.postgresql.sync module
- patroni.postgresql.validator module
BoolEnumEnumBoolIntegerInvalidGucValidatorsFileNumberRealStringValidatorFactoryValidatorFactoryInvalidSpecValidatorFactoryInvalidTypeValidatorFactoryNoType_Transformable_get_postgres_guc_validators()_load_postgres_gucs_validators()_read_postgres_gucs_validators_file()_transform_parameter_value()transform_postgresql_parameter_value()transform_recovery_parameter_value()
Module contents
- class patroni.postgresql.Postgresql(config: Dict[str, Any], mpp: AbstractMPP)View on GitHub
Bases:
object- POSTMASTER_START_TIME = 'pg_catalog.pg_postmaster_start_time()'
- TL_LSN = "CASE WHEN pg_catalog.pg_is_in_recovery() THEN 0 ELSE ('x' || pg_catalog.substr(pg_catalog.pg_{0}file_name(pg_catalog.pg_current_{0}_{1}()), 1, 8))::bit(32)::int END, CASE WHEN pg_catalog.pg_is_in_recovery() THEN 0 ELSE pg_catalog.pg_{0}_{1}_diff(pg_catalog.pg_current_{0}{2}_{1}(), '0/0')::bigint END, pg_catalog.pg_{0}_{1}_diff(pg_catalog.pg_last_{0}_replay_{1}(), '0/0')::bigint, pg_catalog.pg_{0}_{1}_diff(COALESCE(pg_catalog.pg_last_{0}_receive_{1}(), '0/0'), '0/0')::bigint, pg_catalog.pg_is_in_recovery() AND pg_catalog.pg_is_{0}_replay_paused()"
- __init__(config: Dict[str, Any], mpp: AbstractMPP) NoneView on GitHub
- _before_stop() NoneView on GitHub
Synchronously run a script prior to stopping postgres.
- _checkpoint_locations_from_controldata(data: Dict[str, str]) Tuple[int, int] | NoneView on GitHub
Get shutdown checkpoint location.
- Parameters:
data –
dictobject with values returned by pg_controldata tool.- Returns:
a tuple of checkpoint LSN for the cleanly shut down primary, and LSN of prev wal record (SWITCH) if we know that the checkpoint was written to the new WAL file due to the archive_mode=on.
- _cluster_info_state_get(name: str) Any | NoneView on GitHub
- _do_before_stop(cmd: str) NoneView on GitHub
- _do_stop(mode: str, block_callbacks: bool, checkpoint: bool, on_safepoint: Callable[[...], Any] | None, on_shutdown: Callable[[int, int], Any] | None, before_shutdown: Callable[[...], Any] | None, stop_timeout: int | None) Tuple[bool, bool]View on GitHub
- _get_gucs() CaseInsensitiveSetView on GitHub
Get all available GUCs based on
postgres --describe-configoutput.- Returns:
all available GUCs in the local Postgres server.
- _pre_promote() boolView on GitHub
Runs a fencing script after the leader lock is acquired but before the replica is promoted. If the script exits with a non-zero code, promotion does not happen and the leader key is removed from DCS.
- _query(sql: str, *params: Any) List[Tuple[Any, ...]]View on GitHub
Execute sql query with params and optionally return results.
- Parameters:
sql – SQL statement to execute.
params – parameters to pass.
- Returns:
a query response as a list of tuples if there is any.
- Raises:
Errorif had issues while executing sql.PostgresConnectionException: if had issues while connecting to the database.RetryFailedError: if it was detected that connection/query failed due to PostgreSQL restart.
- _version_file_exists() boolView on GitHub
- _wait_for_connection_close(postmaster: PostmasterProcess) NoneView on GitHub
- _wait_promote(wait_seconds: int) bool | NoneView on GitHub
- static _wal_position(is_primary: bool, wal_position: int, received_location: int | None, replayed_location: int | None) intView on GitHub
- property available_gucs: CaseInsensitiveSetView on GitHub
GUCs available in this Postgres server.
- call_nowait(cb_type: CallbackAction) NoneView on GitHub
pick a callback command and call it without waiting for it to finish
- property callback: Dict[str, str]View on GitHub
- property can_advance_slots: boolView on GitHub
Trueif :attr:major_versionis greater than 110000.
- can_create_replica_without_replication_connection(replica_methods: List[str] | None) boolView on GitHub
go through the replication methods to see if there are ones that does not require a working replication connection.
- property cb_called: boolView on GitHub
- check_for_startup() boolView on GitHub
Checks PostgreSQL status and returns if PostgreSQL is in the middle of startup.
- check_startup_state_changed() boolView on GitHub
Checks if PostgreSQL has completed starting up or failed or still starting.
Should only be called when state == ‘starting’
- Returns:
True if state was changed from ‘starting’
- checkpoint(connect_kwargs: Dict[str, Any] | None = None, timeout: float | None = None) str | NoneView on GitHub
- property cluster_info_query: strView on GitHub
Returns the monitoring query with a fixed number of fields.
The query text is constructed based on current state in DCS and PostgreSQL version:
function names depend on version. wal/lsn for v10+ and xlog/location for pre v10.
for primary we query timeline_id (extracted from pg_walfile_name()) and pg_current_wal_lsn()
for replicas we query pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn(), and pg_is_wal_replay_paused()
for v9.6+ we query primary_slot_name and primary_conninfo from pg_stat_get_wal_receiver()
for v11+ with permanent logical slots we query from pg_replication_slots and aggregate the result
for standby_leader node running v9.6+ we also query pg_control_checkpoint to fetch timeline_id
if sync replication is enabled we query pg_stat_replication and aggregate the result. In addition to that we get current values of synchronous_commit and synchronous_standby_names GUCs.
If some conditions are not satisfied we simply put static values instead. E.g., NULL, 0, ‘’, and so on.
- configure_server_parameters() NoneView on GitHub
- connection() connection3 | Connection3[Any]View on GitHub
- controldata() Dict[str, str]View on GitHub
return the contents of pg_controldata, or non-True value if pg_controldata call failed
- property create_replica_methods: List[str]View on GitHub
- property data_dir: strView on GitHub
- data_directory_empty() boolView on GitHub
- property database: strView on GitHub
- property enforce_hot_standby_feedback: boolView on GitHub
- ensure_major_version_is_known() boolView on GitHub
Calls configure_server_parameters() if _major_version is not known
- Returns:
True if _major_version is set, otherwise False
- follow(member: Leader | Member | None, role: str = 'replica', timeout: float | None = None, do_reload: bool = False) bool | NoneView on GitHub
Reconfigure postgres to follow a new member or use different recovery parameters.
Method may call on_role_change callback if role is changing.
- Parameters:
member – The member to follow
role – The desired role, normally ‘replica’, but could also be a ‘standby_leader’
timeout – start timeout, how long should the start() method wait for postgres accepting connections
do_reload – indicates that after updating postgresql.conf we just need to do a reload instead of restart
- Returns:
True - if restart/reload were successfully performed, False - if restart/reload failed None - if nothing was done or if Postgres is still in starting state after timeout seconds.
- get_guc_value(name: str) str | NoneView on GitHub
- get_history(timeline: int) List[Tuple[int, int, str] | Tuple[int, int, str, str, str]]View on GitHub
- get_major_version() intView on GitHub
Reads major version from PG_VERSION file
- Returns:
major PostgreSQL version in integer format or 0 in case of missing file or errors
- get_postgres_role_from_data_directory() strView on GitHub
- get_primary_timeline() intView on GitHub
- Returns:
current timeline if postgres is running as a primary or 0.
- get_replica_timeline() int | NoneView on GitHub
- get_replication_connection_cursor(host: str | None = None, port: int | str = 5432, **kwargs: Any) Generator[cursor | Cursor[Any], None, None]View on GitHub
- handle_parameter_change() NoneView on GitHub
- initdb(*args: str, **kwargs: Any) boolView on GitHub
Builds and executes the initdb command.
- Parameters:
args – List of arguments to be joined into the initdb command.
kwargs – Keyword arguments to pass to
subprocess.call.
- Returns:
Trueif the result ofsubprocess.call`, the exit code, is ``0.
- is_healthy() boolView on GitHub
- is_primary() boolView on GitHub
- is_running() PostmasterProcess | NoneView on GitHub
Returns PostmasterProcess if one is running on the data directory or None. If most recently seen process is running updates the cached process based on pid file.
- is_starting() boolView on GitHub
- last_operation() intView on GitHub
- latest_checkpoint_location() int | NoneView on GitHub
Get shutdown checkpoint location.
Note
In case if checkpoint was written to the new WAL file due to the archive_mode=on we return LSN of the previous wal record (SWITCH).
- Returns:
checkpoint LSN for the cleanly shut down primary.
- property lsn_name: strView on GitHub
- property major_version: intView on GitHub
- move_data_directory() NoneView on GitHub
- parse_wal_record(timeline: str, lsn: str) Tuple[str, str, str, str] | Tuple[None, None, None, None]View on GitHub
- property pending_restart_reason: CaseInsensitiveDictView on GitHub
Get
_pending_restart_reasonvalue._pending_restart_reasonis aCaseInsensitiveDictobject of the PG parameters that are causing pending restart state. Every key is a parameter name, value - a dictionary containing the old and the new value (seeget_param_diff()).
- pg_control_exists() boolView on GitHub
- pg_control_timeline() int | NoneView on GitHub
- pg_ctl(cmd: str, *args: str, **kwargs: Any) boolView on GitHub
Builds and executes pg_ctl command
- Returns:
!True when return_code == 0, otherwise !False
- pg_isready() strView on GitHub
Runs pg_isready to see if PostgreSQL is accepting connections.
- Returns:
‘ok’ if PostgreSQL is up, ‘reject’ if starting up, ‘no_response’ if not up.
- pg_stat_replication() List[Dict[str, Any]]View on GitHub
- Returns:
a result set of ‘SELECT * FROM pg_stat_replication’.
- pg_tblspc_realpaths() Dict[str, str]View on GitHub
Returns a dict containing the symlink (key) and target (values) for the tablespaces
- pg_wal_realpath() Dict[str, str]View on GitHub
Returns a dict containing the symlink (key) and target (value) for the wal directory
- pgcommand(cmd: str) strView on GitHub
Return path to the specified PostgreSQL command.
Note
If
postgresql.bin_name.*cmd*was configured by the user then that binary name is used, otherwise the default binary name cmd is used.- Parameters:
cmd – the Postgres binary name to get path to.
- Returns:
path to Postgres binary named cmd.
- postmaster_start_time() str | NoneView on GitHub
- primary_conninfo() str | NoneView on GitHub
- primary_slot_name() str | NoneView on GitHub
- promote(wait_seconds: int, task: CriticalTask, before_promote: Callable[[...], Any] | None = None) bool | NoneView on GitHub
- query(sql: str, *params: Any, retry: bool = True) List[Tuple[Any, ...]]View on GitHub
Execute sql query with params and optionally return results.
- Parameters:
sql – SQL statement to execute.
params – parameters to pass.
retry – whether the query should be retried upon failure or given up immediately.
- Returns:
a query response as a list of tuples if there is any.
- Raises:
Errorif had issues while executing sql.PostgresConnectionException: if had issues while connecting to the database.RetryFailedError: if it was detected that connection/query failed due to PostgreSQL restart or if retry deadline was exceeded.
- received_location() int | NoneView on GitHub
- received_timeline() int | NoneView on GitHub
- reload(block_callbacks: bool = False) boolView on GitHub
- remove_data_directory() NoneView on GitHub
- replay_paused() boolView on GitHub
- replayed_location() int | NoneView on GitHub
- replica_method_can_work_without_replication_connection(method: str) boolView on GitHub
- replication_state() str | NoneView on GitHub
Checks replication state from pg_stat_get_wal_receiver().
Note
Available only since 9.6
- Returns:
streaming,in archive recovery, orNone
- replication_state_from_parameters(is_primary: bool, receiver_state: str | None, restore_command: str | None) str | NoneView on GitHub
Figure out the replication state from input parameters.
Note
This method could be only called when Postgres is up, running and queries are successfully executed.
- Is_primary:
True is postgres is not running in recovery
- Receiver_state:
value from pg_stat_get_wal_receiver.state or None if Postgres is older than 9.6
- Restore_command:
value of
restore_commandGUC for PostgreSQL 12+ or postgresql.recovery_conf.restore_command if it is set in Patroni configuration- Returns:
None for the primary and for Postgres older than 9.6;
’streaming’ if replica is streaming according to the pg_stat_wal_receiver view;
’in archive recovery’ if replica isn’t streaming and there is a restore_command
- reset_cluster_info_state(cluster: Cluster | None, tags: Tags | None = None) NoneView on GitHub
Reset monitoring query cache.
Note
It happens in the beginning of heart-beat loop and on change of synchronous_standby_names.
- Parameters:
cluster – currently known cluster state from DCS
tags – reference to an object implementing
Tagsinterface.
- restart(timeout: float | None = None, task: CriticalTask | None = None, block_callbacks: bool = False, role: str | None = None, before_shutdown: Callable[[...], Any] | None = None, after_start: Callable[[...], Any] | None = None) bool | NoneView on GitHub
Restarts PostgreSQL.
When timeout parameter is set the call will block either until PostgreSQL has started, failed to start or timeout arrives.
- Returns:
True when restart was successful and timeout did not expire when waiting.
- resume_wal_replay() NoneView on GitHub
- property role: strView on GitHub
- schedule_sanity_checks_after_pause() NoneView on GitHub
After coming out of pause we have to: 1. configure server parameters if necessary 2. sync replication slots, because it might happen that slots were removed 3. get new ‘Database system identifier’ to make sure that it wasn’t changed
- property server_version: intView on GitHub
- set_enforce_hot_standby_feedback(value: bool) NoneView on GitHub
- set_pending_restart_reason(diff_dict: CaseInsensitiveDict) NoneView on GitHub
Set new or update current
_pending_restart_reason.- Parameters:
diff_dict – :class:
CaseInsensitiveDictobject with the parameters that are causing pending restart state with the diff of their values. Used to reset/update the_pending_restart_reason.
- set_role(value: str) NoneView on GitHub
- set_state(value: str) NoneView on GitHub
- slots() Dict[str, int]View on GitHub
- start(timeout: float | None = None, task: CriticalTask | None = None, block_callbacks: bool = False, role: str | None = None, after_start: Callable[[...], Any] | None = None) bool | NoneView on GitHub
Start PostgreSQL
Waits for postmaster to open ports or terminate so pg_isready can be used to check startup completion or failure.
- Returns:
True if start was initiated and postmaster ports are open, False if start failed, and None if postgres is still starting up
- property state: strView on GitHub
- stop(mode: str = 'fast', block_callbacks: bool = False, checkpoint: bool | None = None, on_safepoint: Callable[[...], Any] | None = None, on_shutdown: Callable[[int, int], Any] | None = None, before_shutdown: Callable[[...], Any] | None = None, stop_timeout: int | None = None) boolView on GitHub
Stop PostgreSQL
Supports a callback when a safepoint is reached. A safepoint is when no user backend can return a successful commit to users. Currently this means we wait for user backends to close. But in the future alternate mechanisms could be added.
- Parameters:
on_safepoint – This callback is called when no user backends are running.
on_shutdown – is called when pg_controldata starts reporting Database cluster state: shut down
before_shutdown – is called after running optional CHECKPOINT and before running pg_ctl stop
- property supports_multiple_sync: boolView on GitHub
True if Postgres version supports more than one synchronous node.
- Type:
returns
- synchronous_commit() strView on GitHub
- Returns:
“synchronous_commit” GUC value.
- synchronous_standby_names() strView on GitHub
- Returns:
“synchronous_standby_names” GUC value.
- property sysid: strView on GitHub
- terminate_postmaster(postmaster: PostmasterProcess, mode: str, stop_timeout: int | None) bool | NoneView on GitHub
- terminate_starting_postmaster(postmaster: PostmasterProcess) NoneView on GitHub
Terminates a postmaster that has not yet opened ports or possibly even written a pid file. Blocks until the process goes away.
- time_in_state() floatView on GitHub
- wait_for_port_open(postmaster: PostmasterProcess, timeout: float) boolView on GitHub
Waits until PostgreSQL opens ports.
- wait_for_startup(timeout: float = 0) bool | NoneView on GitHub
Waits for PostgreSQL startup to complete or fail.
- Returns:
True if start was successful, False otherwise
- property wal_dir: strView on GitHub
- property wal_flush: strView on GitHub
For PostgreSQL 9.6 onwards we want to use pg_current_wal_flush_lsn()/pg_current_xlog_flush_location().
- property wal_name: strView on GitHub
- was_restored_from_backup() boolView on GitHub
Check whether the data directory was restored from a base backup.
The presence of a
backup_labelfile in the data directory indicates that PostgreSQL has not yet completed recovery from a base backup. It is checked only for PostgreSQL 15+, because earlier versions supported exclusive backups which could leave a stalebackup_labelbehind after a primary crash.- Returns:
Trueif running on PostgreSQL 15 or newer and thebackup_labelfile exists in the data directory,Falseotherwise.
- patroni.postgresql.null_context()View on GitHub