patroni.postgresql.rewind module

class patroni.postgresql.rewind.REWIND_STATUS(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)View on GitHub

Bases: IntEnum

CHECK = 2
CHECKPOINT = 1
FAILED = 6
INITIAL = 0
NEED = 3
NOT_NEED = 4
SUCCESS = 5
class patroni.postgresql.rewind.Rewind(postgresql: Postgresql)View on GitHub

Bases: object

__checkpoint(task: CriticalTask, wakeup: Callable[[...], Any]) None
__init__(postgresql: Postgresql) NoneView on GitHub
_archive_ready_wals() NoneView on GitHub

Try to archive WALs that have .ready files just in case archive_mode was not set to ‘always’ before promote, while after it the WALs were recycled on the promoted replica. With this we prevent the entire loss of such WALs and the consequent old leader’s start failure.

_buid_archiver_command(command: str, wal_filename: str) strView on GitHub

Replace placeholders in the given archiver command’s template. Applicable for archive_command and restore_command. Can also be used for archive_cleanup_command and recovery_end_command, however %r value is always set to 000000010000000000000001.

_check_timeline_and_lsn(leader: Leader | RemoteMember) NoneView on GitHub
_conn_kwargs(member: Leader | RemoteMember, auth: Dict[str, Any]) Dict[str, Any]View on GitHub
_fetch_missing_wal(restore_command: str, wal_filename: str) boolView on GitHub
_find_missing_wal(data: bytes) str | NoneView on GitHub
_get_checkpoint_end(timeline: int, lsn: int) intView on GitHub

Get the end of checkpoint record from WAL.

Note

The checkpoint record size in WAL depends on postgres major version and platform (memory alignment). Hence, the only reliable way to figure out where it ends, is to read the record from file with the help of pg_waldump and parse the output.

We are trying to read two records, and expect that it will fail to read the second record with message:

fatal: error in WAL record at 0/182E220: invalid record length at 0/182E298: wanted 24, got 0; or

fatal: error in WAL record at 0/182E220: invalid record length at 0/182E298: expected at least 24, got 0

The error message contains information about LSN of the next record, which is exactly where checkpoint ends.

Parameters:
  • timeline – the checkpoint timeline from pg_controldata.

  • lsn – the checkpoint location as int from pg_controldata.

Returns:

the end of checkpoint record as int or 0 if failed to parse pg_waldump output.

_get_local_timeline_lsn() Tuple[bool | None, int | None, int | None]View on GitHub
_get_local_timeline_lsn_from_controldata() Tuple[bool | None, int | None, int | None]View on GitHub
static _log_primary_history(history: List[Tuple[int, int, str]], i: int) NoneView on GitHub
_maybe_clean_pg_replslot() NoneView on GitHub

Clean pg_replslot directory if pg version is less then 11 (pg_rewind deletes $PGDATA/pg_replslot content only since pg11).

property can_rewind: bool

check if pg_rewind executable is there and that pg_controldata indicates we have either wal_log_hints or checksums turned on

property can_rewind_or_reinitialize_allowed: bool
static check_leader_has_run_checkpoint(conn_kwargs: Dict[str, Any]) str | NoneView on GitHub
static check_leader_is_not_in_recovery(conn_kwargs: Dict[str, Any]) bool | NoneView on GitHub
checkpoint_after_promote() boolView on GitHub
cleanup_archive_status() NoneView on GitHub
static configuration_allows_rewind(data: Dict[str, str]) boolView on GitHub
property enabled: bool
ensure_checkpoint_after_promote(wakeup: Callable[[...], Any]) NoneView on GitHub

After promote issue a CHECKPOINT from a new thread and asynchronously check the result. In case if CHECKPOINT failed, just check that timeline in pg_control was updated.

ensure_clean_shutdown() bool | NoneView on GitHub
execute(leader: Leader | RemoteMember) bool | NoneView on GitHub
property executed: bool
property failed: bool
property is_needed: bool
pg_rewind(r: Dict[str, Any]) boolView on GitHub
read_postmaster_opts() Dict[str, str]View on GitHub

returns the list of option names/values from postgres.opts, Empty dict if read failed or no file

reset_state() NoneView on GitHub
rewind_or_reinitialize_needed_and_possible(leader: Leader | RemoteMember | None) boolView on GitHub
property should_remove_data_directory_on_diverged_timelines: bool
single_user_mode(communicate: Dict[str, Any] | None = None, options: Dict[str, str] | None = None) int | NoneView on GitHub

run a given command in a single-user mode. If the command is empty - then just start and stop

trigger_check_diverged_lsn() NoneView on GitHub