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
This commit is contained in:
Alexander Kukushkin
2016-02-17 12:18:50 +01:00
parent a875e93f2e
commit 1b14229da4
2 changed files with 18 additions and 18 deletions
+16 -14
View File
@@ -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:
+2 -4
View File
@@ -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))