Skip to content

Commit c47df3b

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

File tree

5 files changed

+18
-17
lines changed

5 files changed

+18
-17
lines changed

tests/query/test_query_transaction.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ 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+
34+
2935
def test_tx_rollback_before_begin(self, tx: QueryTxContext):
3036
tx.rollback()
3137
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/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)