Skip to content

Commit f8dddd2

Browse files
committed
connection: avoid double heartbeat in-flight release
1 parent e715392 commit f8dddd2

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
@@ -1837,7 +1837,8 @@ def __init__(self, connection, owner):
18371837
try:
18381838
connection.send_msg(OptionsMessage(), request_id, self._options_callback)
18391839
except Exception as exc:
1840-
connection.in_flight -= 1
1840+
if connection.is_control_connection:
1841+
connection.in_flight -= 1
18411842
if request_id not in connection._requests and request_id not in connection.request_ids:
18421843
connection.request_ids.append(request_id)
18431844
self._exception = exc

tests/unit/test_connection.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,24 @@ def test_no_req_ids(self, *args):
513513
def test_heartbeat_future_releases_request_id_when_send_fails(self, *args):
514514
connection = Connection(DefaultEndPoint('1.2.3.4'))
515515
connection.push = Mock(side_effect=ConnectionException("write failed"))
516+
owner = Mock()
516517
initial_in_flight = connection.in_flight
517518
initial_request_ids = len(connection.request_ids)
518519

519-
future = HeartbeatFuture(connection, Mock())
520+
# HostConnection.return_connection releases the heartbeat's in-flight slot.
521+
def return_connection(conn):
522+
with conn.lock:
523+
conn.in_flight -= 1
524+
525+
owner.return_connection.side_effect = return_connection
526+
527+
future = HeartbeatFuture(connection, owner)
520528

521529
with pytest.raises(ConnectionException):
522530
future.wait(0)
523531

532+
owner.return_connection(connection)
533+
524534
assert connection.in_flight == initial_in_flight
525535
assert len(connection.request_ids) == initial_request_ids
526536
assert not connection._requests

0 commit comments

Comments
 (0)