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