o
    ({jk	  ã                   @  s˜   d Z ddlmZ ddlZddlZddlZddlZe e¡Z	e
dee dd¡ƒƒZe dd¡Zd	Ze
d	ee d
d¡ƒƒZG dd„ deƒZG dd„ dƒZdS )z=Cross-process slot limiter for long-running Sarvam STT calls.é    )ÚannotationsNé   ÚSTT_SARVAM_MAX_CONCURRENTÚ2ÚSTT_SARVAM_LOCK_DIRz/tmp/sarvam_stt_slotsé<   ÚSTT_SARVAM_SLOT_WAIT_SECONDSÚ900c                   @  s   e Zd ZdZdS )ÚSarvamSlotTimeoutErrorzDRaised when waiting for a Sarvam concurrency slot exceeds the limit.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úF/home/aiteam/pcaa-dev/call-proccessing/stt_pipeline/stt/concurrency.pyr
      s    r
   c                   @  s.   e Zd ZdZddd„Zddd	„Zddd„ZdS )ÚSarvamConcurrencySlotzEAcquire one of N global Sarvam slots (shared across all STT workers).ÚcallidÚstrc                 C  s   || _ d | _d | _d S )N)r   Ú_fdÚ_slot)Úselfr   r   r   r   Ú__init__   s   
zSarvamConcurrencySlot.__init__Úreturnú'SarvamConcurrencySlot'c              	   C  s"  t jtdd d}t ¡ }| jd u rt ¡ | tkr&td| j› dt› dƒ‚tt	ƒD ]F}t j
 td|› d¡}t  |t jt jB ¡}zt |tjtjB ¡ W n ty[   t  |¡ Y q*w || _|| _t d	| j|d
 t	¡ |   S t ¡ }|| tkr…t d| jt	¡ |}t d¡ | jd u s| S )NT)Úexist_okg        ú[z] Timed out after zs waiting for Sarvam slotÚslot_z.lockz[%s] Acquired Sarvam slot %s/%sr   u-   [%s] Waiting for Sarvam slot (all %s busy)â€¦é   )ÚosÚmakedirsÚ	_LOCK_DIRÚtimer   Ú_MAX_SLOT_WAIT_Sr
   r   ÚrangeÚ
_MAX_SLOTSÚpathÚjoinÚopenÚO_CREATÚO_RDWRÚfcntlÚflockÚLOCK_EXÚLOCK_NBÚBlockingIOErrorÚcloser   ÚloggerÚinfoÚ_WAIT_LOG_INTERVAL_SÚsleep)r   Úlast_logÚwait_startedÚslotr%   ÚfdÚnowr   r   r   Ú	__enter__   s@   
ÿ
þý

çzSarvamConcurrencySlot.__enter__ÚNonec                 C  sN   | j d ur%t | j tj¡ t | j ¡ t d| j| j	pdd ¡ d | _ d S d S )Nz[%s] Released Sarvam slot %sr   r   )
r   r*   r+   ÚLOCK_UNr   r/   r0   r1   r   r   )r   Úexc_typeÚexcÚtbr   r   r   Ú__exit__=   s   

üzSarvamConcurrencySlot.__exit__N)r   r   )r   r   )r   r:   )r   r   r   r   r   r9   r?   r   r   r   r   r      s
    

 r   )r   Ú
__future__r   r*   Úloggingr   r!   Ú	getLoggerr   r0   ÚmaxÚintÚgetenvr$   r    r2   r"   ÚTimeoutErrorr
   r   r   r   r   r   Ú<module>   s    
