Bugfixes for Patronictl and the Development Docker environment

For easier development using Docker the $HOSTNAME variable will be used to
name the running Patroni. Bumped some _segments postgresql settings to ensure
WAL files are not removed very quickly.

Increased the timeout for the post request for Patroni, as some operations
(failover) may take considerable time to complete.

The failover to a specific member was broken in patronictl as it used a wrong
key to specify the member to failover to.

Pretty printing fix for xlog lag, to prevent false negatives to show up and have
good alignment.
This commit is contained in:
Feike Steenbergen
2015-11-25 15:07:55 +01:00
parent 2a37e2c5d7
commit 1606ab6f5a
2 changed files with 13 additions and 9 deletions
+3 -2
View File
@@ -93,7 +93,7 @@ etcd:
ttl: *ttl
host: ${ETCD_CLUSTER}
postgresql:
name: postgresql_${DOCKER_IP//./_} ## Replication slots do not allow dots in their name
name: ${HOSTNAME}
scope: *scope
listen: 0.0.0.0:5432
connect_address: ${DOCKER_IP}:5432
@@ -119,7 +119,8 @@ postgresql:
archive_command: 'true'
max_wal_senders: 20
listen_addresses: 0.0.0.0
wal_keep_segments: 8
checkpoint_segments: 64
wal_keep_segments: 64
archive_timeout: 1800s
max_replication_slots: 20
hot_standby: "on"
+9 -6
View File
@@ -111,7 +111,7 @@ def post_patroni(member, endpoint, content, headers={'Content-Type': 'applicatio
url = urlparse(member.api_url)
logging.debug(url)
return requests.post('{}://{}/{}'.format(url.scheme, url.netloc, endpoint), headers=headers,
data=json.dumps(content), timeout=5)
data=json.dumps(content), timeout=30)
def print_output(columns, rows=[], alignment=None, format='pretty', header=True, delimiter='\t'):
@@ -506,7 +506,7 @@ def failover(config_file, cluster_name, master, candidate, force, dcs):
t_started = time.time()
r = None
try:
r = post_patroni(cluster.leader.member, 'failover', {'leader': master, 'candidate': candidate or ''})
r = post_patroni(cluster.leader.member, 'failover', {'leader': master, 'member': candidate or ''})
if r.status_code == 200:
logging.debug(r)
logging.debug(r.text)
@@ -540,6 +540,8 @@ def output_members(cluster, name=None, format='pretty'):
if cluster.leader:
leader_name = cluster.leader.member.name
xlog_location_cluster = cluster.last_leader_operation or 0
# Mainly for consistent pretty printing and watching we sort the output
cluster.members.sort(key=lambda x: x.name)
for m in cluster.members:
@@ -552,9 +554,10 @@ def output_members(cluster, name=None, format='pretty'):
host = build_connect_parameters(m.conn_url)['host']
xlog_location = m.data.get('xlog_location')
if xlog_location is None or (xlog_location_cluster < xlog_location):
lag = ''
if xlog_location is not None:
lag = round(((cluster.last_leader_operation or 0) - m.data.get('xlog_location', 0)) / 1024 / 1024)
else:
lag = round((xlog_location_cluster - xlog_location)/1024/1024)
rows.append([
name,
@@ -562,7 +565,7 @@ def output_members(cluster, name=None, format='pretty'):
host,
leader,
m.data.get('state', ''),
lag,
lag
])
columns = [
@@ -573,7 +576,7 @@ def output_members(cluster, name=None, format='pretty'):
'State',
'Lag in MB',
]
alignment = {'Cluster': 'l', 'Member': 'l', 'Host': 'l'}
alignment = {'Cluster': 'l', 'Member': 'l', 'Host': 'l', 'Lag in MB': 'r'}
print_output(columns, rows, alignment, format)