From 1b14229da480e36ea36d662b1f1b92e5a46f8269 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Wed, 17 Feb 2016 12:18:50 +0100 Subject: [PATCH] Catch TypeError within ha loop not in the unit test In addition to that use sleep function from patroni.utils instead of time.sleep which is interruptable --- patroni/ha.py | 30 ++++++++++++++++-------------- tests/test_ha.py | 6 ++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/patroni/ha.py b/patroni/ha.py index bf002a51..4aead262 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -3,13 +3,13 @@ import logging import psycopg2 import requests import sys -import time import datetime import pytz +from multiprocessing.pool import ThreadPool from patroni.async_executor import AsyncExecutor from patroni.exceptions import DCSError, PostgresConnectionException -from multiprocessing.pool import ThreadPool +from patroni.utils import sleep logger = logging.getLogger(__name__) @@ -283,20 +283,22 @@ class Ha(object): # the value. # If the value is close to now, we initiate the failover now = datetime.datetime.now(pytz.utc) - delta = (failover.scheduled_at - now).total_seconds() + try: + delta = (failover.scheduled_at - now).total_seconds() - if delta > 10: - logging.info('Awaiting failover at {0} (in {1:.0f} seconds)'.format(failover.scheduled_at.isoformat(), - delta)) - return - elif delta < -15: - logger.warning('Found a stale failover value, cleaning up: {}'.format(failover.scheduled_at)) - self.dcs.manual_failover('', '', self.cluster.failover.index) - return + if delta > 10: + logging.info('Awaiting failover at %s (in %.0f seconds)', failover.scheduled_at.isoformat(), delta) + return + elif delta < -15: + logger.warning('Found a stale failover value, cleaning up: %s', failover.scheduled_at) + self.dcs.manual_failover('', '', self.cluster.failover.index) + return - # The value is very close to now - time.sleep(max(delta, 0)) - logger.info('Manual scheduled failover at {}'.format(failover.scheduled_at.isoformat())) + # The value is very close to now + sleep(max(delta, 0)) + logger.info('Manual scheduled failover at {}'.format(failover.scheduled_at.isoformat())) + except TypeError: + logger.warning('Incorrect value in of scheduled_at: %s', failover.scheduled_at) if not failover.leader or failover.leader == self.state_handler.name: if not failover.member or failover.member != self.state_handler.name: diff --git a/tests/test_ha.py b/tests/test_ha.py index c6b98712..3589e952 100644 --- a/tests/test_ha.py +++ b/tests/test_ha.py @@ -297,7 +297,6 @@ class TestHa(unittest.TestCase): self.ha.update_lock = false self.assertEquals(self.ha.run_cycle(), 'failed to update leader lock during restart') - @patch('requests.get', requests_get) def test_manual_failover_from_leader(self): self.ha.has_lock = true @@ -316,11 +315,10 @@ class TestHa(unittest.TestCase): self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, 'blabla', MockPostgresql.name, None)) self.assertEquals(self.ha.run_cycle(), 'no action. i am the leader with the lock') - ## Failover scheduled time must include timezone + # Failover scheduled time must include timezone scheduled = datetime.datetime.now() self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, 'blabla', MockPostgresql.name, scheduled)) - - self.assertRaises(TypeError, self.ha.run_cycle) + self.ha.run_cycle() scheduled = datetime.datetime.utcnow().replace(tzinfo=pytz.UTC) self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, 'blabla', MockPostgresql.name, scheduled))