From c37f7705856bd82f5416cef4bb82e1786c3f508c Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Fri, 2 May 2014 18:34:20 -0500 Subject: [PATCH 1/2] Add test logger if not added by nose --- tests/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/__init__.py b/tests/__init__.py index 97cea29f..64d56ea8 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -16,3 +16,8 @@ import logging log = logging.getLogger() log.setLevel('DEBUG') +# if nose didn't already attach a log handler, add one here +if not log.handlers: + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s [%(module)s:%(lineno)s]: %(message)s')) + log.addHandler(handler) From e6d56ba0008c190bf9acc4c1b8dd58455f9afd43 Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Tue, 6 May 2014 13:56:17 -0500 Subject: [PATCH 2/2] Handle exhausted reconnection schedule correctly --- CHANGELOG.rst | 1 + cassandra/pool.py | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8a5a0fd1..a19653b5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Bug Fixes * Fix duplicate node-up handling, which could result in multiple reconnectors being started as well as the executor threads becoming deadlocked, preventing future node up or node down handling from being executed. +* Handle exhausted ReconnectionPolicy schedule correctly Other ----- diff --git a/cassandra/pool.py b/cassandra/pool.py index 7fd8e355..755fac26 100644 --- a/cassandra/pool.py +++ b/cassandra/pool.py @@ -167,9 +167,20 @@ class _ReconnectionHandler(object): try: conn = self.try_reconnect() except Exception as exc: - next_delay = self.schedule.next() + try: + next_delay = self.schedule.next() + except StopIteration: + # the schedule has been exhausted + next_delay = None + + # call on_exception for logging purposes even if next_delay is None if self.on_exception(exc, next_delay): - self.scheduler.schedule(next_delay, self.run) + if next_delay is None: + log.warn( + "Will not continue to retry reconnection attempts " + "due to an exhausted retry schedule") + else: + self.scheduler.schedule(next_delay, self.run) else: if not self._cancelled: self.on_reconnection(conn)