o
    )jb                     @   s<   d dl Z d dlmZmZ d dlmZ e ZG dd dZdS )    N)ListTuple)
get_loggerc                   @   s   e Zd ZdZdedefddZedefddZd	edefd
dZd	ede	fddZ
d	ededefddZd	efddZdedeee	 ee f fddZdedefddZdS )BatchTrackerzThread-safe tracker for pre-assigned upload batches.

    Files are assigned to batches by sorted index (file_index // batch_size).
    Upload threads record results; main thread waits for batches in order.
    total_files
batch_sizec                 C   s   || _ |dkr|d | d nd| _dd t| jD | _dd t| jD | _g | _t| jD ]}|| }t|| |}| j||  q0dd t| jD | _t	
 | _d S )Nr      c                 S      g | ]}g qS  r
   .0_r
   r
   _/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/hub/upload_pipeline.py
<listcomp>       z)BatchTracker.__init__.<locals>.<listcomp>c                 S   r	   r
   r
   r   r
   r
   r   r      r   c                 S   s   g | ]}t  qS r
   )	threadingEventr   r
   r
   r   r   !   s    )_batch_size_num_batchesrange_batch_results_batch_failures_batch_expectedminappend_batch_eventsr   Lock_lock)selfr   r   istartendr
   r
   r   __init__   s4   zBatchTracker.__init__returnc                 C   s   | j S N)r   )r   r
   r
   r   num_batches&   s   zBatchTracker.num_batches
file_indexc                 C   s
   || j  S r$   )r   )r   r&   r
   r
   r   batch_index*   s   
zBatchTracker.batch_indexresultc                 C   sn   |  |}| j% | j| | | |r%| j|   W d    d S W d    d S 1 s0w   Y  d S r$   )r'   r   r   r   _is_batch_completer   set)r   r&   r(   idxr
   r
   r   record_success-   s   

"zBatchTracker.record_successitemerrorc                 C   sr   |  |}| j' | j| ||f | |r'| j|   W d    d S W d    d S 1 s2w   Y  d S r$   )r'   r   r   r   r)   r   r*   )r   r&   r-   r.   r+   r
   r
   r   record_failure4   s   

"zBatchTracker.record_failurec                 C   sp   |  |}| j& | j|  d8  < | |r&| j|   W d   dS W d   dS 1 s1w   Y  dS )zMark a file as skipped (already committed).

        Decrements the batch's expected count so _is_batch_complete
        uses the correct target. When all files in a batch are skipped,
        the batch event is set automatically.
        r   N)r'   r   r   r)   r   r*   )r   r&   r+   r
   r
   r   mark_file_skipped;   s   

"zBatchTracker.mark_file_skipped	batch_idxc                 C   sT   | j |   | j t| j| t| j| fW  d   S 1 s#w   Y  dS )ax  Wait for a batch to complete.

        Blocks indefinitely until all files in the batch have reported
        success or failure. Per-blob timeouts (UPLOAD_BLOB_TIMEOUT)
        prevent individual uploads from hanging forever.

        Args:
            batch_idx: Index of the batch to wait for.

        Returns:
            Tuple of (successful_results, failures).
        N)r   waitr   listr   r   )r   r1   r
   r
   r   wait_for_batchH   s   $zBatchTracker.wait_for_batchc                 C   s*   t | j| t | j|  }|| j| kS )z Must be called under self._lock.)lenr   r   r   )r   r1   countr
   r
   r   r)   Z   s   zBatchTracker._is_batch_completeN)__name__
__module____qualname____doc__intr"   propertyr%   r'   dictr,   tuple	Exceptionr/   r0   r   r   r4   boolr)   r
   r
   r
   r   r      s    "r   )r   typingr   r   Zmodelscope.utils.loggerr   loggerr   r
   r
   r
   r   <module>   s
   