Make it possible to schedule failover in less then 10 seconds

But only when API request was posted to the leader
This commit is contained in:
Alexander Kukushkin
2016-04-13 13:32:39 +02:00
parent 94331fde6d
commit b4e86f0809
3 changed files with 12 additions and 5 deletions
+1 -1
View File
@@ -44,7 +44,7 @@ Scenario: check the failover via the API
And replication works from postgres1 to postgres0 after 15 seconds
Scenario: check the scheduled failover
Given I issue a scheduled failover at http://127.0.0.1:8009 from postgres1 to postgres0 in 10 seconds
Given I issue a scheduled failover at http://127.0.0.1:8009 from postgres1 to postgres0 in 1 seconds
Then I receive a response code 200
And postgres0 is a leader after 20 seconds
And postgres0 role is the primary after 5 seconds
+8 -4
View File
@@ -203,8 +203,12 @@ class RestApiHandler(BaseHTTPRequestHandler):
data = b'Cannot schedule failover in the past'
status_code = 422
elif self.server.patroni.dcs.manual_failover(leader, candidate, scheduled_at=scheduled_at):
self.server.patroni.dcs.event.set()
data = b'Failover scheduled'
status_code = 200
else:
data = b'failed to write failover key into DCS'
status_code = 503
except (ValueError, TypeError):
logger.exception('Invalid scheduled failover time: %s', request['scheduled_at'])
data = b'Unable to parse scheduled timestamp. It should be in an unambiguous format, e.g. ISO 8601'
@@ -212,12 +216,12 @@ class RestApiHandler(BaseHTTPRequestHandler):
else:
data = self.is_failover_possible(cluster, leader, candidate)
if not data:
if not self.server.patroni.dcs.manual_failover(leader, candidate):
data = b'failed to write failover key into DCS'
status_code = 503
else:
if self.server.patroni.dcs.manual_failover(leader, candidate):
self.server.patroni.dcs.event.set()
status_code, data = self.poll_failover_result(cluster.leader and cluster.leader.name, candidate)
else:
data = b'failed to write failover key into DCS'
status_code = 503
else:
status_code = 400
data = b'No values given for required parameters leader and candidate'
+3
View File
@@ -188,6 +188,9 @@ class TestRestApiHandler(unittest.TestCase):
request = b'POST /failover HTTP/1.0\nAuthorization: Basic dGVzdDp0ZXN0\nContent-Length: 103\n\n{"leader": ' +\
b'"postgresql1", "member": "postgresql2", "scheduled_at": "6016-02-15T18:13:30.568224+01:00"}'
MockRestApiServer(RestApiHandler, request)
with patch.object(MockPatroni, 'dcs') as d:
d.manual_failover.return_value = False
MockRestApiServer(RestApiHandler, request)
# Exception: No timezone specified
request = b'POST /failover HTTP/1.0\nAuthorization: Basic dGVzdDp0ZXN0\nContent-Length: 97\n\n{"leader": ' +\