
    tnix                     r   d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZ ddlmZ  e            Z ej                    Zej                            d e ej                                        Zej                            dd          du Z G d	 d
          Z G d de
e                   ZdS )z]
Handles getting stuff from environment variables and updating the global state like job id.
    N)AnyDictOptionalSet)FileLock   )RunPodLoggerRUNPOD_POD_IDRUNPOD_WEBHOOK_GET_JOBc            	           e Zd ZdZ	 	 ddedeeeef                  dee         ddfdZde	de
fd	Zdefd
ZdefdZdS )Jobz
    Represents a job object.

    Args:
        job_id: The id of the job, a unique string.
        job_input: The input to the job.
        webhook: The webhook to send the job output to.
    Nidinputwebhookreturnc                     || _         || _        || _        |                                D ]\  }}t	          | ||           d S N)r   r   r   itemssetattr)selfr   r   r   kwargskeyvalues          c/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/runpod/serverless/modules/worker_state.py__init__zJob.__init__'   sS     
 ,,.. 	& 	&JCD#u%%%%	& 	&    otherc                 P    t          |t                    r| j        |j        k    S dS )NF)
isinstancer   r   )r   r   s     r   __eq__z
Job.__eq__5   s(    eS!! 	'7eh&&ur   c                 *    t          | j                  S r   )hashr   r   s    r   __hash__zJob.__hash__:   s    DG}}r   c                     | j         S r   r   r#   s    r   __str__zJob.__str__=   s	    wr   )NN)__name__
__module____qualname____doc__strr   r   r   r   objectboolr    intr$   r'    r   r   r   r      s          +/!%	& && S#X'& #	& 
& & & &F t    
#          r   r   c                       e Zd ZdZdZ ej                    Zej        	                    ed          Z
d Zd ZdefdZ fdZd	 Zd fd
Zdef fdZdef fdZdedee         fdZdee         fdZdefdZ xZS )JobsProgresszBTrack the state of current jobs in progress with persistent state.Nz.runpod_jobs.pklc                 4   t           j        t          j        | j        d           t
                              |           t           _        t
                              t           j                   t           j                                         t           j        S )NT)exist_ok)	r2   	_instanceosmakedirs
_STATE_DIRset__new__r   _load_state)clss    r   r:   zJobsProgress.__new__K   si    !)K6666%([[%5%5L"LL/000"..000%%r   c                     d S r   r0   r#   s    r   r   zJobsProgress.__init__T   s	     	r   r   c                 J    d| j         j         d|                                  S )N<z>: )	__class__r(   get_job_listr#   s    r   __repr__zJobsProgress.__repr__Y   s)    D4>*DDt/@/@/B/BDDDr   c                    	 t           j                            | j                  rt           j                            | j                  dk    rt          | j        dz             5  t          | j        d          5 }	 t          j        |          }t                      
                                 |D ]}t                              | |           n6# t          t          j        f$ r t                              d           Y nw xY wddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS dS dS # t"          $ r t                              d           Y dS w xY w)z3Load jobs state from pickle file with file locking.r   .lockrbzBJobsProgress: Failed to load state file, starting with empty stateNz<JobsProgress: No state file found, starting with empty state)r6   pathexists_STATE_FILEgetsizer   openpickleloadsuperclearr9   addEOFErrorUnpicklingErrorlogdebugFileNotFoundError)r   floaded_jobsjobr@   s       r   r;   zJobsProgress._load_state\   s   	t/00!GOOD$45599d.899 ! !d.55 !!*0+a..K!GGMMOOO'2 " " #$(#!" !" !" !""
 !)&*@A ! ! !II d   !D!! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !	! !99( ! 	 	 	IITUUUDD	s   A$D? 'D.=D?ACD0DDDD
D.D	D.D	D.!D? .D22D? 5D26D? ?$E'&E'c                    	 t          | j        dz             5  t          j        | j        dd          5 }t          j        t          |           |           ddd           n# 1 swxY w Y   t          j	        |j
        | j                   ddd           dS # 1 swxY w Y   dS # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)zBSave jobs state to pickle file with atomic write and file locking.rD   Fwb)dirdeletemodeNzFailed to save job state: )r   rH   tempfileNamedTemporaryFiler8   rK   dumpr9   r6   replacename	ExceptionrR   error)r   temp_fes      r   _save_statezJobsProgress._save_statey   st   	8$*W455 : :0D   3KD		62223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 
