mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-25 14:53:37 +00:00
This commit is a breaking change: 1. `role` in DCS is written as "primary" instead of "master". 2. `role` in REST API responses is also written as "primary". 3. REST API no longer accepts role=master in requests (for example switchover/failover/restart endpoints). 4. `/metrics` REST API endpoint will no longer report `patroni_master`. 5. `patronictl` no longer accepts `--master` argument. 6. `no_master` option in declarative configuration of custom replica creation methods is no longer treated as a special option, please use `no_leader` instead. 7. `patroni_wale_restore` doesn't accept `--no_master` anymore. 8. `patroni_barman` doesn't accept `--role=master` anymore. 9. callback scripts will be executed with role=primary instead of role=master 10. On Kubernetes Patroni by default will set role label to primary. In case if you want to keep old behavior and avoid downtime or lengthy complex migrations you can configure `kubernetes.leader_label_value` and `kubernetes.standby_leader_label_value` to `master`. However, a few exceptions regarding master are still in place: 1. `GET /master` REST API endpoint will continue to work. 2. `master_start_timeout` and `master_stop_timeout` in global configuration are still accepted. 3. `master` tag is still preserved in Consul services in addition to `primary`. Rationale for these exceptions: DBA doesn't always 100% control the infrastructure and can't adjust the configuration.
62 lines
4.5 KiB
Gherkin
62 lines
4.5 KiB
Gherkin
Feature: ignored slots
|
|
Scenario: check ignored slots aren't removed on failover/switchover
|
|
Given I start postgres1
|
|
Then postgres1 is a leader after 10 seconds
|
|
And there is a non empty initialize key in DCS after 15 seconds
|
|
When I issue a PATCH request to http://127.0.0.1:8009/config with {"ignore_slots": [{"name": "unmanaged_slot_0", "database": "postgres", "plugin": "test_decoding", "type": "logical"}, {"name": "unmanaged_slot_1", "database": "postgres", "plugin": "test_decoding"}, {"name": "unmanaged_slot_2", "database": "postgres"}, {"name": "unmanaged_slot_3"}], "postgresql": {"parameters": {"wal_level": "logical"}}}
|
|
Then I receive a response code 200
|
|
And Response on GET http://127.0.0.1:8009/config contains ignore_slots after 10 seconds
|
|
# Make sure the wal_level has been changed.
|
|
When I shut down postgres1
|
|
And I start postgres1
|
|
Then postgres1 is a leader after 10 seconds
|
|
And "members/postgres1" key in DCS has role=primary after 10 seconds
|
|
# Make sure Patroni has finished telling Postgres it should be accepting writes.
|
|
And postgres1 role is the primary after 20 seconds
|
|
# 1. Create our test logical replication slot.
|
|
# Test that ny subset of attributes in the ignore slots matcher is enough to match a slot
|
|
# by using 3 different slots.
|
|
When I create a logical replication slot unmanaged_slot_0 on postgres1 with the test_decoding plugin
|
|
And I create a logical replication slot unmanaged_slot_1 on postgres1 with the test_decoding plugin
|
|
And I create a logical replication slot unmanaged_slot_2 on postgres1 with the test_decoding plugin
|
|
And I create a logical replication slot unmanaged_slot_3 on postgres1 with the test_decoding plugin
|
|
And I create a logical replication slot dummy_slot on postgres1 with the test_decoding plugin
|
|
# It seems like it'd be obvious that these slots exist since we just created them,
|
|
# but Patroni can actually end up dropping them almost immediately, so it's helpful
|
|
# to verify they exist before we begin testing whether they persist through failover
|
|
# cycles.
|
|
Then postgres1 has a logical replication slot named unmanaged_slot_0 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_1 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_2 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_3 with the test_decoding plugin after 2 seconds
|
|
|
|
When I start postgres0
|
|
Then "members/postgres0" key in DCS has role=replica after 10 seconds
|
|
And postgres0 role is the secondary after 20 seconds
|
|
# Verify that the replica has advanced beyond the point in the WAL
|
|
# where we created the replication slot so that on the next failover
|
|
# cycle we don't accidentally rewind to before the slot creation.
|
|
And replication works from postgres1 to postgres0 after 20 seconds
|
|
When I shut down postgres1
|
|
Then "members/postgres0" key in DCS has role=primary after 10 seconds
|
|
|
|
# 2. After a failover the server (now a replica) still has the slot.
|
|
When I start postgres1
|
|
Then postgres1 role is the secondary after 20 seconds
|
|
And "members/postgres1" key in DCS has role=replica after 10 seconds
|
|
# give Patroni time to sync replication slots
|
|
And I sleep for 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_0 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_1 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_2 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_3 with the test_decoding plugin after 2 seconds
|
|
And postgres1 does not have a replication slot named dummy_slot
|
|
|
|
# 3. After a failover the server (now a primary) still has the slot.
|
|
When I shut down postgres0
|
|
Then "members/postgres1" key in DCS has role=primary after 10 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_0 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_1 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_2 with the test_decoding plugin after 2 seconds
|
|
And postgres1 has a logical replication slot named unmanaged_slot_3 with the test_decoding plugin after 2 seconds
|