o
    -wi'                     @   s  d dl Z d dlZd dlZd dl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mZmZmZmZ d dlmZ d dlZd dlZd dlmZ eeZejjZejZejZG dd dej j!Z"G dd de#Z$ed	Z%G d
d dee% Z&ededZ'de
de
dee'ge'f fddZ(G dd de j)Z*G dd de*Z+G dd de*Z,ddde*dedee% f de
deee#gdf  de
de%fdd Z-dS )!    N)Any	AwaitableCallableGenericOptionalTupleTypeTypeVar)	HTTPError)CheckRetryFnTypec                   @   s   e Zd ZdZdS )RetryCancelledErrorz/A retry did not occur because it was cancelled.N)__name__
__module____qualname____doc__ r   r   P/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/lib/retry.pyr      s    r   c                       s:   e Zd ZdZ	ddee dee ddf fddZ  ZS )	TransientErrorzException type designated for errors that may only be temporary.

    Can have its own message and/or wrap another exception.
    Nmsgexcreturnc                    s   t  | || _|| _d S N)super__init__message	exception)selfr   r   	__class__r   r   r   &   s   
zTransientError.__init__NN)	r   r   r   r   r   strBaseExceptionr   __classcell__r   r   r   r   r       s    r   _Rc                   @   s   e Zd ZdZdZddddd dddfdedef d	eej	 d
ee
j dee dedeeee df  dedeeeegef  ddfddZdedee
j defddZedefddZdededefddZdS )RetryzCreate a retryable version of a function.

    Calling this will call the passed function, retrying if any exceptions in
    retryable_exceptions are caught, with exponential backoff.
    i,  Nc                 C   s   dS )NTr   )er   r   r   <lambda>@   s    zRetry.<lambda>zNetwork errorcall_fn.retry_timedeltaretry_cancel_eventnum_retriescheck_retry_fnretryable_exceptionserror_prefixretry_callbackr   c	           	      C   sd   || _ || _|| _tj tjdd | _|| _|| _|| _	|d ur&|| _
ntf| _
d| _|| _d S )N   minutesr   )_call_fn_check_retry_fn_error_prefixdatetimenow	timedelta_last_print_retry_timedelta_retry_cancel_event_num_retries_retryable_exceptionsr   _indexr.   )	r   r'   r(   r)   r*   r+   r,   r-   r.   r   r   r   r   :   s   
zRetry.__init__wait_secondscancel_eventc                 C   s   |st | dS ||}|S )NF)SLEEP_FNwait)r   r>   r?   	cancelledr   r   r   _sleep_check_cancelledS   s
   
zRetry._sleep_check_cancelledc                 C   s   | j S )z7The number of iterations the previous __call__ retried.)	_num_iter)r   r   r   r   	num_iters\   s   zRetry.num_itersargskwargsc              
   O   s,  | d| j}|du rtjdd}| d| j}| d| j}|du r%d}tjdr-d	}| d
d}| d| j	}|}t
 }	|	}
d}d	| _	 z2| j|i |}| jdkrw|	| j tjddkrwt
 | _| jrw| d| j dt
 |
  d |W S  | jy } zb||}|s | j|kr t
 }	t|tjr|s|	}|	| |kr |	|
 |kr | jdkrtjd|d t|tr|jdur| jdur| |jj|jj nt| j d|jj d W Y d}~nd}~ww | j|t d |  |d}|rtd|d9 }|| jkr| j}t
 }	|  jd7  _qG)a  Call the wrapped function, with retries.

        Args:
           retry_timedelta (kwarg): amount of time to retry before giving up.
           sleep_base (kwarg): amount of time to sleep upon first failure, all other sleeps
               are derived from this one.
        r(   Nim  )daysr)   r*   i@B 
WANDB_TESTr   retry_sleep_baser/   r+   T   r0      z resolved after z, resuming normal operation.zRetry attempt failed:)exc_infoz (z), entering retry loop.g      ?)r?   zretry timeout) popr9   r5   r7   r:   r;   osenvirongetr3   NOW_FNrD   r2   r8   r.   r4   r<   
isinstanceloggerinfor
   responsestatus_codetextwandbtermlogr   r   rC   randomr   MAX_SLEEP_SECONDS)r   rF   rG   r(   r)   r*   
