Skip to content

Commit 4fca34b

Browse files
committed
Merge branch 'master' into oss-next
2 parents 0d72845 + 016cbc1 commit 4fca34b

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
@@ -21,6 +21,7 @@ Bug Fixes
2121
* asyncio message chunks can be processed discontinuously (PYTHON-1185)
2222
* Reconnect attempts persist after downed node removed from peers (PYTHON-1181)
2323
* Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)
24+
* ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)
2425

2526
Others
2627
------

cassandra/cluster.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4457,8 +4457,9 @@ def _set_result(self, host, connection, pool, response):
44574457
log.warning("Host %s error: %s.", host, response.summary)
44584458
if self._metrics is not None:
44594459
self._metrics.on_other_error()
4460+
cl = getattr(self.message, 'consistency_level', None)
44604461
retry = retry_policy.on_request_error(
4461-
self.query, self.message.consistency_level, error=response,
4462+
self.query, cl, error=response,
44624463
retry_num=self._query_retries)
44634464
elif isinstance(response, PreparedQueryNotFound):
44644465
if self.prepared_statement:
@@ -4515,9 +4516,9 @@ def _set_result(self, host, connection, pool, response):
45154516
self._metrics.on_connection_error()
45164517
if not isinstance(response, ConnectionShutdown):
45174518
self._connection.defunct(response)
4519+
cl = getattr(self.message, 'consistency_level', None)
45184520
retry = self._retry_policy.on_request_error(
4519-
self.query, self.message.consistency_level, error=response,
4520-
retry_num=self._query_retries)
4521+
self.query, cl, error=response, retry_num=self._query_retries)
45214522
self._handle_retry_decision(retry, response, host)
45224523
elif isinstance(response, Exception):
45234524
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)