Skip to content

Commit 8ac464d

Browse files
committed
Merge branch 'oss-next' into ngdg_master_ft
2 parents 917f923 + 4fca34b commit 8ac464d

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Bug Fixes
4646
* asyncio message chunks can be processed discontinuously (PYTHON-1185)
4747
* Reconnect attempts persist after downed node removed from peers (PYTHON-1181)
4848
* Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)
49+
* ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)
4950

5051
Others
5152
------

cassandra/cluster.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4550,8 +4550,9 @@ def _set_result(self, host, connection, pool, response):
45504550
log.warning("Host %s error: %s.", host, response.summary)
45514551
if self._metrics is not None:
45524552
self._metrics.on_other_error()
4553+
cl = getattr(self.message, 'consistency_level', None)
45534554
retry = retry_policy.on_request_error(
4554-
self.query, self.message.consistency_level, error=response,
4555+
self.query, cl, error=response,
45554556
retry_num=self._query_retries)
45564557
elif isinstance(response, PreparedQueryNotFound):
45574558
if self.prepared_statement:
@@ -4608,9 +4609,9 @@ def _set_result(self, host, connection, pool, response):
46084609
self._metrics.on_connection_error()
46094610
if not isinstance(response, ConnectionShutdown):
46104611
self._connection.defunct(response)
4612+
cl = getattr(self.message, 'consistency_level', None)
46114613
retry = self._retry_policy.on_request_error(
4612-
self.query, self.message.consistency_level, error=response,
4613-
retry_num=self._query_retries)
4614+
self.query, cl, error=response, retry_num=self._query_retries)
46144615
self._handle_retry_decision(retry, response, host)
46154616
elif isinstance(response, Exception):
46164617
if hasattr(response, 'to_exception'):

tests/unit/test_response_future.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,28 @@ def test_unavailable_error_message(self):
203203
rf._set_result(None, None, None, result)
204204
self.assertRaises(Exception, rf.result)
205205

206+
def test_request_error_with_prepare_message(self):
207+
session = self.make_session()
208+
query = SimpleStatement("SELECT * FROM foobar")
209+
retry_policy = Mock()
210+
retry_policy.on_request_error.return_value = (RetryPolicy.RETHROW, None)
211+
message = PrepareMessage(query=query)
212+
213+
rf = ResponseFuture(session, message, query, 1, retry_policy=retry_policy)
214+
rf._query_retries = 1
215+
rf.send_request()
216+
result = Mock(spec=OverloadedErrorMessage)
217+
result.to_exception.return_value = result
218+
rf._set_result(None, None, None, result)
219+
self.assertIsInstance(rf._final_exception, OverloadedErrorMessage)
220+
221+
rf = ResponseFuture(session, message, query, 1, retry_policy=retry_policy)
222+
rf._query_retries = 1
223+
rf.send_request()
224+
result = Mock(spec=ConnectionException)
225+
rf._set_result(None, None, None, result)
226+
self.assertIsInstance(rf._final_exception, ConnectionException)
227+
206228
def test_retry_policy_says_ignore(self):
207229
session = self.make_session()
208230
query = SimpleStatement("INSERT INFO foo (a, b) VALUES (1, 2)")

0 commit comments

Comments
 (0)