6;(8999: : : : : : : : : : : : : : : : : :  	8 	8 	8II6166777777777	8s]   B) B#A%B%A)	)B,A)	-"BB) B  B) #B $B) )
C3CCc                 p    t                                                       |                                  d S r   )rM   rN   rf   )r   r@   s    r   rN   zJobsProgress.clear   s,    r   elementc                 F   t          |t                    rt          |          }t          |t                    rt          di |}t          |t                    st	          d          t                                          |          }|                                  |S )z
        Adds a Job object to the set.

        If the added element is a string, then `Job(id=element)` is added
        
        If the added element is a dict, that `Job(**element)` is added
        r&   z.Only Job objects can be added to JobsProgress.r0   )r   r,   r   dict	TypeErrorrM   rO   rf   r   rh   resultr@   s      r   rO   zJobsProgress.add   s     gs## 	&WoooGgt$$ 	%nnGnnG'3'' 	NLMMMW%%r   c                 F   t          |t                    rt          |          }t          |t                    rt          di |}t          |t                    st	          d          t                                          |          }|                                  |S )z
        Removes a Job object from the set.

        If the element is a string, then `Job(id=element)` is removed
        
        If the element is a dict, then `Job(**element)` is removed
        r&   z2Only Job objects can be removed from JobsProgress.r0   )r   r,   r   rj   rk   rM   discardrf   rl   s      r   removezJobsProgress.remove   s     gs## 	&WoooGgt$$ 	%nnGnnG'3'' 	RPQQQ))r   c                     t          |t                    rt          |          }t          |t                    st          d          | D ]}||k    r|c S d S )Nr&   z4Only Job objects can be retrieved from JobsProgress.)r   r,   r   rk   )r   rh   rW   s      r   getzJobsProgress.get   sn    gs## 	&WoooG'3'' 	TRSSS 	 	Cg~~


 tr   c                     |                                   t          |           sdS d                    d | D                       S )zH
        Returns the list of job IDs as comma-separated string.
        N,c              3   4   K   | ]}t          |          V  d S r   )r,   ).0rW   s     r   	<genexpr>z,JobsProgress.get_job_list.<locals>.<genexpr>   s(      11SC111111r   )r;   lenjoinr#   s    r   rA   zJobsProgress.get_job_list   sJ     	4yy 	4xx11D111111r   c                      t          |           S )z-
        Returns the number of jobs.
        )rx   r#   s    r   get_job_countzJobsProgress.get_job_count   s     4yyr   )r   N)r(   r)   r*   r+   r5   r6   getcwdr8   rF   ry   rH   r:   r   r,   rB   r;   rf   rN   r   rO   rp   r   r   rr   rA   r/   r{   __classcell__)r@   s   @r   r2   r2   D   s{       LLIJ',,z+=>>K& & &  
E# E E E E    :8 8 8     3      *c      *
3 
8C= 
 
 
 
	2hsm 	2 	2 	2 	2s        r   r2   )r+   r6   timeuuidrK   r]   typingr   r   r   r   filelockr   	rp_loggerr	   rR   perf_counterREF_COUNT_ZEROenvironrr   r,   uuid4	WORKER_IDIS_LOCAL_TESTr   r2   r0   r   r   <module>r      sR    
			     + + + + + + + + + + + +       # # # # # # lnn""$$JNN?CC

,=,=>>	 
7>>$F! ! ! ! ! ! ! !NM M M M M3s8 M M M M Mr   