ó
    Ú°›jÖU  ã                   óÖ   • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  \" 5       rSrSrSrSrS	rS
rSr " S S5      rS r/ rS rS rS r\R4                  " \5        g)a°  Directory-mirror warm cache between local directories and a network volume.

``VolumeCache`` keeps a browsable mirror of one or more local directories on a
mounted network volume, and reconciles the two directions on demand:

- ``hydrate()``: copy files that are missing or newer on the volume mirror
  into the container (used on cold start, before the cache is populated).
- ``sync()``: copy files that are missing or newer in the container onto the
  volume mirror (used after the cache has been populated/updated).

Transport adapts to the tree's shape: files below 256 KiB are packed into a
single ``small.tar`` on the volume (collapsing per-file metadata round-trips),
larger files are copied unpacked into ``big/`` across a thread pool, and a
versioned ``manifest.json`` (written last) records the layout. Large-file
transfers stay incremental (size/mtime diff); the small-file archive is
re-packed whole when any small file changes. Packing uses the ``tar`` binary
when present (else stdlib ``tarfile``); extraction always uses ``tarfile``,
validating every member against the configured dirs. Best-effort: any failure
degrades to a cold worker and never raises unless ``best_effort=False``.
é    N)ÚThreadPoolExecutor)ÚRunPodLoggerg       @g      >@i   é   zmanifest.jsonz	small.tarÚbigc                   óœ  • \ rS rSrSr\R                  S-   \R                  -   \R                  S-   \R                  -   4rSSSSS.S	 jr\	S
 5       r
\	S 5       r\	S 5       r\	S 5       r\	S 5       rS rS rS rS rS rS rS r\S 5       rS rS rS r\S 5       rS rS rS rS r\S 5       r S  r!S! r"SS".S# jr#S$ r$S% r%S& r&S'r'g)(ÚVolumeCacheé,   a  Warm-cache local directories across serverless workers via a network volume.

Maintains a mirror of ``dirs`` at ``{volume_path}/.cache/{namespace}``.
``hydrate()`` reconciles volume -> container; ``sync()`` reconciles
container -> volume. Used as a context manager, the object is itself the
"warm cache" closure: hydrate on enter, sync (in the background by
default) on exit.

Requires a network volume mounted at ``volume_path`` (default
``/runpod-volume``) and a non-empty ``namespace`` (default
``RUNPOD_ENDPOINT_ID``); otherwise ``available`` is False and all
operations are no-ops.

Args:
    dirs: Local directories to cache (e.g. a model cache like ``HF_HOME``).
    namespace: Isolation key for the on-volume mirror. Must be a single
        safe path component. Defaults to ``RUNPOD_ENDPOINT_ID``.
    volume_path: Network-volume mount point. Defaults to ``/runpod-volume``.
    best_effort: When True (default), swallow and log errors instead of
        raising.
    max_workers: Thread count for parallel copy of large files. Defaults
        to ``min(32, (os.cpu_count() or 4) * 4)`` (I/O-bound, so
        oversubscribing the CPU count is fine).

Example:
    >>> with VolumeCache(dirs=["/root/.cache/huggingface"]):
    ...     model = load_model()  # downloads land in the cached dir
