From 1606ab6f5adf28a7ad59ae161583d86ec028a1e5 Mon Sep 17 00:00:00 2001 From: Feike Steenbergen Date: Wed, 25 Nov 2015 15:07:55 +0100 Subject: [PATCH] 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. --- docker/entrypoint.sh | 5 +++-- patroni/ctl.py | 17 ++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 1718fb31..9edb2120 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -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" diff --git a/patroni/ctl.py b/patroni/ctl.py index a3c8aa73..7950fab2 100644 --- a/patroni/ctl.py +++ b/patroni/ctl.py @@ -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') - lag = '' - if xlog_location is not None: - lag = round(((cluster.last_leader_operation or 0) - m.data.get('xlog_location', 0)) / 1024 / 1024) + if xlog_location is None or (xlog_location_cluster < xlog_location): + lag = '' + 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)