Skip to content

Commit fc0bb8b

Browse files
committed
Refactor session state reset logic
1 parent 4daa631 commit fc0bb8b

File tree

9 files changed

+34
-28
lines changed

9 files changed

+34
-28
lines changed

tests/aio/query/test_query_session.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
from ydb.aio.query.session import QuerySession
88

99

10-
def _check_session_state_empty(session: QuerySession):
11-
assert session._state.session_id is None
12-
assert session._state.node_id is None
10+
def _check_session_not_attached(session: QuerySession):
1311
assert not session._state.attached
1412

1513

@@ -22,13 +20,13 @@ def _check_session_state_full(session: QuerySession):
2220
class TestAsyncQuerySession:
2321
@pytest.mark.asyncio
2422
async def test_session_normal_lifecycle(self, session: QuerySession):
25-
_check_session_state_empty(session)
23+
_check_session_not_attached(session)
2624

2725
await session.create()
2826
_check_session_state_full(session)
2927

3028
await session.delete()
31-
_check_session_state_empty(session)
29+
_check_session_not_attached(session)
3230

3331
@pytest.mark.asyncio
3432
async def test_second_create_do_nothing(self, session: QuerySession):

tests/aio/query/test_query_transaction.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ async def test_tx_commit_before_begin(self, tx: QueryTxContext):
3030
await tx.commit()
3131
assert tx._tx_state._state == QueryTxStateEnum.COMMITTED
3232

33+
@pytest.mark.asyncio
34+
async def test_tx_rollback_after_session_detached(self, tx: QueryTxContext):
35+
async with tx:
36+
await tx.begin()
37+
await tx.session.delete()
38+
3339
@pytest.mark.asyncio
3440
async def test_tx_rollback_before_begin(self, tx: QueryTxContext):
3541
await tx.rollback()

tests/query/test_query_session.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
from ydb.query.session import QuerySession
1212

1313

14-
def _check_session_state_empty(session: QuerySession):
15-
assert session._state.session_id is None
16-
assert session._state.node_id is None
14+
def _check_session_not_attached(session: QuerySession):
1715
assert not session._state.attached
1816

1917

@@ -25,13 +23,13 @@ def _check_session_state_full(session: QuerySession):
2523

2624
class TestQuerySession:
2725
def test_session_normal_lifecycle(self, session: QuerySession):
28-
_check_session_state_empty(session)
26+
_check_session_not_attached(session)
2927

3028
session.create()
3129
_check_session_state_full(session)
3230

3331
session.delete()
34-
_check_session_state_empty(session)
32+
_check_session_not_attached(session)
3533

3634
def test_second_create_do_nothing(self, session: QuerySession):
3735
session.create()
@@ -145,7 +143,7 @@ def cancel(self):
145143
assert "first response attach stream thread" not in thread_names
146144
assert "attach stream thread" not in thread_names
147145

148-
_check_session_state_empty(session)
146+
_check_session_not_attached(session)
149147

