
    ujb                     X    d dl Z d dlmZmZ d dlmZ  e            Z G d d          ZdS )    N)ListTuple)
get_loggerc                       e Zd ZdZdedefdZedefd            ZdedefdZded	e	fd
Z
dededefdZdefdZdedeee	         ee         f         fdZdedef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                    || _         |dk    r|dz
  |z  dz   nd| _        d t          | j                  D             | _        d t          | j                  D             | _        g | _        t          | j                  D ]7}||z  }t          ||z   |          }| j                            ||z
             8d t          | j                  D             | _        t          j
                    | _        d S )Nr      c                     g | ]}g S  r   .0_s     n/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/modelscope/hub/upload_pipeline.py
<listcomp>z)BatchTracker.__init__.<locals>.<listcomp>   s%     1
 1
 1
B1
 1
 1
    c                     g | ]}g S r   r   r   s     r   r   z)BatchTracker.__init__.<locals>.<listcomp>   s%     3
 3
 3
B3
 3
 3
r   c                 4    g | ]}t          j                    S r   )	threadingEventr   s     r   r   z)BatchTracker.__init__.<locals>.<listcomp>!   s-     5
 5
 5
"#IO5
 5
 5
r   )_batch_size_num_batchesrange_batch_results_batch_failures_batch_expectedminappend_batch_eventsr   Lock_lock)selfr   r	   istartends         r   __init__zBatchTracker.__init__   s8   %7BQ ) !%/0234 4LM 	1
 1
d/001
 1
 1
3
 3
d/003
 3
 3
 +-t()) 	5 	5A
NEej(+66C ''e44445
 5
',T->'?'?5
 5
 5
 ^%%


r   returnc                     | j         S N)r   )r#   s    r   num_batcheszBatchTracker.num_batches&   s      r   
file_indexc                     || j         z  S r*   )r   )r#   r,   s     r   batch_indexzBatchTracker.batch_index*   s    T---r   resultc                    |                      |          }| j        5  | j        |                             |           |                     |          r| j        |                                          d d d            d S # 1 swxY w Y   d S r*   )r.   r"   r   r   _is_batch_completer    set)r#   r,   r/   idxs       r   record_successzBatchTracker.record_success-   s    z**Z 	. 	.$++F333&&s++ ."3'++---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   AA??BBitemerrorc                    |                      |          }| j        5  | j        |                             ||f           |                     |          r| j        |                                          d d d            d S # 1 swxY w Y   d S r*   )r.   r"   r   r   r1   r    r2   )r#   r,   r5   r6   r3   s        r   record_failurezBatchTracker.record_failure4   s    z**Z 	. 	. %,,dE];;;&&s++ ."3'++---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   ABBBc                    |                      |          }| j        5  | j        |xx         dz  cc<   |                     |          r| j        |                                          ddd           dS # 1 swxY w 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   r1   r    r2   )r#   r,   r3   s      r   mark_file_skippedzBatchTracker.mark_file_skipped;   s     z**Z 	. 	. %%%*%%%&&s++ ."3'++---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   A
A44A8;A8	batch_idxc                     | j         |                                          | j        5  t          | j        |                   t          | j        |                   fcddd           S # 1 swxY 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#   r;   s     r   wait_for_batchzBatchTracker.wait_for_batchH   s     	9%**,,,Z 	1 	1+I677$Y/:1 :1 1	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   4A((A,/A,c                     t          | j        |                   t          | j        |                   z   }|| j        |         k    S )z Must be called under self._lock.)lenr   r   r   )r#   r;   counts      r   r1   zBatchTracker._is_batch_completeZ   sF    D'	233c +7- 7- -,Y777r   N)__name__
__module____qualname____doc__intr'   propertyr+   r.   dictr4   tuple	Exceptionr8   r:   r   r   r?   boolr1   r   r   r   r   r      sE        &C &S & & & &( !S ! ! ! X!.c .c . . . .. .d . . . .. .E .) . . . ..C . . . .1 1d4j$u+6M0N 1 1 1 1$8C 8D 8 8 8 8 8 8r   r   )r   typingr   r   modelscope.utils.loggerr   loggerr   r   r   r   <module>rP      s                . . . . . .	S8 S8 S8 S8 S8 S8 S8 S8 S8 S8r   