Úrefsz	.no_existNz/runpod-volumeT)Ú	namespaceÚvolume_pathÚbest_effortÚmax_workersc          
      óæ  • [        U[        [        [        R                  45      (       a  U/nU Vs/ s HJ  n[        R
                  R                  [        R                  " [        R                  " U5      5      5      PML     snU l	        U=(       d(    [        R                  R                  S5      =(       d    SU l        U R                  (       a•  [        R
                  R                  U R                  5      (       dN  [        R                  U R                  ;   d0  SU R                  ;   d   SU R                  ;   d  U R                  S;   a  [        SU R                  < 35      e[        R                  " [        R                  " U5      5      U l        X@l        Ub  US:  a  [        SU< 35      eU=(       d+    [%        S	[        R&                  " 5       =(       d    S
S
-  5      U l        g s  snf )NÚRUNPOD_ENDPOINT_IDÚ Ú/Ú\)Ú.z..z4namespace must be a single safe path component, got r   z,max_workers must be a positive integer, got é    é   )Ú
isinstanceÚstrÚbytesÚosÚPathLikeÚpathÚrealpathÚfsdecodeÚfspathÚ_dirsÚenvironÚgetÚ
_namespaceÚisabsÚsepÚ
ValueErrorÚ_volume_pathÚ_best_effortÚminÚ	cpu_countÚ_max_workers)ÚselfÚdirsr   r   r   r   Úds          Úd/home/mande/repo/quber/.venv/lib/python3.13/site-packages/runpod/serverless/utils/rp_volume_cache.pyÚ__init__ÚVolumeCache.__init__L   sY  € ô �dœS¤%¬¯©Ð5×6Ñ6ð �6ˆDñ LPÓPÊ4Àa”b—g‘g×&Ñ&¤r§{¢{´2·9²9¸Q³<Ó'@ÖAÉ4ÑPˆŒ
Ø#×Q¤r§z¡z§~¡~Ð6JÓ'K×QÈrˆŒØ�?�?Ü�G‰G�M‰M˜$Ÿ/™/×*Ñ*Ü�v‰v˜Ÿ™Ó(Ø�d—o‘oÓ%Ø�t—‘Ó&Ø�‰ +Ó-äØFÀtÇÁÑFYÐZóð ô ŸKšK¬¯	ª	°+Ó(>Ó?ˆÔØ'Ôð Ñ" {°Q£ÜÐKÈKÉ?Ð[Ó\Ð\Ø'×M¬3¨r´B·L²L³N×4GÀaÈ1Ñ3LÓ+MˆÕùò/ Qs   ²AG.c                 ól   • [         R                  R                  U R                  SU R                  5      $ )Nz.cache)r   r   Újoinr'   r#   ©r,   s    r/   Ú_mirror_rootÚVolumeCache._mirror_rooto   s#   € ä�w‰w�|‰|˜D×-Ñ-¨x¸¿¹ÓIÐIó    c                 ó^   • [         R                  R                  U R                  [        5      $ ©N)r   r   r3   r5   Ú_MANIFEST_NAMEr4   s    r/   Ú_manifest_pathÚVolumeCache._manifest_paths   s   € ä�w‰w�|‰|˜D×-Ñ-¬~Ó>Ð>r7   c                 ó^   • [         R                  R                  U R                  [        5      $ r9   )r   r   r3   r5   Ú_SMALL_ARCHIVE_NAMEr4   s    r/   Ú_small_archive_pathÚVolumeCache._small_archive_pathw   s   € ä�w‰w�|‰|˜D×-Ñ-Ô/BÓCÐCr7   c                 ó^   • [         R                  R                  U R                  [        5      $ r9   )r   r   r3   r5   Ú_BIG_SUBDIRr4   s    r/   Ú	_big_rootÚVolumeCache._big_root{   s   € ä�w‰w�|‰|˜D×-Ñ-¬{Ó;Ð;r7   c                 óŒ   • [        U R                  5      =(       a)    [        R                  R	                  U R
                  5      $ )zATrue iff volume_path is a mounted dir AND namespace is non-empty.)Úboolr#   r   r   Úisdirr'   r4   s    r/   Ú	availableÚVolumeCache.available   s+   € ô �D—O‘OÓ$×I¬¯©¯©°t×7HÑ7HÓ)IÐIr7   c              #   óÀ  ^#   • [         R                  " U5       H®  u  p#nU H¢  n[         R                  R                  X%5      mUR	                  S5      (       d  UR	                  S5      (       a  MP  [        U4S jU R                   5       5      (       a  Mv   [         R                  R                  T5      (       a  M�   Tv •  M¤     M°     g ! [         a     M¸  f = f7f)Nz.lockú	.rpvc.tmpc              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr9   © )Ú.0Úsubr   s     €r/   Ú	<genexpr>Ú*VolumeCache._iter_files.<locals>.<genexpr>Ž   s   øé € ÐGÒ.F s˜d–{Ò.Fùs   ƒ)	r   Úwalkr   r3   ÚendswithÚanyÚ_EXCLUDE_SUBSTRINGSÚislinkÚOSError)r,   ÚrootÚdirpathr    ÚfilesÚnamer   s         @r/   Ú_iter_filesÚVolumeCache._iter_filesˆ   s­   øé € Ü%'§W¢W¨T¦]Ñ!ˆG˜EÛ�Ü—w‘w—|‘| GÓ2�Ø—=‘= ×)Ñ)¨T¯]©]¸;×-GÑ-GÙÜÔG¨d×.FÒ.FÓG×GÑGÙðÜ—w‘w—~‘~ d×+Ñ+Ù ð ,ð ”
ó ò &3øô ó Úðüs*   ƒBCÂ$CÂ=CÃ
CÃCÃCÃCc                 ó¾   • / / p2U HA  n [         R                  " U5      R                  nU[        :  a  UOUR                  U5        MC     X#4$ ! [         a     MU  f = fr9   )r   ÚstatÚst_sizerW   Ú_SMALL_FILE_THRESHOLDÚappend)r,   ÚpathsÚsmallr   ÚpÚsizes         r/   Ú
_partitionÚVolumeCache._partition—   sc   € Ø˜ˆsÛˆAðÜ—w’w˜q“z×)Ñ)�ð Ô2Ó2‰U¸×CÑCÀAÖFñ ð ˆzÐøô ó Úðús   Š AÁ
AÁAc                 ó‚   •  [         R                  " U5      nXR                  UR                  S.$ ! [         a     g f = f)N©r   rf   Úmtime)r   r_   rW   r`   Úst_mtime)r,   r   Ústs      r/   Ú
_file_metaÚVolumeCache._file_meta¡   s=   € ð	Ü—’˜“ˆBð §j¡j¸2¿;¹;ÑGÐGøô ó 	Ùð	ús   ‚1 ±
>½>c                 óŽ  • [         R                  " U R                  SS9  [        [        UUS.nU R
                   S[         R                  " 5        S[        R                  " 5        S3n[        US5       n[        R                  " X55        S S S 5        [         R                  " X@R
                  5        g ! , (       d  f       N/= f)NT©Úexist_ok)ÚversionÚ	thresholdrd   r   r   rK   Úw)r   Úmakedirsr5   Ú_FORMAT_VERSIONra   r;   ÚgetpidÚ	threadingÚ	get_identÚopenÚjsonÚdumpÚreplace)r,   Ú
small_metaÚbig_metaÚpayloadÚtmpÚfhs         r/   Ú_write_manifestÚVolumeCache._write_manifest¨   s�   € Ü
�Š�D×%Ñ%°Ò5ä&Ü.ØØñ	
ˆð ×$Ñ$Ð% Q¤r§y¢y£{ m°1´Y×5HÒ5HÓ5JÐ4KÈ9ÐUˆÜ�#�sŒ^˜rÜ�IŠI�gÔ"÷ ä
�
Š
�3×+Ñ+Õ,÷ �^ús   Á6B6Â6
Cc                 ó  •  [        U R                  5       n[        R                  " U5      nS S S 5        [        W[        5      (       a  UR                  S5      [        :w  a  g U$ ! , (       d  f       N?= f! [        [
        4 a     g f = f)Nrs   )
r{   r;   r|   ÚloadrW   r&   r   Údictr"   rw   )r,   rƒ   Úobjs      r/   Ú_read_manifestÚVolumeCache._read_manifestµ   sq   € ð	Ü�d×)Ñ)Ô*¨bÜ—i’i “m�÷ +ô ˜#œt×$Ñ$¨¯©°	Ó(:¼oÓ(Mð Øˆ
÷ +Õ*ûäœÐ$ó 	Ùð	ús-   ‚A8 —A'®A8 Á'
A5Á1A8 Á5A8 Á8BÂ
Bc                 óº   •  [         R                  " US   5      nUR                  US   :H  =(       a    UR                  US   [
        -
  :¬  $ ! [         a     gf = f)Nr   Frf   rk   ©r   r_   rW   r`   rl   Ú_MTIME_TOLERANCE)r,   Úmetarm   s      r/   Ú_meta_satisfied_by_localÚ$VolumeCache._meta_satisfied_by_localÂ   sZ   € ð	Ü—’˜˜f™Ó&ˆBð �z‰z˜T &™\Ñ)×]¨b¯k©k¸TÀ'¹]ÔM]Ñ=]Ñ.]Ð]øô ó 	Ùð	ús   ‚A Á
AÁAc                 ó  • U(       a  UR                  U/ 5      O/  Vs0 s H  oDS   U_M
     nn/ nU HL  nUR                  US   5      nUb!  US   US   :w  d  US   US   [        -   :”  d  M;  UR                  U5        MN     U$ s  snf )Nr   rf   rk   )r"   rŽ   rb   )	r,   ÚmetasÚmanifestÚkeyÚeÚpriorÚchangedÚmre   s	            r/   Ú_changed_vs_manifestÚ VolumeCache._changed_vs_manifestÉ   s“   € ÞAI¨¯©°S¸"Ô(=ÈrÐ(QÓSÒ(Q !�6‘˜A’Ñ(QˆÐSØˆÛˆAØ—	‘	˜!˜F™)Ó$ˆAØ‰y˜A˜f™I¨¨6©Ó2°a¸±jÀ1ÀWÁ:ÔP`ÑC`Õ6`Ø—‘˜qÖ!ñ ð ˆùò Ts   žBc                 ó  •  [         R                  " U 5      n [         R                  " U5      nUR                  UR                  :g  =(       d     UR                  UR                  [
        -   :„  $ ! [         a     gf = f! [         a     gf = f)NFTr�   )Úsrc_pathÚdst_pathÚsr.   s       r/   Ú_needs_copyÚVolumeCache._needs_copyÒ   s|   € ð	Ü—’˜Ó!ˆAð	Ü—’˜Ó!ˆAð �y‰y˜AŸI™IÑ%×S¨¯©°a·j±jÔCSÑ6SÑ)SÐSøô ó 	Ùð	ûô ó 	Ùð	ús"   ‚A/ ™A? Á/
A<Á;A<Á?
BÂBc                 ó€   ^• [         R                  R                  U5      m[        U4S jU R                   5       5      $ )Nc              3   ó€   >#   • U  H3  nTU:H  =(       d"    TR                  U[        R                  -   5      v •  M5     g 7fr9   )Ú
startswithr   r%   )rN   r.   Útargets     €r/   rP   Ú,VolumeCache._is_safe_dest.<locals>.<genexpr>à   s0   øé € ÐTÊÀA�6˜Q‘;×? &×"3Ñ"3°A¼¿¹±JÓ"?Ô?Êùs   ƒ;>)r   r   r   rT   r    )r,   Údst_absr¥   s     @r/   Ú_is_safe_destÚVolumeCache._is_safe_destÞ   s,   ø€ Ü—‘×!Ñ! 'Ó*ˆÜÔTÈÏÊÓTÓTÐTr7   c           	      ó&  • U S[         R                  " 5        S[        R                  " 5        S3n [         R                  " [         R
                  R                  U5      SS9  [        R                  " X5        [         R                  " X25        g! [         at  n[        R                  SU SU SU 35         [         R
                  R                  U5      (       a  [         R                  " U5        O! [         a     Of = f S nAgS nAff = f)	Nr   rK   Trq   zVolumeCache: skip z -> ú: F)r   rx   ry   rz   rv   r   ÚdirnameÚshutilÚcopy2r~   rW   ÚlogÚdebugÚexistsÚremove)r,   ÚsrcÚdstr‚   Úexcs        r/   Ú
_copy_fileÚVolumeCache._copy_fileâ   sÏ   € Ø��Q”r—y’y“{�m 1¤Y×%8Ò%8Ó%:Ð$;¸9ÐEˆð	Ü�KŠKœŸ™Ÿ™¨Ó,°tÒ<Ü�LŠL˜Ô"Ü�JŠJ�sÔ ØøÜó 	Ü�I‰IÐ*¨3¨%¨t°C°5¸¸3¸%Ð@ÔAðÜ—7‘7—>‘> #×&Ñ&Ü—I’I˜c”NùÜó áðúô ûð	ús<   ³AB Â
DÂDÂ;:C6Ã5DÃ6
DÄ DÄDÄDÄDc           	      ó  ^ • U VVs/ s H   u  p#T R                  X#5      (       d  M  X#4PM"     nnnU VVs1 s H  u  p%UiM	     snnU VVs1 s H  u  p%UiM	     snn-
  nU(       d  [        5       U4$ [        T R                  S9 nUR	                  U 4S jU5      n[        XH5       VVV	s1 s H  u  u  p%o™(       d  M  UiM     n
nnn	SSS5        X¦4$ s  snnf s  snnf s  snnf s  sn	nnf ! , (       d  f       W
U4$ = f)aŒ  Copy every (src, dst) that needs it, in parallel.

Returns ``(copied, current)`` sets of source paths:
- ``copied``  -- sources transferred successfully this call.
- ``current`` -- sources skipped because the destination was already
  up to date.
Their union is the set of sources the destination now holds a current
copy of; a source in neither failed to copy. Callers that record a
"mirror complete" manifest MUST include only sources in that union, or
a failed copy would be marked present and later served stale. copy2 +
atomic os.replace means a source in ``copied`` matches its destination
at that instant, so no re-stat is needed to confirm it.
)r   c                 ó4   >• TR                  U S   U S   5      $ )Nr   r   )r¶   )Úsdr,   s    €r/   Ú<lambda>Ú,VolumeCache._copy_parallel.<locals>.<lambda>	  s   ø€ ¨$¯/©/¸"¸Q¹%ÀÀAÁÔ*Gr7   N)r    Úsetr   r+   ÚmapÚzip)r,   ÚpairsrŸ   r.   ÚtodoÚ_ÚcurrentÚpoolÚresultsÚokÚcopieds   `          r/   Ú_copy_parallelÚVolumeCache._copy_paralleló   sã   ø€ ñ $)ÔC¢5™4˜1¨D×,<Ñ,<¸Q×,B“�“¡5ˆÑCÙ!&Ô'¢™˜“1¡Ò'¹Ô*>º±°«1¹Ò*>Ñ>ˆÞÜ“5˜'�>Ð!Ü¨D×,=Ñ,=Ò>À$ð —h‘hÔGÈÓNˆGÜ*-¨dÔ*<ÕCÒ*<™J™F˜Q BÃ—aÑ*<ˆFÒC÷ ?ð ˆÐùó DùÛ'ùÓ*>ùô D÷ ?Ô>ð �wˆÐús9   ‡C§C¶CÁC Â&C-Â,C&
Â?C&
ÃC-Ã&C-Ã-
C>c                 óØ   • [         R                  R                  U 5      n[         R                  R                  U5      nX2:H  =(       d"    UR                  U[         R                  -   5      $ )z?True iff ``path`` resolves inside ``base`` (symlinks resolved).)r   r   r   r¤   r%   )Úbaser   Ú	base_realÚ	path_reals       r/   Ú_withinÚVolumeCache._within  sN   € ô —G‘G×$Ñ$ TÓ*ˆ	Ü—G‘G×$Ñ$ TÓ*ˆ	ØÑ%×Q¨×)=Ñ)=¸iÌ"Ï&É&Ñ>PÓ)QÐQr7   c                 ó˜   •  U" 5       $ ! [          a6  nU R                  (       d  e [        R                  SU 35        Us S nA$ S nAff = f)NzVolumeCache operation failed: )Ú	Exceptionr(   r¯   Úwarn)r,   ÚfnÚdefaultrµ   s       r/   Ú_guardÚVolumeCache._guard  sC   € ð	Ù“4ˆKøÜó 	Ø×$×$ØÜ�H‰HÐ5°c°UÐ;Ô<Ø�Nûð		ús   ‚	 ‰
A	“+A¾A	ÁA	c                 ó.   • [         R                  " S5      $ )NÚtar)r­   Úwhichr4   s    r/   Ú_tar_binaryÚVolumeCache._tar_binary  s   € Ü�|Š|˜EÓ"Ð"r7   c                 ó\  • [         R                  " U R                  SS9  U R                   S[         R                  " 5        S[
        R                  " 5        S3nU Vs/ s H#  n[         R                  R                  US5      PM%     nn U R                  5       (       a˜  U S3n [        US5       nUR                  SR                  U5      5        S S S 5        [        R                  " S	S
SSSSUSU/	S[        R                  [        R                  0 [         R                   ESS0ES9  [#        U5        OD[$        R                  " US5       n['        X5       H  u  p8UR)                  X8SS9  M     S S S 5        [         R*                  " X R                  5        gs  snf ! , (       d  f       NÕ= f! [#        U5        f = f! , (       d  f       NU= f! [,        [        R.                  [$        R0                  4 a-  n	[2        R5                  SU	 35        [#        U5         S n	A	gS n	A	ff = f)NTrq   r   rK   r   z.listru   Ú
rØ   z-Cz-cz--no-recursionz-fz-TÚCOPYFILE_DISABLEÚ1)ÚcheckÚstdoutÚstderrÚenvF)ÚarcnameÚ	recursivez'VolumeCache: pack small bucket failed: )r   rv   r5   r?   rx   ry   rz   r   ÚrelpathrÚ   r{   Úwriter3   Ú
subprocessÚrunÚDEVNULLr!   Ú_silent_removeÚtarfiler¿   Úaddr~   rW   ÚSubprocessErrorÚTarErrorr¯   r°   )
r,   rZ   r‚   ÚfÚrelsÚlistingrƒ   ÚtfÚrelrµ   s
             r/   Ú_pack_smallÚVolumeCache._pack_small   s¹  € Ü
�Š�D×%Ñ%°Ò5Ø×)Ñ)Ð*¨!¬B¯IªI«K¨=¸¼)×:MÒ:MÓ:OÐ9PÐPYÐZˆÙ16Ó7²¨A”—‘—‘  3Ö'±ˆÐ7ð	Ø×Ñ×!Ñ!Ø ˜E ˜-�ð,Ü˜g sÔ+¨rØŸ™ §¡¨4£Ô1÷ ,ä—N’NØ  c¨4Ð1AÀ4ÈÈdÐT[Ð\Ø"Ü)×1Ñ1Ü)×1Ñ1àCœrŸz™zÐCÐ+=¸sÑCòô # 7Õ+ä—\’\ # sÔ+¨rÜ"% eÖ"2™˜ØŸ™˜q¸˜Ó?ñ #3÷ ,ô �JŠJ�s×4Ñ4Ô5Øùò- 8÷
 ,Õ+ûô # 7Õ+úç+Õ+ûô
 œ×3Ñ3´W×5EÑ5EÐFó 	Ü�I‰IÐ?À¸uÐEÔFÜ˜3ÔÜûð	úsg   Á*FÂG Â'F4 Â3!F#ÃAF4 Ä-#G Å%GÅ5(G Æ#
F1Æ-F4 Æ4GÇG Ç
GÇG Ç)H+Ç>#H&È&H+c                 óæ  •  [         R                  " U R                  5      nSn  UR                  5       nU H¤  nUR                  5       (       d  M  [        R                  R                  SUR                  5      nU R                  U5      (       d  M\  XeR                  UR                   S.nU R#                  U5      (       a  M�   U R%                  X5        US-  nM¦     UR                  5         U(       a  [        R'                  SU S	35        U$ ! [        [         R                  4 a     gf = f! [        [         R                  4 aA  n[        R                  SU R                   SU 35        Us S nAUR                  5         $ S nAff = f! [        [         R                  4 a1  n[        R                  SUR                   SU 35         S nAGMž  S nAff = f! UR                  5         f = f)
Nr   zVolumeCache: corrupt archive r«   r   rj   r   zVolumeCache: skip extract zVolumeCache: extracted z small file(s))rì   r{   r?   rW   rï   Ú
getmembersr¯   r°   ÚcloseÚisfiler   r   r3   r[   r¨   rf   rk   r�   Ú_extract_memberÚinfo)r,   ró   Ú	extractedÚmembersrµ   Úmemberr´   r�   s           r/   Ú_extract_smallÚVolumeCache._extract_small?  s¥  € ð	Ü—’˜d×6Ñ6Ó7ˆBð ˆ	ð	ð!ØŸ-™-›/�ó "�à—}‘}—‘ÙÜ—g‘g—l‘l 3¨¯©Ó4�à×)Ñ)¨#×.Ñ.Ùà #¯[©[À6Ç<Á<ÑP�Ø×0Ñ0°×6Ñ6ÙðQØ×(Ñ(¨Ô4Ø ‘N’Iñ "ð& �H‰HŒJÞÜ�H‰HÐ.¨y¨k¸ÐHÔIØÐøô? œ×)Ñ)Ð*ó 	Ùð	ûô œW×-Ñ-Ð.ó !Ü—	‘	Ð9¸$×:RÑ:RÐ9SÐSUÐVYÐUZÐ[Ô\Ø Ô ð( �H‰H�Jûð-!ûô&  ¤×!1Ñ!1Ð2ó QÜ—I‘IÐ :¸6¿;¹;¸-ÀrÈ#ÈÐO×PÓPûðQûð �H‰H�Júsp   ‚ D ¦D2 ¶BG ÃFÃG ÄD/Ä.D/Ä2FÅ&FÅ2FÅ3G ÆFÆG ÆGÆ*%GÇG ÇGÇG ÇG0c                 óv   • [        [        S5      (       a  U R                  USSS9  g U R                  US5        g )NÚdata_filterr   Údata)Úfilter)Úhasattrrì   Úextract)ró   rÿ   s     r/   rû   ÚVolumeCache._extract_memberc  s1   € ô ”7˜M×*Ñ*Ø�J‰J�v˜s¨6ˆJÒ2à�J‰J�v˜sÕ#r7   c                 ó^   • U R                   (       d  gU R                  U R                  S5      $ )z“Reconcile volume mirror -> container.

Copy files missing or newer in the container. Returns the number of
files copied. No-op (0) if unavailable.
r   )rH   rÕ   Ú_do_hydrater4   s    r/   ÚhydrateÚVolumeCache.hydratep  s%   € ð �~�~ØØ�{‰{˜4×+Ñ+¨QÓ/Ð/r7   c                 óÆ  • U R                  5       nUc  gSnUR                  S5      (       a  X R                  5       -  n/ nUR                  S/ 5       H½  n[        R                  R                  US   S5      n[        R                  R                  SU5      n[        R                  R                  U R                  U5      nU R                  U5      (       d  Mˆ  U R                  U R                  U5      (       d  M«  UR                  Xv45        M¿     U R                  U5      u  p‰U[        U5      -  nU(       a%  [        R                  SU SU R                   35        U$ )Nr   rd   r   r   r   zVolumeCache: hydrated z file(s) from )rŠ   r"   r   r   r   ræ   r3   rC   r¨   rÎ   rb   rÈ   Úlenr¯   rü   r5   )
r,   r”   ÚrestoredÚ	big_pairsÚentryrô   r´   r³   rÇ   Ú_currents
             r/   r
  ÚVolumeCache._do_hydratez  s  € Ø×&Ñ&Ó(ˆØÑØØˆØ�<‰<˜× Ñ Ø×+Ñ+Ó-Ñ-ˆHØˆ	Ø—\‘\ %¨Ö,ˆEÜ—'‘'—/‘/ %¨¡-°Ó5ˆCÜ—'‘'—,‘,˜s CÓ(ˆCÜ—'‘'—,‘,˜tŸ~™~¨sÓ3ˆCð ×!Ñ! #×&Ó&¨4¯<©<¸¿¹È×+LÓ+LØ× Ñ  # Ö,ñ -ð  ×.Ñ.¨yÓ9ÑˆØ”C˜“KÑˆÞÜ�H‰HÐ-¨h¨Z°~Àd×FWÑFWÐEXÐYÔZØˆr7   ©Ú
backgroundc                óÚ   ^ • T R                   (       d  gU(       a5  [        R                  " U 4S jSS9n[        U5        UR	                  5         gT R                  T R                  S5        g)a'  Reconcile container -> volume mirror.

Copy files missing or newer on the volume. When ``background=True``
(default), run on a daemon thread and return immediately; a
process-exit hook joins outstanding syncs so short-lived processes
still complete. When False, run inline and return when done.
Nc                  ó<   >• T R                  T R                  S5      $ )Nr   )rÕ   Ú_do_syncr4   s   €r/   r»   Ú"VolumeCache.sync.<locals>.<lambda>œ  s   ø€ °·±¸D¿M¹MÈ1Ô0Mr7   T)r¥   Údaemonr   )rH   ry   ÚThreadÚ_register_pendingÚstartrÕ   r  )r,   r  Úts   `  r/   ÚsyncÚVolumeCache.sync‘  sI   ø€ ð �~�~ØÞÜ× Ò Ô(MÐVZÑ[ˆAÜ˜aÔ Ø�G‰G�Ià�K‰K˜Ÿ™ qÕ)r7   c                 ó0  ^ • / nT R                    HI  n[        R                  R                  U5      (       d  M)  UR	                  T R                  U5      5        MK     T R                  U5      u  p4T R                  5       nU 4S jU 5        Vs/ s H  of(       d  M  UPM     nnSnU(       a»  T R                  XuS5      n	U(       a  UR                  S/ 5      O/  V
s1 s H  oªS   iM	     nn
[        X· Vs1 s H  ofS   iM	     sn-
  5      nU	(       d  U(       aN  T R                  U Vs/ s H  ofS   PM	     sn5      (       a  [        U	5      nOXG Vs/ s H  ofS   PM	     sn-   n/ nU(       d  [        T R                  5        U Vs/ s HL  oÝ[        R                  R                  T R                   [        R                  R#                  US5      5      4PMN     nnT R%                  U5      u  nnUU-  nU 4S jU 5        Vs/ s H  of(       d  M  US   U;   d  M  UPM     nn[        U5      nT R'                  UU5        UU-   nU(       a%  [(        R+                  SU ST R,                   35        U$ s  snf s  sn
f s  snf s  snf s  snf s  snf s  snf )	Nc              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr9   ©rn   ©rN   rð   r,   s     €r/   rP   Ú'VolumeCache._do_sync.<locals>.<genexpr>ª  s   øé € Ð!Jºk¸ $§/¡/°!×"4Ð"4ºkùó   ƒ!r   rd   r   r   c              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr9   r#  r$  s     €r/   rP   r%  Ì  s   øé € Ð>²I¨q˜Ÿ™¨×*Ð*²Iùr&  zVolumeCache: synced z file(s) to )r    r   r   rG   Úextendr\   rg   rŠ   rš   r"   rF   rõ   r  rë   r?   r3   rC   ræ   rÈ   r„   r¯   rü   r5   )r,   Ú	all_filesrX   Úsmall_filesÚ	big_filesr”   r™   r   Úsmall_transferredr˜   r–   Úprior_smallÚdeletedrð   r  rÇ   rÃ   Úmirroredr€   Ú
big_copiedÚtotals   `                    r/   r  ÚVolumeCache._do_sync¢  sR  ø€ Øˆ	Ø—J”JˆDÜ�w‰w�}‰}˜T×"Ó"Ø× Ñ  ×!1Ñ!1°$Ó!7Ö8ñ ð "&§¡°Ó!;Ñˆà×&Ñ&Ó(ˆÜ!J¹kÔ!JÓPÒ!J˜AËa—aÑ!Jˆ
ÐPØÐÞØ×/Ñ/°
ÀgÓNˆGÞLT¨x¯|©|¸GÀRÔ/HÐZ\Ð/\Ó^Ò/\¨˜Vœ9Ñ/\ˆKÐ^Ü˜;¸ZÓ)HºZ¸¨F¬)¹ZÑ)HÑHÓIˆGÞž'ð ×#Ñ#¹
Ó$Cº
°1 v¤Y¹
Ñ$C×DÑDÜ(+¨G«Ñ%ð !*À
Ó,KÂ
¸1¨v¬YÁ
Ñ,KÑ K�IØ!#�Jæô ˜4×3Ñ3Ô4áYbÓcÒYbÐTUœŸ™Ÿ™ d§n¡n´b·g±g·o±oÀaÈÓ6MÓNÓOÑYbˆ	ÐcØ×-Ñ-¨iÓ8‰ˆ�ð
 ˜GÑ#ˆä>±IÔ>ó
Ú>�!Ã!‹AÈÈ&É	ÐU]ÑH]�AÑ>ð 	ð 
ô ˜“[ˆ
à×Ñ˜Z¨Ô2ØÐ.Ñ.ˆÞÜ�H‰HÐ+¨E¨7°,¸t×?PÑ?PÐ>QÐRÔSØˆùòU Qùò _ùÚ)Hùò %Dùò
 -Lùò dùò
s=   Â
I5ÂI5ÃI:Ã5I?
Ä)JÅJ	ÆAJÈ
JÈJÈJc                 ó&   • U R                  5         U $ r9   )r  r4   s    r/   Ú	__enter__ÚVolumeCache.__enter__Ú  s   € Ø�‰ŒØˆr7   c                 ó"   • U R                  SS9  g )NTr  )r  )r,   rµ   s     r/   Ú__exit__ÚVolumeCache.__exit__Þ  s   € Ø�	‰	˜Tˆ	Ñ"Ør7   )r(   r    r+   r#   r'   )(Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r%   rU   r0   Úpropertyr5   r;   r?   rC   rH   r\   rg   rn   r„   rŠ   r�   rš   Ústaticmethodr    r¨   r¶   rÈ   rÎ   rÕ   rÚ   rõ   r   rû   r  r
  r  r  r4  r7  Ú__static_attributes__rM   r7   r/   r   r   ,   sd  † ñð: Ÿ6™6 F™?¨R¯V©VÑ3°R·V±V¸kÑ5IÈBÏFÉFÑ5RÐSÐð "&Ð3CÐQUÐcgõ!NðF ñJó ðJð ñ?ó ð?ð ñDó ðDð ñ<ó ð<ð ñJó ðJòòòHò-òò^òð ñ	Tó ð	TòUòò"ð4 ñRó ðRòò#òò>"ðH ñ$ó ð$ò0òð. "&õ *ò"2òpõr7   r   c                 óR   •  [         R                  " U 5        g ! [         a     g f = fr9   )r   r²   rW   )r   s    r/   rë   rë   è  s$   € ðÜ
�	Š	�$�øÜó áðús   ‚ ™
&¥&c                 ó    • [          Vs/ s H  oR                  5       (       d  M  UPM     sn[         S S & [         R                  U 5        g s  snf r9   )Ú_pending_syncsÚis_aliverb   )Úthreadr  s     r/   r  r  ÷  s5   € Ý$2ÓC¢N˜q·j±j·lŸ¡NÑC„N‘1ÐÜ×Ñ˜&Õ!ùò Ds
   ‰A¥Ac                  ó  • [        [        5       HL  n  U R                  [        S9  U R	                  5       (       a   [
        R                  S[        S S35        ML  MN     [        R                  5         g ! [         a     Mr  f = f)N)Útimeoutz3VolumeCache: background sync did not finish within z.0fz"s at exit; cache may be incomplete)	ÚlistrC  r3   Ú_JOIN_TIMEOUT_SECONDSrD  r¯   rÒ   rÑ   Úclear)r  s    r/   Ú_join_pending_syncsrK  ü  sw   € Ü”.Ö!ˆð		Ø�F‰FÔ0ˆFÑ1Ø�z‰z�|‰|Ü—‘ØIÜ,¨SÐ1Ð1SðUöñ ñ "ô ×ÑÕøô ó 	âð	ús   ”AA5Á5
BÂBc                  ó,   • [         R                  5         g r9   )rC  rJ  rM   r7   r/   Ú_reset_pending_for_testrM    s   € Ü×ÑÕr7   )r=  Úatexitr|   r   r­   rè   rì   ry   Úconcurrent.futuresr   Ú#runpod.serverless.modules.rp_loggerr   r¯   rŽ   rI  ra   rw   r:   r>   rB   r   rë   rC  r  rK  rM  ÚregisterrM   r7   r/   Ú<module>rR     sŒ   ðñó* Û Û 	Û Û Û Û Ý 1å <áƒn€àÐ ØÐ Ø"Ð Ø€Ø €Ø!Ð Ø€÷tñ tòxð €ò"ò
òð ‡‚Ð#Õ $r7   