diff --git a/docs/SETTINGS.rst b/docs/SETTINGS.rst index 63e7f1c5..4e9103ec 100644 --- a/docs/SETTINGS.rst +++ b/docs/SETTINGS.rst @@ -314,7 +314,7 @@ PostgreSQL - **pg\_ctl\_timeout**: How long should pg_ctl wait when doing ``start``, ``stop`` or ``restart``. Default value is 60 seconds. - **use\_pg\_rewind**: try to use pg\_rewind on the former leader when it joins cluster as a replica. - **remove\_data\_directory\_on\_rewind\_failure**: If this option is enabled, Patroni will remove the PostgreSQL data directory and recreate the replica. Otherwise it will try to follow the new leader. Default value is **false**. - - **remove\_data\_directory\_on\_diverged\_timelines**: Patroni will remove the PostgreSQL data directory and recreate the replica if it notices that timelines are diverging and the former master can not start streaming from the new master. This option is useful when ``pg_rewind`` can not be used. Default value is **false**. + - **remove\_data\_directory\_on\_diverged\_timelines**: Patroni will remove the PostgreSQL data directory and recreate the replica if it notices that timelines are diverging and the former master can not start streaming from the new master. This option is useful when ``pg_rewind`` can not be used. While performing timelines divergence check on PostgreSQL v10 and older Patroni will try to connect with replication credential to the "postgres" database. Hence, such access should be allowed in the pg_hba.conf. Default value is **false**. - **replica\_method**: for each create_replica_methods other than basebackup, you would add a configuration section of the same name. At a minimum, this should include "command" with a full path to the actual script to be executed. Other configuration parameters will be passed along to the script in the form "parameter=value". - **pre\_promote**: a fencing script that executes during a failover after acquiring the leader lock but before promoting the replica. If the script exits with a non-zero code, Patroni does not promote the replica and removes the leader key from DCS. diff --git a/patroni/postgresql/rewind.py b/patroni/postgresql/rewind.py index 91360df6..481f0b7a 100644 --- a/patroni/postgresql/rewind.py +++ b/patroni/postgresql/rewind.py @@ -28,13 +28,17 @@ class Rewind(object): def configuration_allows_rewind(data): return data.get('wal_log_hints setting', 'off') == 'on' or data.get('Data page checksum version', '0') != '0' + @property + def enabled(self): + return self._postgresql.config.get('use_pg_rewind') + @property def can_rewind(self): """ check if pg_rewind executable is there and that pg_controldata indicates we have either wal_log_hints or checksums turned on """ # low-hanging fruit: check if pg_rewind configuration is there - if not self._postgresql.config.get('use_pg_rewind'): + if not self.enabled: return False cmd = [self._postgresql.pgcommand('pg_rewind'), '--help'] @@ -186,8 +190,14 @@ class Rewind(object): if isinstance(leader, Leader) and leader.member.data.get('role') != 'master': return - if not self.check_leader_is_not_in_recovery( - self._conn_kwargs(leader, self._postgresql.config.replication)): + # We want to use replication credentials when connecting to the "postgres" database in case if + # `use_pg_rewind` isn't enabled and only `remove_data_directory_on_diverged_timelines` is set + # for Postgresql older than v11 (where Patroni can't use a dedicated user for rewind). + # In all other cases we will use rewind or superuser credentials. + check_credentials = self._postgresql.config.replication if not self.enabled and\ + self.should_remove_data_directory_on_diverged_timelines and\ + self._postgresql.major_version < 110000 else self._postgresql.config.rewind_credentials + if not self.check_leader_is_not_in_recovery(self._conn_kwargs(leader, check_credentials)): return history = need_rewind = None