
    uj                          d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	Z	d dl
mZ  e            ZdZ G d d          ZdS )    N)Path)DictOptionalUnion)
get_loggerz.ms_upload_cachec            	           e Zd ZdZdeeef         fdZedede	de
defd            Zdede	de
dee         fd	Zdede	de
d
efdZd Zd ZdS )UploadHashCachear  Persistent local hash cache for upload_folder resume.

    Stores SHA256 hashes keyed by (relative_path, mtime, size) to skip
    re-hashing unchanged files on retry/resume. Thread-safe for concurrent
    put() calls from multiple upload threads.

    Cache is stored as JSON at {folder_path}/.ms_upload_cache, co-located
    with the upload source for portability.
    
cache_pathc                     t          |          | _        i | _        t          j                    | _        |                                  dS )z}Initialize cache.

        Args:
            cache_path: Path to the cache file (typically folder/.ms_upload_cache).
        N)r   _cache_path_cache	threadingLock_lock_load)selfr
   s     k/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/modelscope/hub/upload_cache.py__init__zUploadHashCache.__init__   s;      
++')^%%


    rel_pathmtimesizereturnc                     |  d| d| S )z*Build cache lookup key from file metadata.| )r   r   r   s      r   	_make_keyzUploadHashCache._make_key(   s      ++U++T+++r   c                     |                      |||          }| j        5  | j                            |          }ddd           n# 1 swxY w Y   |dS ||d         |d         dS )aF  Return cached hash info or None if not cached / stale.

        Args:
            rel_path: Relative path of the file within the upload folder.
            mtime: File modification time (os.stat st_mtime).
            size: File size in bytes.

        Returns:
            Dict with file_hash and file_size, or None.
        N	file_hash	file_size)file_path_or_objr   r    )r   r   r   get)r   r   r   r   keyentrys         r   r"   zUploadHashCache.get-   s     nnXud33Z 	) 	)KOOC((E	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)=4 !){+{+
 
 	
s   AA
A
	hash_infoc                     |                      |||          }|d         |d         d}| j        5  || j        |<   ddd           dS # 1 swxY w Y   dS )a  Store hash info for a file. Thread-safe.

        Args:
            rel_path: Relative path of the file.
            mtime: File modification time.
            size: File size in bytes.
            hash_info: Dict from compute_file_hash with file_hash and file_size.
        r   r    )r   r    N)r   r   r   )r   r   r   r   r%   r#   r$   s          r   putzUploadHashCache.putD   s     nnXud33";/";/
 
 Z 	% 	%$DK	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   AAAc                    	 | j         j                            dd           | j        5  t	          | j                  }ddd           n# 1 swxY w Y   t          j        t          | j         j                  d          \  }}	 t          j
        |dd          5 }t          j        ||           ddd           n# 1 swxY w Y   t          j        |t          | j                              n## t          $ r t          j        |            w xY wt                               d	t%          |           d
| j                     | j                                         s$t                               d| j                     dS dS # t*          $ r0}t                               d| j          d|            Y d}~dS d}~ww xY w)zPersist cache to disk via atomic write (temp file + rename).

        Safe against crashes -- either the old or new file is present,
        never a partial write.
        T)parentsexist_okNz.ms_upload_cache_tmp_)dirprefixwzutf-8)encodingzHash cache saved: z entries -> z&Hash cache file not found after save: zFailed to save hash cache to z: )r   parentmkdirr   dictr   tempfilemkstempstrosfdopenjsondumpreplaceBaseExceptionunlinkloggerinfolenexistswarning	Exception)r   datafdtmp_pathfes         r   savezUploadHashCache.saveU   s   	I#))$)FFF ) )DK(() ) ) ) ) ) ) ) ) ) ) ) ) ) )#+(/00.0 0 0LBYr3999 'QIdA&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '
8S)9%:%:;;;;    	(### KKNSYYNND<LNNP P P#**,, OT=MOO       	I 	I 	INNG0@GGAGGI I I I I I I I I	Isv   (F AF AF A3F C3 C 4C3  CC3 C*C3 2F 3 DA0F 
G%F<<Gc                    | j                                         sdS 	 t          | j         d          5 }t          j        |          | _        ddd           n# 1 swxY w Y   t                              dt          | j                   d| j                     dS # t          $ r/}t          
                    d|            i | _        Y d}~dS d}~ww xY w)z8Load cache from disk. Tolerates missing or corrupt file.NrzHash cache loaded: z entries from z+Failed to load hash cache, starting fresh: )r   r?   openr7   loadr   r<   r=   r>   rA   r@   )r   rE   rF   s      r   r   zUploadHashCache._loads   s&   &&(( 	F	d&,, +"ill+ + + + + + + + + + + + + + +KKXc$+&6&6XXdFVXX      	 	 	NNLLLMMMDKKKKKKK	s:   B AB AB A :B 
C&$CCN)__name__
__module____qualname____doc__r   r4   r   r   staticmethodfloatintr   r   r1   r"   r'   rG   r   r   r   r   r	   r	      s        	5d#3 	 	 	 	 ,C , ,S ,S , , , \,
C 
 
S 
Xd^ 
 
 
 
.%C % %S %T % % % %"I I I<    r   r	   )r5   r2   r   pathlibr   typingr   r   r   r7   modelscope.utils.loggerr   r<   UPLOAD_HASH_CACHE_FILEr	   r   r   r   <module>rW      s    
			            ( ( ( ( ( ( ( ( ( (  . . . . . .	+ m m m m m m m m m mr   