Skip to content

Commit 892831d

Browse files
committed
connection: avoid double heartbeat in-flight release
1 parent 70b2dcf commit 892831d

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

cassandra/connection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1820,7 +1820,8 @@ def __init__(self, connection, owner):
18201820
try:
18211821
connection.send_msg(OptionsMessage(), request_id, self._options_callback)
18221822
except Exception as exc:
1823-
connection.in_flight -= 1
1823+
if connection.is_control_connection:
1824+
connection.in_flight -= 1
18241825
if request_id not in connection._requests and request_id not in connection.request_ids:
18251826
connection.request_ids.append(request_id)
18261827
self._exception = exc

tests/unit/test_connection.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,14 +466,24 @@ def test_no_req_ids(self, *args):
466466
def test_heartbeat_future_releases_request_id_when_send_fails(self, *args):
467467
connection = Connection(DefaultEndPoint('1.2.3.4'))
468468
connection.push = Mock(side_effect=ConnectionException("write failed"))
469+
owner = Mock()
469470
initial_in_flight = connection.in_flight
470471
initial_request_ids = len(connection.request_ids)
471472

472-
future = HeartbeatFuture(connection, Mock())
473+
# HostConnection.return_connection releases the heartbeat's in-flight slot.
474+
def return_connection(conn):
475+
with conn.lock:
476+
conn.in_flight -= 1
477+
478+
owner.return_connection.side_effect = return_connection
479+
480+
future = HeartbeatFuture(connection, owner)
473481

474482
with pytest.raises(ConnectionException):
475483
future.wait(0)
476484

485+
owner.return_connection(connection)
486+
477487
assert connection.in_flight == initial_in_flight
478488
assert len(connection.request_ids) == initial_request_ids
479489
assert not connection._requests

0 commit comments

Comments
 (0)