@@ -80,14 +80,20 @@ impl EtcdLockManager {
80
80
. await
81
81
. map_err ( PyClientError ) ?;
82
82
83
- self . lease_id = match self . ttl {
83
+ let mut self_ = scopeguard:: guard ( self , |self_| {
84
+ if let Some ( ref lease_keepalive_task) = self_. lease_keepalive_task {
85
+ lease_keepalive_task. abort ( ) ;
86
+ }
87
+ } ) ;
88
+
89
+ self_. lease_id = match self_. ttl {
84
90
Some ( ttl) => {
85
91
let lease_grant_res = client. lease_grant ( ttl, None ) . await . map_err ( PyClientError ) ?;
86
92
let lease_id = lease_grant_res. id ( ) ;
87
93
88
94
let mut client_to_move = client. clone ( ) ;
89
95
90
- self . lease_keepalive_task = Some ( tokio:: spawn ( async move {
96
+ self_ . lease_keepalive_task = Some ( tokio:: spawn ( async move {
91
97
let ( mut lease_keeper, _lease_stream) = client_to_move
92
98
. lease_keep_alive ( lease_id)
93
99
. await
@@ -105,22 +111,22 @@ impl EtcdLockManager {
105
111
} ;
106
112
107
113
let timeout_result: Result < Result < ( ) , PyClientError > , tokio:: time:: error:: Elapsed > =
108
- match self . timeout_seconds {
114
+ match self_ . timeout_seconds {
109
115
Some ( seconds) => {
110
- timeout ( Duration :: from_secs_f64 ( seconds) , self . try_lock ( & mut client) ) . await
116
+ timeout (
117
+ Duration :: from_secs_f64 ( seconds) ,
118
+ self_. try_lock ( & mut client) ,
119
+ )
120
+ . await
111
121
}
112
- None => ready ( Ok ( self . try_lock ( & mut client) . await ) ) . await ,
122
+ None => ready ( Ok ( self_ . try_lock ( & mut client) . await ) ) . await ,
113
123
} ;
114
124
115
- if let Some ( ref lease_keepalive_task) = self . lease_keepalive_task {
116
- lease_keepalive_task. abort ( ) ;
117
- }
118
-
119
125
match timeout_result {
120
- Ok ( Ok ( _) ) => { }
121
- Ok ( Err ( e ) ) => return Err ( e . into ( ) ) ,
126
+ Ok ( Ok ( _) ) => Ok ( PyCommunicator :: new ( client ) ) ,
127
+ Ok ( Err ( try_lock_err ) ) => Err ( try_lock_err . into ( ) ) ,
122
128
Err ( timedout_err) => {
123
- if let Some ( lease_id) = self . lease_id {
129
+ if let Some ( lease_id) = self_ . lease_id {
124
130
if let Err ( etcd_client:: Error :: GRpcStatus ( status) ) =
125
131
client. lease_revoke ( lease_id) . await
126
132
{
@@ -129,11 +135,9 @@ impl EtcdLockManager {
129
135
}
130
136
}
131
137
}
132
- return Err ( LockError :: new_err ( timedout_err. to_string ( ) ) ) ;
138
+ Err ( LockError :: new_err ( timedout_err. to_string ( ) ) )
133
139
}
134
140
}
135
-
136
- Ok ( PyCommunicator :: new ( client) )
137
141
}
138
142
139
143
pub async fn handle_aexit ( & mut self ) -> PyResult < ( ) > {
0 commit comments