11import time
22
3+ import ydb
34from ydb ._grpc .v5 .protos .ydb_coordination_pb2 import SessionRequest
45from ydb ._grpc .v5 .ydb_coordination_v1_pb2_grpc import CoordinationServiceStub
6+ from ydb ._utilities import SyncResponseIterator
57
68
79class CoordinationSession :
810 def __init__ (self , driver : "ydb.Driver" ):
911 self ._driver = driver
10-
11- def acquire_semaphore (self , name : str , count : int = 1 , timeout : int = 5000 ):
12- req = SessionRequest (
12+ self ._session_id = None
13+
14+ def _ensure_session (self ):
15+ if self ._session_id is None :
16+ req = SessionRequest (session_start = SessionRequest .SessionStart ())
17+ stream_it = self ._driver (
18+ req ,
19+ CoordinationServiceStub ,
20+ "Session" ,
21+ )
22+ iterator = SyncResponseIterator (stream_it , lambda resp : resp )
23+ first_resp = next (iterator )
24+ self ._session_id = first_resp .session_started .session_id
25+ return self ._session_id
26+
27+ def acquire_semaphore (self , path : str , count : int = 1 , timeout_millis : int = 5000 ):
28+ session_id = self ._ensure_session ()
29+ acquire_req = SessionRequest (
1330 acquire_semaphore = SessionRequest .AcquireSemaphore (
14- name = name ,
31+ name = path ,
1532 count = count ,
16- timeout_millis = timeout ,
33+ timeout_millis = timeout_millis ,
1734 req_id = int (time .time () * 1000 ),
1835 data = b"" ,
1936 ephemeral = True ,
2037 ),
21- session_start = SessionRequest .SessionStart ()
38+ session_start = SessionRequest .SessionStart (session_id = session_id )
2239 )
23-
24- res_iter = self ._driver (req , CoordinationServiceStub , "Session" )
25- res = next (res_iter )
26- acquire_result = getattr (res , "acquire_semaphore_result" , None )
27-
28- if not acquire_result or not acquire_result .acquired :
29- raise RuntimeError (f"Failed to acquire semaphore { name } " )
30-
31- return res .session_started .session_id
32-
33- def release_semaphore (self , name : str , session_id : int ):
34- req = SessionRequest (
40+ stream_it = self ._driver (acquire_req , CoordinationServiceStub , "Session" )
41+ iterator = SyncResponseIterator (stream_it , lambda resp : resp )
42+ resp = next (iterator )
43+ result = getattr (resp , "acquire_semaphore_result" , None )
44+ if not result or not result .acquired :
45+ raise RuntimeError (f"Failed to acquire semaphore { path } " )
46+
47+ def release_semaphore (self , path : str ):
48+ if self ._session_id is None :
49+ return
50+ release_req = SessionRequest (
3551 release_semaphore = SessionRequest .ReleaseSemaphore (
36- name = name ,
52+ name = path ,
3753 req_id = int (time .time () * 1000 ),
3854 ),
3955 session_stop = SessionRequest .SessionStop ()
4056 )
41- self ._driver (req , CoordinationServiceStub , "Session" )
57+ stream_it = self ._driver (release_req , CoordinationServiceStub , "Session" )
58+ SyncResponseIterator (stream_it , lambda resp : resp )
59+ self ._session_id = None
0 commit comments