
    j_                     D   U d Z ddlZddlZddlmZmZ  ej                  e      Zi Z	ee
ej                  f   ed<    ej                         Zde
dej                  defdZde
ddfd	Zde
defd
Zi Zee
e
f   ed<   dde
de
defdZde
ddfdZde
dee
   fdZdefdZy)u`   백그라운드 태스크 레지스트리 — 활성 태스크 추적 + 시작 시 stale 복구.    N)DictOptional_active_taskstask_keythreadreturnc                     t         5  t        j                  |       }|r|j                         r
	 ddd       y|t        | <   	 ddd       y# 1 sw Y   yxY w)u7   태스크 등록. 이미 실행 중이면 False 반환.NFT_lockr   getis_alive)r   r   existings      L/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/task_registry.pyregister_taskr      sF    	 $$X.))+ 
 #)h 
s   )A
AAc                 f    t         5  t        j                  | d        d d d        y # 1 sw Y   y xY wN)r   r   pop)r   s    r   unregister_taskr      s    	(D) 
   '0c                     t         5  t        j                  |       }|d uxr |j                         cd d d        S # 1 sw Y   y xY wr   r
   )r   ts     r   is_task_runningr      s1    	h'}- 
s	   +<A_episode_claimsepisode_keyholderc                 r    t         5  | t        v r
	 ddd       y|t        | <   	 ddd       y# 1 sw Y   yxY w)u   에피소드 하나에 배치 하나 — 잡았으면 True, 이미 남이 잡았으면 False.

    검사와 잡기를 **한 자물쇠 안에서** 한다. 나눠 놓으면 그 사이가 곧 틈이다.
    NFT)r   r   )r   r   s     r   claim_episode_runr   0   s2    
 
/) 
 (.$	 
s   
-
-6c                 f    t         5  t        j                  | d        d d d        y # 1 sw Y   y xY wr   )r   r   r   r   s    r   release_episode_runr    <   s    	K. 
r   c                 d    t         5  t        j                  |       cd d d        S # 1 sw Y   y xY wr   )r   r   r   r   s    r   episode_run_holderr"   A   s    	"";/ 
s   &/c                     ddl m} | j                  |      j                  |j                  dk(        j                  ddd      }| j                          |S )uH   시작 시 running 상태로 남은 PipelineProgress를 error로 복구.r   )PipelineProgressrunningerrorz!Server restarted during operation)statuserror_message)app.models.projectr$   queryfilterr'   updatecommit)
db_sessionr$   counts      r   recover_stale_progressr0   F   sU    3-.559,f2UVW 
 L    ) )__doc__logging	threadingtypingr   r   	getLogger__name__loggerr   strThread__annotations__Lockr   boolr   r   r   r   r   r    r"   intr0    r1   r   <module>rA      s    f   !			8	$-/tC)))* /	C )9)9 d *c *d *
.c .d .$ #%c3h $	3 	 	T 	/S /T /
0C 0HSM 0
# r1   