@@ -10,8 +10,9 @@ use std::{
1010 mem,
1111 pin:: Pin ,
1212 sync:: Arc ,
13+ time:: Duration ,
1314} ;
14- use tokio:: sync:: RwLock ;
15+ use tokio:: { sync:: RwLock , time :: timeout } ;
1516
1617use crate :: setlock:: SetLock ;
1718
@@ -290,16 +291,35 @@ impl ServiceManager {
290291 drop ( status) ;
291292
292293 let service_manager = Arc :: clone ( self . arc . read ( ) . await . unwrap ( ) ) ;
293- match service. start ( service_manager) . await {
294- Ok ( ( ) ) => {
295- info ! ( "Started service: {}" , service. info( ) . name) ;
296- service. info ( ) . set_status ( Status :: Started ) . await ;
297- }
294+
295+ let start = service. start ( service_manager) ;
296+
297+ let duration = Duration :: from_secs ( 10 ) ; //TODO: Add to config instead of hardcoding
298+ let timeout_result = timeout ( duration, start) ;
299+
300+ match timeout_result. await {
301+ Ok ( start_result) => match start_result {
302+ Ok ( ( ) ) => {
303+ info ! ( "Started service: {}" , service. info( ) . name) ;
304+ service. info ( ) . set_status ( Status :: Started ) . await ;
305+ }
306+ Err ( error) => {
307+ error ! ( "Failed to start service {}: {}" , service. info( ) . name, error) ;
308+ service
309+ . info ( )
310+ . set_status ( Status :: FailedToStart ( error) )
311+ . await ;
312+ }
313+ } ,
298314 Err ( error) => {
299- error ! ( "Failed to start service {}: {}" , service. info( ) . name, error) ;
315+ error ! (
316+ "Failed to start service {}: Timeout of {} seconds reached." ,
317+ service. info( ) . name,
318+ duration. as_secs( )
319+ ) ;
300320 service
301321 . info ( )
302- . set_status ( Status :: FailedToStart ( error) )
322+ . set_status ( Status :: FailedToStart ( Box :: new ( error) ) )
303323 . await ;
304324 }
305325 }
@@ -329,14 +349,32 @@ impl ServiceManager {
329349 * status = Status :: Stopping ;
330350 drop ( status) ;
331351
332- match service. stop ( ) . await {
333- Ok ( ( ) ) => {
334- info ! ( "Stopped service: {}" , service. info( ) . name) ;
335- service. info ( ) . set_status ( Status :: Stopped ) . await ;
336- }
352+ let stop = service. stop ( ) ;
353+
354+ let duration = Duration :: from_secs ( 10 ) ; //TODO: Add to config instead of hardcoding
355+ let timeout_result = timeout ( duration, stop) ;
356+
357+ match timeout_result. await {
358+ Ok ( stop_result) => match stop_result {
359+ Ok ( ( ) ) => {
360+ info ! ( "Stopped service: {}" , service. info( ) . name) ;
361+ service. info ( ) . set_status ( Status :: Stopped ) . await ;
362+ }
363+ Err ( error) => {
364+ error ! ( "Failed to stop service {}: {}" , service. info( ) . name, error) ;
365+ service. info ( ) . set_status ( Status :: FailedToStop ( error) ) . await ;
366+ }
367+ } ,
337368 Err ( error) => {
338- error ! ( "Failed to stop service {}: {}" , service. info( ) . name, error) ;
339- service. info ( ) . set_status ( Status :: FailedToStop ( error) ) . await ;
369+ error ! (
370+ "Failed to stop service {}: Timeout of {} seconds reached." ,
371+ service. info( ) . name,
372+ duration. as_secs( )
373+ ) ;
374+ service
375+ . info ( )
376+ . set_status ( Status :: FailedToStop ( Box :: new ( error) ) )
377+ . await ;
340378 }
341379 }
342380 }
0 commit comments