
    :j                     d    d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	  ed      Z
 G d d	      Zy)
z|
Shutdown coordination for graceful application termination.
Manages component shutdown sequence and completion monitoring.
    N)ListOptional)
get_logger   )LifecycleManagermanagerc                       e Zd ZdZ	 	 ddee   dedefdZddee   ddfd	Z	dd
Z
ddZdefdZddee   defdZddZdefdZy)ShutdownCoordinatorz7Coordinates graceful shutdown of application components
componentsshutdown_timeoutmonitor_intervalc                     || _         t        d|      | _        t        d|      | _        t	        j
                         | _        d| _        t	        j
                         | _        y)zInitialize shutdown coordinator

        Args:
            components: List of components to shutdown
            shutdown_timeout: Total timeout for shutdown process
            monitor_interval: Interval between completion checks in seconds
        g      ?r   N)	r   maxr   r   	threadingEventshutdown_eventcompletion_threadcompletion_stop)selfr   r   r   s       7/root/.openclaw/workspace/harvester/manager/shutdown.py__init__zShutdownCoordinator.__init__   sQ     % #C)9 : #A'7 8'oo/=A(0    Nintervalreturnc                    | j                   r0| j                   j                         rt        j                  d       y|%|dkD  r || _        t        j                  d| d       | j                  j                          t        j                  | j                  dd      | _         | j                   j                          t        j                  d	| j                   d       y)
zStart completion monitoring thread

        Args:
            interval: Override monitor interval for this session (optional)
        z"Completion monitor already runningNr   zUsing custom monitor interval: szcompletion-monitorF)targetnamedaemonz0Started completion monitoring thread, interval: )r   is_aliveloggerwarningr   infor   clearr   Thread_completion_monitor_loopstart)r   r   s     r   start_completion_monitorz,ShutdownCoordinator.start_completion_monitor*   s     !!d&<&<&E&E&GNN?@ HqL$,D!KK9(1EF""$!*!1!100%"

 	$$&FtG\G\F]]^_`r   c                    | j                   r| j                   j                         syt        j                  d       | j                  j                          	 | j                   j                  d       | j                   j                         rt        j                  d       yt        j                  d       y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z!Stop completion monitoring threadNz%Stopping completion monitoring threadg      @timeoutz1Completion monitor thread did not stop gracefullyz!Completion monitor thread stoppedz#Error stopping completion monitor: )
r   r    r!   r#   r   setjoinr"   	Exceptionerror)r   es     r   stop_completion_monitorz+ShutdownCoordinator.stop_completion_monitorB   s    %%T-C-C-L-L-N;<  "	D""'''4%%..0RS?@ 	DLL>qcBCC	Ds   AB: $B: :	C%C  C%c                    	 | j                   j                         sd}| j                  D ]  }|j                         rd} n |r0t        j                  d       | j                  j                          y| j                   j                  | j                        ry| j                   j                         syy# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z8Monitor completion status and trigger shutdown when doneTFz,All components finished, triggering shutdownr*   zError in completion monitor: N)r   is_setr   is_finishedr!   r#   r   r,   waitr   r.   r/   )r   all_finished	componentr0   s       r   r&   z,ShutdownCoordinator._completion_monitor_loopS   s    	>**113#!% I$002',
  KK NO''++- '',,T5J5J,K **113"  	>LL8<==	>s(   ;B9 6B9 5&B9 B9 9	C$CC$c           	         t         j                  d       t        j                         }| j                          | j                  t        t        | j                        d      z  }d}t        | j                        D ]   \  }}|j                  j                  }	 t         j                  d|dz    dt        | j                         d|        |j                          t        j                         }t        j                         |z
  |k  r=|j                  snKt        j                  d       t        j                         |z
  |k  r=t         j                  d| d	       d
}t         j                  d| d        t        j                         |z
  }	|rt         j                  d|	dd       |S t         j                  d|	dd       |S # t        $ r(}t         j!                  d| d|        d
}Y d}~d}~ww xY w)zPerform graceful shutdown of all components

        Returns:
            bool: True if shutdown completed successfully
        zStarting graceful shutdownr   TzStopping component /z: g?z
Component z did not stop within timeoutFz stoppedzError stopping component Nz,Graceful shutdown completed successfully in z.1fr   z+Graceful shutdown completed with errors in )r!   r#   timer1   r   r   lenr   	enumerate	__class____name__stop
is_runningsleepr"   r.   r/   )
r   
start_timecomponent_timeoutsuccessir7   component_nametimeout_startr0   elapseds
             r   graceful_shutdownz%ShutdownCoordinator.graceful_shutdownj   s    	01YY[
 	$$& !11CDOO8La4PP%doo6 	 LAy&0099N 1!A#aDOO8L7MRP^O_`a  !%		iikM14EE$//JJsO	 iikM14EE NNZ/??[#\]#Gj(8AB%	 0 ))+
*KKFwsmSTUV  NNHQTUVWX   88H1#NO s   B.G
4G	HG>>Hr+   c                 :    | j                   j                  |      S )zWait for completion signal

        Args:
            timeout: Maximum time to wait

        Returns:
            bool: True if completion was signaled
        r*   )r   r5   )r   r+   s     r   wait_for_completionz'ShutdownCoordinator.wait_for_completion   s     ""'''88r   c                 b    t         j                  d       | j                  j                          y)zSignal shutdown requestzShutdown signal receivedN)r!   r#   r   r,   r   s    r   signal_shutdownz#ShutdownCoordinator.signal_shutdown   s!    ./!r   c                 6    | j                   j                         S )zpCheck if shutdown has been requested

        Returns:
            bool: True if shutdown was requested
        )r   r3   rM   s    r   is_shutdown_requestedz)ShutdownCoordinator.is_shutdown_requested   s     ""))++r   )g      >@g       @)N)r   N)r>   
__module____qualname____doc__r   r   floatr   r   r(   r1   r&   boolrI   rK   rN   rP    r   r   r
   r
      s    A
 #'"%	1)*1  1  	1(a% aD a0D">..4 .`	98E? 	9d 	9"
,t ,r   r
   )rS   r   r:   typingr   r   tools.loggerr   baser   r!   r
   rV   r   r   <module>rZ      s1   
   ! # "	I	], ],r   