sleep_baser+   sleepr6   
start_timestart_time_triggeredresultr%   retry_timedelta_triggeredrB   r   r   r   __call__a   s   



+zRetry.__call__)r   r   r   r   r\   r   r#   r   r5   r7   	threadingEventintr   r   r   	Exceptionr    r   r   floatboolrC   propertyrE   rc   r   r   r   r   r$   1   sN    
	


	r$   _F)boundrF   kargsr   c                     s   dt dt f fdd}|S )Nfnr   c                    s>   t | gR i  t| dtdtdtf fdd}|S )NrF   rm   r   c                     s    | i |S r   r   rF   rm   retrierr   r   
wrapped_fn   s   z0retriable.<locals>.decorator.<locals>.wrapped_fn)r$   	functoolswrapsr   )rn   rr   ro   rp   r   	decorator   s   zretriable.<locals>.decorator)rk   )rF   rm   ru   r   ro   r   	retriable   s   	rv   c                   @   s*   e Zd ZdZejdedejfddZ	dS )BackoffzTA backoff strategy: decides whether to sleep or give up when an exception is raised.r   r   c                 C   s   t r   )NotImplementedErrorr   r   r   r   r   next_sleep_or_reraise   s   zBackoff.next_sleep_or_reraiseN)
r   r   r   r   abcabstractmethodrg   r5   r7   rz   r   r   r   r   rw      s    rw   c                   @   sV   e Zd ZdZ		ddejdejdee deej ddf
dd	Zd
e	dejfddZ
dS )ExponentialBackoffzSJittered exponential backoff: sleep times increase ~exponentially up to some limit.Ninitial_sleep	max_sleepmax_retries
timeout_atr   c                 C   s"   t ||| _|| _|| _|| _d S r   )min_next_sleep
_max_sleep_remaining_retries_timeout_at)r   r~   r   r   r   r   r   r   r      s   
zExponentialBackoff.__init__r   c                 C   sh   | j d ur| j dkr||  j d8  _ | jd ur t | jkr || jt| j| jdt   }| _|S )Nr   r/   )r   r   rR   r   r   r   r[   )r   r   ra   r   r   r   rz      s   

z(ExponentialBackoff.next_sleep_or_reraiser   )r   r   r   r   r5   r7   r   rf   r   rg   rz   r   r   r   r   r}      s     
r}   c                   @   sD   e Zd ZdZdeegef deddfddZdede	j
fd	d
ZdS )FilteredBackoffzRRe-raise any exceptions that fail a predicate; delegate others to another Backoff.filterwrappedr   Nc                 C   s   || _ || _d S r   )_filter_wrapped)r   r   r   r   r   r   r     s   
zFilteredBackoff.__init__r   c                 C   s   |  |s|| j|S r   )r   r   rz   ry   r   r   r   rz   	  s   
z%FilteredBackoff.next_sleep_or_reraise)r   r   r   r   r   rg   ri   rw   r   r5   r7   rz   r   r   r   r   r     s     r   )on_excbackoffrn   .r   rG   c             
      sj   	 z||i |I dH W S  t y3 } z|dur|| t| | I dH  W Y d}~nd}~ww q)zCall `fn` repeatedly until either it succeeds, or `backoff` decides we should give up.

    Each time `fn` fails, `on_exc` is called with the exception.
    TN)rg   SLEEP_ASYNC_FNrz   total_seconds)r   rn   r   rF   rG   r%   r   r   r   retry_async  s   $r   ).r{   asyncior5   rs   loggingrO   r[   rd   timetypingr   r   r   r   r   r   r   r	   requestsr
   rY   wandb.errors
wandb.utilr   	getLoggerr   rT   r6   rR   r^   r@   r   errorsErrorr   rg   r   r#   r$   rk   rv   ABCrw   r}   r   r   r   r   r   r   <module>   sT    (
   