150148
@pytest.mark.parametrize(
151149
"stats_mode",

tests/query/test_query_transaction.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ def test_tx_commit_before_begin(self, tx: QueryTxContext):
2626
tx.commit()
2727
assert tx._tx_state._state == QueryTxStateEnum.COMMITTED
2828

29+
def test_tx_rollback_after_session_detached(self, tx: QueryTxContext):
30+
with tx:
31+
tx.begin()
32+
tx.session.delete()
33+
2934
def test_tx_rollback_before_begin(self, tx: QueryTxContext):
3035
tx.rollback()
3136
assert tx._tx_state._state == QueryTxStateEnum.ROLLBACKED

ydb/aio/query/session.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def _attach(self) -> None:
5757
if first_response.status != issues.StatusCode.SUCCESS:
5858
raise RuntimeError("Failed to attach session")
5959
except Exception as e:
60-
self._state.reset()
60+
self._state.set_attached(False)
6161
self._status_stream.cancel()
6262
raise e
6363

@@ -70,11 +70,11 @@ async def _check_session_status_loop(self) -> None:
7070
try:
7171
async for status in self._status_stream:
7272
if status.status != issues.StatusCode.SUCCESS:
73-
self._state.reset()
73+
self._state.set_attached(False)
7474
self._state._change_state(QuerySessionStateEnum.CLOSED)
7575
except Exception:
7676
if not self._state._already_in(QuerySessionStateEnum.CLOSED):
77-
self._state.reset()
77+
self._state.set_attached(False)
7878
self._state._change_state(QuerySessionStateEnum.CLOSED)
7979

8080
async def delete(self, settings: Optional[BaseRequestSettings] = None) -> None:

ydb/aio/query/transaction.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ async def __aexit__(self, *args, **kwargs):
5252
it is not finished explicitly
5353
"""
5454
await self._ensure_prev_stream_finished()
55+
56+
if not self._session_state.attached:
57+
return
58+
5559
if self._tx_state._state == QueryTxStateEnum.BEGINED and self._external_error is None:
5660
# It's strictly recommended to close transactions directly
5761
# by using commit_tx=True flag while executing statement or by

ydb/query/base.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,6 @@ class IQuerySessionState(abc.ABC):
111111
def __init__(self, settings: Optional[QueryClientSettings] = None):
112112
pass
113113

114-
@abc.abstractmethod
115-
def reset(self) -> None:
116-
pass
117-
118114
@property
119115
@abc.abstractmethod
120116
def session_id(self) -> Optional[str]:
@@ -210,7 +206,7 @@ def decorator(rpc_state, response_pb, session_state: IQuerySessionState, *args,
210206
try:
211207
return func(rpc_state, response_pb, session_state, *args, **kwargs)
212208
except issues.BadSession:
213-
session_state.reset()
209+
session_state.set_attached(False)
214210
raise
215211

216212
return decorator

ydb/query/session.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ class QuerySessionState(base.IQuerySessionState):
6565
def __init__(self, settings: base.QueryClientSettings = None):
6666
self._settings = settings
6767

68-
def reset(self) -> None:
69-
self._session_id = None
70-
self._node_id = None
71-
self._attached = False
72-
7368
@property
7469
def session_id(self) -> Optional[str]:
7570
return self._session_id
@@ -129,7 +124,7 @@ def wrapper_delete_session(
129124
) -> "BaseQuerySession":
130125
message = _ydb_query.DeleteSessionResponse.from_proto(response_pb)
131126
issues._process_response(message.status)
132-
session_state.reset()
127+
session_state.set_attached(False)
133128
session_state._change_state(QuerySessionStateEnum.CLOSED)
134129
return session
135130

@@ -257,7 +252,7 @@ def _attach(self, first_resp_timeout: int = DEFAULT_INITIAL_RESPONSE_TIMEOUT) ->
257252
if first_response.status != issues.StatusCode.SUCCESS:
258253
raise RuntimeError("Failed to attach session")
259254
except Exception as e:
260-
self._state.reset()
255+
self._state.set_attached(False)
261256
status_stream.cancel()
262257
raise e
263258

@@ -275,11 +270,11 @@ def _check_session_status_loop(self, status_stream: _utilities.SyncResponseItera
275270
try:
276271
for status in status_stream:
277272
if status.status != issues.StatusCode.SUCCESS:
278-
self._state.reset()
273+
self._state.set_attached(False)
279274
self._state._change_state(QuerySessionStateEnum.CLOSED)
280275
except Exception:
281276
if not self._state._already_in(QuerySessionStateEnum.CLOSED):
282-
self._state.reset()
277+
self._state.set_attached(False)
283278
self._state._change_state(QuerySessionStateEnum.CLOSED)
284279

285280
def delete(self, settings: Optional[BaseRequestSettings] = None) -> None:

ydb/query/transaction.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,10 @@ def __exit__(self, *args, **kwargs):
377377
it is not finished explicitly
378378
"""
379379
self._ensure_prev_stream_finished()
380+
381+
if not self._session_state.attached:
382+
return
383+
380384
if self._tx_state._state == QueryTxStateEnum.BEGINED and self._external_error is None:
381385
# It's strictly recommended to close transactions directly
382386
# by using commit_tx=True flag while executing statement or by

0 commit comments

Comments
 (0)