@@ -10,9 +10,11 @@ use tokio::time::timeout;
1010use tokio_util:: codec:: { Framed , LengthDelimitedCodec } ;
1111
1212use crate :: common:: error:: DsError ;
13+ use crate :: messages:: common:: sync_worker_configuration;
1314use crate :: messages:: gateway:: LostWorkerReason ;
1415use crate :: messages:: worker:: {
1516 ConnectionRegistration , FromWorkerMessage , RegisterWorker , WorkerRegistrationResponse ,
17+ WorkerStopReason ,
1618} ;
1719use crate :: server:: comm:: { Comm , CommSenderRef } ;
1820use crate :: server:: core:: CoreRef ;
@@ -95,7 +97,7 @@ pub async fn worker_authentication(
9597
9698 let message_data = timeout ( Duration :: from_secs ( 15 ) , reader. next ( ) )
9799 . await
98- . map_err ( |_| "Worker registration did not arrived " ) ?
100+ . map_err ( |_| "Worker registration did not arrive " ) ?
99101 . ok_or_else ( || {
100102 DsError :: from ( "The remote side closed connection without worker registration" )
101103 } ) ??;
@@ -133,10 +135,8 @@ async fn worker_rpc_loop(
133135 assert ! ( heartbeat_interval. as_millis( ) > 150 ) ;
134136
135137 let mut configuration = msg. configuration ;
136- // Update idle_timeout configuration from server default
137- if configuration. idle_timeout . is_none ( ) {
138- configuration. idle_timeout = * core_ref. get ( ) . idle_timeout ( ) ;
139- }
138+ sync_worker_configuration ( & mut configuration, * core_ref. get ( ) . idle_timeout ( ) ) ;
139+
140140 let idle_timeout = configuration. idle_timeout ;
141141 let ( queue_sender, queue_receiver) = tokio:: sync:: mpsc:: unbounded_channel :: < Bytes > ( ) ;
142142
@@ -158,6 +158,7 @@ async fn worker_rpc_loop(
158158 worker_id,
159159 worker_addresses : core_ref. get ( ) . get_worker_addresses ( ) ,
160160 resource_names : core_ref. get ( ) . create_resource_map ( ) . into_vec ( ) ,
161+ server_idle_timeout : * core_ref. get ( ) . idle_timeout ( ) ,
161162 } ;
162163 queue_sender
163164 . send ( serialize ( & message) . unwrap ( ) . into ( ) )
@@ -179,22 +180,10 @@ async fn worker_rpc_loop(
179180 loop {
180181 interval. tick ( ) . await ;
181182 let now = Instant :: now ( ) ;
182- let mut core = core_ref. get_mut ( ) ;
183- let mut worker = core. get_worker_mut_by_id_or_panic ( worker_id) ;
183+ let core = core_ref. get ( ) ;
184+ let worker = core. get_worker_by_id_or_panic ( worker_id) ;
184185 let elapsed = now - worker. last_heartbeat ;
185186
186- if let Some ( timeout) = worker. configuration . idle_timeout {
187- if worker. tasks ( ) . is_empty ( ) {
188- let elapsed = now - worker. last_occupied ;
189- if elapsed > timeout {
190- log:: debug!( "Idle timeout, worker={}" , worker. id) ;
191- break LostWorkerReason :: IdleTimeout ;
192- }
193- } else {
194- worker. last_occupied = now;
195- }
196- }
197-
198187 if elapsed > heartbeat_interval * 2 {
199188 log:: debug!( "Heartbeat not arrived, worker={}" , worker. id) ;
200189 break LostWorkerReason :: HeartbeatLost ;
@@ -203,9 +192,16 @@ async fn worker_rpc_loop(
203192 } ;
204193
205194 let reason = tokio:: select! {
206- e = worker_receive_loop( core_ref. clone( ) , comm_ref. clone( ) , worker_id, connection. receiver, connection. opener) => {
207- log:: debug!( "Receive loop terminated ({:?}), worker={}" , e, worker_id) ;
208- LostWorkerReason :: ConnectionLost
195+ result = worker_receive_loop( core_ref. clone( ) , comm_ref. clone( ) , worker_id, connection. receiver, connection. opener) => {
196+ log:: debug!( "Receive loop terminated ({result:?}), worker={worker_id}" ) ;
197+ if let Ok ( Some ( reason) ) = result {
198+ match reason {
199+ WorkerStopReason :: IdleTimeout => LostWorkerReason :: IdleTimeout ,
200+ WorkerStopReason :: TimeLimitReached => LostWorkerReason :: TimeLimitReached
201+ }
202+ } else {
203+ LostWorkerReason :: ConnectionLost
204+ }
209205 }
210206 e = snd_loop => {
211207 log:: debug!( "Sending loop terminated: {:?}, worker={}" , e, worker_id) ;
@@ -245,7 +241,7 @@ pub async fn worker_receive_loop<
245241 worker_id : WorkerId ,
246242 mut receiver : Reader ,
247243 mut opener : Option < StreamOpener > ,
248- ) -> crate :: Result < ( ) > {
244+ ) -> crate :: Result < Option < WorkerStopReason > > {
249245 while let Some ( message) = receiver. next ( ) . await {
250246 let message: FromWorkerMessage = open_message ( & mut opener, & message?) ?;
251247 let mut core = core_ref. get_mut ( ) ;
@@ -275,7 +271,10 @@ pub async fn worker_receive_loop<
275271 FromWorkerMessage :: Overview ( overview) => {
276272 comm. send_client_worker_overview ( overview) ;
277273 }
274+ FromWorkerMessage :: Stop ( reason) => {
275+ return Ok ( Some ( reason) ) ;
276+ }
278277 }
279278 }
280- Ok ( ( ) )
279+ Ok ( None )
281280}
0 commit comments