Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
* Query session attach stream handles `NodeShutdown` and `SessionShutdown` session hints: on `NodeShutdown` the session's node connection is pessimized and the session is retired, on `SessionShutdown` the session is retired without touching the node
* Bumped `ydb-api-protos` and regenerated gRPC/protobuf stubs (v3–v6) to include query service session hints

## 3.29.1 ##
* Fix driver.wait hang

Expand Down
70 changes: 70 additions & 0 deletions tests/query/test_query_session_hints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from unittest import mock

from ydb._grpc.common.protos import ydb_query_pb2
from ydb.query.session import QuerySession


def _make_session(node_id=42):
driver = mock.Mock()
driver._store = mock.Mock()
driver._store.connections_by_node_id = {node_id: mock.Mock()}
driver._on_disconnected = mock.Mock(return_value=None)
session = QuerySession(driver)
session._session_id = "test-session"
session._node_id = node_id
return session, driver


class TestQuerySessionAttachHints:
def test_node_shutdown_pessimizes_node_and_invalidates_session(self):
session, driver = _make_session(node_id=42)
connection = driver._store.connections_by_node_id[42]

session._handle_attach_session_state(
ydb_query_pb2.SessionState(
status=0,
node_shutdown=ydb_query_pb2.NodeShutdownHint(),
)
)

driver._on_disconnected.assert_called_once_with(connection)
assert session._invalidated
assert session._closed

def test_session_shutdown_invalidates_without_pessimizing_node(self):
session, driver = _make_session(node_id=42)

session._handle_attach_session_state(
ydb_query_pb2.SessionState(
status=0,
session_shutdown=ydb_query_pb2.SessionShutdownHint(),
)
)

driver._on_disconnected.assert_not_called()
assert session._invalidated
assert session._closed

def test_node_shutdown_with_zero_node_id_skips_pessimization(self):
session, driver = _make_session(node_id=0)

session._handle_attach_session_state(
ydb_query_pb2.SessionState(
status=0,
node_shutdown=ydb_query_pb2.NodeShutdownHint(),
)
)

driver._on_disconnected.assert_not_called()
assert session._invalidated

def test_no_hint_does_not_invalidate(self):
session, driver = _make_session()

session._handle_attach_session_state(
ydb_query_pb2.SessionState(status=0),
)

driver._on_disconnected.assert_not_called()
assert not session._invalidated
assert not session._closed
428 changes: 371 additions & 57 deletions ydb/_grpc/v3/draft/protos/ydb_maintenance_pb2.py

Large diffs are not rendered by default.

1,234 changes: 1,234 additions & 0 deletions ydb/_grpc/v3/draft/protos/ydb_replication_pb2.py

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions ydb/_grpc/v3/draft/protos/ydb_replication_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

174 changes: 174 additions & 0 deletions ydb/_grpc/v3/draft/protos/ydb_view_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions ydb/_grpc/v3/draft/protos/ydb_view_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

70 changes: 70 additions & 0 deletions ydb/_grpc/v3/draft/ydb_replication_v1_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading